文章目錄
一、什麼是連接查詢?
連接查詢是將兩個或兩個以上的表按某個條件連接起來,從中選取需要的數據。連接查詢是同時查詢兩個或兩個以上的表時使用的。當不同的表中存在相同意義的字段時,可以通過該字段連接這幾個表
二、內連接查詢
1.簡介
- JOIN|CROSS JOIN| INNER JOIN
- 通過ON連接條件
- 顯示兩個表中符合連接條件的記錄
2.測試內連接查詢
– 查詢cms_user id,username
- provinces,proName;相當於for循環嵌套,不是我們想要的結果
SELECT cms_user.id,username,proName FROM cms_user,provinces;
(1)通過=鏈接
- cms_user的proId對應省份表中的id,可以解決上面出現的問題
SELECT cms_user.id,username,proName FROM cms_user,provinces
WHERE cms_user.proId=provinces.id;
結果:
+----+----------+---------+
| id | username | proName |
+----+----------+---------+
| 1 | 張三 | 北京 |
| 2 | 張三丰 | 上海 |
| 3 | 章子怡 | 深圳 |
| 4 | long | 廣州 |
| 5 | ring | 上海 |
| 6 | queen | 深圳 |
| 7 | king | 重慶 |
| 8 | blek | 北京 |
| 9 | rose | 上海 |
| 10 | lily | 上海 |
| 11 | john | 上海 |
| 12 | test1 | 北京 |
+----+----------+---------+
(2)通過 JOIN|CROSS JOIN| INNER JOIN 連接
- 查詢cms_user表中id,username,email,sex;查詢provinces表proName
SELECT u.id,u.username,u.email,u.sex,p.proName
FROM cms_user AS u
INNER JOIN provinces AS p
ON u.proId=p.id;
SELECT u.id,u.username,u.email,u.sex,p.proName
FROM provinces AS p
CROSS JOIN cms_user AS u
ON u.proId=p.id;
SELECT u.id,u.username,u.email,u.sex,p.proNam
FROM provinces AS p
JOIN cms_user AS u
ON u.proId=p.id;
- 查詢cms_user id,username,sex;
查詢provinces proName;
條件是cms_user的性別爲男的用戶,根據proName分組
SELECT u.id,GROUP_CONCAT(u.username),u.sex,p.proName
FROM cms_user AS u
JOIN
provinces AS p
ON u.proId=p.id
WHERE u.sex='男'
GROUP BY p.proName;
- 對分組結果進行篩選,選出組中人數>=1的;
按照id升序排列,限制顯示條數 前2條
SELECT u.id,u.username,u.sex,p.proName,COUNT(*) AS totalUsers,GROUP_CONCAT(username)
FROM cms_user AS u
JOIN
provinces AS p
ON u.proId=p.id
WHERE u.sex='男'
GROUP BY p.proName
HAVING COUNT(*)>=1
ORDER BY u.id ASC
LIMIT 0,2;
- 查詢cms_news中的id,title;查詢cms_cate 中的cateName
SELECT n.id,n.title,c.cateName FROM
cms_news AS n
JOIN
cms_cate AS c
ON n.cId=c.id;
– 查詢cms_news 中id,title;查詢cms_admin中username,role
SELECT n.id,n.title,a.username,a.role
FROM
cms_news AS n
JOIN
cms_admin AS a
ON n.aId=a.id;
三、外連接查詢
1.簡介
- 左外連接:LEFT [OUTER] JOIN顯示左表的全部記錄及右表符合連接條件的記錄
- 右外連接:RIGHT [OUTER] JOIN 顯示右表的全部記錄以及左表符合條件的記錄
2.測試外連接
(1)內連接的侷限
- 插入錯誤的數據
INSERT cms_user(username,password,regTime,proId)
VALUES('TEST2','TEST2','1381203974',20);
省份只有五個,proId=20明顯是匹配不到結果的
在內連接查詢中是查不到新插入的TEST2這個數據的
(2)左外連接
- 主表是 cms_user
在外連接查詢中是可以查到新插入的TEST2這個數據的,省份欄顯示NULL
SELECT u.id,u.username,u.email,u.sex,p.proName
FROM cms_user AS u
LEFT JOIN provinces AS p
ON u.proId=p.id;
結果:
+----+----------+-------------+------+---------+
| id | username | email | sex | proName |
+----+----------+-------------+------+---------+
| 1 | 張三 | [email protected] | 男 | 北京 |
| 2 | 張三丰 | [email protected] | 女 | 上海 |
| 3 | 章子怡 | [email protected] | 男 | 深圳 |
| 4 | long | [email protected] | 女 | 廣州 |
| 5 | ring | [email protected] | 男 | 上海 |
| 6 | queen | [email protected] | 女 | 深圳 |
| 7 | king | [email protected] | 男 | 重慶 |
| 8 | blek | [email protected] | 女 | 北京 |
| 9 | rose | [email protected] | 男 | 上海 |
| 10 | lily | [email protected] | 女 | 上海 |
| 11 | john | [email protected] | 保密 | 上海 |
| 12 | test1 | [email protected] | 保密 | 北京 |
| 13 | TEST2 | [email protected] | NULL | NULL |
+----+----------+-------------+------+---------+
- 主表是 provinces
查不到TEST2,因爲右表cms_user中TEST2(proId=20)不符合條件
SELECT u.id,u.username,u.email,u.sex,p.proName
FROM provinces AS p
LEFT JOIN cms_user AS u
ON u.proId=p.id;
(3)右外連接
主表爲cms_user,誰在最右邊誰是主表
SELECT u.id,u.username,u.email,u.sex,p.proName
FROM provinces AS p
RIGHT JOIN cms_user AS u
ON u.proId=p.id;