3、排序(order by)与分页(limit)多表查询 -mysql

news2024/11/13 19:45:28

3、排序与分页&多表查询 -mysql

  • 排序与分页
    • 一、排序 Order By
    • 二、分页 Limit
  • 多表查询
    • 一、一个案例引发的多表连接
        • 2、笛卡尔积(或交叉连接)的理解
    • 二、多表查询分类讲解
        • 1、等值连接 vs 非等值连接
        • 2、自连接 vs 非自连接
        • 3、内连接 vs 外连接
    • 三、SQL99语法实现多表查询
        • 2、内连接(INNER JOIN)的实现
        • 3、外连接(OUTER JOIN)的实现

排序与分页

——————————————————————————————————————————————————————

一、排序 Order By

1、排序数据

排序规则

  • 使用 ORDER BY 子句排序
    • ASC(ascend): 升序
    • DESC(descend):降序
  • ORDER BY 子句在SELECT语句的结尾。

2、单列排序

  • 如果不指明排序规则,则默认为ASC 升序

    SELECT  last_name, job_id, department_id, hire_date
    FROM   employees
    ORDER BY hire_date ; #默认为 asc 升序
    
    SELECT  last_name, job_id, department_id, hire_date
    FROM   employees
    ORDER BY hire_date DESC ;
    

3、多列排序

  • 若有多个排序规则,则从左到右依次书写

  • 从左到右,优先级别依次降低

    SELECT last_name, department_id, salary
    FROM  employees
    ORDER BY department_id, salary DESC;
    # 上面这条sql的意思实际上是:先按照department_id升序排序,如果department_id相等,再按照salary降序
    
    

4、自定义排序(使用"FIELD()"函数)

参考地址:https://blog.csdn.net/u011447905/article/details/80013987


二、分页 Limit

1、背景

  • 返回的记录太多了
  • 减少网络传输压力

2、实现规则

  • 格式

    LIMIT [位置偏移量,] 行数
    
  • 举例

    #前10条记录:
    SELECT * FROM 表名 LIMIT 0,10;
    #或者
    SELECT * FROM 表名 LIMIT 10;
    #第11至20条记录:
    SELECT * FROM 表名 LIMIT 10,10;
    #第21至30条记录:
    SELECT * FROM 表名 LIMIT 20,10;
    
    

    MySQL 8.0 中可以使用“LIMIT 3 OFFSET 4
    意思是获取从第5条记录开始后面的3条记录,和“LIMIT 4,3;”返回的结果相同。

  • 分页显式公式

    (当前页数-1)* 每页条数,每页条数

    SELECT * FROM table
    LIMIT (PageNo - 1) * PageSize,PageSize;
    
    
  • LIMIT 子句必须放在整个SELECT语句的最后!

  • 好处

    约束返回结果的数量可以 减少数据表的网络传输量 ,也可以 提升查询效率

    如果我们知道返回结果只有1 条,就可以使用 LIMIT 1 ,告诉 SELECT 语句只需要返回一条记录即可。

    这样的好处就是 SELECT 不需要扫描完整的表,只需要检索到一条符合条件的记录即可返回。


3、拓展

在不同的 DBMS 中使用的关键字可能不同。

MySQLPostgreSQLMariaDBSQLite 中使用 LIMIT 关键字,而且需要放到 SELECT 语句的最后面。

  • SQL ServerAccess,需要使用 TOP 关键字

    SELECT TOP 5 name, hp_max 
    FROM heros 
    ORDER BY hp_max DESC
    
    
  • DB2,使用 FETCH FIRST 5 ROWS ONLY 关键字

    SELECT name, hp_max 
    FROM heros 
    ORDER BY hp_max DESC 
    FETCH FIRST 5 ROWS ONLY
    
    
  • Oracle,基于 ROWNUM 来统计行数

    SELECT rownum,last_name,salary 
    FROM employees 
    WHERE rownum < 5 
    ORDER BY salary DESC;
    #先过滤rownum < 5,排序
    
    

    这条语句是先取出来前 5 条数据行,然后再按照 hp_max 从高到低的顺序进行排序。但这样产生的结果和上述方法的并不一样。

    我会在后面讲到子查询,你可以使用

    SELECT rownum, last_name,salary
    FROM (
      SELECT last_name,salary
      FROM employees
      ORDER BY salary DESC)
    WHERE rownum < 10;
    #根据子查询查询排序好的结果中,再过滤rownum < 10
    
    

