【八】【SQL】子查詢和where

顯示與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子句來找到SMITHdeptno。這是一個簡單的查詢,返回SMITH所在的部門編號,即20

基于部門編號查詢部門內所有員工: 第三個查詢通過WHERE子句和硬編碼的部門編號(從第二個查詢中得知為20)來找到所有在該部門工作的員工。

使用子查詢自動找到特定員工的部門內所有員工: 第四個查詢展示了子查詢的使用。這里,WHERE子句中的條件是通過子查詢動態確定的,即先找到SMITHdeptno,然后使用這個結果來篩選同一部門內的所有員工。這個查詢避免了硬編碼部門編號,使查詢更靈活和自動化。

查詢和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> 

這一系列查詢展示了如何使用ANYALL關鍵字以及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');

這個查詢與第三個查詢效果相同,但是分別對deptnojob使用了子查詢作為條件進行篩選。

分開使用子查詢條件進行篩選并排除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';

結尾

最后,感謝您閱讀我的文章,希望這些內容能夠對您有所啟發和幫助。如果您有任何問題或想要分享您的觀點,請隨時在評論區留言。

同時,不要忘記訂閱我的博客以獲取更多有趣的內容。在未來的文章中,我將繼續探討這個話題的不同方面,為您呈現更多深度和見解。

謝謝您的支持,期待與您在下一篇文章中再次相遇!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/717005.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717005.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717005.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python調用C,python call c,pybind11

文章目錄 前言1.將pybind11 clone至當前項目下的extern目錄下2.在CmakeLists.txt中將pybind11項目包含3.接口cpp文件格式4.編譯5.導入Python使用6.性能比較pybind11項目地址 前言 通過https://github.com/pybind/pybind11項目實現Python調用C/C代碼 實現步驟 1.將pybind11 cl…

騰訊云4核8G服務器申請費用多少?性能如何?支持幾個人?

騰訊云4核8G服務器支持多少人在線訪問&#xff1f;支持25人同時訪問。實際上程序效率不同支持人數在線人數不同&#xff0c;公網帶寬也是影響4核8G服務器并發數的一大因素&#xff0c;假設公網帶寬太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU內存也會造成計算…

大數據報告檢測到風險等級太高是怎么回事呢?

隨著金融風控越來越多元化&#xff0c;大數據作為新興的技術被運用到貸前風控中去了&#xff0c;不少人也了解過自己的大數據&#xff0c;但是由于相關知識不足&#xff0c;看不懂報告&#xff0c;在常見的問題中&#xff0c;大數據檢測到風險等級太高是怎么回事呢?小易大數據…

《javascript高級程序設計》學習筆記 | 21.2.錯誤處理

關注[前端小謳]&#xff0c;閱讀更多原創技術文章 錯誤處理 相關代碼 → try/catch 語句 ES3 新增了try/catch語句&#xff0c;基本語法與 Java 中的 try/catch 一樣 try {// 可能出錯的代碼const a 3;a 4; } catch (error) {// 出錯時執行的代碼console.log("An er…

vsomeip源碼剖析--00環境搭建

環境 Win11 WSL2 Ubuntu22.04安裝依賴 sudo apt-get install cmake sudo apt-get install libboost-system1.71-dev libboost-thread1.71-dev libboost-log1.71-dev源碼編譯 獲取源碼 https://github.com/COVESA/vsomeip.git編譯 cd vsomeip mkdir build cd build// 一般…

漫漫數學之旅035

文章目錄 經典格言數學習題古今評注名人小傳 - 黎勒?笛卡爾 經典格言 完美的數和完美的人是同樣罕見的。——黎勒?笛卡爾&#xff08;Ren Descrates&#xff09; 完美的數和完美的人都是極為罕見的。這句話表達了一個哲學觀點&#xff0c;即無論是在數學領域還是人類自身&am…

Spring框架相關問題

RabbitMQ相關問題 Spring框架相關問題 一、Spring容器中的Bean是線程安全的嗎&#xff1f;二、如何保證Spring容器中的Bean是線程安全的呢&#xff1f;三、什么情況下會觸發Spring事務回滾&#xff1f;四、如果事務方法拋出IOException&#xff0c;是否會觸發Spring事務回滾&a…

Zookeeper學習2:原理、常用腳本、選舉機制、監聽器

文章目錄 原理選舉機制&#xff08;重點&#xff09;情況1&#xff1a;正常啟動集群情況2&#xff1a;集群啟動完&#xff0c;中途有機器掛了 監聽器客戶端向服務端寫入數據客戶端向服務端Leader節點寫入客戶端向服務端Follower節點寫入 Paxos算法&#xff08;每個節點都可以提…

AMDGPU KFD Test 編譯使用

