MySQL-进阶7-子查询 - select后/where后/from后/ []where后/having后] / exists后面 的相关子查询
/*SQL-进阶7-子查询
含义:出现在其他语句中的select 语句,称为子查询或内查询
外部的查询语句,称为主查询 或者 外查询
分类1:按子查询出现的位置———— select 后面:仅仅支持标量子查询(仅能支持一行一列,下面有栗子) from 后面:支持表 子查询
将子查询的结果充当成一张表,要求必须起别名,不然会引起冲突! where 或 having 后面: [重点]
标量子查询 √
列子查询 √ [还一般搭配着多行操作符使用,in/ any/some/ all ]
[ in(not in):等于列表中的任意一个
弃用 #### any/some : (和子查询返回的某一个值比较)
弃用 ##### all : 和子查询返回的所有值比较
]
行子查询
{共同特点:
①子查询放在小括号里
②子查询放在条件的右侧
③标量子查询,一般搭配着单行操作符使用
} exists后面(相关子查询)
exists后面的子查询 #结果返回1或者0;先执行主查询,再执行子查询 分类2:按结果集的行列数不同:(用的很少)
标量子查询(结果集)
....... */ #联系: 多表查询 ,查询部门名为SAL 或IT的员工的所有信息
SELECT e.*,d.`department_name`
FROM employees e,departments d
WHERE e.`department_id`=d.`department_id` AND d.department_name IN ('SAL','IT'); #where 或 having 后面: [重点]
#1.单行子查询(标量子查询)
#案例1:谁的工资比ABel的高
SELECT e.*
FROM employees e
WHERE e.`salary` >(
SELECT salary
FROM employees
WHERE last_name ='Abel'
); #案例2:返回job_id 与 141号员工 相同,salary 比143号员工多的员工姓名, 显示 job_id和工资
SELECT last_name,job_id,salary
FROM employees
WHERE `job_id` =(
SELECT job_id
FROM employees
WHERE employee_id =141
AND salary >(
SELECT salary
FROM employees
WHERE employee_id =143
)
); #案例3: 返回公司工资最低的员工的last_name ,job_id 和 salary
SELECT *
FROM employees
WHERE salary =(
SELECT MIN(salary)
FROM employees
); #二: select 后面的子查询 #案例:查询每个部门的员工个数
SELECT d.*,(
SELECT COUNT(*)
FROM employees e
WHERE d.department_id=e.department_id
) 个数
FROM departments d;
##也可以用连接查询???? :employees 右外连接 departments
SELECT d.*,COUNT(*)
FROM employees e
RIGHT OUTER JOIN departments d
ON e.department_id=d.department_id
GROUP BY department_id;
#查询员工号=102的部门号
SELECT (
SELECT d.department_name
FROM departments d,employees e
WHERE d.department_id = e.department_id
AND e.employee_id = 102
) 部门名; #三: from后面
#案例:查询每个部门的平均工资的工资等级
#1.查询每个部门的平均工资
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id;
#2.查询工资等级
SELECT * FROM job_grades;
#3.进行组合 , 连接1的两个结果集和job_grades表,筛选条件平均工资 between low and high
SELECT ag_dep.* ,g.grade_level
FROM (
SELECT AVG(salary) ag,department_id #查询后生成的表
FROM employees
GROUP BY department_id
) ag_dep
INNER JOIN job_grades g
ON ag_dep.ag BETWEEN g.lowest_sal AND g.highest_sal; #四: exists后面的(相关子查询) #结果返回1或者0;先执行主查询,再执行子查询 #案例1:查询有员工名的部门名
SELECT department_name
FROM departments d
WHERE EXISTS(
SELECT *
FROM employees e
WHERE d.department_id = e.`department_id`
); #----------------栗子练习--------------
#一:查询各部门中工资比本部门平均工资高的员工的员工号,姓名和工资
#①本部门平均工资
SELECT AVG(e.`salary`) ag,department_id
FROM employees e
GROUP BY e.`department_id`;
#(2) 与1进行连接
SELECT e.`department_id`,e.`employee_id`,e.`last_name`,e.`salary`,ag 平均工资
FROM employees e
INNER JOIN(
SELECT AVG(e.`salary`) ag,department_id
FROM employees e
GROUP BY e.`department_id`
)ag_dep
ON e.`department_id`=ag_dep.department_id ##内连接的连接条件!
WHERE salary > ag_dep.ag; ###加上筛选条件
MySQL-进阶7-子查询 - select后/where后/from后/ []where后/having后] / exists后面 的相关子查询的更多相关文章
- Mysql相关子查询&&MySQL获取分组后的TOP N记录
小燕子,哈哈哈哈~~~~~~~~~~ 相关子查询是指引用了外部查询列的子查询,即子查询会对外部查询的每行进行一次计算. 举个例子 root:test> show create table tes ...
- sql之独立子查询和相关子查询总结
1.独立子查询:顾名思义:就是子查询和外层查询不存在任何联系,是独立于外层查询的: 下面就看一个例子: 有一张订单表 Sales.Order 和一张 客户表 Sales.Customer 下面的sql ...
- T-SQL的进阶:超越基本级别3:构建相关子查询——701小组
T-SQL的进阶:超越基本级别3:构建相关子查询 格雷戈里·拉森,2014/03/05 原文链接: http://www.sqlservercentral.com/articles/Stairway+ ...
- SQL相关子查询是什么?和嵌套子查询有什么区别?
目录 两者的各种叫法 相关子查询MySQL解释 相关子查询Wikipedia解释 相关子查询执行步骤拆解 相关子查询和嵌套查询的区别 参考资料 两者的各种叫法 相关子查询叫做:Correlated S ...
- ylb:子查询(嵌套子查询)和子查询(相关子查询)
ylbtech-SQL Server:SQL Server-子查询(嵌套子查询)和子查询(相关子查询) SQL Server 子查询(嵌套子查询)和子查询(相关子查询). 1,ylb:1,子查询(嵌套 ...
- [SQL SERVER系列]之嵌套子查询和相关子查询
子查询有两种类型,一种是只返回一个单值的子查询,这时它可以用在一个单值可以使用的地方,这时子查询可以看作是一个拥有返回值的函数:另外一种是返回一列值的子查询,这时子查询可以看作是一个在内存中临时存在的 ...
- 相关子查询和嵌套子查询 [SQL Server]
SQLServer子查询可以分为 相关子查询 和 嵌套子查询 两类.前提,假设Books表如下: 类编号 图书名 出版社 价格-------------- ...
- SQL嵌套子查询和相关子查询的执行过程有什么区别(推荐)
SQLServer子查询可以分为 相关子查询 和 嵌套子查询 两类.前提, 假设Books表如下: 类编号 图书名 出版社 价格 ----------------------------------- ...
- SQLServer学习笔记<>相关子查询及复杂查询
二.查询缺少值的查询 在这里我们加入要查询2008年每一天的订单有多少?首先我们可以查询下订单表的订单日期在2008年的所有订单信息. 1 select distinct orderdate,coun ...
随机推荐
- java基本思想
面向对象 众所周知,面向对象编程思想是java的基本思想.java的整个体系和技术实现都是以这个思想为基础.(这个通过类和接口能看出来,后面提到) 对这个事情的认知度甚至变成了很多公司的面试标准.比如 ...
- Windows删除某服务
win+R然后cmd进入命令窗口 sc delete 服务名
- python 列表推导式 - python基础入门(16)
截止到目前为止,python基础内容已经学习了50%左右,在学习编程过程中,我们不仅要学习python语法,同时也需要学习如何把自己代码写的更美观,效率更高. 一.什么是推导式 推导式是从一个或者多个 ...
- redis事务、并发及应用场景
目录 事务概念 事务命令 乐观锁 悲观锁 并发控制及过期时间 队列 队列防丢失 阻塞队列 时间区间控制 持久化 RDB AOF 命令追加 文件写入.同步 RDB.AOF优缺点 RDB优缺 AOF优缺 ...
- go 数组的定义和赋值
package main import "fmt" func main() { //字符数组定义 var str [2]string str[0] = &q ...
- S04_CH01_搭建工程移植LINUX/测试EMMC/VGA
S04_CH01_搭建工程移植LINUX/测试EMMC/VGA 1.1概述: 本章内容是在已经提供安装了VIVADO2015.4 的ubuntu系统下,进行.大家可以下周我们已经提供的虚拟机镜像,我们 ...
- 使用Duilib开发Windows软件(5)——使用VLC做视频播放
需求:调用PC上的摄像头拍照. 实现思路:接入视频流,截屏获取照片. 早期的vlc安装包(Windows)是附带sdk包的,现在的安装后已经没有了,原因如下: VLC SDK下载连接:https:// ...
- 三种redis数据导出导入方式
推荐博客链接:https://www.cnblogs.com/hjfeng1988/p/7146009.html https://blog.csdn.net/qq_14945847/article/d ...
- 怎样在数组处理方法中使用this
回调函数中的this不做处理的话, this仍然会指向window, 解决方法有两种. 第一种: 使用另一个变量固定this, 适用于在对象方法中使用的情况. var obj = { arr: [1, ...
- 将自定义dockerfile生成的image推送到仓库中
本文为以阿里云的案例方法,其他方法未尝试 1.注册阿里云账号 2.设置密码并通过docker登录 3.创建命名空间 4.创建镜像仓库 创建仓库时,需要选择代码源的仓库储存的方式,这里我用的是gitHu ...