Mysql入門之簡單的DQL查詢語句【Mysql數據庫基礎】

11.簡單的查詢語句(DQL)

語法格式
select 字段名1,字段名2,字段名3,…from 表名;
提示:
1.任何一條sql語句以;結尾。
2.sql語句不區分大小寫。
給查詢結果的列重命名:
select name,sal12 as yearsal from emp;
別名中含有中文
select ename,sal
12 as ‘年薪’ from emp;
mysql> select ename,sal*12 as ‘年薪’ from emp;

+--------+----------+
| ename  | 年薪     |
+--------+----------+
| smith  |  9600.00 |
| allen  | 19200.00 |
| ward   | 15000.00 |
| jones  | 35700.00 |
| martin | 15000.00 |
| blake  | 34200.00 |
| clark  | 29400.00 |
| scott  | 36000.00 |
| king   | 60000.00 |
| turner | 18000.00 |
| adams  | 13200.00 |
| james  | 11400.00 |
| frod   | 36000.00 |
| miller | 15600.00 |
+--------+----------+

注意:標準sql語句中要求字符串用單引號括起來。
as關鍵字可以省略。
查詢所有字段:select * from emp;//實際開發中不建議使用
,效率較低。
*

12.條件查詢:

語法格式:
select
字段,字段…
from
表名;
where
條件;
案例
查詢工資等於5000的員工姓名:
select ename from emp where sal=5000;
查詢工資大於3000的員工姓名:
select ename,sal from emp where sal>3000;
查詢工資不等於3000的:
select ename,sal from emp where sal<>3000;
select ename,sal from emp where sal!=3000;
查詢工資在1100-3000的員工:
select ename,sal from emp where sal>=1100 and sal<=3000;
select ename,sal from emp where sal between 1100 and 3000;

mysql> select ename,sal from emp where sal between 1100 and 3000;
+--------+---------+
| ename  | sal     |
+--------+---------+
| allen  | 1600.00 |
| ward   | 1250.00 |
| jones  | 2975.00 |
| martin | 1250.00 |
| blake  | 2850.00 |
| clark  | 2450.00 |
| scott  | 3000.00 |
| turner | 1500.00 |
| adams  | 1100.00 |
| frod   | 3000.00 |
| miller | 1300.00 |
+--------+---------+
11 rows in set (0.00 sec)

between and 使用的時候要左小右大。
between and 也可以使用在字符串://此時左閉右開
select ename from emp where ename between ‘A’ and ‘C’;

mysql> select ename from emp where ename between 'A' and 'C';
+-------+
| ename |
+-------+
| allen |
| blake |
| adams |
+-------+
3 rows in set (0.00 sec)

找出沒有津貼的人:
null不能使用等號: is null 或 is not null;
select ename,sal,comm from emp where comm is null;
select ename,sal,comm from emp where comm is null or comm=0;

mysql> select ename,comm from emp where comm is null or comm=0;
+--------+------+
| ename  | comm |
+--------+------+
| smith  | NULL |
| jones  | NULL |
| blake  | NULL |
| clark  | NULL |
| scott  | NULL |
| king   | NULL |
| turner | 0.00 |
| adams  | NULL |
| james  | NULL |
| frod   | NULL |
| miller | NULL |
+--------+------+
11 rows in set (0.00 sec)

找出工作崗位是MANAGER和SALESMAN的員工:
select ename,job from emp where job='MANAGER’or job=‘SALESMAN’;
in等同於or:
select ename,job from emp where job in(‘MANAGER’,‘SALESMAN’);

mysql> select ename,job from emp where job in('manager','salesman');
+--------+----------+
| ename  | job      |
+--------+----------+
| allen  | salesman |
| ward   | salesman |
| jones  | manager  |
| martin | salesman |
| blake  | manager  |
| clark  | manager  |
| turner | salesman |
+--------+----------+
7 rows in set (0.00 sec)

and和or聯合起來用:找出薪資大於1000的且部門編號是20或30部門的員工.
select ename,sal,deptno from emp where sal>100 and (deptno=20 or deptno=30);
注意:當運算符的優先級不確定的時候加小括號。

