排序数据
如果没有进行排序的操作,那么查询出来的数据就是根据添加的顺序显示的。
使用order by对查询到的数据进行排序操作
注意:
强调格式
from先执行,然后执行where,然后执行select,然后再执行order by。
因此列的别名是在执行完where后才执行的,所以列的别名不能在where中使用。
二级排序
若写成order by department_id,salary 则表示先从对department_id升序排序,department_id相同的情况下再对salary升序排序。
多级排序以此类推…
LIMIT分页操作
limit a,b;其中a表示偏移量,也就是从总数据的第a+1个开始显示,b表示每页显示多少条数据。
总结公式:
where …order by…limit 声明顺序
筛选、排序、分页
MySQL8.0新特性:LIMIT…OFFSET…
就是将limit 偏移量,条目数中的两个变量位置交换了
limit 条目数 offset 偏移量
多表查询
为什么要使用多表查询?
利用employees表查询last name为‘Abel’的人的department_id,查到等于80之后
再用department_id在department表中去查询该人的location_id,查到location_id=2500后
再到locations表中去查询该人在哪个城市。
这种做法查询了三次才查到,效率太低,所以后面要用到多表查询。
多表的查询如何实现?
但这里查询不到department_id为null的员工信息,后面再解决。
如果查询语句中出现了多个表中都存在的字段,则必须指明此字段所在的表。比如这里的department_id同时存在于employees,departments两个表中,所以需要指明。
建议
从sql优化的角度,建议多表查询时,每个字段前都指明其所在的表。
注意:如果给表起了别名,一旦在select或where中使用表名,则必须使用该表的别名,而不能再使用表的原名。否则报错。
总结:如果有n个表实现多表查询,则至少需要n-1个连接条件。否则必定出现迪卡尔积的错误。
多表查询的分类
从三个不同角度分类
角度一:等值连接 vs 非等值连接
角度二:自连接 vs 非自连接
角度三:内连接 vs 外连接
举例:
这是内连接,当employee_id为null时,对应的department_name不会显示出来,当department_id为null时,employee_id不会显示出来。
外连接就是解决这一问题的,可以使这两种情况显示出来。
外连接的分类:
左外连接、右外连接、满外连接。
左外连接:两个表在连接过程中除了返回满足连接条件的行以外还返回左表中不满足条件的行,这种连接称为左连接。
右外连接:两个表在连接过程中除了返回满足连接条件的行以外还返回右表中不满足条件的行,这种连接称为右连接。
在Oracle中这种写法可以,但MySQL中不行:
SQL99语法实现多表查询
SQL99语法中使用join…on的方式实现多表的查询。这种方式也能解决外连接的问题。MySQL是支持此种方式的。
实现内连接
两个表:
三个表:
实现外连接
SQL99语法实现外连接
左外连接:
可以显示出那些还没有部门的员工
右外连接只需要把left改成right
可以显示出暂时还没有员工的部门
满外连接
那么MySQL怎么实现满外连接呢?
要用到union:
七种join的实现
满外连接
实现右下图
SQL99语法新特性
知识的拓展,会用前面的就行,这里只需要了解
自然连接
不够灵活,会强制将所有字段相同的进行等值连接
USING
课后练习
第三个勘误:select里面的d.department_id改成e.department_id