一、多表連接
1、應用場景
常常用於主表和從表的連接上。
- 對於併發量特別巨大的表或數據庫,建議取消主從關係,也就是不設置外鍵。
- 阿里規範:數據庫設計時,可以使用主從關係,但是建立物理數據庫時,必須刪除。
2、等值連接
格式
select 列名列表
from 表1, 表2
where 表1.列1 = 表2.列2[ and 條件表達式];
使用示例
select
empno, ename, job, mgr, hiredate, sal, comm,
d.deptno, dname, loc
from emp e, dept d
where
e.deptno = d.deptno
and job = 'CLEAR'
and dname = 'RESEARCH';
注意點
- 沒有任何條件的多表查詢,結果將會是所有被查詢列的笛卡爾積
3、非等值連接
使用示例
select
e.ename, e.sal, s.grade
from emp e, salgrade s
where e.sal between s.losal and s.hisal;
4、自連接
應用場景
往往用於樹形表(用來描述目錄或類別)
eg:
id | name | fid |
---|---|---|
藥品目錄 | ||
西藥 | ||
中藥 | ||
抗生素 | ||
青黴素 |
使用示例
select
e.empno, e.ename, e.job, e.hiredate, e.sal, e.comm, e.mgr,
m.ename as MGR_Name
from emp e, emp m
where e.mgr = m.empno;
5、標準連接
(1).交叉連接
說明
cross join
查詢的結果即爲各列的笛卡爾積
使用示例
select ename, dname
from emp
cross join dept;
-- 多表查詢的效果與上述語句效果相同
select ename, dname
from emp, dept;
(2).自然連接
說明
natural join
自然連接是對兩個表之間相同名字和數據類型的列進行的等值連接,查詢的效果相當於等值連接
注意點
- 如果兩個表之間相同名稱的列的數據類型不同,則會產生錯誤
使用示例
select
empno, ename, job, mgr, hiredate, sal, comm,
d.deptno, dname, loc
from emp e
natural join dept d;
-- 多表查詢的效果與上述語句效果相同
select
empno, ename, job, mgr, hiredate, sal, comm,
d.deptno, dname, loc
from emp e, dept d
where
e.deptno = d.deptno
(3).using子句連接
使用示例
-- 用using子句指定連接與(2)中示例效果相同
select
empno, ename, job, mgr, hiredate, sal, comm,
d.deptno, dname, loc
from emp e
join dept d using (deptno);
(4).on子句連接
使用示例
-- 用on子句指定連接與(2)中示例效果相同
select
empno, ename, job, mgr, hiredate, sal, comm,
d.deptno, dname, loc
from emp e
join dept d on e.deptno = d.deptno;
-- 三表查詢
select e.empno, e.ename, d.dname, m.ename
from emp e
join dept d on e.deptno = d.deptno
join emp m on e.mgr = m.empno;
-- 可以用外連接彌補沒有顯示“老闆”的缺點
(5).外連接
說明
外連接類型 | 說明 |
---|---|
left |
左表列的數據全部顯示,其餘表無數據列顯示null |
right |
右表列的數據全部顯示,其餘表無數據列顯示null ,實際上往往改寫爲left |
使用示例
-- 左外連接示例
select
e.empno, e.name,
d.deptno, d.dname
from emp e
left join dept d on e.deptno = d.deptno
-- 右外連接示例
select
e.empno, e.name,
d.deptno, d.dname
from emp e
left join dept d on e.deptno = d.deptno
-- 查詢沒有員工的部門信息
select d.deptno, dname, loc
from dept d
left join emp e on d.deptno = e.deptno
where e.deptno is null;
-- 查詢存在員工的部門信息
select distinct d.deptno, dname, loc
from dept d
join emp e on d.deptno = e.deptno;
-- 顯示所有員工的[編號、項目、領導姓名、部門名稱]
select e.empno, e.ename, d.dname, m.ename
from emp e
left join dept d on e.deptno = d.deptno
left join emp m on e.mgr = m.empno;
注意點
- 連接查詢通常建議使用關鍵字
distinct
來消除重複行 - 注意是否需要連續
left join
或者連續right join
二、知識點補充
1、自動行號
格式
select
(@id := @id + 1) autoline, 列名列表
from 表名, (select @id := 0) t;