MySQL學習-排序與分組函數

操作的表
mysql> select * from emp;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7369 SMITH CLERK 7902 1980-12-17 800.00 NULL 20
7499 ALLEN SALESMAN 7698 1981-02-20 1600.00 300.00 30
7521 WARD SALESMAN 7698 1981-02-22 1250.00 500.00 30
7566 JONES MANAGER 7839 1981-04-02 2975.00 NULL 20
7654 MARTIN SALESMAN 7698 1981-09-28 1250.00 1400.00 30
7698 BLAKE MANAGER 7839 1981-05-01 2850.00 NULL 30
7782 CLARK MANAGER 7839 1981-06-09 2450.00 NULL 10
7788 SCOTT ANALYST 7566 1987-04-19 3000.00 NULL 20
7839 KING PRESIDENT NULL 1981-11-17 5000.00 NULL 10
7844 TURNER SALESMAN 7698 1981-09-08 1500.00 0.00 30
7876 ADAMS CLERK 7788 1987-05-23 1100.00 NULL 20
7900 JAMES CLERK 7698 1981-12-03 950.00 NULL 30
7902 FORD ANALYST 7566 1981-12-03 3000.00 NULL 20
7934 MILLER CLERK 7782 1982-01-23 1300.00 NULL 10

其每個字段的字段名分別爲員工編號、員工姓名、員工職位、員工上級領導編號、員工僱傭日期,員工薪水、員工津貼、員工部門編號。

排序(升序、降序)

按照工資升序,找出員工名和薪資?

select 
		ename,sal 
from 
		emp 
order by
		sal;
ename
sal
SMITH 800.00
JAMES 950.00
ADAMS 1100.00
WARD 1250.00
MARTIN 1250.00
MILLER 1300.00
TURNER 1500.00
ALLEN 1600.00
CLARK 2450.00
BLAKE 2850.00
JONES 2975.00
SCOTT 3000.00
FORD 3000.00
KING 5000.00

注意:默認是升序。怎麼指定升序或者降序呢?asc表示升序,desc表示降序。

select ename , sal from emp order by sal; // 升序
select ename , sal from emp order by sal asc; // 升序
select ename , sal from emp order by sal desc; // 降序。

按照工資的降序排列,當工資相同的時候再按照名字的升序排列。

select ename,sal from emp ORDER BY sal desc;
ename sal
KING 5000.00
SCOTT 3000.00
FORD 3000.00
JONES 2975.00
BLAKE 2850.00
CLARK 2450.00
ALLEN 1600.00
TURNER 1500.00
MILLER 1300.00
WARD 1250.00
MARTIN 1250.00
ADAMS 1100.00
JAMES 950.00
SMITH 800.00
select ename,sal from emp ORDER BY sal desc,ename asc;
ename sal
KING 5000.00
FORD 3000.00
SCOTT 3000.00
JONES 2975.00
BLAKE 2850.00
CLARK 2450.00
ALLEN 1600.00
TURNER 1500.00
MILLER 1300.00
MARTIN 1250.00
WARD 1250.00
ADAMS 1100.00
JAMES 950.00
SMITH 800.00

注意:多個字段同時排序的原理:越靠前的字段越能起到主導作用。只有當前面的字段無法完成排序的時候,纔會啓用後面的字段

select ename,sal from emp order by 2;

2代表第2列。

by後面跟數字時表示第幾列。
找出工作崗位是SALESMAN的員工,並且要求按照薪資的降序排列。

select 
		ename,job,sal					3
	from
		emp							1
	where 
		job = 'SALESMAN'				2
	order by
		sal desc;							4

order by是最後執行的

select 
		字段						3
	from
		表名						1
	where
		條件						2
	order by
		....						4
	
	order by是最後執行的。

分組函數

分組函數?
count 計數
sum 求和
avg 平均值
max 最大值
min 最小值
記住:所有的分組函數都是對“某一組”數據進行操作的。






找出工資總和?

select sum(sal) from emp;

找出最高工資?

select max(sal) from emp;

