MySQL-連接查詢

什么是連接查詢遇八?

  • 在實際開發(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語句是子查詢

  1. 子查詢可以出現(xiàn)的位置
select
    ..(select).
from
    ..(select).
where
    ..(select).
  1. 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

  1. limit是mysql特有的,其他數(shù)據(jù)庫中沒有缰泡,不通用刀荒。(Oracle中有一個相同的機制,叫做rownum)
  2. limit取結(jié)果集中的部分數(shù)據(jù),這是它的作用

語法機制

limit startIndex, length

  • startIndex表示起始位置缠借,從0開始干毅,0表示第一條數(shù)據(jù)。
  • length表示取幾個泼返,取的記錄的條數(shù)

limitselect語句最后執(zhí)行的一個環(huán)節(jié)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末硝逢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子符隙,更是在濱河造成了極大的恐慌趴捅,老刑警劉巖垫毙,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霹疫,死亡現(xiàn)場離奇詭異,居然都是意外死亡综芥,警方通過查閱死者的電腦和手機丽蝎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膀藐,“玉大人屠阻,你說我怎么就攤上這事《罡鳎” “怎么了国觉?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長虾啦。 經(jīng)常有香客問我麻诀,道長,這世上最難降的妖魔是什么傲醉? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任蝇闭,我火速辦了婚禮,結(jié)果婚禮上硬毕,老公的妹妹穿的比我還像新娘呻引。我一直安慰自己,他們只是感情好吐咳,可當我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布逻悠。 她就那樣靜靜地躺著,像睡著了一般韭脊。 火紅的嫁衣襯著肌膚如雪童谒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天乾蓬,我揣著相機與錄音惠啄,去河邊找鬼。 笑死,一個胖子當著我的面吹牛撵渡,可吹牛的內(nèi)容都是我干的融柬。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼趋距,長吁一口氣:“原來是場噩夢啊……” “哼粒氧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起节腐,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤外盯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后翼雀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饱苟,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年狼渊,在試婚紗的時候發(fā)現(xiàn)自己被綠了箱熬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡狈邑,死狀恐怖城须,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情米苹,我是刑警寧澤糕伐,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站蘸嘶,受9級特大地震影響良瞧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜亏较,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一莺褒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雪情,春花似錦遵岩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宴凉,卻和暖如春誊锭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背弥锄。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工丧靡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蟆沫,地道東北人。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓温治,卻偏偏與公主長得像饭庞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子熬荆,可洞房花燭夜當晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內(nèi)容