子查詢:就是一個查詢的結果作為另一個查詢的數據源或者條件。
如何查詢出工資最大的人的姓名?
mysql> select max(sal) from emp; --查詢出工資最大值 +----------+ | max(sal) | +----------+ | 5000.00 | +----------+ 1 row in set (0.00 sec) mysql> select ename,sal from emp where sal = (select max(sal) from emp);--可以將工資的最大值最為一個篩選條件,select ename,sal from emp執行完之后賦值給sal sal = (select max(sal) from emp); +-------+---------+ | ename | sal | +-------+---------+ | KING | 5000.00 | +-------+---------+ 1 row in set (0.32 sec) mysql> select ename,sal from emp where sal = (select min(sal) from emp);--查詢最小工資 +-------+--------+ | ename | sal | +-------+--------+ | SMITH | 800.00 | +-------+--------+ 1 row in set (0.00 sec)
子查詢情況;將查詢結果作為另一個查詢的條件
查詢出公司都有那些人是經理人;看那些對應的的empno出現在mgr字段中,誰就是經理人
mysql> select mgr from emp; 查詢 +------+ | mgr | +------+ | 7902 | | 7698 | | 7698 | | 7839 | | 7698 | | 7839 | | 7839 | | 7566 | | NULL | | 7698 | | 7788 | | 7698 | | 7566 | | 7782 | | NULL | +------+ 15 rows in set (0.00 sec) mysql> select distinct mgr from emp; --去重 +------+ | mgr | +------+ | 7902 | | 7698 | | 7839 | | 7566 | | NULL | | 7788 | | 7782 | +------+ 7 rows in set (0.00 sec) mysql> select distinct mgr from emp where mgr is not null; --去掉null空值,通過這條語句得到的信息就是都有哪些empno出現在mgr字段中 +------+ | mgr | +------+ | 7902 | | 7698 | | 7839 | | 7566 | | 7788 | | 7782 | +------+ 6 rows in set (0.01 sec) mysql> select ename,empmo from emp where empmo in(select distinct mgr from emp);--查詢公司都有哪些人是經理人in關鍵字 +-------+-------+ | ename | empmo | +-------+-------+ | JONES | 7566 | | BLAKE | 7698 | | CLARK | 7782 | | SCOTT | 7788 | | KING | 7839 | | FORD | 7902 | +-------+-------+ 6 rows in set (0.00 sec) mysql> select ename,empmo from emp where empmo in(select distinct mgr from emp where mgr is not null); +-------+-------+ | ename | empmo | +-------+-------+ | JONES | 7566 | | BLAKE | 7698 | | CLARK | 7782 | | SCOTT | 7788 | | KING | 7839 | | FORD | 7902 | +-------+-------+ 6 rows in set (0.00 sec)
注意:以上這兩種情況都是將整個查詢的一個結果作為另一個查詢的條件,作為條件的時候這里用到了等值比較、in,其他的<\>\<=\>=都是可以的。查出平均工資最大的部門是那個?
1、每個部門的平均工資需要先查出來,組函數不可以嵌套
查詢結果作為另一個查詢的數據源,可以當成一張表。
注意:當成表的過程中必須起別名
mysql> select avg(sal),deptno from emp group by deptno;--查詢平均工資和對應的部門編號 +-------------+--------+ | avg(sal) | deptno | +-------------+--------+ | 2356.540000 | NULL | | 2916.666667 | 10 | | 2175.000000 | 20 | | 1566.666667 | 30 | +-------------+--------+ 4 rows in set (0.00 sec)
MySQL多表聯合查詢
查詢員工的姓名和員工所在部門的名稱
mysql> select ename,DNAME from emp,dept; +------------+------------+ | ename | DNAME | +------------+------------+ | SMITH | ACCOUNTING | | SMITH | RESEARCH | | SMITH | SALES | | SMITH | OPERATIONS | | ALLEN | ACCOUNTING | | ALLEN | RESEARCH | | ALLEN | SALES | | ALLEN | OPERATIONS | | WARD | ACCOUNTING | | WARD | RESEARCH | | WARD | SALES | | WARD | OPERATIONS | | JONES | ACCOUNTING | | JONES | RESEARCH | | JONES | SALES | | JONES | OPERATIONS | | MARTIN | ACCOUNTING | | MARTIN | RESEARCH | | MARTIN | SALES | | MARTIN | OPERATIONS | | BLAKE | ACCOUNTING | | BLAKE | RESEARCH | | BLAKE | SALES | | BLAKE | OPERATIONS | | CLARK | ACCOUNTING | | CLARK | RESEARCH | | CLARK | SALES | | CLARK | OPERATIONS | | SCOTT | ACCOUNTING | | SCOTT | RESEARCH | | SCOTT | SALES | | SCOTT | OPERATIONS | | KING | ACCOUNTING | | KING | RESEARCH | | KING | SALES | | KING | OPERATIONS | | TURNER | ACCOUNTING | | TURNER | RESEARCH | | TURNER | SALES | | TURNER | OPERATIONS | | ADAMS | ACCOUNTING | | ADAMS | RESEARCH | | ADAMS | SALES | | ADAMS | OPERATIONS | | JAMES | ACCOUNTING | | JAMES | RESEARCH | | JAMES | SALES | | JAMES | OPERATIONS | | FORD | ACCOUNTING | | FORD | RESEARCH | | FORD | SALES | | FORD | OPERATIONS | | MILLER | ACCOUNTING | | MILLER | RESEARCH | | MILLER | SALES | | MILLER | OPERATIONS | | zhang | ACCOUNTING | | zhang | RESEARCH | | zhang | SALES | | zhang | OPERATIONS | +------------+------------+ 60 rows in set (0.29 sec)
笛卡爾積
(14*4)emp的每一條數據與dept表的每一條數據組合。也就是56條數據。
多表聯合查詢
兩個表中的deptno是相等的
mysql> select ename,DNAME from emp,dept where emp.deptno = dept.deptno; +--------+------------+ | ename | DNAME | +--------+------------+ | SMITH | RESEARCH | | ALLEN | SALES | | WARD | SALES | | JONES | RESEARCH | | MARTIN | SALES | | BLAKE | SALES | | CLARK | ACCOUNTING | | SCOTT | RESEARCH | | KING | ACCOUNTING | | TURNER | SALES | | ADAMS | RESEARCH | | JAMES | SALES | | FORD | RESEARCH | | MILLER | ACCOUNTING | +--------+------------+ 14 rows in set (0.01 sec)
關鍵字join= 聯和 on = 條件;查詢ename和dname在emp表和dept表查詢,查詢對應的數據on emp.deptno = dept.deptno
mysql> select ename,dname from emp join dept on emp.deptno = dept.deptno; +--------+------------+ | ename | dname | +--------+------------+ | SMITH | RESEARCH | | ALLEN | SALES | | WARD | SALES | | JONES | RESEARCH | | MARTIN | SALES | | BLAKE | SALES | | CLARK | ACCOUNTING | | SCOTT | RESEARCH | | KING | ACCOUNTING | | TURNER | SALES | | ADAMS | RESEARCH | | JAMES | SALES | | FORD | RESEARCH | | MILLER | ACCOUNTING | +--------+------------+ 14 rows in set (0.00 sec)
查詢某個人的姓名、所在的部門、工資的等級
mysql> select ename,DNAME,GRADE from emp join dept join salgrade on emp.deptno = dept.deptno and emp.sal between losal and hisal; +--------+------------+-------+ | ename | DNAME | GRADE | +--------+------------+-------+ | SMITH | RESEARCH | 1 | | ADAMS | RESEARCH | 1 | | JAMES | SALES | 1 | | WARD | SALES | 2 | | MARTIN | SALES | 2 | | MILLER | ACCOUNTING | 2 | | ALLEN | SALES | 3 | | TURNER | SALES | 3 | | JONES | RESEARCH | 4 | | BLAKE | SALES | 4 | | CLARK | ACCOUNTING | 4 | | SCOTT | RESEARCH | 4 | | FORD | RESEARCH | 4 | | KING | ACCOUNTING | 5 | +--------+------------+-------+ 14 rows in set (0.01 sec)