mysql> select ename,sal,deptno from emp where sal>100 and(deptno=20 or deptno=30);
+--------+---------+--------+
| ename  | sal     | deptno |
+--------+---------+--------+
| smith  |  800.00 |     20 |
| allen  | 1600.00 |     30 |
| ward   | 1250.00 |     30 |
| jones  | 2975.00 |     20 |
| martin | 1250.00 |     30 |
| blake  | 2850.00 |     30 |
| scott  | 3000.00 |     20 |
| turner | 1500.00 |     30 |
| adams  | 1100.00 |     20 |
| james  |  950.00 |     30 |
| frod   | 3000.00 |     20 |
+--------+---------+--------+
11 rows in set (0.00 sec)

模糊查詢like:(特殊符號 % 和 _)
%代表任意多個字符,_代表任意一個字符。
找出名字中含有O的,
select ename from emp where ename like ‘%O%’;

+-------+
| ename |
+-------+
| jones |
| scott |
| frod  |
+-------+

找出第二個字母是A的:
select ename from emp where ename like ‘_A%’;

+--------+
| ename  |
+--------+
| ward   |
| martin |
| james  |
+--------+

找出名字中有下劃線的:
select name from t_user name like ‘%_%’;

13.排序(升序、降序)

按照工資升序,找出員工名和薪資:
select
ename,sal
from
emp
order by
sal;
默認是升序,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;//降序

mysql> 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 |
| frod   | 3000.00 |
| king   | 5000.00 |
+--------+---------+

按照工資的降序排列,當工資相同的時侯再按照名字的升序排列:
select ename,sal from emp by sal desc,ename asc;

mysql> select ename,sal from emp order by sal desc,ename asc;
+--------+---------+
| ename  | sal     |
+--------+---------+
| king   | 5000.00 |
| frod   | 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 |
+--------+---------+
14 rows in set (0.00 sec)

找出工作崗位是SALESMAN的員工,並且要求按照薪資的降序排列。
select 3
ename.job,sal
from 1
emp
where 2
job=‘SALESMAN’
order by 4
sal desc;

mysql> select ename,job,sal from emp where job='salesman' order by sal desc;
+--------+----------+---------+
| ename  | job      | sal     |
+--------+----------+---------+
| allen  | salesman | 1600.00 |
| turner | salesman | 1500.00 |
| ward   | salesman | 1250.00 |
| martin | salesman | 1250.00 |
+--------+----------+---------+
4 rows in set (0.00 sec)

14.分組函數:都是對某一組數據進行操作的

count 計數
sum 求和
avg 平均值
max 最大值
min 最小值
求出工資總和
select sum(sal) from emp;
找出最高工資
select max(sal) from emp;
求總人數:
select count(*) from emp;
select count(ename)from emp;
分組函數自動忽略NULL。

count()和count(具體的某個字段)的區別:
count(
):統計總記錄條數。
count(comm):表示統計comm字段中不爲NULL的數據總數量。

mysql> select max(sal),sum(sal),count(*) as '總人數' from emp;
+----------+----------+--------+
| max(sal) | sum(sal) | 總人數 |
+----------+----------+--------+
|  5000.00 | 29025.00 |     14 |
+----------+----------+--------+
1 row in set (0.00 sec)

找出工資高於平均工資的員工:
select ename,sal from emp where sal>avg(sal) ;//無效
原因:SQL語句中,分組函數不可以直接使用在where子語句中去。
因爲group by實在where執行之後纔會執行的。
select 5

from 1

where 2

group by 3

having 4

order by 6

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

mysql> select ename,sal from emp where sal>(select avg(sal) from emp);
+-------+---------+
| ename | sal     |
+-------+---------+
| jones | 2975.00 |
| blake | 2850.00 |
| clark | 2450.00 |
| scott | 3000.00 |
| king  | 5000.00 |
| frod  | 3000.00 |
+-------+---------+
6 rows in set (0.00 sec)

