目录
子查询返回单行单列
查询公司工资最低的员工信息
查找公司雇佣最早的员工信息
子查询返回单行多列
查询与 ALLEN 工资相同,职位相同的所有员工信息
子查询返回多行单列
IN 操作
查询职位是“MANAGER”的所有员工的薪水
Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645
where子句主要是进行数据的筛选。通过分析可以发现,单行单列、多行单列、单行多列都可以在 where子句中出现
子查询返回单行单列
查询公司工资最低的员工信息
SQL> set linesize 250
SQL> select *
2 from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7900 JAMES CLERK 7698 03-12月-81 950 30
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
8989 HELLO
可以看出,最低工资是 800,但是不可能直接使用 80 这个数据
因为这个数据需要统计出来,而要想知道这个内容,可以利用 min() 函数
SQL> select min(sal)
2 from emp;
MIN(SAL)
----------
800
第二步:以上的查询会返回单行单列的数据,本质就是一个数值
如果现在给了数值,就可以直接 利用 where子句筛选所需要的数据行
SQL> select * from emp
2 where sal=(select min(sal) from emp);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
查找公司雇佣最早的员工信息
雇佣最早的员工一定是雇佣日期最小的,那么使用 min() 函数完成
SQL> select min(hiredate)
2 from emp;
MIN(HIREDATE)
--------------
17-12月-80
以上的查询会返回单行单列的数据,所以可以直接在 where子句中使用
SQL> select *
2 from emp
3 where hiredate=(select min(hiredate) from emp);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
子查询返回单行多列
查询与 ALLEN 工资相同,职位相同的所有员工信息
现在需要同时比较工资与职位,首先应该查询到 ALLEM的工资与职位
SQL> select sal,job
2 from emp
3 where ename='ALLEN';
SAL JOB
---------- ------------------
1600 SALESMAN
此时返回了单行两列的数据信息,而要进行比较的时候需要同时满足
SQL> select * from emp
2 where (sal,job)=(select sal,job from emp where ename='ALLEN');
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
子查询返回多行单列
如果说子查询返回了多行单列的数据,实质上就相当于告诉用户一个数据的操作范围
而如果要想 进行范围的判断
在 WHERE 子句里面主要提供 3 个运算符: IN、ANY、ALL
IN 操作
IN 操作指的是内容在指定的范围内
查询职位是“MANAGER”的所有员工的薪水
SQL> select sal
2 from emp
3 where job='MANAGER';
SAL
----------
2975
2850
2450
返回的值是多行单列的记录,可以发现职位是“MANAGER”的,
员工的薪水有 3 种: 2975,2850和 2450。
再来看下面这个查询语句
SQL> select * from emp
2 where sal in(select sal from emp where job='MANAGER');
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
对 IN 操作还可以使用 NOT IN 进行,指的是内容不在指定的范围内
SQL> select * from emp
2 where sal not in(select sal from emp where job='MANAGER');
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7839 KING PRESIDENT 17-11月-81 5000 10
7900 JAMES CLERK 7698 03-12月-81 950 30
7934 MILLER CLERK 7782 23-1月 -82 1300 10
7902 FORD ANALYST 7566 03-12月-81 3000 20
7369 SMITH CLERK 7902 17-12月-80 800 20
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
在讲解 NOT IN 操作的时候曾经说过一个问题,不能够为 null,这一概念在此处照样适用
SQL> select * from emp
2 where comm not in(select comm from emp);
未选定行
主要原因就是因为在子查询“ (SELECT comm FROM emp) ”中出现了 null