1. 程式人生 > 其它 >多表查詢(一)

多表查詢(一)

技術標籤:mysqlsql資料庫javaoracle

多表查詢(連線查詢,庫表查詢)

多張表聯合索引

沒有限制條件的關聯——笛卡爾集-cross join

select ename, dname
from emp, dept;
等價於
select ename, dname
from emp cross join dept;

內連線

A表與B表連線,只查詢匹配記錄

等值連線:inner-join

#查詢每一個員工所在部門的名稱,要求最終顯示員工姓名和對應的部門名稱

select
ename, dname
from emp
inner join dept
on emp.deptno = dept.deptno

非等值連線

查詢員工姓名,薪水,薪水對應等級

方法一:

select e.ename, esal, e.grade

from emp as e inner join salgrade as s

on e.sal >= s.losal and e.sal <= s.hisal;

方法二:

select ename, sal, grade

from emp as e inner join salgrade as s

on e.sal between s.losal and s.hisal

自連線

select

emp.ename empname, emp.empno, empmgr.ename as marname, empmgr.empno as mgrno

from emp

inner join emp as empmgr

on emp.mgr = empmgr.empno

外連線

左連線

兩張表聯合查詢,一張表為主,關聯另外一張表的匹配欄位,如果沒有匹配上,在這個主表的連線顯示上顯示null佔位

練習:查詢所有殺手和殺手中被殺清單上的資訊名單

select user1.user_name, user1.over, user2.over

from user1

left join user2

on user1.user_name = user2.user_name

#查詢沒有在被殺名單上的殺手資訊

select

user1.user_name, user1.over, user2.over

from user1 left join user2

on user1.user_name = user2.user_name

where user2.over is null;

右連線

查詢被殺名單以及上面的殺手資訊

select user2.user_name, user2.over, user1.over

from user1

right join user2

on user1.user_name = user2.user_name

查詢被殺名單中不是殺手的資訊

select user2.user_name, user2.over, user1.over

from user1

right join user2

on user1.user_name = user2.user_name

where user1.over is null

注意where條件跟的user1.overselect後面查出來以後的值user1.over

全連線(不要求掌握,掌握了很強)-full join

定義:包含左,右兩個表的全部行,不管另外一個表中是否存在與他們匹配的行。

full-join沒有直接實現的語句,需要通過來擬合表結構實現

#查詢殺手清單上的資訊,殺手在被殺清單上的資訊,被殺清單上的資訊,被殺清單上的殺手資訊

select user1.user_name, user1.over, user2.over

from user1 left join user2

on user1.user_name = user2.user_name

union all

select user2.user_name, user2.over, user1.over

from user1 right join user2

on user1.user_name = user2.user_name

合併結果集

合併結果集的時候,每個查詢表中的欄位個數要相同

union—合併相同的資料
select ename, job from emp where job = ‘MANAGER’

union

select ename, job from emp where job = ‘CLERK’;

union all 不會合並相同的資料
select ename, job from emp where job = ‘MANAGER’

union all

select ename, job from emp where job = ‘CLERK’;