目录
子查询返回单行单列
查询公司工资最低的员工信息
查找公司雇佣最早的员工信息
子查询返回单行多列
查询与 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                    207499 ALLEN                SALESMAN                 7698 20-2月 -81           1600        300         307521 WARD                 SALESMAN                 7698 22-2月 -81           1250        500         307566 JONES                MANAGER                  7839 02-4月 -81           2975                    207654 MARTIN               SALESMAN                 7698 28-9月 -81           1250       1400         307698 BLAKE                MANAGER                  7839 01-5月 -81           2850                    307782 CLARK                MANAGER                  7839 09-6月 -81           2450                    107839 KING                 PRESIDENT                     17-11月-81           5000                    107844 TURNER               SALESMAN                 7698 08-9月 -81           1500          0         307900 JAMES                CLERK                    7698 03-12月-81            950                    307902 FORD                 ANALYST                  7566 03-12月-81           3000                    207934 MILLER               CLERK                    7782 23-1月 -82           1300                    108989 HELLO可以看出,最低工资是 800,但是不可能直接使用 80 这个数据
因为这个数据需要统计出来,而要想知道这个内容,可以利用 min() 函数
SQL> select min(sal)2  from emp;MIN(SAL)
----------800第二步:以上的查询会返回单行单列的数据,本质就是一个数值
如果现在给了数值,就可以直接 利用 where子句筛选所需要的数据行
SQL> select * from emp2  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 emp3  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,job2  from emp3  where ename='ALLEN';SAL JOB
---------- ------------------1600 SALESMAN此时返回了单行两列的数据信息,而要进行比较的时候需要同时满足
SQL> select * from emp2  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 sal2  from emp3  where job='MANAGER';SAL
----------297528502450返回的值是多行单列的记录,可以发现职位是“MANAGER”的,
员工的薪水有 3 种: 2975,2850和 2450。
再来看下面这个查询语句
SQL> select * from emp2  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                    207698 BLAKE                MANAGER                  7839 01-5月 -81           2850                    307782 CLARK                MANAGER                  7839 09-6月 -81           2450                    10对 IN 操作还可以使用 NOT IN 进行,指的是内容不在指定的范围内
SQL> select * from emp2  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         307844 TURNER               SALESMAN                 7698 08-9月 -81           1500          0         307839 KING                 PRESIDENT                     17-11月-81           5000                    107900 JAMES                CLERK                    7698 03-12月-81            950                    307934 MILLER               CLERK                    7782 23-1月 -82           1300                    107902 FORD                 ANALYST                  7566 03-12月-81           3000                    207369 SMITH                CLERK                    7902 17-12月-80            800                    207521 WARD                 SALESMAN                 7698 22-2月 -81           1250        500         307654 MARTIN               SALESMAN                 7698 28-9月 -81           1250       1400         30在讲解 NOT IN 操作的时候曾经说过一个问题,不能够为 null,这一概念在此处照样适用
SQL> select * from emp2  where comm not in(select comm from emp);未选定行主要原因就是因为在子查询“ (SELECT comm FROM emp) ”中出现了 null
