(mysql学习笔记6)查询结果的去重、连接查询(笛卡尔积现象)

1、关于查询结果的去重

select distinct job from emp;//distinct 关键字去除重复记录

image

select ename,distinct job from emp;//error

distinct 只能出现在所有字段的最前面

image

统计岗位的数量

select count(distinct job) from emp;

image

2、连接查询

什么是连接查询

在实际开发中,大部分的情况下都不是从单表中查询数据,一般都是多张表联合查询取出最终的结果

在实际开发中,一般一个业务都会对应多张表,比如:学生和老师,起码两张表。

将所有的信息存储在一张表中,数据会存在大量的重复,导致数据的冗(rong)余。

连接查询的分类

根据语法出现的年份来划分:

      SQL92(一些老的DBA可能还在使用这种语法。DBA: DataBase Administrator,数据管理员)

      SQL99(比较新的语法)

根据表的连接方式来划分

      内连接

      等值连接

      非等值连接

      自连接

      外连接

            左外连接(左连接)

            右外连接(右连接)

      全连接(这个基本不用,可以不学)

3、笛卡尔积现象(笛卡尔乘积现象)

(这是一种在表的连接查询出现的现象

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

select ename,dname from emp,dept;

image

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

表的别名

select e.ename,d.dname from emp e,dept d;

表的别名有什么好处

  • 执行效率高
  • 可读性高

避免笛卡尔积现象(加条件过滤)

不会减少记录的匹配记录,只是显示有效的记录

4、内连接之等值连接

最大特定:条件是等量关系

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

select

   e.ename,d.dname

from

   emp e,dept d

where

   e.deptno = d.deptno;//SQL92,以后不用

image

select

    e.ename,d.dname

from

    emp e

join

    dept d

on

    e.deptno = d.deptno;//SQL99,常用的

image

select

    e.ename,d.dname

from

    emp e

inner join //inner可以省略,带着inner目的是可读性好一些

    dept d

on

    e.deptno = d.deptno;

image

语法

      ···

      A

join

      B

on

      连接条件

where

      ···

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

5、内连接之非等值连接

最大的特定:连接条件中的关系是非等值连接

找出一个员工的部门名称,要求显示员工号、工资、工资等级

select

   e.ename,e.sal,s.grade

from

   emp e

join

   salgrade s

on

   e.sal between s.losal and s.hisal;

image

 //inner可省

select

   e.ename,e.sal,s.grade

from

   emp e

inner join

   salgrade s

on

   e.sal between s.losal and s.hisal;

image

6、自连接

最大的特点是:一张表看作两张表。自己连接自己

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

image

员工的领导编号 = 领导的员工编号

//内连接

select

   a.ename as '员工名' ,b.ename as '领导名'

from

  emp a

inner join

   emp b

on

   a.mgr = b.empno;

image

7、外连接

什么是外连接,和内连接的区别

内连接:

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

     AB表没有主副之分,都是平等的

外连接:

      假设A表和B表进行连接,使用外连接的话,AB两张表中有一张是主表,一张表是副表主要查询主表中的

      数据,捎带着查询副表,当副表中的数据没有和主表上的数据匹配上,副表自动模拟出NULL与之匹配

外连接的分类

      左外连接(左连接):表示左边这张表是主表

      右外连接(右连接):表示邮编这张表是主表

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

找出每个员工的上级领导(所有的员工必须全部查询出来)

//外连接(左外连接/左连接)

select

   a.ename '员工',b.ename'领导'

from

   emp a

left join

   emp b

on

   a.mgr = b.empno;

//outer可以省略

select

   a.ename '员工',b.ename'领导'

from

   emp a

left outer join

   emp b

on

   a.mgr = b.empno;

image

//外连接:(右外连接/右连接)

select

    a.ename '员工',b.ename'领导'

from

   emp a

right join

   emp b

on

   a.mgr = b.empno;

//outer可以省略

select

    a.ename '员工',b.ename'领导'

from

   emp a

right outer join

   emp b

on

   a.mgr = b.empno;

image

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

找出哪个部门没有员工

select

   d.*

from

   emp e

right join

   dept d

on

   e.deptno = d.deptno

where

   e.empno is null;

image

8、三张以上表连接查询

      ···

      A

join

      B

join

      C

on

      ···

A表先和B表进行表连接,连接之后A表再继续和C表连接

找出每一个员工的部门名称以及工资等级

select

   e.ename,d.dname,s.grade

from

   emp e

join

  dept d

on

   e.deptno = d.deptno

join

   salgrade s

on

   e.sal between s.losal and s.hisal;

image

找出每一个员工的部门名称、工资等级以及上级领导

select

   e.ename '员工',d.dname,s.grade,e1.ename '领导'

from

   emp e

join

  dept d

on

   e.deptno = d.deptno

join

    salgrade s

on

  e.sal between s.losal and s.hisal

left join

   emp e1

on

    e.mgr = e1.empno;

image

 


版权声明:本文为qq_43791665原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。