Mysql高級操作(select嵌套,多表JOIN)

如果展示格式有問題盒至,請移步到https://www.yuque.com/mrhuang-ire4d/oufb8x/kac705vebgmmfbgg?singleDoc#%20%E3%80%8Amysql%E9%AB%98%E7%BA%A7%E6%93%8D%E4%BD%9C(%E5%B5%8C%E5%A5%97select,%20join)%E3%80%8B

select嵌套查詢

  1. 返回一個值

當子查詢的返回值只有一個時,可以使用比較運算符可以使用比較運算符如=枷遂、<、>箫老、>=、<=耍鬓、!=等將主查詢和子查詢連接起來。示例:

SELECT name,age 
FROM person 
WHERE age > (SELECT age FROM person WHERE name = '張三');
  1. 返回一組值

如果子查詢的返回值不止一個牲蜀,而是一個集合時,則不能直接使用比較運算符涣达,可以在比較運算符和子查詢之間插入IN、ANY度苔、SOME、ALL, 或者EXISTS寇窑。

  • IN,用于where子句中用來判斷查詢的表達式是否在子查詢集合中甩骏,返回滿足IN列表中的記錄窗市。IN的語法是:<表達式> in (子查詢)
  • ANY饮笛,與子查詢集每個元素的比較,部分值為True福青,那么結果就為True。ANY的語法是:<表達式>{ =|<>|!=|>|>=|!>|<|<=|!<}ANY(子查詢) , SOME與ANY語法一致无午。
  • ALL,如果與子查詢集每個元素的比較都為true指厌,那么結果才能為true踊跟。ALL的語法是:<表達式> { =|<>|!=|>|>=|!>|<|<=|!<} all(子查詢)
  • EXISTS, 如果子查詢返回有值,那么主查詢數(shù)據(jù)返回商玫。
SELECT name 
FROM person
WHERE country_id IN (SELECT country_id FROM country where country_name = '中國');
  1. **返回新數(shù)據(jù)表 **

select返回的數(shù)據(jù)可以當做臨時表用,語法是:(<子查詢>) <臨時表名>, 注意需要加上臨時表名拳昌。示例:

SELECT name
FROM (SELECT name,country_id FROM country where country_name = '中國') a;

多表JOIN查詢

多表查詢,又為連接查詢炬藤,是指在兩張表(多張表)中進行查詢的操作。當查詢的字段來自多個表沈矿,先將表與表之間通過主鍵和外鍵聯(lián)系在一起,再執(zhí)行多表查詢操作羹膳。

語法結構:

SELECT column_name1[,column_name2,...]
FROM table_name_1
[LEFT OR RIGHT OR INNER] JOIN table_name_2 ON conditions
[ [LEFT OR RIGHT OR INNER] JOIN tables_name_3 ON conditons,...]
[WHERE conditions]

其中有兩個關鍵字:
JOIN: 建立表與表進行連接,分為內連接(INNER JOIN)陵像,左外連接(LEFT JOIN),右外連接(RIGHT JOIN), 全連接(FULL JOIN)醒颖。
ON: 表與表之間連接條件。

執(zhí)行順序:

  • FROM

    以兩張表進行連接為例泞歉,對左右兩張表執(zhí)行笛卡爾積冕广,產(chǎn)生第一張臨時表vt1偿洁。行數(shù)為n*m(n為左表的行數(shù)撒汉,m為右表的行數(shù))涕滋;
    笛卡爾積,又叫交叉連接(CROSS JOIN)宾肺, 在數(shù)學中如果兩個集合 X 和 Y ,那么 X 和 Y 的笛卡爾積就是 X 和 Y 的所有可能組合锨用。以兩表連接為例,假設第一張表有n條數(shù)據(jù)增拥,第二張表有m條數(shù)據(jù),根據(jù)笛卡爾方法生成一張臨時表vt1, 行數(shù)為n * m掌栅。

[圖片上傳失敗...(image-8d462b-1692842700357)]

  • ON

根據(jù)ON的條件逐行篩選vt1,將結果聚合猾封,生成新臨時表vt2中;

  • JOIN

添加外部行晌缘,如果指定了LEFT JOIN(LEFT OUTER JOIN),則先遍歷一遍左表的每一行磷箕,其中不在vt2的行會被插入到vt2,該行的剩余字段將被填充為NULL搀捷,形成新臨時表vt3;如果指定了 RIGHT JOIN也是同理嫩舟。但如果指定的是INNER JOIN,則不會添加外部行家厌,上述插入過程被忽略,vt2=vt3(所以INNER JOIN的過濾條件放在ON或WHERE里 執(zhí)行結果是沒有區(qū)別的);

  • WHERE

對vt3進行條件過濾饭于,滿足條件的行被輸出到新臨時表vt4维蒙;

  • SELECT

取出vt4的指定字段到vt5果覆;

1.內連接

特點: 通過指定的條件去匹配兩張表中的數(shù)據(jù), 匹配上就顯示,匹配不上就不顯示,比如通過: 從表的外鍵 = 主表的主鍵方式去匹配局待。

  • 以左表為基準, 匹配右邊表中的數(shù)據(jù),如果匹配的上,就展示匹配到的數(shù)據(jù)

  • 如果匹配不到, 都不展示;

[圖片上傳失敗...(image-71f09d-1692842700357)]

