当前位置: 首页 > news >正文

MySQL基础关键_006_DQL(五)

目  录

一、子查询

1.说明

2.where 后嵌套

(1)查询高于平均薪资的员工姓名、薪资

3.from 后嵌套

(1)查询每个部门平均薪资对应的等级 

4.select 后嵌套

(1)查询每个员工的姓名和部门名称

5.exists/not exists

(1)说明

(2)实例初始化 

(3)查询下单用户

(4)in 和 exists 的区别

二、合并 union/union all

1.说明

2.查询职位是“MANAGER”和“SALESMAN”的员工信息

 三、limit

1.说明

2.查询薪资前三名的员工信息 

3.分页 SQL 语句 


一、子查询

1.说明

  1. 子查询就是在 select 语句中嵌套 select语句;
  2. select 语句可以嵌套在 from、where、select 后。

2.where 后嵌套

(1)查询高于平均薪资的员工姓名、薪资

select emp_name, salary from employees where salary > (select avg(salary) from employees);


3.from 后嵌套

        from 后的子查询可以看作一张临时表。 

(1)查询每个部门平均薪资对应的等级 

select a.*, s.grade from (select dept_no, avg(salary) as average_salary from employees group by dept_no) a join salary_grades s on a.average_salary between s.min_salary and s.max_salary;


4.select 后嵌套

(1)查询每个员工的姓名和部门名称

select e.emp_name, (select d.dept_name from departments d where e.dept_no = d.dept_no) as dept_name from employees e;


5.exists/not exists

(1)说明

  1. 在 MySQL 中,EXISTS 用于检查子查询的查询结果行数是否大于 0 。若存在,则 EXISTS 的条件为真;
  2. 应用场景:
    1. 用于检验条件子句中的表达式是否存在;
    2. 用于子查询条件过滤;
    3.  可以与 SELECT、UPDATE、DELETE 搭配使用,检查另一个查询是否有返回。

(2)实例初始化 

        执行下方 sql 脚本。

DROP TABLE IF EXISTS customers;
DROP TABLE IF EXISTS orders;CREATE TABLE customers (id INT PRIMARY KEY,name VARCHAR(32)
);CREATE TABLE orders (id INT PRIMARY KEY,price DECIMAL(5,1),customer_id INT REFERENCES customers(id)
);INSERT INTO customers (id, name) VALUES (1, 'XiaoMing');
INSERT INTO customers (id, name) VALUES (2, 'XiaoHong');
INSERT INTO customers (id, name) VALUES (3, 'XiaoGang');INSERT INTO orders (id, price, customer_id) VALUES (10, 1000.0, 1);
INSERT INTO orders (id, price, customer_id) VALUES (20, 2000.0, 1);
INSERT INTO orders (id, price, customer_id) VALUES (30, 3000.0, 2);
INSERT INTO orders (id, price, customer_id) VALUES (40, 4000.0, 2);COMMIT;

(3)查询下单用户

select * from customers c where exists (select * from orders o where c.id = o.customer_id);


(4)in 和 exists 的区别

  1. in 是根据指定列表中的值判断是否满足条件,而 exists 是根据子查询结果是否有返回来判断;

  2. exists 通常效率更高,因为 exists 只需要判断是否有符合条件的记录,而 in 需要对比整个列表;

  3. 但是 in 可以匹配多个值,而 exists 只能匹配一组条件。


二、合并 union/union all

1.说明

  1. union 和 union all 都是将两个查询结果集合并
  2. 两个结果集合并时,列数要相同;
  3. union 会对合并后的数据集进行去重
  4. union all 不会对合并后的数据集去重
  5. union all 由于不需要去重,所以效率更高

2.查询职位是“MANAGER”和“SALESMAN”的员工信息

# union all
select * from employees where job_title = 'MANAGER' union all select * from employees where job_title = 'SALESMAN';# union
select * from employees where job_title = 'MANAGER' union select * from employees where job_title = 'SALESMAN';


 三、limit

1.说明

  1. 查询从哪一条开始到哪一条的记录。通常是因为表中数据量庞大,需要分页展示;
  2. 语法格式:【limit 开始下标, 长度;】;
  3. 不写开始下标,则默认从第一行开始。

2.查询薪资前三名的员工信息 

select * from employees order by salary desc limit 0, 3;-- 可以省略不写开始下标,默认从第一行数据开始
select * from employees order by salary desc limit 3;


3.分页 SQL 语句 

# 假设要求每页展示10条数据,当前是第1页
int pageNo = 1;
int pageSize = 10;# 第一页
limit 0, 10;# 第2页
limit 10, 10;# 第3页
limit 20, 10;# 第pageNo页
limit (pageNo - 1) * pageSize, pageSize;

相关文章:

  • Vue3学习笔记2——路由守卫
  • 如何用CSS实现HTML元素的旋转效果:从基础到高阶应用
  • c++26新功能——gcc15.1的支持
  • Java大师成长计划之第11天:Java Memory Model与Volatile关键字
  • NVMe控制器之完成信息解析模块
  • 单片机嵌入式字符流数据解析库
  • c++ 二级指针 vs 指针引用
  • AI生成视频检测方法及其相关研究
  • 【电路笔记】-自耦变压器
  • java学习之数据结构:三、八大排序
  • 生成式 AI 的重要性
  • 在MySQL中建索引时需要注意哪些事项?
  • 【Linux知识】find命令行使用详解
  • 《ATPL地面培训教材13:飞行原理》——第5章:升力
  • 生物化学笔记:神经生物学概论08 运动系统 人类逐渐建立运动技能 不同层次的运动发起
  • 【AutoDL】云服务器配置指南
  • 架构师-金丝雀与蓝绿发布
  • vue3+ts vite打包结构控制通过rollup进行配置
  • Java学习手册:Spring 生态其他组件介绍
  • PCIe | TLP 报头 / 包格式 / 地址转换 / 配置空间 / 寄存器 / 配置类型
  • 戴紫薇评《不像说母语者》丨后殖民语境下的母语追寻
  • 儿童文学作家周晴病逝,享年57岁
  • 长三角铁路今日预计发送386万人次,沪宁、沪杭等方向尚有余票
  • 降雪致长白山天池景区关闭,有游客在户外等待一小时,景区回应
  • 蓝佛安主持东盟与中日韩财长和央行行长系列会议并举行多场双边会见
  • 今晚上海地铁1、2、10、17号线加开定点班车至次日0点