连接查询(MySQL)

Posted 桃陉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了连接查询(MySQL)相关的知识,希望对你有一定的参考价值。

目录


前言

介绍mysql的连续查询操作我们选择使用可视化软件Navicat,对应的数据库使用了某公司员工数据库,该数据库包含员工信息表、部门信息表、公司地址信息表、工作职业信息表、员工等级表。

当遇到多表查询(查询的字段来自多个表时)就需要用到连接查询,根据前面介绍的知识,直接from对应的表的话,就会遇到笛卡尔乘积现象,这个时候为了解决问题,我们就要通过增加有效的连接手段来避免。

连接查询分类

∙ \\bullet 按功能分类:

∙ \\bullet 按年代分类:sql92标准、sql99标准。其中sql92只支持内连接,sql99支持内连接、左(右)外连接、交叉连接。

sql92连接

内连接显示的是多个表之间交集的部分,n表连接至少需要n-1个连接条件。

等值连接

语法

select 查询列表
from 表1 别名,表2 别名
where 表1.key=表2.key
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】

示例一:查询员工名和对应的部门名

示例二:查询有奖金的员工名、部门名

示例三:查询员工名、部门名和所在城市(三表连接)

特点

∙ \\bullet 为表起别名,方便书写,区分重名的字段,起别名后查询字段只能用别名

∙ \\bullet 两个表的顺序可以调换

∙ \\bullet 可以加筛选where,后面使用and接下一个筛选条件

∙ \\bullet 可以加分组、进行排序,可以实现多表连接

非等值连接

where语句下的连接条件不再是等于号。

示例一:查询员工的工资和工资级别

自连接

在一个表中进行查询,一定要记得起别名来进行区分。

示例一:查询员工名和上级的名称

sql99连接

语法

select 查询列表
from 表1 别名
【连接类型】 join 表2 别名 on 连接条件 【where 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】

注意:多表连接时重复【连接类型】join 表2 别名 on 连接条件

内连接

连接类型为inner,其余于sql92的内连接基本相同。

等值连接

示例一:查询部门个数大于3的城市名和部门个数

示例二:查询员工名、部门名、工种名,并按部门名降序

特点

∙ \\bullet 添加排序、分组、筛选

∙ \\bullet inner可以省略

∙ \\bullet 筛选条件放在where之后,连接条件放在on之后,提高分离性,便于阅读

∙ \\bullet inner join 连接于sql92连接效果相同,都是查询多表的交集部分

非等值连接

示例一:查询员工的工资和工资级别

自连接

示例一:查询员工的名字、上级的名字

外连接

用于查询一个表中有,另一个表中没有的信息。分主从表,显示信息为主表全部信息,当对应的项没有记录时用null填充。左外连接的连接类型为left 【outer】,右外连接的连接类型为right 【outer】,全外连接的连接类型为full 【outer】

左(右)外连接

左外、右外连接的唯一区别是表示的主从表不同。即左外连接left左边的表为主表,右边的表为从表;右外连接右边的表为主表,左边的表为从表。

示例一:查询哪个部门没有员工

全外连接

mysql不支持全外连接,所以这里简单的介绍一下全外连接的功能。

全外连接=内连接的结果+表1中有但表2没有的+表2中有表1中没有的

交叉连接

交叉连接的连接类型为cross,不加on连接条件,最终实现的结果相当于笛卡尔集。

以上是关于连接查询(MySQL)的主要内容,如果未能解决你的问题,请参考以下文章

mysql树形结构的查询案例

MySQL连接查询

mysql里查询时怎么把一张表里的上级ID显示为上级名称?

MySQL数据库多表查询

mysql中的连接查询

MySQL数据库多表查询