操做系統:CentOS6.8 數據庫:Oracle 11.2.0.4(企業版) 客戶端工具:Oracle SQL Developer
簡單查詢:查詢一張表的全部數據
語法格式:
SELECT [DISTINCT] * 字段 [別名][字段[別名]] FROM 表名稱 [別名];數據庫
範例:查詢dept表全備記錄
SELECT * FROM dept;
範例:查詢出每一個僱員編號、姓名、基本工資
SELECT empno,ename,sal FROM emp;oracle
範例:查詢每一個僱員職位
SELECT job FROM emp;
這個時候發現查詢處理的job內容中出現了重複的數據,能夠用DISTINCT 消除掉全部重複內容:
SELECT DISTINCT job FROM emp;
可是,對於重複數據,指的是一行的每一個列的記錄都重複,才叫重複數據。
範例:查詢每一個僱員姓名、職位
SELECT DISTINCT ename,job FROM emp;ide
在進行查詢操做中,可使用各個屬性的size運算符
範例:顯示每一個僱員姓名、職位、基本年薪
SELECT ename,job,sal12 FROM emp;
這個時候顯示一個「SAL12」,ZHEG 確定顯示的是查詢列,可是這個列名稱不方便瀏覽,全部此時能夠起一個別名。
SELECT ename,job,sal*12 AS income FROM emp;函數
範例:因爲公司福利好,每月都有200元的飯食補助以及100元車費補助,這個時候年薪:
SELECT ename,job, (sal+200+100)*12 AS income FROM emp;工具
公司每一年的年末多發一個月基本工資
SELECT ename,job, (sal+200+100)*12+sal AS income FROM emp;
範例:觀察「||」的使用
SELECT empno || ',' || ename FROM emp;
因爲「,」屬於原樣輸出字符串,因此必須使用「,」括起來,即:在SQL語句之中,「,」表示的是字符串。
範例:要求限制的數據安裝以下格式顯示:
SELECT '僱員編號是:' || empno || '僱員姓名是:' || ename || ',基本工資是:' || sal || ',職位是:' || job AS 僱員信息 FROM emp;學習
在以前的簡單查詢之中,是將全部的記錄顯示,可是如今能夠對顯示的記錄鏡像過來操做,這就是限定查詢。限定查詢就是在以前語法的基礎
上增長了一個WHERE子句,用戶限定條件,語法以下:
SELECT [DISTINCT] * 字段 [別名][字段[別名]] FROM 表名稱 [別名] [WHERE 條件(S)];
在WHERE本身以後能夠增長多個條件,最多見的條件就是基本的關係運算:>、>=、<=、!=(<>)、BETWEEN...AND、
LIKE、IN、IS NULL、,AND、OR、NOT;搜索引擎
一、關係運算
範例:查詢基本工資高於1500的全部僱員信息
SELECT * FROM emp WHERE sal>1500;操作系統
範例:查詢全部職位是辦事員的僱員信息:
SELECT FROM emp WHERE job='clerk';
這個時候沒有返回相應查詢結果,緣由是在oracle數據庫中,全部的數據都是區分大小寫的,大面修改以下:
SELECT FROM emp WHERE job='CLERK';
以上只是操做一個條件,如今也能夠操做多個條件,而這多個條件之間可使用AND或OR進行鏈接操做。
範例:查詢工資在1500-3000之間的所有僱員信息
SELECT FROM emp WHERE sal BETWEEN 1000 AND 1500;
等價於
SELECT FROM emp WHERE sal>=1000 AND sal<=1500;code
範例:查詢職位是CLERK,或是SALESMAN的所有信息:
SELECT * FROM emp WHERE job='CLERK' OR job='SALESMAN';排序
範例:查詢職位是CLERK,或是SALESMAN的所有信息,而且要求這些僱員的工做大於1200
SELECT * FROM emp WHERE (job='CLERK' OR job='SALESMAN') AND sal>1200;
範例:查詢全部不是職位不是CLERK的信息:
SELECT FROM emp WHERE job<>'CLERK';
等價於
SELECT FROM emp WHERE job!='CLERK';
等價於
SELECT * FROM emp WHERE NOT job='CLERK';
二、範圍判斷 BETWEEN... AND
"BETWEEN 最小值 AND 最大值" ,表示一個範圍間的判斷過程。
範例:查詢基本工資在1500-3000的僱員信息
SELECT * FROM emp WHERE sal BETWEEN 1500 AND 3000;
範例:如今也能夠對BETWEEN...AND操做求反
SELECT * FROM emp WHERE NOT sal BETWEEN 1500 AND 3000;
"BETWEEN...AND"操做不只能夠對數字有用,並且對於日期也一樣有用。
範例:要求查詢出在僱員的所有僱員信息
時間範圍:1981_01_01-1981_12-31,使用hiredate字段表示僱傭日期;
hiredate字段上的內容可使用字符串表示:‘01-JAN-81’-‘31-DEC-81’
SELECT * FROM emp WHERE hiredate BETWEEN '01-JAN-81' AND '03-DEC-81'; 故障
三、判斷是否爲空:IS(NOT)NULL
使用次語法能夠判斷某一個字段的內容是否爲「null」,可是null和數字0以及空字符是兩個概念。
範例:查詢全部領取獎金的僱員信息:
SELECT FROM emp WHERE comm IS NOT NULL;
等價於
SELECT FROM emp WHERE NOT comm IS NULL;
範例:查詢全部不領取獎金的僱員
SELECT * FROM emp WHERE comm IS NULL;
四、知道範圍的判斷:IN操做符
IN操做符表示的是指定一個查詢範圍,例如:
範例:查詢僱員編號是736九、756六、7799的僱員信息
若是按照最先作法,使用OR操做:
SELECT FROM emp WHERE empno=7369 OR empno=7566 OR empno=7799;
使用新操做符IN,則代碼簡單:
SELECT FROM emp WHERE empno IN (7369,7566,7799);
而若是使用NOT IN呢?,則表示不在制定範圍之中。
SELECT FROM emp WHERE empno NOT IN (7369,7566,7799);
注意點:關於NOT IN 問題
若是如今使用IN 操做符,查詢範圍之中存在null,不影響查詢
SELECT FROM emp WHERE empno IN (7369,7566,7799,null);
若是如今使用NOT IN 操做符,查詢範圍有null,則表示查詢所有數據 難點
SELECT * FROM emp WHERE empno NOT IN (7369,7566,7799,null);
五、模糊查詢:LIKE子句
LIKE 子句的功能提供了模糊查找的操做,例如:某些程序出現的搜索操做,都屬於LIKE子句的實現,可是必須提醒,搜索引擎上的查詢
不是LIKE.
要想使用LIKE子句,必須認識兩個匹配符號:
匹配單個字符: _
匹配任意多個字符:%
範例:要求查詢僱員姓名中以字母A開通的所有僱員信息:
SELECT FROM emp WHERE ename LIKE 'A%';
範例:要求查詢出僱員姓名中第二個字母是A的所有僱員信息:
SELECT FROM emp WHERE ename LIKE '_A%';
如今也可使用NOT 操做,對LIKE 求反
SELECT FROM emp WHERE ename NOT LIKE '%A%';
另外對於LIKE子句,不必定只能在字符串中使用,能夠在任意數據上表示
SELECT FROM emp WHERE ename LIKE '%1%' OR hiredate LIKE '%1%' OR sal LIKE '%1%';
說明:緣由LIKE子句使用
在開發之中,數據庫的模糊查詢確定使用LIKE子句,可是在使用LIKE子句的時候有一個最多的注意點:若是在模糊查詢上不設置任何的查詢關鍵字的話
('%%'),則表示查詢全部記錄:
3.1 數據的排序
當數據返回查詢結果後,全部數據默認狀況是安裝僱員標號排序。咱們也可使用「ORDER BY」子句
指定所須要排序的操做列,語法以下:
SELECT [DISTINCT] * 字段 [別名][字段[別名]]
FROM 表名稱 [別名]
[WHERE 條件(S)];
[ORDER BY 字段 [ASC|DESC] [字段 [ASC|DESC],...]]
「ORDER BY」子句是寫在全部的SQL語句最好的內容,並且對於排序有一下幾點說明:
排序的時候能夠指定多個排序的字段;
排序的方式有兩種:
升序(ASC):默認,不寫也是升序;
降序(DESC):需指定,由大到小排序;
範例:查詢全部僱員信息,要求安裝工資排序
SELECT FROM emp ORDER BY sal;
SELECT FROM emp ORDER BY sal DESC;
範例:查詢全部僱員信息,安裝工做由高到低排序,若是工做相同,則安裝僱傭日期由早到晚排序
此時確定須要兩個字段排序:工資(DESC),僱傭日期(ASC);
SELECT * FROM emp ORDER BY sal DESC,hiredate ASC;
對於排序操做,通常只在須要的地方使用,並且必定要記住的是,ORDER BY 子句是寫在全部SQL語句最後
3.2單行函數
雖然各個數據庫都是支持SQL語句,可是每個數據庫也有子句所支持的操做函數,這些就是單行函數,而若是要想進行數據庫開發的話,除了
要會使用SQL外,就是要多學習函數。
單行函數主要分爲如下五類:字符函數、數字函數、轉換函數、統一函數;
3.2.1 字符函數
字符函數的功能主要是進行字符串函數的操做,下面給誰幾個字符函數:
UPPER (字符串|列):將輸入的字符串變爲大寫返回;
LOWER(字符串|列):將輸入的字符串變爲小寫返回;
INITCAP(字符串|列):開頭首字母大寫;
LENGTH(字符串|列):求字符串長度;
REPLACE(字符串|列):進行替換;
SUBSTR(字符串|列),開始點[結束點]:字符串截取;
Oracle 之中有一點比較麻煩,即便要驗證字符串,也必須寫完整的SQL語句,因此在Oracle數據庫中爲了用戶的查詢方便
專門提供一個「dual」的虛擬表。
SELECT UPPER('hello') FROM dual;
大寫轉換做用:在一邊使用之中,用戶輸入數據的時候不會關心數據自己存放是大寫仍是小寫
SELECT * FROM emp WHERE ename='&str';
固然以上的「&」的操做屬於替代變量的內容。
範例:觀察轉小寫的操做,將全部的僱員姓名安裝小寫字母返回
SELECT LOWER(ename) FROM emp;
範例:將每一個僱員姓名的開頭首字母大寫
SELECT INITCAP (ename) FROM emp;
範例:查詢出每一個僱員姓名的長度
SELECT ename,LENGTH(ename) FROM emp;
範例:查詢姓名長度正好是5的僱員信息
SELECT ename ,LENGTH(ename) FROM emp ename WHERE LENGTH(ename)=5;
範例:使用字母「」替換姓名中的全部字母「A」
SELECT REPLACE(ename,'A','') FROM emp;
字符串截取操做有兩種語法;
語法一:SUBSTR(字符串|列,開始點),表示從開始點一直截取到結尾;
SELECT ename,SUBSTR(ename,3) FROM emp;
語法二:SUBSTR(字符串|列,開始點,結束點),表示從開始點截圖到結束點,截取部門內容;
SELECT ename,SUBSTR(ename,0,3) FROM emp;
等價於
SELECT ename,SUBSTR(ename,1,3) FROM emp;
範例:要求截取每一個僱員姓名的後三個字母
正常思路:經過長度-2肯定開始點
SELECT ename,SUBSTR(ename,LENGTH(ename)-2) FROM emp;
等價於
SELECT ename,SUBSTR(ename,-3) FROM emp;
SUBSTR()也能夠設置負數,表示由後指定截取的開始點;
以前的查詢都是在一張表裏進行,若是如今使用一張以上的表,就成爲多表查詢。
多表查詢語法:
SELECT [DISTICNT] * | 查詢列1 別名1,查詢列2,別名2,...
FROM 表名稱1 別名1,表名稱2,別名2,...
[WHERE 條件(s)]
[ORDER BY 排序字段1 ASC|DESC,排序字段2 ASC|DESC]
範例:下面使用多表查詢,同時查詢emp和dept表
SELECT * FROM emp,dept;
以上查詢使用2個表。
從查詢結果上發現返回的數據是56行,可是emp是14行。
範例:查詢emp表中的記錄數
SELECT COUNT(*) FROM emp;
從查詢結果上看emp中有14條
範例:查詢dept表的記錄數
SELECT COUNT(*) FROM dept;
從查詢結果上看dept中有4條
使用多表查詢會產生笛卡爾乘積。若是表的數據越多,那麼笛卡爾乘積就會越大,若是如今假設
有3張表,每張表有1000條記錄,100010001000
全部多表查詢是不建議過多使用
要想去掉笛卡爾乘積必須使用字段就那些關聯操做。
在emp中表存在一個deptno的字段,在dept表中也存在一個deptno字段,並且emp表中的deptno中的字段
是與dept表中的deptno關聯的,全部deptno屬於關聯字段。
在多表查詢要使用WHERE子句來消除笛卡爾積
範例:修改前面的查詢
SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno;
查詢結果是14行,此時消除了笛卡爾積,可是若是如今名稱過長時,不是很好用,
通常會對錶起個別名。
SELECT * FROM emp e, dept d FROM e.deptno=d.deptno;
結果是相同的,因此通常使用多表查詢,最好指定表的別名
範例:要求查詢出僱員的編號、僱員的姓名、部門的編號、部門名稱及部門位置
SELECT e.empno,e.ename,d.deptno,dname,d.loc FROM emp e, dept d WHERE e.deptno=d.deptno;
範例:要求查詢出每一個僱員姓名、工做、僱員的直接上級領導的姓名
在emp表中mgr字段表示一個僱員的上級領導的編號,若是要查詢一個僱員的上級領導的姓名,則確定要將
emp和emp本身進行關聯,這種叫自關聯。
SELECT e.ename,e.job,m.ename FROM emp e, emp m WHERE e.mgr=m.mgr;
範例:要求進一步擴展,將僱員所在部門名稱同時列出
SELECT e.ename,e.job,m.ename ,d.dname FROM emp e, emp m,dept d WHERE e.mgr=m.empno and e.deptno=d.deptno;
思考題:要求查詢每一個僱員的姓名、工資、部門名稱、工資在公司的等級(salgrade),及其領導的姓名及工資所在公司的等級。
SELECT e.ename,e.sal,d.dname,s.grade FROM emp e, dept d, salgrade s WHERE e.deptno=d.deptno And e.sal BETWEEN s.losal AND s.hisal;
4.1左鏈接、右鏈接
在dept表中存在4條記錄
如今emp表和dept表關聯查詢,查詢一下指定的字段。
SELECT e.empno,e.ename,d.deptno,d.dname FROM emp e, dept d WHERE e.deptno=d.deptno;
此時發現查詢結果中,deptno字段裏沒有出現40的記錄,咱們查看在dept表中的部門編號有40,這是爲何?
由於在僱員表中沒有是40部門的僱員
SELECT e.empno,e.ename,d.deptno,d.dname FROM emp e,dept d WHERE e.deptno(+)=d.deptno;
若是想要40部門顯示出來,在WHERE子句中(+)寫在等會的左邊,發現40部門出現。這個時候是右鏈接。
所以,
(+)在=右邊是左鏈接-----鏈接的時候以左邊爲準
(+)在=左邊是右鏈接-----鏈接的時候以右邊爲準
注意:在開發中左、右鏈接使用較多,要理解
實際上在之間的查詢中查找僱員姓名及每一位僱員的領導的時候就應該使用左右鏈接
SELECT e.empno,e.ename,m.empno,m.ename FROM emp e,emp m WHERE e.mgr=m.empno;
一共13行數據,可是emp表中有14條數據
SELECT e.empno,e.ename,m.empno,m.ename FROM emp e,emp m WHERE e.mgr=m.empno(+);
SQL語法
SELECT table1.column,table2.column FROM table1 [CROSS JOIN table2] |
[NATURAL JOIN table2] |
[JOIN table2 USING(column_name)] |
[JOIN table2 ON(table1.column_name=table2.column_name)] |
[LEFT|RIGHT|FULL OUTER JOIN table2 ON(table1.column_name=table2.column_name)];
交叉鏈接[CROSS JOIN table2]產生笛卡爾積
SELECT FROM emp CROSS JOIN dept;
產生56條記錄,效果和一下查詢同樣
SELECT FROM emp,dept;
天然鏈接[CROSS JOIN table2]自動進行關聯字段的匹配
SELECT FROM emp NATURAL JOIN dept;
查詢的結果是14條記錄,自動進行字段的關聯匹配,不用寫WHERE子句的關聯條件,效果和一下查詢結果同樣
SELECT FROM emp,dept WHERE emp.deptno=dept.deptno;
[JOIN table2 USING dept(column_name)]直接指定關聯的操做列
SELECT * FROM emp JOIN dept USING(deptno);
[JOIN table2 ON(table2.column_name=table2.column_name)]用戶子句變相鏈接的條件
SELECT * FROM emp JOIN dept ON (emp.deptno=dept.deptno);
[LEFT OUTER JOIN table2 ON(table1.column_name=table2.column_name)]左外鏈接
[RIGHT OUTER JOIN table2 ON (table1.column_name=table2.column_name)]右外鏈接
SELECT * FROM emp e RIGHT OUTER JOIN dept d ON (e.deptno=d.deptno);
4.2 組函數和分組統計
組函數也稱爲聚合函數
例如:咱們把學生能夠分爲難受和女生兩個組,若是想求每組的人數,平均身高,平均年齡等,
就須要用到分組函數
在SQL中經常使用的組函數有一下幾個:
COUNT();求所有記錄數
MAX():求出一組中的最大值
MIN():求出一組中的最小值
AVG():求出一組中的平均值
SUM():求和
範例:COUNT()函數
SELECT COUNT(empno) FROM emp;
咱們經常使用COUNT(),最好可以用字段代替
範例:MAX()、MIN()函數,求最大最小值,通常是針對於數值的字段的,求出全部員工的最高工資,和最低工資和平均工資。
SELECT MAX(sal) 最高工資,MIN(sal) 最低工資,AVG(sal) 平均工資 FROM emp;
範例:求出部門10的全部員工工資的總和
SELECT SUM(sal) 工資總和 FROM emp WHERE deptno=10;
若是以下查詢輸出部門編號和其部門全部員工的工資總和,會產生錯誤。
SELECT deptno,SUM(sal) 工資總和 FROM emp WHERE deptno=10;
發生以上的錯誤信息,是應爲這樣的查詢須要進行分組統計
SELECT deptno,SUM(sal) 工資總和 FROM emp WHERE deptno=10 GROUP BY deptno;
分組統計語法格式
SELECT [DISTINCT] * | 查詢列1 列別名1,查詢列2 列別名2,...
FROM 表名稱1 表別名1,表名稱2 表別名2,...
[WHERE 條件]
[ORDER BY 排序字段1,排序字段2 ASC|DESC]
[GROUP BY 分組字段]
範例:求出每一個部門的僱員數量
分析:應該按照部門編號deptno進行分組
SELECT deptno,COUNT(empno) FROM emp GROUP BY deptno;
進一步查詢部門編號是10的僱員的總工資,
SELECT deptno,SUM(sal) FROM emp WHERE deptno=10 GROUP BY deptno;
但是若是咱們想找出總工資大於9000的部門
SELECT deptno,SUM(sal) FROM emp WHERE SUM(sal)>9000 GROUP BY deptno;
會出現如下錯誤
ORA-00934: 此處不容許使用分組函數
分組函數只能在分組中使用,不允許在WHERE語句之中出現,那麼若是如今要指定分組的條件,只能經過
HAVING子句
此時的SQL語法格式
SELECT [DISTINCT] * | 查詢列1 列別名1,查詢列2 列別名2,...
FROM 表名稱1 表別名1,表名稱2 表別名2,...
[WHERE 條件]
[ORDER BY 排序字段1,排序字段2 ASC|DESC]
[GROUP BY 分組字段 [HAVING 分組條件]]
SELECT deptno ,SUM(sal) FROM emp GROUP BY deptno HAVING SUM(sal)>9000;
範例:顯示非銷售人員工做名稱以及從事同一工做僱員的月工資的總和,而且要知足從事同一工做的僱員的月工資合計大於5000,
輸出結果按月工資的合計升序排列
分析:一、顯示非銷售人員條件是:job<>'SALESMAN'
SELECT * FROM emp WHERE job<>'SALESMAN';
分析:二、從事同一工做安裝工做分組:GROUP BY job
工做名稱、月工資的總和----分組查詢的是工做名稱和工資合計:job,SUM(sal)
SELECT job,SUM(sal) FROM emp WHERE job<>'SALESMAN' GROUP BY job;
分析:三、工資合計大於5000---分組條件:HAVING SUM(sal)> 5000
SELECT job,SUM(sal) FROM emp WHERE job<>'SALESMAN' GROUP BY job HAVING SUM(sal)>5000;
分析:四、輸出結果按月工資的合計排列----ORDER BY
SELECT job, SUM(sal) FROM emp WHERE job<>'SALESMAN' GROUP BY job HAVING SUM(sal)>5000 ORDER BY SUM(sal) ASC;
由於排序的時候使用SUM(sal)不方便,咱們經常使用列別名解決這個問題
SELECT job, SUM(sal) S FROM emp WHERE job<>'SALESMAN' GROUP BY job HAVING SUM(sal)>5000 ORDER BY S ASC;
小結:
一、若是使用了分組函數,則有兩種可使用的狀況
二、若是不使用應分組的話,則只能單獨使用分組函數
分組的簡單原則:
只要一列存在重複的內容,才能夠考慮到分組
分組函數能夠嵌套使用,可是在組函數使用的時候,不能再出現分組條件的查詢語句
範例:求出平均工資最高的部門的編號和部門的工資
SELECT deptno,MAX(SUM(sal)) FROM emp GROUP BY deptno;
ORA-00937: 不是單組分組函數
結果出現錯誤,修改代碼,去掉deptno字段的顯示
SELECT MAX(SUM(sal)) FROM emp GROUP BY deptno;
若是須要查詢平均工資最高的部門編號,修改以上的代碼:
SELECT a.d FROM (SELECT deptno d,AVG(sal) av FROM emp GROUP BY deptno) a WHERE a.av>=(SELECT MAX(AVG(sal)) FROM emp GROUP BY deptno);
以上問題的解決採用的子查詢
子查詢:在一個查詢的內部還包括另外的查詢,則此查詢稱爲子查詢
範例:要求查詢比7654工資要高的全部僱員的信息
分析:先查詢出7654的工資
SELECT sal FROM emp WHERE empno=7654;
分析:在此查詢的基礎上再查詢比7654工資高的僱員,只要sal>7654便可
SELECT * FROM emp WHERE sal>(SELECT sal FROM emp WHERE empno=7654);
全部子查詢必須在()中編寫
子查詢在操做中有分爲如下三類:
單列查詢:返回的結果是一列的一個內容
單列子查詢:返回多個列,有多是一個完整的記錄
多行子查詢:返回多條子記錄
範例:要求查詢出工資比7654高,同時與7788從事相同工資的所有僱員信息
根據剛纔查詢分析:條件有兩個,一個是sal>7654的工資,同時job=7788的job
SELECT * FROM emp WHERE sal>(SELECT sal FROM emp WHERE empno=7654) AND job=(SELECT job FROM emp WHERE empno=7788);
範例:要求查詢出工資最低的僱員姓名、工做、工資。
分析:工資最低,須要採用到分組函數MIN(sal),首先查詢最低工資
SELECT MIN(sal) FROM emp;
分析:在這個基礎上完善查詢的條件
SELECT ename,job,sal FROM emp WHERE sal=(SELECT MIN(sal) FROM emp);
思考:要求查詢出,部門名稱、部門的員工數,部門的平均工資,部門的最低收入僱員的姓名和最高收入
僱員的姓名。
分析:查詢涉及到兩張表emp和dept
一、若是要想求出每一個部門的員工數量及平均工資,則確定須要使用分組統計,按deptno進行分組
SELECT deptno,COUNT(empno),AVG(sal) FROM emp GROUP BY deptno;
二、可是若是想查詢出部門的名稱,就須要與dept表進行關聯。因而有人寫下一下代碼:
SELECT d.dname,COUNT(e.empno),AVG(sal)FROM emp e, dept d WHERE e.deptno=d.deptno GROUP BY e.deptno;
ORA-00979: 不是 GROUP BY 表達式
但是出現了這樣的錯誤。
在第一步查出部門編號、部門人數、部門平均工資的基礎上,應該把這個做爲一個臨時的表與dept表進行關聯。
這樣才能正確的顯示出部門的名稱。
SELECT d.dname,l.c,l.a FROM (SELECT deptno,COUNT(empno) c,AVG(sal) a
FROM emp GROUP BY deptno) l,dept d
WHERE l.deptno=d.deptno;
三、部門的最低收入和最高收入,應該用到MAX()和MIN()函數,依然是根據部門進行分組的,修改以上的代碼,同時顯示出部門中工資最低和工資最高的員工姓名SELECT d.dname,l.c,l.a,e.ename,e.salFROM (SELECT deptno,COUNT(empno) c,AVG(sal) a,MAX(sal) max,MIN(sal) minFROM empGROUP BY deptno) l,dept d,emp eWHERE l.deptno=d.deptno AND (e.sal=l.min OR e.sal=l.max);