连接查询(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)的主要内容,如果未能解决你的问题,请参考以下文章