得到与上述方法一致的结果。

4、课后练习

# 1、查询员工的的姓名和部门号和年薪,按年薪降序,按姓名升序显示
select last_name,department_id,salary * 12 annual_salary from employees order by annual_salary desc,last_name asc;

# 2、选择工资不在 8000 到 17000 的员工的姓名和工资,按工资降序,显示第21到40位置的数据
select last_name,salary from employees where salary not between 8000 and 17000 order by salary desc limit 20,20;

# 3、查询邮箱中包含 e 的员工信息,并先按邮箱的字节数降序,再按部门号升序
select employee_id,last_name,email,department_id from employees 
# where email like '%e%'
where email regexp '[e]'
order by length(email) desc,department_id asc;

多表查询

——————————————————————————————————————————————————
多表查询,也称为关联查询,指 两个或更多个表一起完成查询操作。

前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键。

比如:员工表和部门表,这两个表依靠“部门编号”进行关联。

一、一个案例引发的多表连接

1、案例说明
在这里插入图片描述在这里插入图片描述

#案例:查询员工的姓名及其部门名称
SELECT last_name, department_name
FROM employees, departments;

在这里插入图片描述
上述多表查询中出现的问题称为:笛卡尔积的错误


2、笛卡尔积(或交叉连接)的理解

笛卡尔乘积是一个数学运算。假设我有两个集合 X 和 Y,那么 X 和 Y 的笛卡尔积就是 X 和 Y 的所有可能
组合,也就是第一个对象来自于 X,第二个对象来自于 Y 的所有可能。

组合的个数即为两个集合中元素个数的乘积数。

在这里插入图片描述
SQL92中,笛卡尔积也称为 交叉连接 ,英文是 CROSS JOIN

在 SQL99 中也是使用 CROSS JOIN表示交叉连接。

它的作用就是可以把任意表进行连接,即使这两张表不相关。在MySQL中如下情况会出现笛卡尔积:

#查询员工姓名和所在部门名称
SELECT last_name,department_name FROM employees,departments;
SELECT last_name,department_name FROM employees CROSS JOIN departments;
SELECT last_name,department_name FROM employees INNER JOIN departments;
SELECT last_name,department_name FROM employees JOIN departments;


3、案例分析与问题解决

  • 笛卡尔积的错误会在下面条件下产生:

    • 省略多个表的连接条件(或关联条件)
    • 连接条件(或关联条件)无效
    • 所有表中的所有行互相连接
  • 为了避免笛卡尔积, 可以在 WHERE 加入有效的连接条件

  • 加入连接条件后,查询语法:

    SELECT table1.column, table2.column
    FROM table1, table2
    WHERE table1.column1 = table2.column2;  #连接条件
    
    
    • WHERE子句中写入连接条件。
  • 正确写法:

    #案例:查询员工的姓名及其部门名称
    SELECT last_name, department_name
    FROM employees, departments
    WHERE employees.department_id = departments.department_id;
    
    
  • 在表中有相同列时,在列名之前加上表名前缀。


二、多表查询分类讲解

1、等值连接 vs 非等值连接

  • 等值连接

    表与表之间有字段相关联
    连接 n个表,至少需要n-1个连接条件
    在这里插入图片描述

  • 非等值连接

    表与表之间没有明确的关联条件,是根据一个表中的字段的,在另一个表中一个范围的情况
    在这里插入图片描述

SELECT e.last_name, e.salary, j.grade_level
FROM  employees e, job_grades j
WHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal; 
#e.salary字段在j.lowest_sal中是一个范围情况


2、自连接 vs 非自连接

  • 自连接

    同一张表,自己连接自己
    在这里插入图片描述
    当table1和table2本质上是同一张表,只是用取别名的方式虚拟成两张表以代表不同的意义。

然后两个表再进行内连接,外连接等查询。

