标量子查询
子查询返回的是单行单列的数据,就是一个值
主要用在WHERE子句中
需要用到一些运算符 大于>、小于<、等于=、不等于<>、!=
子查询的书写方式
①从外往内写
②从内往外写
-
查询出基本工资比ALLEN低的全部员工信息
从外往内写
-- 查询出全部员工信息
SELECT * FROM emp;
-- ALLEN的工资
SELECT sal FROM emp WHERE ename='ALLEN';
-- 查询出([基本工资比ALLEN低的]全部员工信息)
SELECT * FROM emp WHERE sal<(SELECT sal FROM emp WHERE ename='ALLEN');
-
查询基本工资高于公司平均工资的全部员工信息
-- 查询公司平均工资
SELECT AVG(sal) FROM emp;/*1988.3333*/
-- 查询基本工资高于公司平均工资的全部员工信息
SELECT * FROM emp WHERE sal>1988.3333;
-- 查询[基本工资高于(公司平均工资)的全部员工信息]
SELECT * FROM emp WHERE sal>(SELECT AVG(sal) FROM emp);
从内往外写
MySQL --- 数据库查询 - 聚合函数的使用、聚合查询、分组查询
-
查询出与ALLEN从事同一工作,并且基本工资高于员工编号为7521的全部员工信息
-- 查询出与ALLEN从事同一工作
SELECT * FROM emp
WHERE job=(SELECT job FROM emp WHERE ename='ALLEN')
-- 并且基本工资高于员工编号为7521的全部员工信息
AND sal>(SELECT sal FROM emp WHERE empno=7521)
-- 把 ALLEN 从查询结果中剔除
AND ename<>'ALLEN';
可以发现查询结果中包含 ALLEN,需要把 ALLEN 从查询结果中剔除
单行子查询
子查询返回的是单行多列的数据,就是一条记录
-
查询与SCOTT从事同一工作且工资相同的员工信息
-- 查询与SCOTT从事同一工作且工资相同的员工信息
SELECT * FROM emp
WHERE job=(SELECT job FROM emp WHERE ename='SCOTT')
AND sal=(SELECT sal FROM emp WHERE ename='SCOTT')
AND ename<>'SCOTT';
使用标量子查询
使用单行子查询
-- 查询SCOTT的员工信息
SELECT job,sal FROM emp WHERE ename='SCOTT';
-- 查询与SCOTT从事同一工作且工资相同的员工信息
SELECT * FROM emp WHERE (job,sal)=(SELECT job,sal FROM emp WHERE ename='SCOTT');
-
查询与员工编号为7566从事同一工作且领导相同的全部员工信息
-- 查询与员工编号为7566从事同一工作且领导相同的全部员工信息
SELECT * FROM emp WHERE
(job,mgr)=(SELECT job,mgr FROM emp WHERE empno=7566);
-
查询与ALLEN从事同一工作且在同一年雇佣的全部员工信息(包含ALLEN)
列数相同、数据类型相同可以直接进行比较
MySQL --- 常用函数 - 数值函数、时间日期函数、条件判断函数、其他函数
-- 查询与ALLEN从事同一工作且在同一年雇佣的全部员工信息(包含ALLEN)
SELECT * FROM emp WHERE
(job,DATE_FORMAT(hiredate,'%Y'))=
(SELECT job,DATE_FORMAT(hiredate,'%Y') FROM emp WHERE ename='ALLEN');