mysql 联表详解_MySQL多表查询详解下

好好吃饭,好好休息,听着很简单,实际落实缺失不那么容易。

继续回顾MySql的多表查询之1999语法

#二,SQL1999语法

语法:

SELECT 查询列表

FROM 表1 别名 【连接类型】

JOIN 表2 别名

ON 链接条件

【WHERE 筛选条件】

【GROUP BY 分组】

【HAVING 筛选条件】

【ORDER BY 排序列表ASC|DESC】

分类(连接类型):

内连接(★): INNER

外联结

左外(★):LEFT 【OUTER】

右外(★):RIGHT 【OUTER】

全外:FULL 【OUTER】

交叉连接:CROSS

===============================================================================

一、内连接

语法:

SELECT 查询列表

FROM 表1 别名

INNER JOIN 表2 别名

ON 连接条件

【WHERE 筛选条件】

【GROUP BY 分组】

【HAVING 筛选分组】

【ORDER BY 排序列表 ASC|DESC】

分类:

等值

非等值

自连接

特点:

①添加排序,分组,筛选

②INNER可以省略

③筛选条件放在WHERE后面,连接条件放在ON后面,提高分离性,便于阅

读。

④INNER JOIN连接和SQL1992语法中的等值连接效果是一样的,都是查

询交集部分。

#1.等值连接

#案例1.查询员工名,部门名。交换连接条件不影响结果。

SELECT last_name AS 员工名,department_name AS 部门名

FROM employees e

INNER JOIN departments d

ON e.department_id=d.department_id;

SELECT last_name AS 员工名,department_name AS 部门名

FROM employees d

INNER JOIN departments e

ON e.department_id=d.department_id;

b49ad873a80bffab706469f72c40a0ea.png

#案例2.查询名字中包含e的员工和工种名(筛选)

SELECT last_name AS 员工名,job_title AS 工种名

FROM employees e

INNER JOIN jobs j

ON e.job_id=j.job_id

WHERE e.last_name LIKE '%e%';

ea55d0370246f2a5442ee0ff9b080689.png

#案例3.查询部门个数>3的城市名和部门个数。(分组+筛选)

分步:先把每个城市的部门个数查出来,在筛选满足条件的。

SELECT city AS 城市,COUNT(*) AS 个数

FROM locations l

INNER JOIN departments d

ON l.location_id=d.location_id

GROUP BY city

HAVING COUNT(*) > 3;

1a6753a6f840ec4d569b8ccd62ed2247.png

#案例4.查询哪个部门员工个数>3的部门名和员工个数,并按个数降序排序。

分步:

1.查询每个部门的员工个数,

2.在上面的结果上筛选出员工数大于3的记录,

3.把员工数排序

SELECT COUNT(*) AS 员工个数,d.department_name AS 部门名

FROM employees e

INNER JOIN departments d

ON e.department_id=d.department_id

GROUP BY d.department_name

HAVING COUNT(*) > 3

ORDER BY 员工个数 DESC;

98aad032eed75dc54a6503c204e37665.png

#案例5.查询员工名,部门名,工种名,并按部门名降序。三表连接注意条件。

SELECT last_name AS 员工名,department_name AS 部门名,

job_title AS 工种名

FROM employees e

INNER JOIN departments d

ON e.department_id=d.department_id

INNER JOIN jobs j

ON e.job_id=j.job_id

ORDER BY d.department_name DESC;

b1d8fb71b7e3b3dc660fab322a01a707.png

#2.非等值连接。范围(间接)

#案例1.查询员工的工资级别。

SELECT salary AS 月薪,grade_level AS 工资等级

FROM employees e

INNER JOIN job_grades g

ON e.salary BETWEEN g.lowest_sal AND g.highest_sal;

eb59320219966d1772a3a3f697c370b9.png

#案例2.查询每个工资的级别的个数>20,并且按降序排列。

SELECT j.grade_level AS 等级,COUNT(*) 个数

FROM employees e

INNER JOIN job_grades j

ON e.salary BETWEEN j.lowest_sal AND j.highest_sal

GROUP BY j.grade_level

HAVING COUNT(*) > 20

ORDER BY 个数 DESC;

bea6171783872aaa5da4249c11834984.png

#3.自连接

#案例1.查询员工的名字,上级的名字。

SELECT e.last_name AS 员工名,m.last_name AS 上级名

FROM employees e

INNER JOIN employees m

ON e.manager_id=m.employee_id;

821d99fbac4b9bab8e4e05c94bc66af5.png

#案例2.查询员工的名字,上级的名字,名字中包含字符k。

SELECT e.last_name AS 员工名,m.last_name AS 上级名

FROM employees e

INNER JOIN employees m

ON e.manager_id=m.employee_id

WHERE e.last_name LIKE '%k%';

