數據庫Ⅵ——連接查詢(內、外連接查詢)

一、什麼是連接查詢?

連接查詢是將兩個或兩個以上的表按某個條件連接起來,從中選取需要的數據。連接查詢是同時查詢兩個或兩個以上的表時使用的。當不同的表中存在相同意義的字段時,可以通過該字段連接這幾個表

二、內連接查詢

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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章