高級(jí)查詢

數(shù)據(jù)庫(kù)示例:

學(xué)生信息表student

+-----+------+-----+-----+
| id  | name | age | sex |
+-----+------+-----+-----+
| 001 | 張三 |  18 | 男  |
| 002 | 李四 |  20 | 女  |
| 003 | 王五 |  18 | 男  |
+-----+------+-----+-----+

成績(jī)表score

+----+------------+------------+-------+
| id | student_id | subject_id | score |
+----+------------+------------+-------+
|  1 | 001        | 1001       |    80 |
|  2 | 002        | 1002       |    60 |
|  3 | 001        | 1001       |    70 |
|  4 | 002        | 1002       |  60.5 |
+----+------------+------------+-------+

一驶臊、子查詢

一個(gè)內(nèi)層查詢語(yǔ)句(select-from-where)塊可以嵌套在另外一個(gè)外層查詢塊的where子句中棚贾,其中外層查詢也稱為父查詢匿垄,主查詢专执。內(nèi)層查詢也稱子查詢,從查詢验懊。
例如查詢張三的各個(gè)科目的成績(jī):

mysql> SELECT subject_id, score FROM score WHERE student_id = (SELECT id FROM student WHERE name = '張三');
+------------+-------+
| subject_id | score |
+------------+-------+
| 1001       |    80 |
| 1002       |    70 |
+------------+-------+
2 rows in set (0.00 sec)

子查詢可以較方便地對(duì)兩個(gè)或多個(gè)表進(jìn)行查詢吭服,過(guò)程也比較好理解嚷堡。但是當(dāng)查詢的表過(guò)多(超過(guò)3個(gè))時(shí)嵌套的查詢就比較復(fù)雜,會(huì)可讀性艇棕。而且外部的查詢的返回結(jié)果不能包括內(nèi)部查詢的結(jié)果蝌戒。

二串塑、聯(lián)結(jié)查詢

聯(lián)結(jié)查詢可以將表進(jìn)行關(guān)聯(lián),從而顯示出來(lái)自多張表的數(shù)據(jù)北苟。

1. 內(nèi)聯(lián)結(jié)

返回兩個(gè)或者多個(gè)表之間相等關(guān)系的數(shù)據(jù)桩匪,從數(shù)學(xué)關(guān)系來(lái)看,相當(dāng)于求交集粹淋。從左表中取出每一條記錄吸祟,去右表中與所有的記錄進(jìn)行匹配:匹配必須是某個(gè)條件在左表中與右表中相同最終才會(huì)保留結(jié)果,否則不保留桃移。

mysql>  SELECT * FROM student INNER JOIN score ON student.id = score.student_id;
+-----+------+-----+-----+----+------------+------------+-------+
| id  | name | age | sex | id | student_id | subject_id | score |
+-----+------+-----+-----+----+------------+------------+-------+
| 001 | 張三 |  18 | 男  |  1 | 001        | 1001       |    80 |
| 002 | 李四 |  20 | 女  |  2 | 002        | 1001       |    60 |
| 001 | 張三 |  18 | 男  |  3 | 001        | 1002       |    70 |
| 002 | 李四 |  20 | 女  |  4 | 002        | 1002       |  60.5 |
+-----+------+-----+-----+----+------------+------------+-------+
4 rows in set (0.00 sec)

注:表名太長(zhǎng)時(shí)可以使用別名來(lái)區(qū)分同名字段;可以使用where代替on關(guān)鍵字葛碧,但效率差很多借杰。

2. 外聯(lián)結(jié)

以某張表為主,取出里面的所有記錄,然后每條與另外一張表進(jìn)行連接:不管能不能匹配上條件进泼,最終都會(huì)保留:能匹配蔗衡,正確保留;不能匹配乳绕,其他表的字段都置空NULL绞惦。

  • 左外聯(lián)結(jié):以左邊為主表,返回左表中的所有數(shù)據(jù):
