顯示與SMITH同一部門的員工
mysql> select *from emp where ename='SMITH';
+--------+-------+-------+------+---------------------+--------+------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+--------+-------+-------+------+---------------------+--------+------+--------+
| 007369 | SMITH | CLERK | 7902 | 1980-12-17 00:00:00 | 800.00 | NULL | 20 |
+--------+-------+-------+------+---------------------+--------+------+--------+
1 row in set (0.00 sec)mysql> select deptno from emp where ename='SMITH';
+--------+
| deptno |
+--------+
| 20 |
+--------+
1 row in set (0.00 sec)mysql> select *from emp where deptno=20;
+--------+-------+---------+------+---------------------+---------+------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+--------+-------+---------+------+---------------------+---------+------+--------+
| 007369 | SMITH | CLERK | 7902 | 1980-12-17 00:00:00 | 800.00 | NULL | 20 |
| 007566 | JONES | MANAGER | 7839 | 1981-04-02 00:00:00 | 2975.00 | NULL | 20 |
| 007788 | SCOTT | ANALYST | 7566 | 1987-04-19 00:00:00 | 3000.00 | NULL | 20 |
| 007876 | ADAMS | CLERK | 7788 | 1987-05-23 00:00:00 | 1100.00 | NULL | 20 |
| 007902 | FORD | ANALYST | 7566 | 1981-12-03 00:00:00 | 3000.00 | NULL | 20 |
+--------+-------+---------+------+---------------------+---------+------+--------+
5 rows in set (0.00 sec)mysql> select *from emp where deptno=(select deptno from emp where ename='SMITH');
+--------+-------+---------+------+---------------------+---------+------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+--------+-------+---------+------+---------------------+---------+------+--------+
| 007369 | SMITH | CLERK | 7902 | 1980-12-17 00:00:00 | 800.00 | NULL | 20 |
| 007566 | JONES | MANAGER | 7839 | 1981-04-02 00:00:00 | 2975.00 | NULL | 20 |
| 007788 | SCOTT | ANALYST | 7566 | 1987-04-19 00:00:00 | 3000.00 | NULL | 20 |
| 007876 | ADAMS | CLERK | 7788 | 1987-05-23 00:00:00 | 1100.00 | NULL | 20 |
| 007902 | FORD | ANALYST | 7566 | 1981-12-03 00:00:00 | 3000.00 | NULL | 20 |
+--------+-------+---------+------+---------------------+---------+------+--------+
5 rows in set (0.00 sec)mysql>
在這些示例中,我們看到了子查詢(subquery)和WHERE
子句在數據庫查詢中是如何結合使用的,特別是在需要基于其他查詢結果進行篩選時。
查詢特定員工信息: 第一個查詢通過WHERE
子句直接找到名為SMITH
的員工信息。
查詢特定員工的部門編號: 第二個查詢使用WHERE
子句來找到SMITH
的deptno
。這是一個簡單的查詢,返回SMITH
所在的部門編號,即20
。
基于部門編號查詢部門內所有員工: 第三個查詢通過WHERE
子句和硬編碼的部門編號(從第二個查詢中得知為20
)來找到所有在該部門工作的員工。
使用子查詢自動找到特定員工的部門內所有員工: 第四個查詢展示了子查詢的使用。這里,WHERE
子句中的條件是通過子查詢動態確定的,即先找到SMITH
的deptno
,然后使用這個結果來篩選同一部門內的所有員工。這個查詢避免了硬編碼部門編號,使查詢更靈活和自動化。
查詢和10號部門的工作崗位相同的雇員的名字,崗位,工資,部門號,但是不包括10號自己的
mysql> select job from emp where deptno=10;
+-----------+
| job |
+-----------+
| MANAGER |
| PRESIDENT |
| CLERK |
+-----------+
3 rows in set (0.00 sec)mysql> select distinct job from emp where deptno=10;
+-----------+
| job |
+-----------+
| MANAGER |
| PRESIDENT |
| CLERK |
+-----------+
3 rows in set (0.01 sec)mysql> select ename,job ,sal ,deptno from emp where job in (select distinct job from emp where deptno=10);
+--------+-----------+---------+--------+
| ename | job | sal | deptno |
+--------+-----------+---------+--------+
| JONES | MANAGER | 2975.00 | 20 |
| BLAKE | MANAGER | 2850.00 | 30 |
| CLARK | MANAGER | 2450.00 | 10 |
| KING | PRESIDENT | 5000.00 | 10 |
| SMITH | CLERK | 800.00 | 20 |
| ADAMS | CLERK | 1100.00 | 20 |
| JAMES | CLERK | 950.00 | 30 |
| MILLER | CLERK | 1300.00 | 10 |
+--------+-----------+---------+--------+
8 rows in set (0.00 sec)mysql> select ename,job ,sal ,deptno from emp where (job in (select distinct job from emp where deptno=10)) and deptno <>10;
+-------+---------+---------+--------+
| ename | job | sal | deptno |
+-------+---------+---------+--------+
| JONES | MANAGER | 2975.00 | 20 |
| BLAKE | MANAGER | 2850.00 | 30 |
| SMITH | CLERK | 800.00 | 20 |
| ADAMS | CLERK | 1100.00 | 20 |
| JAMES | CLERK | 950.00 | 30 |
+-------+---------+---------+--------+
5 rows in set (0.00 sec)mysql> select * from (select ename,job ,sal ,deptno from emp where (job in (select distinct job from emp where deptno=10)) and deptno <>
>10) as tmp ,dept;
+-------+---------+---------+--------+--------+------------+----------+
| ename | job | sal | deptno | deptno | dname | loc |
+-------+---------+---------+--------+--------+------------+----------+
| SMITH | CLERK | 800.00 | 20 | 10 | ACCOUNTING | NEW YORK |
| JONES | MANAGER | 2975.00 | 20 | 10 | ACCOUNTING | NEW YORK |
| BLAKE | MANAGER | 2850.00 | 30 | 10 | ACCOUNTING | NEW YORK |
| ADAMS | CLERK | 1100.00 | 20 | 10 | ACCOUNTING | NEW YORK |
| JAMES | CLERK | 950.00 | 30 | 10 | ACCOUNTING | NEW YORK |
| SMITH | CLERK | 800.00 | 20 | 20 | RESEARCH | DALLAS |
| JONES | MANAGER | 2975.00 | 20 | 20 | RESEARCH | DALLAS |
| BLAKE | MANAGER | 2850.00 | 30 | 20 | RESEARCH | DALLAS |
| ADAMS | CLERK | 1100.00 | 20 | 20 | RESEARCH | DALLAS |
| JAMES | CLERK | 950.00 | 30 | 20 | RESEARCH | DALLAS |
| SMITH | CLERK | 800.00 | 20 | 30 | SALES | CHICAGO |
| JONES | MANAGER | 2975.00 | 20 | 30 | SALES | CHICAGO |
| BLAKE | MANAGER | 2850.00 | 30 | 30 | SALES | CHICAGO |
| ADAMS | CLERK | 1100.00 | 20 | 30 | SALES | CHICAGO |
| JAMES | CLERK | 950.00 | 30 | 30 | SALES | CHICAGO |
| SMITH | CLERK | 800.00 | 20 | 40 | OPERATIONS | BOSTON |
| JONES | MANAGER | 2975.00 | 20 | 40 | OPERATIONS | BOSTON |
| BLAKE | MANAGER | 2850.00 | 30 | 40 | OPERATIONS | BOSTON |
| ADAMS | CLERK | 1100.00 | 20 | 40 | OPERATIONS | BOSTON |
| JAMES | CLERK | 950.00 | 30 | 40 | OPERATIONS | BOSTON |
+-------+---------+---------+--------+--------+------------+----------+
20 rows in set (0.00 sec)mysql> select * from (select ename,job ,sal ,deptno from emp where (job in (select distinct job from emp where deptno=10)) and deptno <>10) as tmp ,dept where dept.deptno=tmp.deptno;
+-------+---------+---------+--------+--------+----------+---------+
| ename | job | sal | deptno | deptno | dname | loc |
+-------+---------+---------+--------+--------+----------+---------+
| SMITH | CLERK | 800.00 | 20 | 20 | RESEARCH | DALLAS |
| JONES | MANAGER | 2975.00 | 20 | 20 | RESEARCH | DALLAS |
| ADAMS | CLERK | 1100.00 | 20 | 20 | RESEARCH | DALLAS |
| BLAKE | MANAGER | 2850.00 | 30 | 30 | SALES | CHICAGO |
| JAMES | CLERK | 950.00 | 30 | 30 | SALES | CHICAGO |
+-------+---------+---------+--------+--------+----------+---------+
5 rows in set (0.00 sec)mysql> select ename,job ,sal ,dname from (select ename,job ,sal ,deptno from emp where (job in (select distinct job from emp where deptnno=10))
+-------+---------+---------+----------+
| ename | job | sal | dname |
+-------+---------+---------+----------+
| SMITH | CLERK | 800.00 | RESEARCH |
| JONES | MANAGER | 2975.00 | RESEARCH |
| ADAMS | CLERK | 1100.00 | RESEARCH |
| BLAKE | MANAGER | 2850.00 | SALES |
| JAMES | CLERK | 950.00 | SALES |
+-------+---------+---------+----------+
5 rows in set (0.00 sec)mysql>
子查詢和WHERE的關系
當子查詢用在WHERE
子句中時,它可以為外部查詢提供條件值。例如,你可以使用子查詢找出與某個特定條件匹配的記錄,然后用這個結果去過濾外部查詢的結果。
子查詢通常用于比較運算符的右側,如=
, <>
, IN
, NOT IN
, >
, <
, >=
, <=
等。
子查詢可以返回單個值或多個值,具體取決于你如何使用它們。返回單個值的子查詢通常用于標準的比較運算,而返回多個值的子查詢常用于IN
, ANY
, ALL
這樣的操作中。
查找特定部門號的所有職位:
SELECT job FROM emp WHERE deptno=10;
這個查詢返回部門號為10的所有職位。
使用子查詢過濾特定條件的記錄:
SELECT * FROM emp WHERE deptno=(SELECT deptno FROM emp WHERE ename='SMITH');
這個查詢首先找出名為SMITH的員工所在的部門號,然后返回該部門所有員工的記錄。
結合子查詢和DISTINCT關鍵字:
SELECT ename, job, sal, deptno FROM emp WHERE job IN (SELECT DISTINCT job FROM emp WHERE deptno=10);
這個查詢首先找出部門號為10的所有不重復的職位,然后返回具有這些職位的所有員工的記錄。
使用子查詢和連接查詢提供更復雜的篩選邏輯:
SELECT * FROM (SELECT ename, job, sal, deptno FROM emp WHERE (job IN (SELECT DISTINCT job FROM emp WHERE deptno=10)) AND deptno <> 10) AS tmp, dept WHERE dept.deptno=tmp.deptno;
這個查詢展示了如何使用子查詢作為一個臨時表(tmp)的篩選條件,并且如何將它與另一個表(dept)進行連接,以便獲取滿足特定條件的詳細信息。
顯示工資比部門30的所有員工的工資高的員工的姓名、工資和部門號
mysql> select max(sal) from emp;
+----------+
| max(sal) |
+----------+
| 5000.00 |
+----------+
1 row in set (0.00 sec)mysql> select max(sal) from emp where deptno =30;
+----------+
| max(sal) |
+----------+
| 2850.00 |
+----------+
1 row in set (0.00 sec)mysql> select *from emp where sal>2850;
+--------+-------+-----------+------+---------------------+---------+------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+--------+-------+-----------+------+---------------------+---------+------+--------+
| 007566 | JONES | MANAGER | 7839 | 1981-04-02 00:00:00 | 2975.00 | NULL | 20 |
| 007788 | SCOTT | ANALYST | 7566 | 1987-04-19 00:00:00 | 3000.00 | NULL | 20 |
| 007839 | KING | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 | NULL | 10 |
| 007902 | FORD | ANALYST | 7566 | 1981-12-03 00:00:00 | 3000.00 | NULL | 20 |
+--------+-------+-----------+------+---------------------+---------+------+--------+
4 rows in set (0.00 sec)mysql> select *from emp where sal>(select max(sal) from emp where deptno =30);
+--------+-------+-----------+------+---------------------+---------+------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+--------+-------+-----------+------+---------------------+---------+------+--------+
| 007566 | JONES | MANAGER | 7839 | 1981-04-02 00:00:00 | 2975.00 | NULL | 20 |
| 007788 | SCOTT | ANALYST | 7566 | 1987-04-19 00:00:00 | 3000.00 | NULL | 20 |
| 007839 | KING | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 | NULL | 10 |
| 007902 | FORD | ANALYST | 7566 | 1981-12-03 00:00:00 | 3000.00 | NULL | 20 |
+--------+-------+-----------+------+---------------------+---------+------+--------+
4 rows in set (0.00 sec)mysql> select ename ,sal ,deptno from emp where sal>(select max(sal) from emp where deptno =30);
+-------+---------+--------+
| ename | sal | deptno |
+-------+---------+--------+
| JONES | 2975.00 | 20 |
| SCOTT | 3000.00 | 20 |
| KING | 5000.00 | 10 |
| FORD | 3000.00 | 20 |
+-------+---------+--------+
4 rows in set (0.01 sec)mysql>
mysql>
mysql> select sal from emp where deptno =30;
+---------+
| sal |
+---------+
| 1600.00 |
| 1250.00 |
| 1250.00 |
| 2850.00 |
| 1500.00 |
| 950.00 |
+---------+
6 rows in set (0.00 sec)mysql> select distinct sal from emp where deptno =30;
+---------+
| sal |
+---------+
| 1600.00 |
| 1250.00 |
| 2850.00 |
| 1500.00 |
| 950.00 |
+---------+
5 rows in set (0.00 sec)mysql> select *from emp where sal >all(select distinct sal from emp where deptno =30);
+--------+-------+-----------+------+---------------------+---------+------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+--------+-------+-----------+------+---------------------+---------+------+--------+
| 007566 | JONES | MANAGER | 7839 | 1981-04-02 00:00:00 | 2975.00 | NULL | 20 |
| 007788 | SCOTT | ANALYST | 7566 | 1987-04-19 00:00:00 | 3000.00 | NULL | 20 |
| 007839 | KING | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 | NULL | 10 |
| 007902 | FORD | ANALYST | 7566 | 1981-12-03 00:00:00 | 3000.00 | NULL | 20 |
+--------+-------+-----------+------+---------------------+---------+------+--------+
4 rows in set (0.00 sec)mysql> select ename,sal,deptno from emp where sal >all(select distinct sal from emp where deptno =30);
+-------+---------+--------+
| ename | sal | deptno |
+-------+---------+--------+
| JONES | 2975.00 | 20 |
| SCOTT | 3000.00 | 20 |
| KING | 5000.00 | 10 |
| FORD | 3000.00 | 20 |
+-------+---------+--------+
4 rows in set (0.00 sec)mysql>
這一系列的SQL查詢展示了如何使用SELECT
語句來執行數據庫中的不同類型的數據檢索操作,包括使用聚合函數(如MAX
),子查詢,以及ALL
關鍵字來過濾結果。
第一種方法:
獲取最高薪水:
SELECT max(sal) FROM emp;
此查詢返回整個emp
表中的最高薪水。
獲取特定部門的最高薪水:
SELECT max(sal) FROM emp WHERE deptno = 30;
此查詢返回部門號為30的員工中的最高薪水。
獲取薪水高于2850的所有員工:
SELECT * FROM emp WHERE sal > 2850;
這個查詢返回薪水高于2850的所有員工的詳細信息。
使用子查詢過濾薪水:
SELECT * FROM emp WHERE sal > (SELECT max(sal) FROM emp WHERE deptno = 30);
通過子查詢找到部門號為30的最高薪水,然后返回薪水高于這個值的所有員工的詳細信息。
第二種方法:
查詢特定部門的所有不同薪資:
SELECT DISTINCT sal FROM emp WHERE deptno = 30;
這個查詢返回部門號為30的所有不同薪資水平。
篩選出薪水高于部門30中所有員工薪水的員工:
SELECT * FROM emp WHERE sal > ALL (SELECT distinct sal FROM emp WHERE deptno = 30);
通過子查詢找出部門號為30的所有不同的薪水值,然后返回薪水高于這些值中的任意一個的所有員工的詳細信息。ALL
關鍵字確保了比較是針對子查詢返回的每一個值。
顯示工資比部門30的任意成員的工資高的員工的姓名、工資和部門號(包括自己部門)
mysql> select sal from emp where deptno=30;
+---------+
| sal |
+---------+
| 1600.00 |
| 1250.00 |
| 1250.00 |
| 2850.00 |
| 1500.00 |
| 950.00 |
+---------+
6 rows in set (0.00 sec)mysql> select distinct sal from emp where deptno=30;
+---------+
| sal |
+---------+
| 1600.00 |
| 1250.00 |
| 2850.00 |
| 1500.00 |
| 950.00 |
+---------+
5 rows in set (0.01 sec)mysql> select *from emp where sal> any (select distinct sal from emp where deptno=30);
+--------+--------+-----------+------+---------------------+---------+---------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+--------+--------+-----------+------+---------------------+---------+---------+--------+
| 007499 | ALLEN | SALESMAN | 7698 | 1981-02-20 00:00:00 | 1600.00 | 300.00 | 30 |
| 007521 | WARD | SALESMAN | 7698 | 1981-02-22 00:00:00 | 1250.00 | 500.00 | 30 |
| 007566 | JONES | MANAGER | 7839 | 1981-04-02 00:00:00 | 2975.00 | NULL | 20 |
| 007654 | MARTIN | SALESMAN | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 | 30 |
| 007698 | BLAKE | MANAGER | 7839 | 1981-05-01 00:00:00 | 2850.00 | NULL | 30 |
| 007782 | CLARK | MANAGER | 7839 | 1981-06-09 00:00:00 | 2450.00 | NULL | 10 |
| 007788 | SCOTT | ANALYST | 7566 | 1987-04-19 00:00:00 | 3000.00 | NULL | 20 |
| 007839 | KING | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 | NULL | 10 |
| 007844 | TURNER | SALESMAN | 7698 | 1981-09-08 00:00:00 | 1500.00 | 0.00 | 30 |
| 007876 | ADAMS | CLERK | 7788 | 1987-05-23 00:00:00 | 1100.00 | NULL | 20 |
| 007902 | FORD | ANALYST | 7566 | 1981-12-03 00:00:00 | 3000.00 | NULL | 20 |
| 007934 | MILLER | CLERK | 7782 | 1982-01-23 00:00:00 | 1300.00 | NULL | 10 |
+--------+--------+-----------+------+---------------------+---------+---------+--------+
12 rows in set (0.00 sec)mysql> select ename,sal,deptno from emp where sal> any (select distinct sal from emp where deptno=30);
+--------+---------+--------+
| ename | sal | deptno |
+--------+---------+--------+
| ALLEN | 1600.00 | 30 |
| WARD | 1250.00 | 30 |
| JONES | 2975.00 | 20 |
| MARTIN | 1250.00 | 30 |
| BLAKE | 2850.00 | 30 |
| CLARK | 2450.00 | 10 |
| SCOTT | 3000.00 | 20 |
| KING | 5000.00 | 10 |
| TURNER | 1500.00 | 30 |
| ADAMS | 1100.00 | 20 |
| FORD | 3000.00 | 20 |
| MILLER | 1300.00 | 10 |
+--------+---------+--------+
12 rows in set (0.00 sec)mysql>
mysql>
mysql> select min(sal) from emp where deptno =30;
+----------+
| min(sal) |
+----------+
| 950.00 |
+----------+
1 row in set (0.00 sec)mysql> select *from emp where sal>(select min(sal) from emp where deptno =30);
+--------+--------+-----------+------+---------------------+---------+---------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+--------+--------+-----------+------+---------------------+---------+---------+--------+
| 007499 | ALLEN | SALESMAN | 7698 | 1981-02-20 00:00:00 | 1600.00 | 300.00 | 30 |
| 007521 | WARD | SALESMAN | 7698 | 1981-02-22 00:00:00 | 1250.00 | 500.00 | 30 |
| 007566 | JONES | MANAGER | 7839 | 1981-04-02 00:00:00 | 2975.00 | NULL | 20 |
| 007654 | MARTIN | SALESMAN | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 | 30 |
| 007698 | BLAKE | MANAGER | 7839 | 1981-05-01 00:00:00 | 2850.00 | NULL | 30 |
| 007782 | CLARK | MANAGER | 7839 | 1981-06-09 00:00:00 | 2450.00 | NULL | 10 |
| 007788 | SCOTT | ANALYST | 7566 | 1987-04-19 00:00:00 | 3000.00 | NULL | 20 |
| 007839 | KING | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 | NULL | 10 |
| 007844 | TURNER | SALESMAN | 7698 | 1981-09-08 00:00:00 | 1500.00 | 0.00 | 30 |
| 007876 | ADAMS | CLERK | 7788 | 1987-05-23 00:00:00 | 1100.00 | NULL | 20 |
| 007902 | FORD | ANALYST | 7566 | 1981-12-03 00:00:00 | 3000.00 | NULL | 20 |
| 007934 | MILLER | CLERK | 7782 | 1982-01-23 00:00:00 | 1300.00 | NULL | 10 |
+--------+--------+-----------+------+---------------------+---------+---------+--------+
12 rows in set (0.00 sec)mysql> select ename,sal,deptno from emp where sal>(select min(sal) from emp where deptno =30);
+--------+---------+--------+
| ename | sal | deptno |
+--------+---------+--------+
| ALLEN | 1600.00 | 30 |
| WARD | 1250.00 | 30 |
| JONES | 2975.00 | 20 |
| MARTIN | 1250.00 | 30 |
| BLAKE | 2850.00 | 30 |
| CLARK | 2450.00 | 10 |
| SCOTT | 3000.00 | 20 |
| KING | 5000.00 | 10 |
| TURNER | 1500.00 | 30 |
| ADAMS | 1100.00 | 20 |
| FORD | 3000.00 | 20 |
| MILLER | 1300.00 | 10 |
+--------+---------+--------+
12 rows in set (0.00 sec)mysql>
這一系列查詢展示了如何使用ANY
和ALL
關鍵字以及MIN
函數來篩選出滿足特定條件的記錄。
第一種方法:
查詢特定部門的薪資列表:
SELECT sal FROM emp WHERE deptno = 30;
這個查詢返回部門號為30的所有員工的薪資。
查詢特定部門的不同薪資值:
SELECT DISTINCT sal FROM emp WHERE deptno = 30;
該查詢返回部門號為30的員工的不同薪資水平。
查詢薪資高于部門30中任一薪資的員工:
SELECT * FROM emp WHERE sal > ANY (SELECT DISTINCT sal FROM emp WHERE deptno = 30);
這個查詢返回薪資高于部門號為30中的任一薪資水平的所有員工信息。
第二種方法:
查詢特定部門的最低薪資:
SELECT MIN(sal) FROM emp WHERE deptno = 30;
該查詢返回部門號為30的員工中最低的薪資。
查詢薪資高于部門30最低薪資的員工:
SELECT * FROM emp WHERE sal > (SELECT MIN(sal) FROM emp WHERE deptno = 30);
這個查詢返回薪資高于部門號為30的最低薪資的所有員工信息。
查詢和SMITH的部門和崗位完全相同的所有雇員,不含SMITH本人
mysql> select deptno,job from emp;
+--------+-----------+
| deptno | job |
+--------+-----------+
| 20 | CLERK |
| 30 | SALESMAN |
| 30 | SALESMAN |
| 20 | MANAGER |
| 30 | SALESMAN |
| 30 | MANAGER |
| 10 | MANAGER |
| 20 | ANALYST |
| 10 | PRESIDENT |
| 30 | SALESMAN |
| 20 | CLERK |
| 30 | CLERK |
| 20 | ANALYST |
| 10 | CLERK |
+--------+-----------+
14 rows in set (0.00 sec)mysql> select deptno,job from emp where ename='SMITH';
+--------+-------+
| deptno | job |
+--------+-------+
| 20 | CLERK |
+--------+-------+
1 row in set (0.00 sec)mysql> select *from emp where (deptno ,job )=(select deptno ,job from emp where ename='SMITH');
+--------+-------+-------+------+---------------------+---------+------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+--------+-------+-------+------+---------------------+---------+------+--------+
| 007369 | SMITH | CLERK | 7902 | 1980-12-17 00:00:00 | 800.00 | NULL | 20 |
| 007876 | ADAMS | CLERK | 7788 | 1987-05-23 00:00:00 | 1100.00 | NULL | 20 |
+--------+-------+-------+------+---------------------+---------+------+--------+
2 rows in set (0.00 sec)mysql> select *from emp where (deptno ,job )=(select deptno ,job from emp where ename='SMITH') and ename<>'SMITH';
+--------+-------+-------+------+---------------------+---------+------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+--------+-------+-------+------+---------------------+---------+------+--------+
| 007876 | ADAMS | CLERK | 7788 | 1987-05-23 00:00:00 | 1100.00 | NULL | 20 |
+--------+-------+-------+------+---------------------+---------+------+--------+
1 row in set (0.00 sec)mysql>
mysql>
mysql> select *from emp where deptno=(select deptno from emp where ename='SMITH') and job=(select job from emp where ename='SMITH');
+--------+-------+-------+------+---------------------+---------+------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+--------+-------+-------+------+---------------------+---------+------+--------+
| 007369 | SMITH | CLERK | 7902 | 1980-12-17 00:00:00 | 800.00 | NULL | 20 |
| 007876 | ADAMS | CLERK | 7788 | 1987-05-23 00:00:00 | 1100.00 | NULL | 20 |
+--------+-------+-------+------+---------------------+---------+------+--------+
2 rows in set (0.00 sec)mysql> select *from emp where deptno=(select deptno from emp where ename='SMITH') and job=(select job from emp where ename='SMITH') and ename<>'SMITH';
+--------+-------+-------+------+---------------------+---------+------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+--------+-------+-------+------+---------------------+---------+------+--------+
| 007876 | ADAMS | CLERK | 7788 | 1987-05-23 00:00:00 | 1100.00 | NULL | 20 |
+--------+-------+-------+------+---------------------+---------+------+--------+
1 row in set (0.01 sec)mysql>
目前全部的子查詢,全部都是在where子句中,充當判斷條件!!
任何時刻,查詢出來的臨時結構,本質在邏輯上也是表結構!
這一系列查詢演示了如何使用組合條件和子查詢來篩選特定的記錄。
第一種方法:
查詢所有員工的部門號和職位:
SELECT deptno, job FROM emp;
返回所有員工的部門號和職位信息。
查詢特定員工(例如SMITH)的部門號和職位:
SELECT deptno, job FROM emp WHERE ename = 'SMITH';
返回名為SMITH的員工的部門號和職位。
查詢與SMITH相同部門和職位的所有員工:
SELECT * FROM emp WHERE (deptno, job) = (SELECT deptno, job FROM emp WHERE ename = 'SMITH');
使用組合條件(deptno, job)
與子查詢配合,返回與SMITH在同一部門且職位相同的所有員工信息。
查詢除SMITH外,與SMITH相同部門和職位的所有員工:
SELECT * FROM emp WHERE (deptno, job) = (SELECT deptno, job FROM emp WHERE ename = 'SMITH') AND ename <> 'SMITH';
在上一個查詢的基礎上增加了一個條件來排除SMITH本身,返回除SMITH外,與SMITH在同一部門且職位相同的所有員工信息。
第二種方法:
分開使用子查詢條件進行篩選:
SELECT * FROM emp WHERE deptno = (SELECT deptno FROM emp WHERE ename = 'SMITH') AND job = (SELECT job FROM emp WHERE ename = 'SMITH');
這個查詢與第三個查詢效果相同,但是分別對deptno
和job
使用了子查詢作為條件進行篩選。
分開使用子查詢條件進行篩選并排除SMITH:
SELECT * FROM emp WHERE deptno = (SELECT deptno FROM emp WHERE ename = 'SMITH') AND job = (SELECT job FROM emp WHERE ename = 'SMITH') AND ename <> 'SMITH';
結尾
最后,感謝您閱讀我的文章,希望這些內容能夠對您有所啟發和幫助。如果您有任何問題或想要分享您的觀點,請隨時在評論區留言。
同時,不要忘記訂閱我的博客以獲取更多有趣的內容。在未來的文章中,我將繼續探討這個話題的不同方面,為您呈現更多深度和見解。
謝謝您的支持,期待與您在下一篇文章中再次相遇!