**15.多行處理函數:輸入多行,輸出一行。
單行處理函數:輸入一行,輸出一行。
計算員工的年薪:
select ename,(sal+comm)12 as yearsal from emp;
當null參與運算,運算結果一定是NULL
使用ifnull();
select ename,(sal+ifnull(comm,0))12 as yearsal from emp;
ifnull()空處理函數:
ifnull(可能爲null的數據,被當作什麼處理):屬於單行處理函數
select ename,ifnull(comm,0) as comm from emp;

mysql> select ename,sal+ifnull(comm,0)*12 as yearsal from emp;
+--------+----------+
| ename  | yearsal  |
+--------+----------+
| smith  |   800.00 |
| allen  |  5200.00 |
| ward   |  7250.00 |
| jones  |  2975.00 |
| martin | 18050.00 |
| blake  |  2850.00 |
| clark  |  2450.00 |
| scott  |  3000.00 |
| king   |  5000.00 |
| turner |  1500.00 |
| adams  |  1100.00 |
| james  |   950.00 |
| frod   |  3000.00 |
| miller |  1300.00 |
+--------+----------+
14 rows in set (0.00 sec)

16.group by 和 having

group by:按照某個字段或者某些字段進行分組。
having:having是對分組之後的數據進行再次過濾。
案例:找出每個工作崗位的最高薪資。
select max(sal),job from emp group by job;

mysql> select max(sal),job from emp group by job;
+----------+-----------+
| max(sal) | job       |
+----------+-----------+
|  1300.00 | clerk     |
|  1600.00 | salesman  |
|  2975.00 | manager   |
|  3000.00 | analyst   |
|  5000.00 | persident |
+----------+-----------+
5 rows in set (0.00 sec)

注意:
1.分組函數一般都會和group by聯合使用,這也是爲什麼它被稱爲分組函數的原因
並且任何一個分組函數(count sum avg max min)都是在group by語句執行結束之後纔會
執行的,當一個sql語句沒有group by的話,整張表的數據都會自成一組。
2.當一條語句中有group by的話,select後面只能跟分組函數和參與分組的字段。

案例:找出每個部門不同工作崗位的最高薪資。
select
deptno,job,max(sal)
from
emp
group by
deptno,job;

mysql> select deptno,job,max(sal) from emp group by deptno,job;
+--------+-----------+----------+
| deptno | job       | max(sal) |
+--------+-----------+----------+
|     20 | clerk     |  1100.00 |
|     30 | salesman  |  1600.00 |
|     20 | manager   |  2975.00 |
|     30 | manager   |  2850.00 |
|     10 | manager   |  2450.00 |
|     20 | analyst   |  3000.00 |
|     10 | persident |  5000.00 |
|     30 | clerk     |   950.00 |
|     10 | clerk     |  1300.00 |
+--------+-----------+----------+
9 rows in set (0.00 sec)

找出每個部門的最高薪資,要求顯示薪資大於2900的數據
select max(sal),deptno from emp group by deptno having max(sal)>2900;//效率低
select max(sal),deptno from emp where sal>2900 group by deptno;//where

mysql> select deptno,max(sal) from emp group by deptno having max(sal)>2900;
+--------+----------+
| deptno | max(sal) |
+--------+----------+
|     20 |  3000.00 |
|     10 |  5000.00 |
+--------+----------+
2 rows in set (0.00 sec)

mysql> select deptno,max(sal) from emp where sal>2900 group by deptno;
+--------+----------+
| deptno | max(sal) |
+--------+----------+
|     20 |  3000.00 |
|     10 |  5000.00 |
+--------+----------+

找出每個部門的平均薪資,要求顯示薪資大於2000的薪資;
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
where後面不能使用分組函數,只能使用having使用。

mysql> select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
+--------+-------------+
| deptno | avg(sal)    |
+--------+-------------+
|     20 | 2175.000000 |
|     10 | 2916.666667 |
+--------+-------------+
2 rows in set (0.00 sec)

17.完整的DQL語句的運行順序

select 5

from 1

where 2

group by 3

having 4

order by 6

以上操作使用的案例表

EMP員工表

員工表

DEPT部門表

部門表

SALGRADE工資等級表

工資等級表

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章