操作的表
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 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/241405.html
標籤:其他
上一篇:關于mysql面試題(持續更新)
下一篇:資料庫的批量操作
