03 DQL(數據庫查詢語言)
一、簡單查詢
- 語法格式:
select [字段1],[字段2],[字段3],··· from [表名] ;
- 查詢字段可以參與速學運算:
select name,num*10 from emp;
- 查詢時還可以給字段別名:
select name,num*10 as n from emp;
as可以省略。 - 查詢所有字段:
select * from emp;
二、條件查詢
-
語法格式:
select [字段1],[字段2],[字段3],··· from [表名] where [條件];
-
按條件表達式篩選
簡單條件運算符:> < = != <> >= <= -
按邏輯表達式篩選
邏輯運算符:
作用:用於連接條件表達式
&& || !
and or not&&和and:兩個條件都爲true,結果爲true,反之爲false
||或or: 只要有一個條件爲true,結果爲true,反之爲false
!或not: 如果連接的條件本身爲false,結果爲true,反之爲false -
模糊查詢
- like (必須掌握兩個特殊字符,一個是%,一個是_。%代表任意多個字符,_代表任意1個字符)
/*示例1:找出名字中有'O'的員工*/ select ename from emp where ename like '%O%'; /*找出名字中第二個字母是‘A’的員工*/ select ename from emp where ename like '_A%'; /*找出名字中有下劃線的員工*/ select ename from emp where ename like '%\_%'; +-------+ | ename | +-------+ | JOH_N | +-------+ /*找出名字中最後一個字母是‘T’的員工*/ select ename from emp where ename like '%T'; +-------+ | ename | +-------+ | SCOTT | +-------+
- between and
- in (in運算和 or 類似)
/*如找出工作崗位是'MANAGER'和'SALESMAN'的員工*/ or: select ename,job from emp where job='MANAGER' or job='SALESMAN'; in: 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 | +--------+----------+
- is null
三、排序
注意:asc
升序排,desc
降序排,不寫默認升序。
/*按照工資升序排*/
select ename,sal from emp order by sal;
/*按照工資降序排*/
select ename,sal from emp order by sal desc;
/*按照工資的降序排列,工資一樣的按照名字的排列*/
select ename,sal from emp order by sal desc,ename asc;
+----------+---------+
| ename | sal |
+----------+---------+
| ADAMS | 11000 |
| JAMES | 9500 |
| KING | 5000 |
| FORD | 3000 |
| SCOTT | 3000 |
| JONES | 2975 |
| BLAKE | 2850 |
+----------+---------+
/*找出工作崗位是‘SALESMAN’的員工,並按照工資降序排列*/
select ename,job,sal from emp where job='salesman' order by sal desc;
+--------+----------+------+
| ename | job | sal |
+--------+----------+------+
| ALLEN | SALESMAN | 1600 |
| TURNER | SALESMAN | 1500 |
| WARD | SALESMAN | 1250 |
| MARTIN | SALESMAN | 1250 |
+--------+----------+------+
四、分組函數
-
count 計數
-
sum 求和
-
avg 平均值
-
max 最大值
-
min 最小值
-
分組函數是對某一組數據進行操作
-
示例
/*找出最高工資*/ select max(sal) from emp; /*找出最低工資*/ select min(sal) from emp; /*找出工資總和*/ select sum(sal) from emp; /*找出平均工資*/ select avg(sal) from emp; /*找出總人數*/ select count(ename) from emp;
-
分組函數一共5個,分組函數又叫多行處理函數,其特點是輸入多行輸出一行,且忽略NULL。
-
SQL 語句有一條規則,分組函數不能直接使用在where子句當中。
如:
/*找出工資高於平均工資的員工*/
select ename,sal from emp where sal>avg(sal); #這是一條錯誤語句
ERROR 1111 (HY000): Invalid use of group function
正確寫法:
select ename,sal from emp where sal>(select avg(sal) from emp);
五、group by 和 having
- group by :按照某個字段或者某些字段進行分組。
-
示例
/*找出每個工作崗位的最高薪資*/ select job,max(sal) from emp group by job;
-
注意:分組函數一般聯合group by 使用,且在group by執行結束之後分組函數纔會執行。
-
多字段聯合分組
/*找出每個部門不同崗位的最高薪資*/ select max(sal),job,deptno from emp group by deptno,job;
-
- having:對分組之後的數據再次進行過濾。
- 示例
/*找出每個部門的最高薪資,要求顯示薪資大於3000的部門*/ #方法一 select max(sal),deptno from emp group by deptno having max(sal)>3000; #方法二 select max(sal),deptno from emp where sal>3000 group by deptno;
- 示例
六、查詢結果去重(distinct)
distinct:清除查詢結果集的重複記錄
使用命令:select distinct [字段名] from [表名] ;
示例:select distinct sal from emp;
七、表連接查詢
- 什麼是連接查詢
在實際開發中,大部分情況下都不是從單表中查詢數據,一般都是多張表聯合查詢取出最終結果。在實際開發中,一般一個業務都會對應多張表,比如:學生和班級,至少兩種表組成。 - 內連接和外連接有什麼區別
- 內連接:
假設A表和B表進行連接,使用內連接的話,凡是A表和B表能夠匹配上的記錄查詢出來,這就是內連接。AB兩張表沒有主副之分,兩張表是平等的。 - 外連接:
假設A和B表進行連接,使用外連接的話,AB兩張表中有一張表是主表,一張表是副表,主要查詢主表中的數據,捎帶着查詢副標,當副標中的數據沒有和主表中的數據匹配上,副表自動模擬出NULL與之匹配。
- 內連接:
- 內連查詢
- 等值連接
- 特點:條件是等量關係
- 案例
/*查詢每個員工的部門名稱,要求顯示員工名和部門名*/ select e.ename,d.dname from emp e join dept d on e.deptno=d.deptno;
- 非等值連接
- 案例
/*找出每個員工的工資等級,要求顯示員工名、工資、工資等級*/ select e.ename,e.sal,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;
- 自連接
- 特點:自己連接自己,把自己看作2張表
- 案例
/*找出每個員工的上級領導,要求顯示員工名和對應的領導名*/ select e.ename,m.ename mgr from emp e inner join emp m on e.mgr=m.empno;
- 等值連接
- 外聯查詢
- 左外連接(左連接):表示左邊的這張表是主表
/*找出每個員工的上級領導,要求顯示員工名和對應的領導名*/ select a.ename '員工',b.mgr '領導' from emp a left outer join emp b on a.mgr=b.empno;
- 右外連接(右連接):表示右邊的這張表是主表
- 全連接(不常使用)
- 三張表怎麼連接查詢
/*案例:找出 每個員工 的 部門名稱 以及 工資等級 */ select e.ename,d.dname,s.grade from emp e left join dept d on e.deptno=d.deptno left join salgrade s on e.sal between s.losal and s.hisal;
六、union 的使用
- union可以將查詢結果集相加
- 案例
/*找出工作崗位是SALESMAN和MANAGER的員工*/
select e.ename,e.job from emp e where e.job='SSALESMANE'
union
select e.ename,e.job from emp e where e.job='MANAGER';
七、limit查詢(重點)
- 應用:常用於分頁查詢
- limit是mysql特有的,其他數據庫沒有,不通用。(Oracle中有一種相同的機制,叫做rownum)
- limit取結果集中的部分數據,這是它的作用
- 語法機制
limit startIndex,length startIndex:表示起始位置 length:表示取出幾個 /*案例:取出工資前五的員工信息*/ select * from emp order by sal desc limit 0,5;
- 分頁技巧
limit (pageNo-1)*pageSize,pageSize
pageNo:表示頁碼數
pageSize:表示每頁顯示多少條數據
八、完整DQL語句
5. select
···
1.from (後面可以加 join on)
···
2. where
···
3. group by
···
4. having
···
6. order by
···
7. limit
···