MySQL连接查询详解及案例

MySQL连接查询详解及案例【目录】

    • 1:什么是连接查询?
    • 2:连接查询的分类:根据表的连接方式来划分,包括:
    • 3:在表连接查询方面有一种现象被称为:笛卡尔积现象。(笛卡尔乘积现象)
    • 4:内连接-等值连接:最大特点:条件是等量关系。
    • 5:内连接-非等值连接:最大的特点是:连接条件中的关系是非等量关系。
    • 6:内连接-自连接:最大的特点:一张表看作两张表,表示自己连接自己。
    • 7:外连接?什么是外连接,和内连接有什么区别?

1:什么是连接查询?

在实际开发中,大部分的情况都不是从单表中查询数据的,一般都是多张表联合查询取出最终的结果。
在实际开发中,一般一个业务都会对应多张表,比如:学生和班级,起码两张表。

2:连接查询的分类:根据表的连接方式来划分,包括:

内连接:
等值连接
非等值连接
自连接
外连接:
左外连接(左连接)
右外连接(右连接)
全连接(很少用!)

3:在表连接查询方面有一种现象被称为:笛卡尔积现象。(笛卡尔乘积现象)

笛卡尔积现象:当两张表进行连接查询的时候,没有任何条件进行限制,
最终的查询结果条数是两张表记录条数的乘积。

怎么避免笛卡尔积现象?当然是加条件过滤。
思考:避免了笛卡尔积现象,会减少记录的匹配次数吗?
不会,次数还是两张表的记录条数的乘积,只不过显示的是有效记录。

4:内连接-等值连接:最大特点:条件是等量关系。

找出每一个员工的部门名称,要求显示员工名和部门名。

#SQL92:以后不用
Select 
e.ename,d.dname
from
Emp e,dept d
where
e.deptno=d.deptno;

#SQL99:常用
Select 
e.ename,d.dname
from 
emp e
inner join 
dept d 
on
(e.deptno=d.deptno);

SQL99语法结构更清晰一些:表的连接条件和后来的where条件分离了。

5:内连接-非等值连接:最大的特点是:连接条件中的关系是非等量关系。

找出每个员工的工资等级,要求显示员工名,工资,工资等级。

Select 
e.ename,e.sal,s.grade
from
emp e
inner join
salgrade s
on
e.sal between s.losal and s.hisal;

6:内连接-自连接:最大的特点:一张表看作两张表,表示自己连接自己。

找出每个员工的上级领导,要求显示员工名和对应的领导名

select
p.ename '员工',e.ename '领导'
from
emp e
inner join 
emp p
on
p.mgr = e.empno;

7:外连接?什么是外连接,和内连接有什么区别?

内连接:假设A和B表进行连接,使用内连接的话,凡是A表和B表能匹配上的记录查询出来,这就是内连接。

外连接:假设A和B进行连接,使用外连接的话,AB两张表中有一张表是主表,一张表是副表,主要查询主表中的数据,捎带着查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出null与之匹配。

外连接的分类?
左外连接(左连接):表示左边这张表是主表。
右外连接(右连接):表示右边这张表是主表。

左连接有右连接的写法,右连接也会有对应的左连接的写法。

案例:找出每个员工的上级领导?

左外连接:

select
a.ename '员工',b.ename '领导'
from
emp a
left outer join 
emp b
on
a.mgr = b.empno;

outer可以省略。

右外连接:

select
a.ename '员工',b.ename '领导'
from
emp b
right join 
emp a
on
a.mgr = b.empno;

外连接最主要的特点:主表的数据无条件的全部查询出来。

案例:找出那个部门没有员工?

select d.* from
dept d
left join
emp e		
on
d.deptno = e.deptno
where
e.ename is null;

5:三张表怎么连接查询?
案例:找出每一个员工的部门名称以及工资等级。

select 
e.ename '员工',d.dname '部门',s.grade '工资等级'
from
emp e
left join
dept d
on
e.deptno = d.deptno
left join
salgrade s
on
e.sal between s.losal and s.hisal;

案例:找出每一个员工的部门名称以及工资等级,以及上级领导。

select 
e.ename '员工',d.dname '部门',s.grade '工资等级',a.ename '领导'
from
emp e
left join
dept d
on
e.deptno = d.deptno
left join
salgrade s
on
e.sal between s.losal and s.hisal
left join
emp a
on
a.empno = e.mgr;

你可能感兴趣的:(MySQL)