e0b4eee25307e5ccf4eb18af0d699b38.png

#二,外连接

应用场景:用于查询一个表中有,另一个表没有的记录。

特点:

1.外连接的查询结果为主表中的所有记录

如果从表中有和它匹配的,则显示匹配的值

如果从表中没有和它匹配的,则显示null

外连接查询结果=内连接结果+主表中有而从表没有的记录

2.左外连接,LEFT JOIN左边的是主表

右外连接,RIGHT JOIN右边的是主表

3.左外和右外交换两个表的顺序,可以实现同样的效果。

4.全外连接=内连接的结果+表1中有但表2中没有的+表2中有但表一没有的(Mysql不支持)

引入:

SELECT * FROM beauty;

SELECT * FROM boys;

0d6d6d11b3c885337f9bf40e4f0eca7e.png

#引入:查询男朋友不在男神表的女神名

SELECT b.NAME,bo.*

FROM beauty b

LEFT OUTER JOIN boys bo

ON b.boyfriend_id=bo.id;

1a677a38556ababfc341b3e587b9c59b.png

#左外连接

SELECT b.NAME,bo.*

FROM beauty b

LEFT OUTER JOIN boys bo

ON b.boyfriend_id=bo.id

WHERE bo.id IS NULL;

#选从表中的主键列

#右外连接,得到同样的结果。

SELECT b.NAME,bo.*

FROM boys bo

RIGHT OUTER JOIN beauty b

ON b.boyfriend_id=bo.id

WHERE bo.id IS NULL;

696dc6d16e1e2caadd8009028cdcc5f4.png

#把beauty表中的id为10行的boyfriend_id从4改到6.才能查询出如下结果。

SELECT b.*,bo.*

FROM boys bo

LEFT OUTER JOIN beauty b

ON b.boyfriend_id=bo.id

WHERE b.id IS NULL;

241cd5ebc8af420f6f2236e651f8a844.png

#案例1.哪个部门没有员工。

#左外写法

SELECT d.*,e.employee_id

FROM departments d

LEFT OUTER JOIN employees e

ON d.department_id=e.department_id

WHERE e.department_id IS NULL;

==============================

#右外写法

SELECT d.*,e.employee_id

FROM employees e

RIGHT OUTER JOIN departments d

ON d.department_id=e.department_id

WHERE e.employee_id IS NULL;

efeb622aaafb4b5beb5d065e2017b5df.png

#全外连接查出的结果有三部分组成(举例,Mysql不支持)语法结构演示

先把两张表的交集查出来,在把缺失的填充查出来,在把其他无关联的查出来

语法结构示例

SELECT b.*,bo.*

FROM beauty b

FULL OUTER JOIN boys bo

ON b.boyfriend_id=bo.id

#交叉连接,使用1999的语法标准实现的

笛卡尔乘积

SELECT b.*,bo.*

FROM beauty b

CROSS JOIN boys bo;

df6d06e754950e3317b1d9ee4c8d4f7c.png

#SQL1992语法 与 SQL 1999语法 相比

功能:SQL1999支持的较多

可读性:SQL1999实现连接条件和筛选条件的分离,可读性提高

总结:

d002aabc8682a0cab826506b9d85b985.png

SELECT

FROM A

INNER JOIN B

ON A.KEY=B.KEY;

28ba1bf44af4af611d94ffe81c88bad2.png

SELECT

FROM A

LEFT JOIN B

ON A.KEY=B.KEY;

b276301214eada981a7579c0d89dbb57.png

SELECT

FROM A

RIGHT JOIN B

ON A.KEY=B.KEY;

386e6e66e2ab5d90813a404e22c59e63.png

SELECT

FROM A

LEFT JOIN B

ON A.KEY=B.KEY

WHERE B.KEY IS NULL;

7e21e541d8d619bee35653ccac155c91.png

SELECT

FROM A

RIGHT JOIN B

ON A.KEY=B.KEY

WHERE A.KEY IS NULL;

8fe1cc143e1c31ebd050c3655c5fdd1f.png

SELECT

FROM A

FULL JOIN B

ON A.KEY=B.KEY;

2c293e8871dd5451c5bed0444b9cbe7a.png

SELECT

FROM A

FULL JOIN B

ON A.KEY=B.KEY

WHERE A.KEY IS NULL

OR B.KEY IS NULL;

简单的多表查询已结束,相信看到这里的基本对简单多表连接应该手到擒来,至于看不懂的emmm...

用我们杨老师的话就是,自己去写个二三十遍就有感觉了。o(^▽^)o。

高考结束,大学生活的开始,世界是属于你们的倒计时开启了...不管你们选择什么专业,只要是你自己选择的,一定要相信自己会在这个专业留下一笔....。

到此这篇关于MySQL多表查询详解下的文章就介绍到这了,更多相关MySQL多表查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值