1、子查询:
1、子查询就是在一个完整的查询语句中,嵌套若干个不同功能的小查询,从而完成一个复杂的查询。
2、多次查询,查询效率低
通俗的说,它就是把一个查询的结果,当做另一个查询的条件
1.1、子查询返回单行单列数据:
1.1.1、查询基本工资比员工:dmh低的员工信息:
分析:先查出dmh的工资,再比较工资:
SELECT * from emp WHERE SAL < (SELECT SAL from emp where ENAME = 'dmh');
1.2 子查询返回单行多列数据 ( =,<,>)
1.1.2、查询与员工tom从事同一工作且领导相同的全部员工信息:
分析:先查询tom的职位和领导,再条件查询相同职位和领导的员工。(查询结果多个用括号隔开)
SELECT * from emp
where
(JOB,MGR) = (SELECT JOB,MGR from emp where ENAME = 'tom');
注意:() = ()里面的数据 要对应
1.3 子查询返回多行多列数据:(in)
查询与员工tom和jack从事同一工作且领导相同的员工全部信息:
SELECT * from emp where (JOB,MGR) in (SELECT JOB,MGR from emp WHERE EMPNO in(5,6));
1.4 在from字句中使用子查询:
如果子查询的返回值是多行多列,则可其当做一张数据表,并且这种子查询一般都出现在From字句中.
1.4.1查询出每个部门的部门编号,部门名称,部门人数,平均工资
SELECT
d.DNAME,
t.*
FROM
dept d
LEFT JOIN (
SELECT
d.DEPTNO,
COUNT(e.EMPNO),
IFNULL(ROUND(AVG(SAL), 2), 0)
FROM
emp e
RIGHT JOIN dept d ON (e.DEPTNO = d.DEPTNO)
GROUP BY
d.DEPTNO
) t on (d.DEPTNO = t.DEPTNO);
1.5在where字句中使用子查询:
如果返回的数据是单行单列,也可以在where字句中使用子查询
1.5.1查询部门名称为 技术部 下面的所有员工:
SELECT
*
FROM
emp e
WHERE
e.DEPTNO = (
SELECT
DEPTNO
FROM
dept d
WHERE
d.DNAME = '技术部'
);
1.6在select语句中使用子查询:(相当重要)
效率很低
1.6.1查询出每个员工的部门名称:
SELECT
e.ENAME,
e.DEPTNO,
(
SELECT
d.DNAME
FROM
dept d
WHERE
d.DEPTNO = e.DEPTNO
)
FROM
emp e;