2.左外連接

會讀取左邊數(shù)據(jù)表的全部數(shù)據(jù)钳榨,即使右邊表無對應數(shù)據(jù)。

特點: 左外連接 , 使用 LEFT OUTER JOIN , OUTER 可以省略

①以左表為基準, 匹配右邊表中的數(shù)據(jù),如果匹配的上,就展示匹配到的數(shù)據(jù)

②如果匹配不到, 左表中的數(shù)據(jù)正常展示, 右邊的展示為null.

[圖片上傳失敗...(image-9cd45c-1692842700357)]

3.右外連接

讀取右邊數(shù)據(jù)表的全部數(shù)據(jù)薛耻,即使左邊邊表無對應數(shù)據(jù)。

特點: 右外連接 , 使用 RIGHT OUTER JOIN , OUTER 可以省略

  • 以右表為基準饼齿,匹配左邊表中的數(shù)據(jù),如果能匹配到候醒,展示匹配到的數(shù)據(jù)

  • 如果匹配不到杂瘸,右表中的數(shù)據(jù)正常展示, 左邊展示為null

[圖片上傳失敗...(image-59fac9-1692842700357)]

示例:

//初始數(shù)據(jù)
mysql> SELECT * FROM tcount_tbl;
+---------------+--------------+
| runoob_author | runoob_count |
+---------------+--------------+
| 菜鳥教程  | 10           |
| RUNOOB.COM    | 20           |
| Google        | 22           |
+---------------+--------------+
3 rows in set (0.01 sec)

mysql> SELECT * from runoob_tbl;
+-----------+---------------+---------------+-----------------+
| runoob_id | runoob_title  | runoob_author | submission_date |
+-----------+---------------+---------------+-----------------+
| 1         | 學習 PHP    | 菜鳥教程  | 2017-04-12      |
| 2         | 學習 MySQL  | 菜鳥教程  | 2017-04-12      |
| 3         | 學習 Java   | RUNOOB.COM    | 2015-05-01      |
| 4         | 學習 Python | RUNOOB.COM    | 2016-03-06      |
| 5         | 學習 C      | FK            | 2017-04-05      |
+-----------+---------------+---------------+-----------------+
5 rows in set (0.01 sec)
 

//內連接示例: 
mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count 
FROM runoob_tbl a 
INNER JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
+-------------+-----------------+----------------+
| a.runoob_id | a.runoob_author | b.runoob_count |
+-------------+-----------------+----------------+
| 1           | 菜鳥教程    | 10             |
| 2           | 菜鳥教程    | 10             |
| 3           | RUNOOB.COM      | 20             |
| 4           | RUNOOB.COM      | 20             |
+-------------+-----------------+----------------+
4 rows in set (0.00 sec)
 
//左連接示例
mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count 
FROM runoob_tbl a 
LEFT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
+-------------+-----------------+----------------+
| a.runoob_id | a.runoob_author | b.runoob_count |
+-------------+-----------------+----------------+
| 1           | 菜鳥教程    | 10             |
| 2           | 菜鳥教程    | 10             |
| 3           | RUNOOB.COM      | 20             |
| 4           | RUNOOB.COM      | 20             |
| 5           | FK              | NULL           |
+-------------+-----------------+----------------+
5 rows in set (0.01 sec)

//右連接示例
mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count 
FROM runoob_tbl a 
RIGHT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
+-------------+-----------------+----------------+
| a.runoob_id | a.runoob_author | b.runoob_count |
+-------------+-----------------+----------------+
| 1           | 菜鳥教程    | 10             |
| 2           | 菜鳥教程    | 10             |
| 3           | RUNOOB.COM      | 20             |
| 4           | RUNOOB.COM      | 20             |
| NULL        | NULL            | 22             |
+-------------+-----------------+----------------+
5 rows in set (0.01 sec)

參考:
[1].https://blog.csdn.net/u013158317/article/details/100997948
[2].https://www.runoob.com/mysql/mysql-join.html
[3].https://segmentfault.com/a/1190000015572505
[4].https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末败玉,一起剝皮案震驚了整個濱河市敌土,隨后出現(xiàn)的幾起案子运翼,更是在濱河造成了極大的恐慌,老刑警劉巖血淌,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異悠夯,居然都是意外死亡,警方通過查閱死者的電腦和手機沦补,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夕膀,“玉大人美侦,你說我怎么就攤上這事魂奥〔な#” “怎么了耻煤?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長违霞。 經(jīng)常有香客問我,道長买鸽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任眼五,我火速辦了婚禮,結果婚禮上看幼,老公的妹妹穿的比我還像新娘。我一直安慰自己诵姜,他們只是感情好,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布棚唆。 她就那樣靜靜地躺著,像睡著了一般宵凌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瞎惫,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音瓜喇,去河邊找鬼。 笑死欠橘,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播黍檩,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼刽酱!你這毒婦竟也來了?” 一聲冷哼從身側響起棵里,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎殿怜,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體头谜,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年截驮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片葵袭。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖坡锡,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情娜氏,我是刑警寧澤拳缠,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站窟坐,受9級特大地震影響,放射性物質發(fā)生泄漏哲鸳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一徙菠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧婿奔,春花似錦问慎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽穷劈。三九已至,卻和暖如春歇终,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背评凝。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肥哎,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓篡诽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親杈女。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內容