翼度科技»论坛 编程开发 mysql 查看内容

SQL中的排序order by 、SQL中的分页limit、SQL的多表查询、

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
SQL中的排序

使用关键字:ORDER BY

  • ORDER BY 字段名后使用ASC升序表示;使用DESC表示降序。
  • ORDER BY 后面可以使用列的别名进行排序(列的别名只能在ORDER BY中使用,不能再HWERE后使用)
  • WHERE需要再FROM后,ORDER BY前声明!!
  • 多级排序,ORDER BY 列名1 ASC,列名2 DESC..;
SQL中的分页

mysql使用LIMIT实现数据的分页显示
  1. # 需求1:每页显示20条,此时显示第1页
  2. SELECT employee_id,last_name FROM employees
  3. LIMIT 0,20; #limit后第一个数字表示偏移量,第一条数据为0,第二个数字表示显示多少条。
  4. # 需求2:每页显示20条,此时显示第2页
  5. SELECT employee_id,last_name FROM employees
  6. LIMIT 20,20;
  7. # 需求3:每页显示20条,此时显示第3页
  8. SELECT employee_id,last_name FROM employees
  9. LIMIT 40,20;
复制代码
分页公式
  1. # 需求:每页显示pagesize条,此时显示第pageno页
  2. # 公式:LIMIT (pageno-1)*pagesize,pagesize;
复制代码
关于LIMIT:mysql8.0新特性
LIMIT...OFFSET...
在8.0之前的版本,limit后面的默认第一个数字表示偏移量,第二个数字表示要取的条数
在8.0之后的版本,limit后面新增了一个offset关键字,offset后面表示偏移量,limit后面表示要取的条数
SQL的多表查询

多表查询基本格式
  1. # 多表查询的格式:
  2. # select 要查询的字段名 from 表1,表2.. where 表1.字段名=表2.字段名
  3. # 注意:要查询的字段名如果在多表中出现,则需要指定是哪个表的字段。
  4. # 但是,从sql查询优化的角度看,建议多表查询时指明每个字段来自哪个表
  5. SELECT employee_id,department_name
  6. FROM employees,departments
  7. WHERE employees.department_id=departments.department_id;
复制代码
多表查询的分类

角度1:等值连接 vs 非等值连接
角度2:自连接 vs 非自连接
角度3:内连接 vs 外连接


  • 等值连接:where后连接条件是=连接
  1. SELECT employee_id,department_name
  2. FROM employees,departments
  3. WHERE employees.department_id=departments.department_id;
复制代码

  • 非等值连接:where后连接条件不是=连接
  1. # 非等值连接例子
  2. SELECT employee_id,salary,grade_level
  3. FROM employees e,job_grades j
  4. WHERE e.salary BETWEEN j.lowest_sal AND j.grade_level;
复制代码

  • 自连接:自己这张表和自己连接
  1. # 自连接的例子
  2. # 员工表里有员工id和员工对应的管理者id(有的管理者也是员工,也在员工表里)这时需要自连接
  3. SELECT e.employee_id,e.last_name,m.employee_id,m.last_name
  4. FROM employees e,employees m
  5. WHERE e.manager_id=m.employee_id;
复制代码

  • 非自连接:一张表和其他表连接
  • 内连接:合并具有同一列的两个以上的表的行,结果集中不包含一个表与另一个表不匹配的行
  • 外连接:合并具有同一列的两个以上的表的行,结果集中包含一个表与另一个表匹配的行之外,还查询到了左表或者右表中不匹配的行,外连接的分类:左外连接、右外连接、满外连接。

  • 左外连接
两个表在连接的过程中,除了返回满足连接条件的行以外,还返回了左表不满足条件的行,这种方式叫左外连接

  • 右外连接
两个表在连接过程中,除了返回满足连接条件的行以外,还返回了右表不满足条件的行,这种方式叫右外连接
SQL92和SQL99实现内连接外连接的语法格式
  1. # 查询所有员工的last_name和department_name信息、
  2. # SQL92语法实现内连接,直接from后面写表名,表名用逗号分割,where后面写连接条件
  3. # SQL92语法实现外连接使用+法 ----但是mysql不支持SQL92语法
  4. # SQL99语法中使用JOIN...ON..实现多表查询
  5. # SQL99的内连接写法:JOIN前面还可以加一个INNER(一般可省略)
  6. SELECT last_name,department_name
  7. FROM employees t1 JOIN departments t2
  8. ON t1.department_id=t2.department_id
  9. # SQL99的外连接写法:LEFT OUTER JOIN左外连接(OUTER可省略);RIGHT JOIN 右外连接
  10. SELECT last_name,department_name
  11. FROM employees t1 LEFT OUTER JOIN departments t2
  12. ON t1.department_id=t2.department_id
  13. # 满外连接:使用FULL OUTER JOIN---但是mysql不支持这样操作
  14. SELECT last_name,department_name
  15. FROM employees t1 LEFT OUTER JOIN departments t2
  16. ON t1.department_id=t2.department_id