#查询employees表,返回“Xxx works for Xxx”
SELECT CONCAT(worker.last_name ,' works for '
   , manager.last_name)
FROM  employees worker, employees manager
WHERE worker.manager_id = manager.employee_id ;

在这里插入图片描述


3、内连接 vs 外连接

在这里插入图片描述

  • 内连接: 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行
  • 外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右)
    外连接。没有匹配的行时, 结果表中相应的列为空(NULL)。
  • 如果是左外连接,则连接条件中左边的表也称为 主表 ,右边的表称为 从表
  • 如果是右外连接,则连接条件中右边的表也称为 主表 ,左边的表称为 从表

SQL92:使用(+)创建连接

  • 在 SQL92 中采用(+)代表从表所在的位置。即左或右外连接中,(+) 表示哪个是从表。
  • Oracle 对 SQL92 支持较好,而 MySQL 则不支持 SQL92 的外连接。
#左外连接
SELECT last_name,department_name
FROM employees ,departments
WHERE employees.department_id = departments.department_id(+);

#右外连接
SELECT last_name,department_name
FROM employees ,departments
WHERE employees.department_id(+) = departments.department_id;

# (+)在谁那里就是相反的连接,代表谁补null
# 如果在左边就是右外连接
# 如果在右边就是左外连接

  • 而且在 SQL92 中,只有左外连接和右外连接,没有满(或全)外连接。

三、SQL99语法实现多表查询

1、基本语法

  • 使用JOIN…ON子句创建连接的语法结构:

    SELECT table1.column, table2.column,table3.column
    FROM table1
    JOIN table2 ON table1 和 table2 的连接条件
    JOIN table3 ON table2 和 table3 的连接条件
    
    
  • SQL99 采用的这种嵌套结构非常清爽、层次性更强、可读性更强,即使再多的表进行连接也都清晰可见。

  • 语法说明:

    • 可以使用 ON 子句指定额外的连接条件。
    • 这个连接条件是与其它条件分开的。
    • ON 子句使语句具有更高的易读性。
    • 关键字 JOIN、INNER JOIN、CROSS JOIN 的含义是一样的,都表示内连接

2、内连接(INNER JOIN)的实现

  • 语法

    SELECT 字段列表
    FROM A表 INNER JOIN B表
    ON 关联条件
    WHERE 等其他子句;
    
    
  • 题目1

    SELECT 
    	e.employee_id, 
    	e.last_name, 
    	e.department_id,
        d.department_id, d.location_id
    FROM  
    	employees e 
    JOIN 
    	departments d 
    ON 
    	e.department_id = d.department_id;
    
    

在这里插入图片描述

  • 题目2

    SELECT 
    	employee_id, 
    	city, 
    	department_name
    FROM  
    	employees e
    JOIN  
    	departments d
    ON   
    	d.department_id = e.department_id
    JOIN  
    	locations l
    ON   
    	d.location_id = l.location_id;	
    
    

    在这里插入图片描述


3、外连接(OUTER JOIN)的实现

以一张表为标准,其他表做辅助,如果没有则,辅助表用null填充

  • 左外连接(LEFT OUTER JOIN)

    • 语法
    #实现查询结果是A
    SELECT 字段列表
    FROM A表 LEFT JOIN B表
    ON 关联条件
    WHERE 等其他子句;
    
    
    • 举例
    SELECT 
    	e.last_name, 
    	e.department_id, 
    	d.department_name
    FROM  
    	employees e
    LEFT OUTER JOIN 
    	departments d
    ON  
    	e.department_id = d.department_id;
    
    

    在这里插入图片描述

  • 右外连接(RIGHT OUTER JOIN)

    • 语法

      #实现查询结果是B
      SELECT 字段列表
      FROM A表 RIGHT JOIN B表
      ON 关联条件
      WHERE 等其他子句;
      
      
    • 举例

      SELECT e.last_name, e.department_id, d.department_name
      FROM  employees e
      RIGHT OUTER JOIN departments d
      ON  (e.department_id = d.department_id) ;
      
      

    在这里插入图片描述

