1查询工资比scott高的员工信息
A 第一步:查询出scott这个员工的工资
select sal from emp
where ename = 'SCOTT';

B 第二步:查询出工资比scott高的员工信息
select * fromemp
where sal >3000;
总结:
子查询的本质:多个select语句的嵌套
2:子查询的知识体系搭建
A 合理的书写风格
B 子查询外面()不要忘记
C 子查询和主查询能够查询的是同一张表,也能够不是同一张表
仅仅要子查询返回的结果,主查询能够用就可以。
D 在什么地方能够防止子查询
select a,b,c ---OK,仅仅能存放单行子查询,不能使多行子查询
from tab1 ---OK 能够有子查询
where col in(em1,em2) ---能够有子查询
col between a1 and a2
col > 222
col > ()
group by … ---不能够有子查询
having …. ---能够有子查询
order by … ---不能够有子查询
E 子查询的分类
1.单行操作符相应单行子查询。多行操作符相应多行子查询。
2.依照子查询返回的条目数。分为:单行子查询和多行子查询
3.单行子查询仅仅能使用单行比較操作符(= > >= < <= <>)
4.多行子查询仅仅能使用多行比較操作符(int any all)
3 单行子查询
Eg:查询员工信息和141号工种一样的,薪水比143号员工工资高的员工
SQL> conn hr/123456
已连接。
SQL> select last_name,job_id,salary
2 FROM employees
3 WHERE job_id =
4 (SELECT job_id
5 FROM employees
6 WHERE employee_id = 141);
Eg:查询工资最低的员工信息
select last_name,job_id,salary
FROM employees
WHERE salary =
(SELECT MIN(salary)
FROM employees);
Eg:求各个部门编号和部门的最低工资(这个最低工资要比50号部门的最低工资要高)
思路分析:看子查询 看group by 和 having条件检索 看检索对象
//子查询:求50号部门的最低工资
à检索 各部门的最低工资 比50号部门的最低工资 大的部门号和部门最小工资
SELECT department_id,MIN(salary)
GROUP By department_id
HAVING MIN(salary) >
(SELECT MIN(salary)
FROM employees
WHERE department_id = 50);
4 查询部门名称是SALES的员工信息(2中方式)
方法1:子查询
SELECT *
FROM emp
WHERE DEPTNO = (SELECT deptno
FROM dept
WHERE dname = 'SALES');
方法2:多表查询
SELECT e.*
FROM emp e,dept d
WHERE e.deptno = d.deptno and d.dname = 'SALES';
注意:另外一种(多表查询的运行速度比子查询的运行速度快。由于多表查询是一次将数据读到内存中进行读取,消耗内存而加高速度)
第一种(子查询要进行两次连接数据库的操作。连接数据库的操作是一个耗时操作,减低了速度)。
5 select后面要查询的列中能够是单行子查询,不能够是多行子查询
错误案例:
select ename,empno,(select deptno from emp) AA from emp;
正确案例:
select ename,empno,(select deptno from emp where EMPNO = 7369) AA from emp;
6 查询员工的姓名和薪水
select *
from (select ename,sal
from emp);
7 多行子查询
多行子查询仅仅能使用多行比較操作符(in any all)
--eg 查询部门名称是*(不是)SALES 和 ACCOUNTING 的员工信息 2种方法
--eg 查询薪水 比30号部门 随意一个员工薪高的员工信息
-eg 查询薪水 比30号部门 全部员工 高的员工信息
查询部门名称是*(不是)SALES 和 ACCOUNTING 的员工信息 2种方法
from emp
where deptno in
(select deptno
from dept
where dname = 'SALES' or dname = 'ACCOUNTING');
操作符
含义
IN
等于列表中的不论什么一个
ANY
和子查询返回的随意一个值比較
ALL
和子查询返回的全部值比較
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE salary < ANY
(SELECT salary
FROM employees
WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROC';
WHERE salary < ALL
(SELECT salary
FROM employees
WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROC'
Eg: 比30号部门 随意一个员工薪高的员工信息 大于集合中的最小值 any
where sal > all(select sal
from emp
where deptno = 30);
等价于:
where sal > (select max(sal)
from emp
where deptno = 30);
查询是经理的员工信息
分析:
WHERE empno in(经理的集合);
实际:
where empno in
(
select mgr from emp
);
where empno not in
(
select mgr
where mgr is not null
);
本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5193739.html,如需转载请自行联系原作者