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

作者:pure3417 时间:2024-01-19 04:27:32 

多表连接的基本语法

多表连接,就是将几张表拼接为一张表,然后进行查询


select 字段1, 字段2, ...
from 表1 {inner|lift|right} join 表2
on 连接条件;

有如下两张表:部门表和员工表

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

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

交叉连接和笛卡尔积现象

交叉连接

交叉连接,又名无条件内连接/笛卡尔连接

第一张表种的每一项会和另一张表的每一项依次组合


select * from employee,department;

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

上述结果肯定不是我们想晓得的,左表中每一个人都有4个部门,仔细观察这4条记录,正好是左表每一条记录和右表一一匹配后的结果。

笛卡尔积现象

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

笛卡尔积现象产生的原因:两张表没有有效的连接条件。既然你没有连接条件,本表中的第一行肯定是能和另外表中的所有行进行一一匹配,同理,本表中的第二行肯定是能和另外表中的所有行进行一一匹配,以此类推,本表中的最后一行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;

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

由于部门表中没有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;

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

右外连接

跟左连接正好相反,右连接(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;

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

全外连接

全外连接,在内连接的基础上,展示左右表的所有的记录,而左右表中缺省记录以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;

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

子查询

  • 子查询是将一个查询语句嵌套再另一个查询语句中的查询方式:

  • 子查询的内层查询结果,可以作为外层查询语句提供查询条件。

  • 子查询中可以包含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中连接查询和子查询的问题

来源:https://www.cnblogs.com/pure3417/p/15225630.html

标签:MySQL,连接查询,子查询
0
投稿

猜你喜欢

  • Mysql 5.7.17安装后登录mysql的教程

    2024-01-15 04:28:38
  • vue中typescript装饰器的使用方法超实用教程

    2024-05-28 15:47:06
  • Python实现一维插值方法的示例代码

    2022-04-14 02:49:10
  • Python实现统计单词出现的个数

    2022-11-01 12:19:30
  • Request.ServerVariables("HTTP_REFERER")的用法

    2008-06-19 13:33:00
  • 浅谈tf.train.Saver()与tf.train.import_meta_graph的要点

    2022-06-02 09:59:32
  • document.getElementById的简写方式

    2010-06-21 10:44:00
  • JavaScript/TypeScript中==和===的区别详解

    2024-04-25 13:14:39
  • Vue学习之路之登录注册实例代码

    2024-04-27 16:08:32
  • 使用python3 实现插入数据到mysql

    2024-01-15 07:53:22
  • Linux 7下脚本安装配置oracle 11g r2教程

    2024-01-13 13:35:56
  • Python中的lambda和apply用法及说明

    2023-08-12 14:56:46
  • JavaScript中layim之整合右键菜单的示例代码

    2024-04-18 09:42:29
  • python 实现打印扫描效果详情

    2022-04-20 18:29:50
  • Python字符串切片操作知识详解

    2022-05-17 07:04:35
  • Python字符串详细介绍

    2023-08-29 09:15:09
  • php动态生成函数示例

    2024-05-02 17:19:00
  • php实现简单的权限管理的示例代码

    2024-05-05 09:18:37
  • 关于base64编码的原理及实现方法分享

    2023-08-31 07:34:40
  • numpy:找到指定元素的索引示例

    2022-05-18 22:29:37
  • asp之家 网络编程 m.aspxhome.com