需要注意的是,LEFT JOIN 和 RIGHT JOIN 只存在于 SQL99 及以后的标准中,在 SQL92 中不存在,
只能用 (+) 表示。

  • 满外连接(FULL OUTER JOIN)
    • 满外连接的结果 = 左右表匹配的数据 + 左表没有匹配到的数据 + 右表没有匹配到的数据。
    • SQL99是支持满外连接的。使用FULL JOIN 或 FULL OUTER JOIN来实现。
    • 需要注意的是,MySQL不支持FULL JOIN,但是可以用 LEFT JOIN UNIONRIGHT join代替。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/12880.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pytorch深度学习实战lesson18

第十八课 卷积层 卷积是深度学习最重要的概念之一&#xff0c;下面来学习和回顾一下卷积的基本概念。 目录 理论部分 从全连接层到卷积层 卷积层 实践部分 理论部分 从全连接层到卷积层 还是从一个例子开始&#xff1a;假设我要对猫和狗进行分类。 假设我用一千二百万像…

3年经验,光靠自动化测试基础,你可能连17k的测试岗都找不到,认清现实.....

相信对于每一个求职者来说都有被面试的经历吧&#xff0c;曾经作为一位测试小白的我&#xff0c;每一次面试过后都会各种吐槽面试官的不是&#xff0c;吐槽HR人事的不足&#xff0c;以及自己的有点没有发挥出来&#xff0c;今天我终于体会了一次面试官的心情.... 起因&#xf…

【夯实Kafka知识体系及基本功】分析一下(Broker)服务的可靠性机制分析「原理篇」

副本机制 分布式系统中&#xff0c;为了提高可靠性&#xff0c;最常用、最有效的策略是“副本机制”&#xff0c;Kafka也不例外。 Kafka 为每个 Partition 维护了一个 AR&#xff08;Assigned Replicas&#xff09;列表&#xff0c;由 ISR&#xff08;In-Sync Replicas&#x…

通过瑞利判据对显微镜物镜进行分辨率研究

摘要 通常可以采用瑞利判据理论表征显微镜的分辨率&#xff0c;瑞利判据是1896年由第三代瑞利男爵约翰威廉斯特拉特(John William Strutt)提出的。该理论认为&#xff0c;当一个艾里图样的中心与另一个艾里图样的第一个最小值重叠时&#xff0c;就可以分辨它们。在这个例子中…

力扣(LeetCode)3. 无重复字符的最长子串(C++)

滑动窗口 设置滑动窗口&#xff0c; lll 维护左窗口 &#xff0c; rrr 维护右窗口 &#xff0c;利用哈希表统计字母出现次数。 遍历字符串 sss &#xff0c;lll 循环右移&#xff0c;每次移动 &#xff0c; lll 指向的字母 s[l]s[l]s[l] 出现次数 。如果窗口内 s[l]s[l]s[l] …

NCMMSC 2021丨长短视频多语种多模态识别挑战赛

比赛背景 2021年第十六届全国人机语音通讯学术会议&#xff08;National Conference on Man-Machine Speech Communication&#xff0c;NCMMSC2021&#xff09;将于2021年10月15-18日在江苏徐州举行。本次会议由中国中文信息学会和中国计算机学会联合主办。 针对本次会议&…

STA -- clock gating check

对于现在design中例化好的icg以及工具插进去的icg&#xff0c;不存在clock gating check的问题&#xff0c;因为clock gating 搞成了一个lib cell&#xff0c;不再是latch加上与门的组合。不过design中除了这些icg&#xff0c;还有一些的clock gating check的出现&#xff0c;这…

写给 Android 开发:从0到1,再从1到N,都离不开 Framework

作为过来人&#xff0c;发现很多学习者和实践者都在 Android Framework上面临着很多的困扰&#xff0c;比如&#xff1a; 工作场景中遇到难题&#xff0c;往往只能靠盲猜和感觉&#xff0c;用临时性的补救措施去掩盖&#xff0c;看似解决了问题&#xff0c;但下次同样的问题又…

Node.js开发、CommondJS 、ES-Module模块化设计

