MySQL中连接查询和子查询的问题

 更新时间:2021年09月04日 08:39:16   作者:pure3417  
这篇文章主要介绍了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语句实现。

UNIONUNION 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;

子查询

  • 子查询是将一个查询语句嵌套再另一个查询语句中的查询方式:
  • 子查询的内层查询结果,可以作为外层查询语句提供查询条件。
  • 子查询中可以包含INNOT INANDALLEXISTSNOT 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中连接查询和子查询的问题的文章就介绍到这了,更多相关MySQL连接查询和子查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql5.7.19 winx64安装配置方法图文教程(win10)

    mysql5.7.19 winx64安装配置方法图文教程(win10)

    这篇文章主要为大家详细介绍了mysql5.7.19 winx64安装配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • 一文掌握MySQL锁表方法

    一文掌握MySQL锁表方法

    在MySQL中,可以使用多种方法来锁定表,这些方法取决于你的具体需求,比如是锁定整个表还是行级锁,本文给大家分享一些常用的MySQL锁表方法,感兴趣的朋友跟随小编一起看看吧
    2024-02-02
  • mysql 5.6.13 免安装版配置方法详解

    mysql 5.6.13 免安装版配置方法详解

    这篇文章主要介绍了mysql 5.6.13 免安装版配置的方法,今天小编把配置方法分享到脚本之家平台供大家参考下
    2016-10-10
  • Mysql5.7.14 linux版密码忘记完美解决办法

    Mysql5.7.14 linux版密码忘记完美解决办法

    这篇文章主要介绍了Mysql5.7.14 linux版密码忘记完美解决办法,需要的朋友可以参考下
    2017-08-08
  • mysql5.5中文乱码问题解决的有用方法

    mysql5.5中文乱码问题解决的有用方法

    在使用MYSQL时遇到中文乱码的问题,表现为插入数据后查询时输出为??(乱码),下面这篇文章主要给大家介绍了关于mysql5.5中文乱码问题解决的有用方法,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • mysql函数全面总结

    mysql函数全面总结

    这篇文章主要介绍了mysql函数,下面文章从MySQL常用的函数开始介绍、还有数值函数,利用举例说明的形式展开内容,需要的朋友可以参考一下
    2021-11-11
  • MySQL select、insert、update批量操作语句代码实例

    MySQL select、insert、update批量操作语句代码实例

    这篇文章主要介绍了MySQL select、insert、update批量操作语句代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 修改MySQL8.0 默认的数据目录(快捷操作无配置)

    修改MySQL8.0 默认的数据目录(快捷操作无配置)

    这篇文章主要介绍了修改MySQL8.0 默认的数据目录(快捷操作无配置),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • mysql 8.0.20 winx64.zip压缩版安装配置方法图文教程

    mysql 8.0.20 winx64.zip压缩版安装配置方法图文教程

    这篇文章主要为大家详细介绍了mysql 8.0.20 winx64.zip压缩版安装配置方法图文教程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • MySQL数据库中表的操作详解

    MySQL数据库中表的操作详解

    这篇文章主要为大家详细介绍了MySQL数据库中表常用的一些操作方法,文中的示例代码讲解详细, 对我们学习MySQL有一定帮助,需要的可以参考一下
    2022-08-08

最新评论