操作的表
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 |