真實業務中數據分散於多張關聯表,本文通過「員工基本信息表」與「文章發表記錄表」實例,演示如何使用隱式內連接(WHERE 條件關聯)完成跨表查詢。
+----------+------+------------+-----------+ | name | sex | birth | birthaddr | +----------+------+------------+-----------+ | abccs | f | 1977-07-07 | china | | mary | f | 1978-12-12 | usa | | tom | m | 1970-09-02 | usa | +----------+------+------------+-----------+
CREATE TABLE title ( writer VARCHAR(20) NOT NULL, title VARCHAR(40) NOT NULL, senddate DATE ); +--------+-------+------------+ | writer | title | senddate | +--------+-------+------------+ | abccs | a1 | 2000-01-23 | | mary | b1 | 1998-03-21 | | abccs | a2 | 2000-12-04 | | tom | c1 | 1992-05-16 | | tom | c2 | 1999-12-12 | +--------+-------+------------+
從語法上,多表查詢在 FROM 列出多表,在 WHERE 指定關聯鍵:
SELECT 欄位列表 FROM 表1, 表2 WHERE 表1.關聯欄位 = 表2.關聯欄位 [AND 其他條件];
SELECT name, sex, title FROM mytable, title WHERE name = writer AND name = 'abccs'; +-------+------+-------+ | name | sex | title | +-------+------+-------+ | abccs | f | a1 | | abccs | f | a2 | +-------+------+-------+
SELECT title, writer, birthaddr, birth FROM mytable, title WHERE mytable.name = title.writer AND title = 'a2'; +-------+--------+-----------+------------+ | title | writer | birthaddr | birth | +-------+--------+-----------+------------+ | a2 | abccs | china | 1977-07-07 | +-------+--------+-----------+------------+
name),必須加表名前綴區分:mytable.name = title.nameINNER JOIN ... ON ... 語法,可讀性更強-- 隱式內連接(舊語法) SELECT m.name, m.sex, t.title FROM mytable m, title t WHERE m.name = t.writer AND m.name = 'abccs'; -- 顯式內連接(推薦) SELECT m.name, m.sex, t.title FROM mytable m INNER JOIN title t ON m.name = t.writer WHERE m.name = 'abccs';
| 連接類型 | 語法 | 結果特點 |
|---|---|---|
| 內連接 | INNER JOIN ... ON | 僅返回雙方匹配的行 |
| 左連接 | LEFT JOIN ... ON | 左表所有行 + 右表匹配行(無匹配則 NULL) |
| 右連接 | RIGHT JOIN ... ON | 右表所有行 + 左表匹配行 |