目錄
1 簡介
2 內連接查詢
2.1 內連接語法
2.2 內連接練習
3 外連接查詢
3.1 外連接語法
3.2 外連接練習
4 總結
1 簡介
連接的本質就是把各個表中的記錄都取出來依次匹配的組合加入結果集并返回給用戶。我們把 t1 和 t2 兩個表連接起來的過程如下圖所示:
在 MySQL 中多表查詢分為連接查詢和子查詢,而連接查詢又分為內連接查詢和外連接查詢,外連接查詢的方式有左外連接查詢和右外連接查詢。
2 內連接查詢
2.1 內連接語法
內連接查詢分為隱式內連接查詢和顯式內連接查詢,表示查詢 A 集合和 B 集合的交集。
語法:
-- 隱式內連接查詢
SELECT?字段列表?FROM?表1,表2…?WHERE?條件;
-- 顯示內連接查詢
SELECT?字段列表?FROM?表1?[INNER]?JOIN?表2?ON?條件;
2.2 內連接練習
練習一:查詢每名同學的姓名、成績
student 表:
+------+--------+------------+-------+
| s_id | s_name | s_birth ? ?| s_sex |
+------+--------+------------+-------+
| 01 ? | 趙雷 ? | 1990-01-01 | 男 ? ?|
| 02 ? | 錢電 ? | 1990-12-21 | 男 ? ?|
| 03 ? | 孫風 ? | 1990-05-20 | 男 ? ?|
| 04 ? | 李云 ? | 1990-08-06 | 男 ? ?|
| 05 ? | 周梅 ? | 1991-12-01 | 女 ? ?|
| 06 ? | 吳蘭 ? | 1992-03-01 | 女 ? ?|
| 07 ? | 鄭竹 ? | 1989-07-01 | 女 ? ?|
| 08 ? | 王菊 ? | 1990-01-20 | 女 ? ?|
+------+--------+------------+-------+score 表:
+------+------+---------+
| s_id | c_id | s_score |
+------+------+---------+
| 01 ? | 01 ? | ? ? ?80 |
| 01 ? | 02 ? | ? ? ?90 |
| 01 ? | 03 ? | ? ? ?99 |
| 02 ? | 01 ? | ? ? ?70 |
| 02 ? | 02 ? | ? ? ?60 |
| 02 ? | 03 ? | ? ? ?80 |
| 03 ? | 01 ? | ? ? ?80 |
| 03 ? | 02 ? | ? ? ?80 |
| 03 ? | 03 ? | ? ? ?80 |
| 04 ? | 01 ? | ? ? ?50 |
| 04 ? | 02 ? | ? ? ?30 |
| 04 ? | 03 ? | ? ? ?20 |
| 05 ? | 01 ? | ? ? ?76 |
| 05 ? | 02 ? | ? ? ?87 |
| 06 ? | 01 ? | ? ? ?31 |
| 06 ? | 03 ? | ? ? ?34 |
| 07 ? | 02 ? | ? ? ?89 |
| 07 ? | 03 ? | ? ? ?98 |
+------+------+---------+Course 表:
+------+--------+------+
| c_id | c_name | t_id |
+------+--------+------+
| 01 ? | 語文 ? | 02 ? |
| 02 ? | 數學 ? | 01 ? |
| 03 ? | 英語 ? | 03 ? |
+------+--------+------+
編寫一個 SQL 查詢 學生姓名、課程名、成績
mysql>?SELECT-> ? ? t2.s_name,-> ? ? t3.c_name,-> ? ? t1.s_score->?FROM-> ? ? score t1-> ? ??JOIN?student t2?ON?t1.s_id = t2.s_id-> ? ??JOIN?Course t3?ON?t1.c_id = t3.c_id;+--------+--------+---------+
| s_name | c_name | s_score |
+--------+--------+---------+
| 趙雷 ? | 語文 ? | ? ? ?80 |
| 趙雷 ? | 數學 ? | ? ? ?90 |
| 趙雷 ? | 英語 ? | ? ? ?99 |
| 錢電 ? | 語文 ? | ? ? ?70 |
| 錢電 ? | 數學 ? | ? ? ?60 |
| 錢電 ? | 英語 ? | ? ? ?80 |
| 孫風 ? | 語文 ? | ? ? ?80 |
| 孫風 ? | 數學 ? | ? ? ?80 |
| 孫風 ? | 英語 ? | ? ? ?80 |
| 李云 ? | 語文 ? | ? ? ?50 |
| 李云 ? | 數學 ? | ? ? ?30 |
| 李云 ? | 英語 ? | ? ? ?20 |
| 周梅 ? | 語文 ? | ? ? ?76 |
| 周梅 ? | 數學 ? | ? ? ?87 |
| 吳蘭 ? | 語文 ? | ? ? ?31 |
| 吳蘭 ? | 英語 ? | ? ? ?34 |
| 鄭竹 ? | 數學 ? | ? ? ?89 |
| 鄭竹 ? | 英語 ? | ? ? ?98 |
+--------+--------+---------+
3 外連接查詢
3.1 外連接語法
外連接查詢分為左外連接查詢和右外連接查詢。
-
左外連接查詢:相當于查詢 A 表所有數據和交集部分數據。
-
右外連接查詢:相當于查詢 B 表所有數據和交集部分數據。
語法:
-- 左外連接
SELECT?字段列表?FROM?表1?LEFT?[OUTER]?JOIN?表2?ON?條件;
-- 右外連接
SELECT?字段列表?FROM?表1?RIGHT?[OUTER]?JOIN?表2?ON?條件;
3.2 外連接練習
練習一:連續出現的數字
表:Logs
+-------------+---------+
| Column Name | Type ? ?|
+-------------+---------+
| id ? ? ? ? ?| int ? ? |
| num ? ? ? ? | varchar |
+-------------+---------+
在 SQL 中,id 是該表的主鍵。
id 是一個自增列。找出所有至少連續出現三次的數字。
返回的結果表中的數據可以按 任意順序 排列。
結果格式如下面的例子所示:示例 1:
輸入:
Logs 表:
+----+-----+
| id | num |
+----+-----+
| 1 ?| 1 ? |
| 2 ?| 1 ? |
| 3 ?| 1 ? |
| 4 ?| 2 ? |
| 5 ?| 1 ? |
| 6 ?| 2 ? |
| 7 ?| 2 ? |
+----+-----+
輸出:
Result 表:
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1 ? ? ? ? ? ? ? |
+-----------------+
解釋:1 是唯一連續出現至少三次的數字。
找出所有至少連續出現三次的數字:
select?distinct?t1.num?as?ConsecutiveNums
fromLogs?t1?
leftjoinlogs?t2?on?t1.num = t2.num?and?t1.id = t2.id-1
leftjoinlogs?t3?on?t1.num = t3.num?and?t2.id = t3.id-1
where?t3.num?isnotnull;
4 總結
本文介紹了MySQL中的連接查詢,包括內連接和外連接的使用方法。內連接查詢用于獲取兩個表中交集部分的數據,分為隱式內連接和顯式內連接兩種方式。通過內連接,我們可以實現多表聯合查詢,如查詢學生的姓名、課程名稱和成績。外連接查詢分為左外連接和右外連接,左外連接返回左表的所有數據和右表匹配的數據,而右外連接則返回右表的所有數據和左表匹配的數據。通過外連接,我們能夠處理一些不完全匹配的數據,比如查找連續出現至少三次的數字。通過本文的練習,讀者可以掌握多表查詢的基本技巧,并理解連接查詢的實際應用。