找出最低工資?

select min(sal) from emp;
min(sal)
800.00

找出平均工資?

select avg(sal) from emp;

找出總人數?

select count(*) from emp;
select count(ename) from emp;
count(*)
14

分組函數一共5個。
分組函數還有另一個名字:多行處理函數。
多行處理函數的特點:輸入多行,最終輸出的結果是1行。

分組函數自動忽略NULL。

select count(comm) from emp;
count(comm)
4
select sum(comm) from emp;
sum(comm)
2200.00

單行處理函數:輸入一行,輸出一行
計算每個員工的年薪?

select ename,(sal+comm)*12 as yearsal from emp;
ename yearsal
SMITH NULL
ALLEN 22800.00
WARD 21000.00
JONES NULL
MARTIN 31800.00
BLAKE NULL
CLARK NULL
SCOTT NULL
KING NULL
TURNER 18000.00
ADAMS NULL
JAMES NULL
FORD NULL
MILLER NULL

Smith的年薪爲空,因爲smith的comm爲空,而數據庫中有一個規定,只要數據表達式中有NULL出現,最終結果都是NULL。
重點:所有數據庫都是這樣規定的,只要有NULL參與的運算結果一定是NULL
ifnull() 空處理函數?
ifnull(可能爲NULL的數據,被當做什麼來處理):屬於單行處理函數


select ename,ifnull(comm,0) as comm from emp;
ename comm
SMITH 0.00
ALLEN 300.00
WARD 500.00
JONES 0.00
MARTIN 1400.00
BLAKE 0.00
CLARK 0.00
SCOTT 0.00
KING 0.00
TURNER 0.00
ADAMS 0.00
JAMES 0.00
FORD 0.00
MILLER 0.00
select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;
ename yearsal
SMITH 9600.00
ALLEN 22800.00
WARD 21000.00
JONES 35700.00
MARTIN 31800.00
BLAKE 34200.00
CLARK 29400.00
SCOTT 36000.00
KING 60000.00
TURNER 18000.00
ADAMS 13200.00
JAMES 11400.00
FORD 36000.00
MILLER 15600.00

select sum(comm) from emp;

sum(comm)
2200.00
select sum(comm) from emp where comm is not null; 

不需要額外添加這個過濾條件。sum函數自動忽略NULL。
count也忽略了null
分組函數都可以直接忽略null


找出工資高於平均工資的員工?

select ename,sal from emp where sal>avg(sal);

[SQL]select ename,sal from emp where sal>avg(sal);報錯[Err] 1111 - Invalid use of group function思考以上的錯誤信息:無效的使用了分組函數?
原因:SQL語句當中有一個語法規則,分組函數不可直接使用在where子句當中。why???
因爲group by是在where執行之後纔會執行的。(如果沒有寫group by也會自成一組,相當於有一個缺省的group by語句)

select		5
					..			
				from			1
					..
				where			2
					..
				group by		3
					..
				having		4
					..
				order by		6

找出工資高於平均工資的員工?
第一步:找出平均工資

select avg(sal) from emp;
avg(sal)
2073.214286

第二步:找出高於平均工資的員工

select ename,sal from emp where sal > 2073.214286;
ename sal
JONES 2975.00
BLAKE 2850.00
CLARK 2450.00
SCOTT 3000.00
KING 5000.00
FORD 3000.00

兩條語句拼接到一起,select語句中嵌套select語句是子查詢
select ename,sal from emp where sal > (select avg(sal) from emp);

count()和count(具體的某個字段),他們有什麼區別?
  count(
):不是統計某個字段中數據的個數,而是統計總記錄條數。(和某個字段無關)
  count(comm): 表示統計comm字段中不爲NULL的數據總數量。

select count(*) from emp;	//輸出14
select count(comm) from emp;		//輸出4

分組函數也能組合起來用

select count(*),sum(sal),avg(sal),max(sal),min(sal) from emp;
count(*) sum(sal) avg(sal) max(sal) min(sal)
14 29025.00 2073.214286 5000.00 800.00
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章