資料庫:DQL操作
阿新 • • 發佈:2018-11-09
目錄
一、基本查詢
1.基本語法格式
語法格式 | 作用 |
---|---|
select 欄位或表示式 | 展示結果集 |
from 表、檢視或結果集等 | 指定資料來源 |
where 檢索條件 | 指定檢索條件 |
group by 欄位 | 指定按某欄位分組 |
having 檢索條件 | 用在group by之後,指定檢索條件 |
order by 欄位 | 指定按某欄位進行排序,預設增序asc,降序desc |
limit 初始索引, 長度 | 限制結果,索引從0開始,若為0,則可省略僅寫長度 |
2.常見查詢
2.1 select 指定展示結果集
#匯入了3個sql檔案,老師給的!
#1.查詢emp表中所有的員工資訊
select * from emp;
#2.在emp表中查詢所有員工的姓名和職位資訊
select ename, job from emp;
2.2 where指定檢索條件:關係運算符、邏輯運算子、in關鍵詞、是否空值、範圍查詢between and
#3.在emp表中查詢所有的20號部門的員工資訊 select * from emp where deptno=20; #4.在emp表中查詢工作大於2000的員工的姓名和工資 select ename, sal from emp where sal > 2000; #5.在emp表中查詢工作在1000到2000之間的員工資訊(範圍查詢) select * from emp where sal > 1000 and sal < 2000; select * from emp where sal between 1000 and 2000; #6.在emp表中查詢員工編號為7788,7369,7521的員工資訊 select * from emp where empno = 7788 or empno = 7369 or empno = 7521; select * from emp where empno in (7788,7369,7521); #9.在emp表中查詢所有沒有獎金的員工資訊。(comm值為空) select * from emp where comm is null; select * from emp where comm is not null;
2.3 去重distinct 關鍵字
#7.在emp表中查詢所有的職位資訊(去重)
select distinct job from emp;
2.4 取別名
#8.在emp中查詢工資提升5%後的員工姓名及工資(別名:欄位、表示式、表、結果集等)
# 別名格式:[as] 別名
select ename,sal * 1.05 nsal from emp;
select emp.ename,emp.sal from emp;
select e.ename,e.sal from emp e;
2.5 排序 order by 和限制結果查詢 limit
#10.在emp中查詢工資最高的員工資訊
#方法一:使用SQL提供的函式
#方法二:倒序排序取第一個
#排序:order by 排序的欄位(預設升序,asc 升序,desc 降序)
#先按照工資降序排序,如果工資一樣,則按照編號降序排序
select * from emp order by sal desc, empno desc;
#限制結果查詢(格式:limit 開始索引, 長度,其中索引從0開始,如果是從0開始,則索引可以不
#寫,直接寫 limit 5,表示去前5條),限制結果查詢功能僅適用於mysql。
select * from emp order by sal desc limit 1;
2.6 模糊查詢
關鍵字和萬用字元:
- 模糊查詢:like
- %:代表0到多個字元
- _:代表1位字元
示例程式碼:
#11.查詢名稱中包含s的員工資訊(模糊查詢:like %:代表0到多個字元 _:代表1位字元)
select * from emp where ename like '%s%';
select * from emp where ename like 's%';
select * from emp where ename like '%s';
#查詢名稱第3個字元是L的員工資訊
select * from emp where ename like '__L%';
二、高階查詢
1.關聯查詢(也稱為連線查詢)
1.1 定義:查詢多張表或結果集
1.2 分類:內連線和外連線
1.3 內連線
語法格式:
#在emp查詢所有的員工及其所在部門資訊
#語法一:
#where的條件相當於從笛卡爾積中進行檢索
select * from emp,dept where emp.deptno = dept.deptno;
#語法二:inner join … on
select * from emp inner join dept on emp.deptno = dept.deptno;
#語法三:存在通用列,所以可以這樣寫
select * from emp inner join dept using(deptno);
特點總結:
- 多張關聯表共有的記錄才能出現在結果集中。
- 內連線的結果與連線順序無關。
1.4 外連線
語法格式:
- 左外連線:left [outer] join … on …
- 右外連線:right [outer] join … on …
示例程式碼:
#查詢所有的部門及其部門下的員工資訊(內連線就解決不了了)
select * from dept left join emp on emp.deptno = dept.deptno;
select * from dept left join emp on dept.deptno = emp.deptno;
#自然連線(自然連線都是等值連線,等值連線不一定是自然連線)
select * from emp natural join dept;
#查詢20號部門所有員工及其所在部門資訊
select * from emp , dept where emp.deptno = dept.deptno and emp.deptno=20;
select * from (select * from emp where deptno = 20) e,dept where e.deptno=dept.deptno;
#查詢所有員工及其上級領導(mgr)的名稱(自連線)
select e1.ename '姓名', e2.ename '領導' from emp e1 left join emp e2 on e1.mgr=e2.empno;
特點總結:
- 外連線結果與連線順序有關。
- 有主從表之分,依次遍歷主表每條記錄並與關聯表進行匹配,若匹配成功則關聯展示到結果集,若匹配失敗則以null填充。
2.子查詢
1.1 定義
將一個查詢結果作為另一個查詢的條件或組成繼續進行檢索。
2.2 分類
單行子查詢:子查詢返回的結果是一條記錄
多行子查詢:子查詢返回的結果是多條記錄
2.3 單行子查詢
示例程式碼:
#查詢編號為7788的員工所在部門的資訊
#方法一:關聯查詢實現
select dept.* from (select * from emp where empno = 7788) e, dept where e.deptno=dept.deptno;
#方法二:子查詢(或巢狀查詢)實現
#查詢7788員工的部門編號,將條件和結果放到一張表中(查詢通用列)
select * from dept where deptno = (select deptno from emp where empno = 7788);
#查詢工資>20號部門平均工資的員工資訊
select * from emp where sal > (select avg(sal) from emp where deptno = 20);
#查詢工資>20號部門平均工資並且不在20號部門的員工資訊
select * from emp where sal > (select avg(sal) from emp where deptno = 20) and deptno<>20;
2.4 多行子查詢
2.4.1 關鍵詞: any 與all
# 關鍵詞:any / all:
# =any:相當於in >any:大於最小值 <any:小於最大值
# >all:大於最大值 <all:小於最小值
#查詢工資大於2000的員工所在部門資訊
select * from dept where deptno in (select distinct deptno from emp where sal > 2000);
#查詢工資大於所在部門的平均工資的員工資訊
#關聯查詢實現
select emp.* from emp , (select deptno , avg(sal) avg from emp group by deptno) e where
emp.deptno = e.deptno and sal > e.avg;
#子查詢實現
#步驟:
#1.主查詢將deptno傳給子查詢
#2.子查詢根據主查詢的deptno查詢指定部門的平均工資
#3.子查詢將該部門平均工資返回給主查詢
#4.主查詢根據返回結果進行最後檢索。
select * from emp e1 where sal > (
select avg(sal) from emp e2 where e2.deptno = e1.deptno
);
2.4.2 關鍵詞:exists
示例程式碼:
#查詢工資>2000的員工所在的部門資訊
#exists:
#1.將主查詢的記錄一次次交給子查詢
#2.在子查詢中匹配記錄,如果能夠找到匹配的記錄,返回true,此時將展示主查詢該條記錄;如
#果不匹配則返回false,主查詢該條記錄不展示
select * from dept where exists (
select * from emp where sal > 2000 and emp.deptno = dept.deptno
);
in和exsits的區別:
- in先執行子查詢,exists先執行主查詢
- in需要關注子查詢返回值的欄位資訊;exists不需要關心返回欄位
- exists將主查詢的記錄依次在子查詢中匹配,如果匹配返回true展示。
2.5 總結
什麼時候使用關聯查詢?什麼時候使用子查詢?
- 當查詢結果存在多張表,使用關聯查詢;當查詢結果存在於一張表,用子查詢。
- 關聯查詢資源消耗高,子查詢資源消耗低但可能存在多次查詢。
3.聯合查詢:合併結果集
3.1 條件
多個結果集的欄位必須保持一致,才能進行聯合查詢
3.2 關鍵詞
union:聯合結果集並去重
union all:聯合結果集但不去重
3.3 為什麼使用聯合查詢?
理論上可以用or關鍵詞代替聯合查詢,但or關鍵詞會導致索引失效故此使用聯合查詢。
3.4 示例程式碼
#查詢20號部門以及工資>2000的員工資訊
select * from emp where deptno = 20 or sal > 2000;
select * from emp where deptno = 20 union select * from emp where sal > 2000;
select * from emp where deptno = 20 union all select * from emp where sal > 2000;