mysql> SELECT * FROM student LEFT JOIN score ON student.id = score.student_id;
+-----+------+-----+-----+------+------------+------------+-------+
| id  | name | age | sex | id   | student_id | subject_id | score |
+-----+------+-----+-----+------+------------+------------+-------+
| 001 | 張三 |  18 | 男  |    1 | 001        | 1001       |    80 |
| 002 | 李四 |  20 | 女  |    2 | 002        | 1001       |    60 |
| 001 | 張三 |  18 | 男  |    3 | 001        | 1002       |    70 |
| 002 | 李四 |  20 | 女  |    4 | 002        | 1002       |  60.5 |
| 003 | 王五 |  18 | 男  | NULL | NULL       | NULL       |  NULL |
+-----+------+-----+-----+------+------------+------------+-------+
5 rows in set (0.00 sec)
  • 右外聯(lián)結(jié):以右邊為主表洋措,返回右表中的所有數(shù)據(jù):
mysql> SELECT * FROM student RIGHT JOIN score ON student.id = score.student_id;
+------+------+------+------+----+------------+------------+-------+
| id   | name | age  | sex  | id | student_id | subject_id | score |
+------+------+------+------+----+------------+------------+-------+
| 001  | 張三 |   18 | 男   |  1 | 001        | 1001       |    80 |
| 001  | 張三 |   18 | 男   |  3 | 001        | 1002       |    70 |
| 002  | 李四 |   20 | 女   |  2 | 002        | 1001       |    60 |
| 002  | 李四 |   20 | 女   |  4 | 002        | 1002       |  60.5 |
+------+------+------+------+----+------------+------------+-------+
4 rows in set (0.00 sec)

3. 交叉聯(lián)結(jié)

從一張表中循環(huán)取出每一條記錄济蝉,每條記錄都去另外一張表進(jìn)行匹配:匹配一定保留(沒(méi)有條件匹配),而連接本身字段就會(huì)增加(保留)菠发,最終形成的結(jié)果叫做:笛卡爾積王滤。

SELECT * FROM table1 AS t1 CROSS JOIN table2 AS t2;

4. 自聯(lián)結(jié)

有時(shí)需要在同一張表中進(jìn)行聯(lián)結(jié)條件的匹配或字段比較,可以使用自聯(lián)結(jié)滓鸠。

SELECT * FROM table t1, table t2 WHERE t1.column1=t2.column2;

三雁乡、組合查詢

多數(shù)SQL查詢都只包含從一個(gè)或多個(gè)表中返回?cái)?shù)據(jù)的單條SELECT語(yǔ)句。MySQL也允許執(zhí)行多個(gè)查詢(多條SELECT語(yǔ)句)糜俗,并將結(jié)果作為單個(gè)查詢結(jié)果集返回踱稍。一般在以下兩種情況中使用:

  • 在單個(gè)查詢中,從不同表中返回類似結(jié)構(gòu)的數(shù)據(jù)悠抹。
  • 對(duì)單個(gè)表執(zhí)行多個(gè)查詢珠月,按照單個(gè)查詢返回?cái)?shù)據(jù)。
SELECT * FROM table1 WHERE condition 
UNION
SELECT * FROM table2 WHERE condition;

第一種情況锌钮,例:

mysql> SELECT student_id,score FROM score WHERE score > 65 
    -> UNION 
    -> SELECT id,age FROM student WHERE age >= 20;
+------------+-------+
| student_id | score |
+------------+-------+
| 001        |    80 |
| 001        |    70 |
| 002        |    20 |
+------------+-------+
3 rows in set (0.00 sec)

第二種情況桥温,例:

mysql> SELECT * FROM score WHERE score > 65 UNION SELECT * FROM score WHERE id = 4;
+----+------------+------------+-------+
| id | student_id | subject_id | score |
+----+------------+------------+-------+
|  1 | 001        | 1001       |    80 |
|  3 | 001        | 1002       |    70 |
|  4 | 002        | 1002       |  60.5 |
+----+------------+------------+-------+
3 rows in set (0.00 sec)

