真實業務中,資料常分散在多張關聯表中。本文透過「員工基本資料表」與「文章發表記錄表」的經典案例,詳細講解多表查詢的寫法與注意事項。
mytable+----------+------+------------+-----------+
| name | sex | birth | birthaddr |
+----------+------+------------+-----------+
| abccs | f | 1977-07-07 | china |
| mary | f | 1978-12-12 | usa |
| tom | m | 1970-09-02 | usa |
+----------+------+------------+-----------+
titleCREATE 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 指定關聯條件:
-- 查詢 abccs 的姓名、性別、文章標題
SELECT name, sex, title
FROM mytable, title
WHERE name = writer AND name = 'abccs';
結果:
+-------+------+-------+
| name | sex | title |
+-------+------+-------+
| abccs | f | a1 |
| abccs | f | a2 |
+-------+------+-------+
找出文章 a2 的作者出生地與生日:
SELECT title, writer, birthaddr, birth
FROM mytable, title
WHERE mytable.name = title.writer AND title = 'a2';
name),必須寫成 mytable.name、title.name 區分,否則報錯。WHERE 關聯條件會產生笛卡兒積,資料量暴增導致效能災難。INNER JOIN ... ON ...,語義更清晰、易維護。-- 內連結(推薦)
SELECT m.name, m.sex, t.title
FROM mytable m
INNER JOIN title t ON m.name = t.writer
WHERE m.name = 'abccs';