DQL查询语句的高级使用
1 连接查询(级联查询)
1.1 介绍
- 在实际开发中,大部分的情况下都不是从单表中查询数据,一般都是多张变联合查询取出最终的结果
1.2 分类
- (1)年代划分
- SQL92(老)
- SQL99(比较新)
- (2)连接方式划分
- 内连接:
- 等值连接
- 非等值连接
- 自连接
- 外连接
- 左外连接(左连接)
- 右外连接(右连接)
- 全连接(少用)
1.3 笛卡尔乘积现象
- 当两张表进行连接查询,如果不设置过滤条件(where),查询出来结果个数为x*y
- 此现象为表连接查询的原理:两张表数据相乘,再进行过滤,最后得出想要的数据
- 上面连接查询方法为SQL92,不建议使用
1.4 内连接
- 内连接:假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录都查询出来。AB量表没有主副之分,两张表时平等的
1 | select 字段 |
- 现在普遍使用SQL99语法,因为99将连接过滤条件和连接后的过滤条件进行了分离,阅读性更好。
- SQL92若要补充连接后的where条件,只能使用and来连接,使得与连接过滤条件混合
- inner join 中的 inner 可以省略
- (1)等值连接
- 顾名思义:连接过滤条件是用等于表达式进行连接
- (2)非等值连接
- 与等值连接相反,连接过滤条件并不是用等于表达式进行连接
- (3)自连接
- 自连接的特点:一张表当作两张表来进行连接
- 例:员工的领导编号 = 领导的员工编号,两个编号都在同一张员工表上
1 | select a.ename '员工名', b.ename '领导名'、 |
1.5 外连接
- 外连接:假设A和B表进行连接,使用外连接的话,AB两张表有一张表时主表,一张表是附表,主要查询主表中的数据,捎带查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出null与之匹配
1 | select 字段 |
- 左外连接(左连接):表示左边的表是主表,使用
left outer join
- 右外连接(右连接):表示右边的表时主表,使用
right outer join
- 和内连接一样,外连接的
outer
可省略
1.6 多表之间连接
1 | select 字段 |
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 | limit [startIndex], [length] |
- startIndex可以省略,默认从0开始