目录 Node.js是什么 基础使用 Node的REPL 全局变量 模块化设计 CommondJS规范 基础使用exports和module.exports require CommondJS优缺点 AMD和CMD规范 ES_Module 基本使用方法 导出 导入 结合使用 默认导出 ES Module解析流程 Node.js是什么 Node与浏览器的对比 在…

两点云求差集和交集

这里两点云的差集指从点云1中删除属于点云2的点得到的点集&#xff0c;并集指既属于点云1又属于点云2的点集。 两点云求差集 基于kd-tree搜索的方法较快速&#xff0c;当然也可以暴力搜索。思路如下&#xff1a; step1 在点云2建立kd-tree&#xff0c;设置容忍误差&#xff0…

UI控件DevExpress WinForm新手指南——如何在应用启动时执行操作

DevExpress WinForm拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜任…

RESTful 接口设计

文章目录RESTful 接口设计1.获取所有员工列表2.增加一个员工3.更新员工4.删除员工5.查询单个员工RESTful 接口设计 1.获取所有员工列表 /*** 获取所有员工* 1. 请求路径--确认资源--员工--/employees* 2. 请求方法--get* 3. 请求参数--无* 4. 请求响应--多个员工--List<Em…

苹果iOS App Store上架操作流程

很多开发者在开发完iOS APP、进行内测后&#xff0c;下一步就面临上架App Store&#xff0c;不过也有很多同学对APP上架App Store的流程不太了解&#xff0c;下面我们来说一下iOS APP上架App Store的具体流程&#xff0c;如有未涉及到的部分&#xff0c;大家可以及时咨询&#…

基于微信小程序的学生购电系统设计与实现-计算机毕业设计源码+LW文档

小程序开发说明 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Mave…

服务端Skynet(二)——消息调度机制

服务端Skynet(二)——消息调度机制 文章目录服务端Skynet(二)——消息调度机制1、提前了解知识1.1、互斥锁&#xff08;mutex lock : **mut**ual **ex**clusion lock&#xff09;1.2、自旋锁&#xff08;spinlock&#xff09;1.3、读写锁&#xff08;readers–writer lock&…

最简单的git图解(多远程仓库)

上一节我们讲了git操作最基本的命令&#xff1a;最简单的git图解&#xff08;最基本命令&#xff09;_jerry_dyy的博客-CSDN博客 这一节我们来讲一下面对多个远程仓库的场景&#xff0c;应该如何来处理。 为什么要有多个远程仓库&#xff1f; 在企业内部开发团队开发过程中&a…

什么是CDN?CDN的技术原理是什么?

什么是CDN&#xff1f; CDN的全称是Content Delivery Network&#xff0c;中文名称“内容分发网络”。其主要原理是在现有网络中增加一层新的网络架构&#xff0c;将源站中的内容发布到不同的网络节点上&#xff0c;使用户可以就近获得所需的内容&#xff0c;从而提高用户访问…

【学习记录】镭神激光雷达与PC机的NTP同步

本文仅用于记录自己在实现镭神C32激光雷达和PC机进行NTP同步时的一些总结。 吐槽在先&#xff0c;镭神的文档写极其不完善&#xff0c;很多都只是提了一句&#xff0c;但并没有完整的说应该具体怎么做。前前后后折腾了三四天&#xff0c;在一知半解的官方技术支持和实验室大佬…

立创EDA仿真入门1 基本操作

立创EDA仿真入门1 基本操作一、进入EDA仿真环境二、画原理图1. 新建工程2. 绘制如下电路图三、仿真1. 运行仿真2. 导出波形图3. 查看仪表一、进入EDA仿真环境 网址&#xff1a; https://lceda.cn/ 进入EDA标准版&#xff0c;点击左上角切换到仿真模式。 二、画原理图 1. 新…

java毕业设计——基于java+Socket+sqlserver的办公自动化系统设计与实现(毕业论文+程序源码)——办公自动化系统

基于javaSocketsqlserver的办公自动化系统设计与实现&#xff08;毕业论文程序源码&#xff09; 大家好&#xff0c;今天给大家介绍基于javaSocketsqlserver的办公自动化系统设计与实现&#xff0c;文章末尾附有本毕业设计的论文和源码下载地址哦。 文章目录&#xff1a; 基于…