此種情況下(即情況2),可以用一個(gè)SELECT語(yǔ)句加上WHERE條件來(lái)實(shí)現(xiàn)梁丘。

注:

  • UNION中的每個(gè)查詢必須包含相同的列侵浸、表達(dá)式或聚集函數(shù)旺韭。
  • UNION中的每個(gè)SELECT語(yǔ)句返回的列類型必須兼容√途酰可以不必完全相同区端,但是可以隱式轉(zhuǎn)換。
  • UNION默認(rèn)會(huì)消除重復(fù)的行澳腹,如果要返回所有行:請(qǐng)用UNION ALL织盼。
  • 再用UNION查詢時(shí),只能使用一條ORDER BY子句酱塔,它必須出現(xiàn)在最后一條SELECT之后沥邻。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市羊娃,隨后出現(xiàn)的幾起案子唐全,更是在濱河造成了極大的恐慌,老刑警劉巖蕊玷,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邮利,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡垃帅,警方通過(guò)查閱死者的電腦和手機(jī)延届,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)贸诚,“玉大人方庭,你說(shuō)我怎么就攤上這事∩馄模” “怎么了二鳄?”我有些...
    開(kāi)封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)媒怯。 經(jīng)常有香客問(wèn)我订讼,道長(zhǎng),這世上最難降的妖魔是什么扇苞? 我笑而不...
    開(kāi)封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任欺殿,我火速辦了婚禮,結(jié)果婚禮上鳖敷,老公的妹妹穿的比我還像新娘脖苏。我一直安慰自己,他們只是感情好定踱,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布棍潘。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪亦歉。 梳的紋絲不亂的頭發(fā)上恤浪,一...
    開(kāi)封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音肴楷,去河邊找鬼水由。 笑死,一個(gè)胖子當(dāng)著我的面吹牛赛蔫,可吹牛的內(nèi)容都是我干的砂客。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼呵恢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鞠值!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起渗钉,我...
    開(kāi)封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤齿诉,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后晌姚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡歇竟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年挥唠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片焕议。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宝磨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盅安,到底是詐尸還是另有隱情唤锉,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布别瞭,位于F島的核電站窿祥,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蝙寨。R本人自食惡果不足惜晒衩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望墙歪。 院中可真熱鬧听系,春花似錦、人聲如沸虹菲。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至浪漠,卻和暖如春陕习,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背郑藏。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工衡查, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人必盖。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓拌牲,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親歌粥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

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

  • layout: posttitle: "MySQL高級(jí)查詢"date: 2016-06-02 11:14:38 +...
    EwanRenton閱讀 348評(píng)論 0 2
  • 1.分組查詢 1.1什么是分組: 針對(duì)于班上所有的同學(xué): 分組情況1-按照性別分組:男生一組土居,女生一組,之后可以統(tǒng)...
    賈里閱讀 1,996評(píng)論 1 2
  • 你的眼睛蒙著一層霧擦耀。 聽(tīng)人說(shuō),敢于對(duì)視的人都是誠(chéng)實(shí)的眷蜓。 可是啊,對(duì)視的眼睛如果蒙了一層?xùn)|西胎围,還是誠(chéng)實(shí)嗎? 如果你愛(ài)...
    林香文閱讀 205評(píng)論 0 0
  • 半陽(yáng)半雨汽纤, 一日消度, 墜煮嗒嗒福荸, 烏沉北覷, 瓢禿是靡逞姿, 渾油嚙嚙; 雨歇雷唬滞造, 濕鳥咬咬, 陽(yáng)火盛盛谒养, 胭脂憔...
    笛木閱讀 267評(píng)論 0 0
  • 我原本不是一個(gè)能閑下心來(lái)養(yǎng)花挺狰,靜下性子喂魚的人明郭。 各種蹦跶之后,突然間像變了一個(gè)人丰泊,不愛(ài)出動(dòng)了薯定,有時(shí)可以靜一整天,...
    琥兒說(shuō)閱讀 462評(píng)論 0 0