ROCT-Thunk-Interface是一個用于在ROCm軟件堆棧中提供設備無關性的層。它是ROCm的一部分,允許不同的硬件平臺(如AMD GPU和Intel CPU)使用相同的API進行計算。 要安裝ROCT-Thunk-Interface,首先需要創建一個新的目錄,并進入該目錄: mkdir rocm-build cd rocm-build然后,…

ng : 無法將ng項識別為 cmdlet、函數、腳本文件或可運行程序的名稱

ng : 無法將“ng”項識別為 cmdlet、函數、腳本文件或可運行程序的名稱”&#xff0c;出現這種錯誤&#xff0c;那說明你angular-cli沒有下載所以環境變量里沒有相應的東西 1、需要在cmd里輸入npm install -g angular/cli 2、之后運行angular命令時還可能出現這種錯誤 “ng : …

ruoyi 圖片等文件資源讀取

老是忘&#xff0c;記錄一下 ResourcesConfig 文件下 /** 本地文件上傳路徑 */ registry.addResourceHandler(Constants.RESOURCE_PREFIX "/**").addResourceLocations("file:" RuoYiConfig.getProfile() "/"); /*** 資源映射路徑 前綴*/ …

kafka消費者重平衡是什么?怎么避免?

消費者重平衡是指主題下的分區怎么分配給消費者的過程。下面這個圖可以看出該過程&#xff1a;原來有2個消費者&#xff0c;3個分區&#xff0c;其中一個消費者肯定就的處理2個分區了。那么當新加入消費者時&#xff0c;則每個消費者就只處理一個分區了。處理這個分區過程的叫協…

詳解Nacos注冊中心的使用

文章目錄 1、安裝2、服務注冊2.1、引入依賴2.2、配置nacos地址2.3、重啟 3、服務分級存儲模型3.1、給user-service配置集群3.2、同集群優先的負載均衡 4、權重配置5、環境隔離5.1、創建namespace5.2、配置namespace 6、Nacos與Eureka的區別7、代碼免費分享 ?&#x1f343;作者…

首例以“冠狀病毒”為主題的勒索病毒,篡改系統MBR

前言概述 2020年勒索病毒攻擊仍然是網絡安全的最大威脅&#xff0c;在短短三個月的時間里&#xff0c;已經出現了多款新型的勒索病毒&#xff0c;關于2020年勒索病毒攻擊新趨勢&#xff0c;可以閱讀筆者寫的上一篇文章&#xff0c;里面有詳細的分析&#xff0c;從目前觀察到的…

Linux 學習筆記(9)

九、 運行級別 1 、 Linux 系統的運行級別 (runlevel) Linux 系統有 7 個運行級別&#xff0c; Linux 系統任何時候都運行在一個指定的運行級別上&#xff0c;不同的運行級 別所運行的程序和服務不盡相同&#xff0c;所要完成的工作和要達到的目的也不相同 運行級別…

RH850P1X芯片學習筆記-Generic Timer Module -ATOM

文章目錄 ARU-connected Timer Output Module (ATOM)OverviewGLOBAL CHANNEL CONTROL BLOCK ATOM Channel architectureATOM Channel modesSOMP-Signal Output Mode PWMSOMP - ARUSOMC-Signal Output Mode CompareSOMC - ARUSOMC – COMPARE COMMANDSOMC – OUTPUT ACTIONATOM …

Python縮進規則

Python的縮進規則是Python語法中非常重要的一部分&#xff0c;也是Python語言獨特的特點之一。在Python中&#xff0c;縮進被用來表示代碼塊的層次結構&#xff0c;而不是像其他語言一樣使用大括號或關鍵詞。這種縮進規則使得Python代碼更加簡潔、易讀、易于理解&#xff0c;同…

python模塊百科_操作系統接口_os【一】

python模塊百科_操作系統接口_os【一】 os --- 多種操作系統接口一、相關模塊1.1 os.path 文件路徑1.2 fileinput 文件讀取1.3 tempfile 臨時文件和目錄1.4 shutil 高級文件和目錄1.5 platform 操作系統底層模塊 二、關于函數適用性的說明2.1 與操作系統相同的接口2.2 支持字節…

Git版本管理常用指令

Git常用命令 一、基本指令二、本地倉庫管理三、遠程倉庫管理四、分支管理五、儲藏區六、標簽管理一、基本指令 查看Git安裝版本:git --version 查看log指令的幫助信息:git log --help 配置Git用戶名:git config --global user.name “xxxxx” 配置Git郵箱: git config --…

2024年騰訊云新用戶優惠券領取入口及使用教程

隨著云計算技術的不斷發展和普及&#xff0c;越來越多的個人和企業選擇使用云服務。騰訊云作為國內領先的云服務提供商&#xff0c;為了吸引新用戶&#xff0c;經常推出各種優惠活動&#xff0c;其中就包括新用戶專屬優惠券&#xff0c;本文將為大家分享騰訊云新用戶優惠券的領…