MySQL入門基礎4-多表查詢(內連線,左右外連線,全連線)
多表查詢
多表還是單表
問題:軟體中不同模組,不同型別的資料怎麼儲存?
一個表:欄位過多、表資料龐大,資料冗餘、維護,無法體現資料間豐富的關係
多個表:怎麼保持表與表之間的聯絡?
示例1:
SELECT member.regName,member.mobilephone,loan.amount
FROM member,loan
WHERE member.id = loan.memberID
AND member.id = 1
內連線:
INNER JOIN
內連線,也稱為等值連線
顯示左表及右表符合連線條件(欄位匹配關係)的記錄
將兩張表的列組合在一起,產出新的結果集,結果集是兩個表的公共部分
不使用ON語法時,join、inner join、逗號、cross join結果相同,都是取兩個表的笛卡爾積
-- INNER JOIN
SELECT * FROM boys INNER JOIN girls;
SELECT * FROM boys,girls ORDER BY boyNum ASC;
SELECT * FROM boys INNER JOIN girls WHERE boys.matchNum = girls.matchNum;
SELECT * FROM boys,girls WHERE boys.matchNum = girls.matchNum
-- ON/USING的方式
SELECT * FROM boys INNER JOIN girls ON boys.matchNum = girls.matchNum;
SELECT * FROM boys INNER JOIN girls USING(matchNum);
左/右外連線LEFT/RIGHT JOIN:
讀取左表全部資料,即便右表沒有對應資料
如果讀取右邊沒有匹配的記錄,右側結果集欄位講為null
A LEFT JOIN B:以A表為基礎連線B查詢結果
查詢出所有A記錄
SELECT * FROM A LEFT JOIN B ON A.key=B.key;
查詢出不在B表中的A記錄
SELECT * FROM A LEFT JOIN B ON A.key=B.key WHERE B.key IS NULL;
SELECT boys.boyNum,boys.matchNum from girls RIGHT JOIN boys ON boys.matchNum = girls.matchNum WHERE girls.matchNum is NULL;
SELECT boys.boyNum,boys.matchNum from boys LEFT JOIN girls ON boys.matchNum = girls.matchNum WHERE girls.matchNum is NULL;
全連線:
完全連線返回左表和右表中的所有行
用UNION ALL的方式達到FULL JOIN的效果
查詢A表B表所有資料
SELECT * FROM A LEFT JOIN B ON A.key=B.key
UNION ALL
SELECT * FROM A RIGHT JOIN B ON A.key=B.key;
查詢A表B表公共資料
SELECT * FROM A LEFT JOIN B ON A.key=B.key WHERE B.key IS NULL
UNION ALL
SELECT * FROM A RIGHT JOIN B ON A.key=B.key WHERE A.key IS NULL;
UNION ALL/UNION(去重重複)
SELECT * FROM girls FULL JOIN boys;
SELECT girlNum 嘉賓編號,matchNum 牽手標號 FROM girls
UNION
SELECT boyNum 嘉賓編號,matchNum 牽手標號 FROM boys;
SELECT girls.girlNum 嘉賓編號,girls.matchNum 牽手標號 FROM girls LEFT JOIN boys
ON girls.matchNum = boys.matchNum WHERE boys.boyNum IS NOT NULL
UNION
SELECT boys.boyNum 嘉賓編號,boys.matchNum 牽手標號FROM boys LEFT JOIN girls ON boys.matchNum = girls.matchNum WHERE girls.girlNum IS NOT NULL;