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基础系列-substring的原理
原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755235.html JDK 6和JDK 7中substring的原理及区别 substring(i ...
- 使用Duilib开发Windows软件(4)——消息传递
云信Duilib中没有窗体类的函数可以用来直接收取到所有控件的事件,每个控件都可以单独设置自己的事件处理函数,一般在InitWindow方法中初始化各个控件的事件处理函数. 每个控件都有许多形如Att ...
- hdu 6205 card card card 尺取法
card card card Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- C# Unix时间戳和DateTime类型相互转换
/// <summary> /// 将Unix时间戳转换为DateTime类型时间 /// </summary> /// <param name="d" ...
- C# Winform 设置窗口打开的特效
https://www.cnblogs.com/mq0036/p/6421946.html using System.Runtime.InteropServices; public class Win ...
- iis7 运行多个https,433端口监听多个htps 站点
默认情况一个服务器的IIS只能绑定一个HTTPS也就是443端口,现在有需要一个服务器 iis 433 端口 绑定多个 申请到证书后(不是必须要通配符的证书),添加多个https站点,先绑定别的端口 ...
- findstr 命令使用
findstr 命令使用 find /? 在文件中搜索字符串. FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][p ...
- 清北学堂-DAY2-数论专题-中国剩余定理(CRT)
首先请看定义:(百科上抄下来的)孙子定理是中国古代求解一次同余式组(见同余)的方法.是数论中一个重要定理.又称中国余数定理. 一元线性同余方程组问题最早可见于中国南北朝时期(公元5世纪)的数学著作&l ...
- (详细)JAVA使用JDBC连接MySQL数据库(1)- 软件
欢迎任何形式的转载,但请务必注明出处. 本节为下面四个的安装和配置 jdk Eclipse MySQL mysql connectors 一.jdk 点击查看安装和环境配置教程 二.Eclipse 点 ...
- 3.Redis数据类型
Redis的五大数据类型: 1.string(字符串) string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value. string类型是二进制安 ...