1. 程式人生 > >資料庫:DQL操作

資料庫:DQL操作

目錄

一、基本查詢

1.基本語法格式

2.常見查詢

二、高階查詢

1.關聯查詢(也稱為連線查詢)

2.子查詢

3.聯合查詢:合併結果集


一、基本查詢

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;