select嵌套查詢
- 返回一個值
當子查詢的返回值只有一個時,可以使用比較運算符可以使用比較運算符如=枷遂、<、>箫老、>=、<=耍鬓、!=等將主查詢和子查詢連接起來。示例:
SELECT name,age
FROM person
WHERE age > (SELECT age FROM person WHERE name = '張三');
- 返回一組值
如果子查詢的返回值不止一個牲蜀,而是一個集合時,則不能直接使用比較運算符涣达,可以在比較運算符和子查詢之間插入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 = '中國');
- **返回新數(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