多表查詢(一)
阿新 • • 發佈:2021-02-14
多表查詢(連線查詢,庫表查詢)
多張表聯合索引
沒有限制條件的關聯——笛卡爾集-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.over是select後面查出來以後的值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’;