数据库Ⅵ——连接查询(内、外连接查询)

一、什么是连接查询?

连接查询是将两个或两个以上的表按某个条件连接起来,从中选取需要的数据。连接查询是同时查询两个或两个以上的表时使用的。当不同的表中存在相同意义的字段时,可以通过该字段连接这几个表

二、内连接查询

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