0%

【MySQL】DQL高级

DQL查询语句的高级使用


1 连接查询(级联查询)

1.1 介绍

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

1.2 分类

  • (1)年代划分
  • SQL92(老)
  • SQL99(比较新)
  • (2)连接方式划分
  • 内连接:
    • 等值连接
    • 非等值连接
    • 自连接
  • 外连接
    • 左外连接(左连接)
    • 右外连接(右连接)
  • 全连接(少用)

1.3 笛卡尔乘积现象

  • 当两张表进行连接查询,如果不设置过滤条件(where),查询出来结果个数为x*y
  • 此现象为表连接查询的原理:两张表数据相乘,再进行过滤,最后得出想要的数据
  • 上面连接查询方法为SQL92,不建议使用

1.4 内连接

  • 内连接:假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录都查询出来。AB量表没有主副之分,两张表时平等的
1
2
3
4
select 字段
from1
inner join2
on 连接过滤条件
  • 现在普遍使用SQL99语法,因为99将连接过滤条件和连接后的过滤条件进行了分离,阅读性更好。
  • SQL92若要补充连接后的where条件,只能使用and来连接,使得与连接过滤条件混合
  • inner join 中的 inner 可以省略
  • (1)等值连接
  • 顾名思义:连接过滤条件是用等于表达式进行连接
  • (2)非等值连接
  • 与等值连接相反,连接过滤条件并不是用等于表达式进行连接
  • (3)自连接
  • 自连接的特点:一张表当作两张表来进行连接
  • 例:员工的领导编号 = 领导的员工编号,两个编号都在同一张员工表上
1
2
3
4
select a.ename '员工名', b.ename '领导名'
from emp a
inner join emp b
on a.mgr = b.empno;

1.5 外连接

  • 外连接:假设A和B表进行连接,使用外连接的话,AB两张表有一张表时主表,一张表是附表,主要查询主表中的数据,捎带查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出null与之匹配
1
2
3
4
select 字段
from1
left|right outer join2
on 连接条件
  • 左外连接(左连接):表示左边的表是主表,使用left outer join
  • 右外连接(右连接):表示右边的表时主表,使用right outer join
  • 和内连接一样,外连接的outer可省略

1.6 多表之间连接

1
2
3
4
5
6
7
select 字段
from1
join2
on 连接条件
join3
on 连接条件
...以此类推

2 子查询

2.1 介绍

  • 子查询:select语句当前嵌套select 语句,被嵌套的select语句为子查询
  • 子查询可以出现在select、from、where后面

2.2 where使用子查询

  • 使用思想:将子查询得出的结果理解为一个参数值
  • 例:求出高于平均分的学生信息

2.3 from使用子查询

  • 使用思想:将子查询得出的结果理解为一张新表
  • 例:求出每个班级平均分的分数等级

2.4 select使用子查询

  • 使用思想:将子查询得出的结果理解为一个带逻辑处理的字段
  • 例:求出每个学生的班级名称(连接查询可以解决)

3 Union

  • Union将两张表合成为一张表
  • 合成要求:两张表的列数要一样
  • 合成后的字段名,按照最前面合成的表

4 limit

  • limit非常常用,一般用于分页查询
  • limit是mysql特有的,其他数据库中没有,不通用。(Oracle中有一个相同的机制,叫做rownum)
  • limit作用:取结果集的部分数据
  • limit在sql语句中执行顺序为最后
1
2
3
4
limit [startIndex], [length]

startIndex:数据起始位置
length:数据长度
  • startIndex可以省略,默认从0开始