MySQL之连接查询和子查询
2021/9/4 2:05:55
本文主要是介绍MySQL之连接查询和子查询,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
多表连接的基本语法
多表连接,就是将几张表拼接为一张表,然后进行查询
select 字段1, 字段2, ... from 表1 {inner|lift|right} join 表2 on 连接条件;
有如下两张表:部门表和员工表
交叉连接和笛卡尔积现象
交叉连接
交叉连接,又名无条件内连接/笛卡尔连接
第一张表种的每一项会和另一张表的每一项依次组合
select * from employee,department;
上述结果肯定不是我们想晓得的,左表中每一个人都有4个部门,仔细观察这4条记录,正好是左表每一条记录和右表一一匹配后的结果。
笛卡尔积现象
笛卡尔积现象产生的原因:两张表没有有效的连接条件。既然你没有连接条件,本表中的第一行肯定是能和另外表中的所有行进行一一匹配,同理,本表中的第二行肯定是能和另外表中的所有行进行一一匹配,以此类推,本表中的最后一行m也可以和另外表中的所有行进行一一匹配。若另外一张表有n行,那么最后显示的行数,肯定就是m*n行了。
如果不想产生笛卡尔积现象,就需要添加有效的表连接条件。拿上述例子来说,左表dep_id只有和右表id相等时,才代表他们的部门。
内连接
内连接(INNER JOIN)是找几张表的交集,即根据条件筛选出来正确的结果。
select emp.id,emp.name,emp.age,emp.dep_id,emp.gender,dep.id,dep.name from employee as emp INNER JOIN department as dep on emp.dep_id=dep.id;
由于部门表中没有id=5
的部门,所以员工表dep_id=5
的这条记录没有返回;而由于行政部
没有员工,所以这条记录也没返回。
外连接
左外连接
左连接(left join)是以左表为准,如果右表中没有合适的记录,用NULL
补全;其本质是在内连接的基础上增加左表有结果而右表没有的记录(内连接时,这种情况的记录会忽略)。
select emp.id,emp.name,emp.age,emp.dep_id,emp.gender,dep.id,dep.name from employee as emp left join department as dep on emp.dep_id=dep.id;
右外连接
跟左连接正好相反,右连接(right join)是以右表为准,如果左表中某些字段没有合适的结果,用NULL
补全;其本质是在内连接的基础上增加右表有结果而左表没有的记录(内连接时,这种情况的记录会忽略)。
select emp.id,emp.name,emp.age,emp.dep_id,emp.gender,dep.id,dep.name from employee as emp right join department as dep on emp.dep_id=dep.id;
全外连接
全外连接,在内连接的基础上,展示左右表的所有的记录,而左右表中缺省记录以NULL
补全。
MySQL中并没有全外连接的FULL JOIN
语法,而是借助UNION/UNION ALL
语句实现。
UNION
和UNION ALL
的区别,UNION
具有去重功能。
select emp.id,emp.name,emp.age,emp.dep_id,emp.gender,dep.id,dep.name from employee as emp left join department as dep on emp.dep_id=dep.id union select emp.id,emp.name,emp.age,emp.dep_id,emp.gender,dep.id,dep.name from employee as emp right join department as dep on emp.dep_id=dep.id;
子查询
子查询是将一个查询语句嵌套再另一个查询语句中的查询方式:
- 子查询的内层查询结果,可以作为外层查询语句提供查询条件。
- 子查询中可以包含
IN
、NOT IN
、AND
、ALL
、EXISTS
、NOT EXISTS
等关键字。 - 子查询中还可以包含比较运算符,如
=
、!=
、>
、<
等。
-- 查询平均年龄在20以上的部门名称 select name from department where id in ( select dep_id from employee group by dep_id having avg(age) > 20); -- 查询财务部员工姓名 select name from employee where dep_id in ( select id from department where name='财务部'); -- 查询所有大于平均年龄的员工的年龄和姓名 select name,age from employee where age > ( select avg(age) from employee);
这篇关于MySQL之连接查询和子查询的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-16MySQL资料:新手入门教程
- 2024-11-16MySQL资料:新手入门教程
- 2024-11-15MySQL教程:初学者必备的MySQL数据库入门指南
- 2024-11-15MySQL教程:初学者必看的MySQL入门指南
- 2024-11-04部署MySQL集群项目实战:新手入门教程
- 2024-11-04如何部署MySQL集群资料:新手入门指南
- 2024-11-02MySQL集群项目实战:新手入门指南
- 2024-11-02初学者指南:部署MySQL集群资料
- 2024-11-01部署MySQL集群教程:新手入门指南
- 2024-11-01如何部署MySQL集群:新手入门教程