什么是連接查詢遇八?
- 在實際開發(fā)中,大部分的情況下都不是從單表中查詢數(shù)據(jù)虑鼎,一般都是多張表聯(lián)合查詢?nèi)〕鲎罱K的結(jié)果辱匿。
- 在實際開發(fā)中,一般一個業(yè)務(wù)都會對應(yīng)多張表炫彩,比如:學(xué)生和班級匾七,最少兩張表。
連接查詢的分類
根據(jù)語法出現(xiàn)的年代來劃分的話江兢,包括:
- SQL92(一些老的DBA可能還在使用這種語法昨忆。DBA:DataBase Administrator,數(shù)據(jù)庫管理員)
- SQL99(比較新的語法)
根據(jù)表的連接方式來劃分杉允,包括:
內(nèi)連接:
- 等值連接
- 非等值連接
- 自連接
外連接:
- 左外連接(左連接)
- 右外連接(右連接)
- 全連接
笛卡爾積現(xiàn)象
兩張表進行連接查詢的時候邑贴,如果沒有任何條件進行限制,最終的查詢結(jié)果條數(shù)是兩張表記錄條數(shù)的乘積
比如叔磷,一張表a有6條記錄拢驾,表b有12條記錄,那么第一張表的每一行都會與第二張表的每一條記錄都會進行一次匹配改基,最終有72條的記錄繁疤,這種現(xiàn)象存在數(shù)據(jù)冗余,也存在無效的記錄秕狰,不合理的記錄
如何避免笛卡爾積現(xiàn)象
根據(jù)定義稠腊,我們知道,連接查詢時鸣哀,對連接條件進行設(shè)置可以避免這種現(xiàn)象
但是架忌,匹配次數(shù)并不會減少,只是查詢結(jié)果記錄減少了
內(nèi)連接
關(guān)鍵字:join on
或者inner join on
诺舔,老版的SQL語句on
可以替換成where
inner
可以省略
a表與b表內(nèi)連接時鳖昌,a、b兩張表的地位是等同的低飒,不分主次许昨,不分主副表,如果兩張表有不匹配的地方褥赊,例如null,則會自動忽略這條記錄
等值連接
連接條件是等量關(guān)系糕档,就是這么簡單
語法:
select
...
A
join
B
on
連接條件
非等值連接
連接條件中的關(guān)系是非等量關(guān)系
語法與等值連接一樣,只是on后面的連接條件不同
select
e.ename,e.sal,s.grade
from
emp e
inner join
salgrade s
on
e.sal between s.losal and s.hisal;
自連接
最大的特點:
- 一張表看做兩張或者多張表
- 自己連接自己
案例:找出每個員工的上級領(lǐng)導(dǎo),要求顯示員工名和對應(yīng)的領(lǐng)導(dǎo)名速那。
mysql> select empno,ename,mgr from emp;
emp a 員工表
+-------+--------+------+
| empno | ename | mgr |
+-------+--------+------+
| 7369 | SMITH | 7902 |
| 7499 | ALLEN | 7698 |
| 7521 | WARD | 7698 |
| 7566 | JONES | 7839 |
| 7654 | MARTIN | 7698 |
| 7698 | BLAKE | 7839 |
| 7782 | CLARK | 7839 |
| 7788 | SCOTT | 7566 |
| 7839 | KING | NULL |
| 7844 | TURNER | 7698 |
| 7876 | ADAMS | 7788 |
| 7900 | JAMES | 7698 |
| 7902 | FORD | 7566 |
| 7934 | MILLER | 7782 |
+-------+--------+------+
emp b 領(lǐng)導(dǎo)表
+-------+--------+
| empno | ename |
+-------+--------+
| 7566 | JONES |
| 7698 | BLAKE |
| 7782 | CLARK |
| 7788 | SCOTT |
| 7839 | KING |
| 7902 | FORD |
+-------+--------+
員工的領(lǐng)導(dǎo)編號 = 領(lǐng)導(dǎo)的員工編號
select
a.ename as '員工名',b.ename as '領(lǐng)導(dǎo)名'
from
emp a
inner join
emp b
on
a.mgr = b.empno;
+--------+--------+
| 員工名 | 領(lǐng)導(dǎo)名 |
+--------+--------+
| SMITH | FORD |
| ALLEN | BLAKE |
| WARD | BLAKE |
| JONES | KING |
| MARTIN | BLAKE |
| BLAKE | KING |
| CLARK | KING |
| SCOTT | JONES |
| TURNER | BLAKE |
| ADAMS | SCOTT |
| JAMES | BLAKE |
| FORD | JONES |
| MILLER | CLARK |
+--------+--------+
外連接
外連接與內(nèi)連接的區(qū)別
內(nèi)連接:
- 假設(shè)A和B表進行連接俐银,使用內(nèi)連接的話,凡是A表和B表能夠匹配上的記錄查詢出來端仰,這就是內(nèi)連接捶惜。
- AB兩張表沒有主副之分,兩張表是平等的荔烧。
外連接:
- 假設(shè)A和B表進行連接吱七,使用外連接的話,AB兩張表中有一張表是主表鹤竭,一張表是副表踊餐,主要查詢主表中的數(shù)據(jù),捎帶著查詢副表臀稚,當副表中的數(shù)據(jù)沒有和主表中的數(shù)據(jù)匹配上吝岭,副表自動模擬出NULL與之匹配。
外連接的分類吧寺?
左外連接(左連接):表示左邊的這張表是主表窜管。
右外連接(右連接):表示右邊的這張表是主表。
左連接有右連接的寫法撮执,右連接也會有對應(yīng)的左連接的寫法微峰,是相對的
外連接最重要的特點是:主表的數(shù)據(jù)無條件的全部查詢出來
// outer可以省略。
select
a.ename '員工', b.ename '領(lǐng)導(dǎo)'
from
emp b
right outer join
emp a
on
a.mgr = b.empno;
+--------+-------+
| 員工 | 領(lǐng)導(dǎo) |
+--------+-------+
| SMITH | FORD |
| ALLEN | BLAKE |
| WARD | BLAKE |
| JONES | KING |
| MARTIN | BLAKE |
| BLAKE | KING |
| CLARK | KING |
| SCOTT | JONES |
| KING | NULL |
| TURNER | BLAKE |
| ADAMS | SCOTT |
| JAMES | BLAKE |
| FORD | JONES |
| MILLER | CLARK |
+--------+-------+
多張表連接
案例:找出每一個員工的部門名稱以及工資等級
EMP e
+-------+--------+---------+--------+
| empno | ename | sal | deptno |
+-------+--------+---------+--------+
| 7369 | SMITH | 800.00 | 20 |
| 7499 | ALLEN | 1600.00 | 30 |
| 7521 | WARD | 1250.00 | 30 |
| 7566 | JONES | 2975.00 | 20 |
| 7654 | MARTIN | 1250.00 | 30 |
| 7698 | BLAKE | 2850.00 | 30 |
| 7782 | CLARK | 2450.00 | 10 |
| 7788 | SCOTT | 3000.00 | 20 |
| 7839 | KING | 5000.00 | 10 |
| 7844 | TURNER | 1500.00 | 30 |
| 7876 | ADAMS | 1100.00 | 20 |
| 7900 | JAMES | 950.00 | 30 |
| 7902 | FORD | 3000.00 | 20 |
| 7934 | MILLER | 1300.00 | 10 |
+-------+--------+---------+--------+
DEPT d
+--------+------------+----------+
| DEPTNO | DNAME | LOC |
+--------+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
+--------+------------+----------+
SALGRADE s
+-------+-------+-------+
| GRADE | LOSAL | HISAL |
+-------+-------+-------+
| 1 | 700 | 1200 |
| 2 | 1201 | 1400 |
| 3 | 1401 | 2000 |
| 4 | 2001 | 3000 |
| 5 | 3001 | 9999 |
+-------+-------+-------+
注意抒钱,解釋一下:
....
A
join
B
join
C
on
...
表示:A表和B表先進行表連接蜓肆,連接之后A表繼續(xù)和C表進行連接。
select
e.ename,d.dname,s.grade
from
emp e
join
dept d
on
e.deptno = d.deptno
join
salgrade s
on
e.sal between s.losal and s.hisal;
+--------+------------+-------+
| ename | dname | grade |
+--------+------------+-------+
| SMITH | RESEARCH | 1 |
| ALLEN | SALES | 3 |
| WARD | SALES | 2 |
| JONES | RESEARCH | 4 |
| MARTIN | SALES | 2 |
| BLAKE | SALES | 4 |
| CLARK | ACCOUNTING | 4 |
| SCOTT | RESEARCH | 4 |
| KING | ACCOUNTING | 5 |
| TURNER | SALES | 3 |
| ADAMS | RESEARCH | 1 |
| JAMES | SALES | 1 |
| FORD | RESEARCH | 4 |
| MILLER | ACCOUNTING | 2 |
+--------+------------+-------+
子查詢
什么是子查詢谋币?子查詢都可以出現(xiàn)在哪里仗扬?
select語句當中嵌套select語句,被嵌套的select語句是子查詢
- 子查詢可以出現(xiàn)的位置
select
..(select).
from
..(select).
where
..(select).
- where子句中可以使用子查詢
Union
union
比較雞肋蕾额,但也有奇效早芭,可以將查詢結(jié)果集相加
案例:找出工作崗位是SALESMAN和MANAGER的員工?
第一種:select ename,job from emp where job = 'MANAGER' or job = 'SALESMAN';
第二種:select ename,job from emp where job in('MANAGER','SALESMAN');
+--------+----------+
| ename | job |
+--------+----------+
| ALLEN | SALESMAN |
| WARD | SALESMAN |
| JONES | MANAGER |
| MARTIN | SALESMAN |
| BLAKE | MANAGER |
| CLARK | MANAGER |
| TURNER | SALESMAN |
+--------+----------+
第三種:union
select ename,job from emp where job = 'MANAGER'
union
select ename,job from emp where job = 'SALESMAN';
+--------+----------+
| ename | job |
+--------+----------+
| JONES | MANAGER |
| BLAKE | MANAGER |
| CLARK | MANAGER |
| ALLEN | SALESMAN |
| WARD | SALESMAN |
| MARTIN | SALESMAN |
| TURNER | SALESMAN |
+--------+----------+
兩張不相干的表中的數(shù)據(jù)拼接在一起顯示時诅蝶,會排成一列
select ename from emp
union
select dname from dept;
+------------+
| ename |
+------------+
| SMITH |
| ALLEN |
| WARD |
| JONES |
| MARTIN |
| BLAKE |
| CLARK |
| SCOTT |
| KING |
| TURNER |
| ADAMS |
| JAMES |
| FORD |
| MILLER |
| ACCOUNTING |
| RESEARCH |
| SALES |
| OPERATIONS |
+------------+
拼接的數(shù)據(jù)必須兩兩相對應(yīng)退个。不能一張表是一個數(shù)據(jù),另一張表是兩個數(shù)據(jù)调炬,這樣無法拼接语盈!
mysql> select ename,sal from emp
-> union
-> select dname from dept;
ERROR 1222 (21000): The used SELECT statements have a different number of columns
limit
- limit是mysql特有的,其他數(shù)據(jù)庫中沒有缰泡,不通用刀荒。(Oracle中有一個相同的機制,叫做rownum)
- limit取結(jié)果集中的部分數(shù)據(jù),這是它的作用
語法機制
limit startIndex, length
- startIndex表示起始位置缠借,從0開始干毅,0表示第一條數(shù)據(jù)。
- length表示取幾個泼返,取的記錄的條數(shù)
limit
是select
語句最后執(zhí)行的一個環(huán)節(jié)