1. 程式人生 > 其它 >MySQL入門基礎4-多表查詢(內連線,左右外連線,全連線)

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;