复制代码
union和union all的使用

union:会执行去重操作
union all:不会执行去重操作
结论:如果明确知道合并后的数据不存在重复的数据,或者不需要去重重复数据,则尽量使用union all语句,以次来提高数据查询效率
7中JOIN操作的实现(重点)
  1. # 7种JOIN的实现,以employees和departments表为例
  2. # 中图:内连接
  3. SELECT employee_id,department_name
  4. FROM employees t1 JOIN departments t2
  5. ON t1.department_id=t2.department_id
  6. # 左上图:左外连接
  7. SELECT employee_id,department_name
  8. FROM employees t1 LEFT JOIN departments t2
  9. ON t1.department_id=t2.department_id
  10. #右上图:右外连接
  11. SELECT employee_id,department_name
  12. FROM employees t1 RIGHT JOIN departments t2
  13. ON t1.department_id=t2.department_id
  14. # 左中图:
  15. SELECT employee_id,department_name
  16. FROM employees t1 LEFT JOIN departments t2
  17. ON t1.department_id=t2.department_id
  18. WHERE t2.department_id is NULL
  19. # 右中图:
  20. SELECT employee_id,department_name
  21. FROM employees t1 RIGHT JOIN departments t2
  22. ON t1.department_id=t2.department_id
  23. WHERE t1.department_id IS NULL
  24. # 左下图:使用union all连接上面的两个表
  25. # 方式1:连接左上图和右中图
  26. SELECT employee_id,department_name
  27. FROM employees t1 LEFT JOIN departments t2
  28. ON t1.department_id=t2.department_id
  29. UNION ALL
  30. SELECT employee_id,department_name
  31. FROM employees t1 RIGHT JOIN departments t2
  32. ON t1.department_id=t2.department_id
  33. WHERE t1.department_id IS NULL
  34. # 方式2:连接右上图和左中图
  35. SELECT employee_id,department_name
  36. FROM employees t1 RIGHT JOIN departments t2
  37. ON t1.department_id=t2.department_id
  38. UNION ALL
  39. SELECT employee_id,department_name
  40. FROM employees t1 LEFT JOIN departments t2
  41. ON t1.department_id=t2.department_id
  42. WHERE t2.department_id is NULL
  43. # 右下图:连接左中图和右中图
  44. SELECT employee_id,department_name
  45. FROM employees t1 LEFT JOIN departments t2
  46. ON t1.department_id=t2.department_id
  47. WHERE t2.department_id is NULL
  48. UNION ALL
  49. SELECT employee_id,department_name
  50. FROM employees t1 RIGHT JOIN departments t2
  51. ON t1.department_id=t2.department_id
  52. WHERE t1.department_id IS NULL
复制代码
SQL99的新特性


  • 新特性1:自然连接NATURAL JOIN
自然连接它会帮你自动查询两张表中的所有相同字段。然后进行等值连接
  1. # 不用自然连接的写法
  2. SELECT employee_id,department_name
  3. FROM employees t1 JOIN departments t2
  4. ON t1.department_id=t2.department_id
  5. AND t1.manager_id=t2.manager_id
  6. # 使用自然连接的写法
  7. SELECT employee_id,department_name
  8. FROM employees t1 NATURAL JOIN departments t2
  9. # 使用natural自动代替了on下面的连接条件
复制代码

  • 新特性2:USING的使用
  1. # 原先连接的正常写法
  2. SELECT employee_id,department_name
  3. FROM employees t1 JOIN departments t2
  4. ON t1.department_id=t2.department_id
  5. # 使用USING之后的写法
  6. SELECT employee_id,department_name
  7. FROM employees t1 JOIN departments t2
  8. USING(department_id)
复制代码
来源:https://www.cnblogs.com/suncolor/p/17145395.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具