1. 程式人生 > >DQL查詢語句總結

DQL查詢語句總結

max bst 交叉 安全 man 流程 空格 minute end

基礎查詢

一、語法
select 查詢列表
from 表名;
二、特點
1、查詢列表可以是字段、常量、表達式、函數,也可以是多個
2、查詢結果是一個虛擬表

三、示例
1、查詢單個字段
select 字段名 from 表名;
2、查詢多個字段
select 字段名,字段名 from 表名;
3、查詢所有字段
select * from 表名
4、查詢常量
select 常量值;
註意:字符型和日期型的常量值必須用單引號引起來,數值型不需要
5、查詢函數
select 函數名(實參列表);
6、查詢表達式
select 100/1234;
7、起別名
①as
②空格
8、去重
select distinct 字段名 from 表名;

9、+
作用:做加法運算
select 數值+數值; 直接運算
select 字符+數值;先試圖將字符轉換成數值,如果轉換成功,則繼續運算;否則轉換成0,再做運算
select null+值;結果都為null

10、【補充】concat函數
功能:拼接字符
select concat(字符1,字符2,字符3,...);

11、【補充】ifnull函數
功能:判斷某字段或表達式是否為null,如果為null 返回指定的值,否則返回原本的值
select ifnull(commission_pct,0) from employees;

12、【補充】isnull函數
功能:判斷某字段或表達式是否為null,如果是,則返回1,否則返回0

條件查詢

一、語法
select 查詢列表
from 表名
where 篩選條件

二、篩選條件的分類
1、簡單條件運算符
> < = <> != >= <= <=>安全等於
2、邏輯運算符
&& and
|| or
! not
3、模糊查詢
like:一般搭配通配符使用,可以判斷字符型或數值型
通配符:%任意多個字符,_任意單個字符

between and
in
is null /is not null:用於判斷null值

is null PK <=>
普通類型的數值 null值 可讀性
is null × √ √
<=> √ √ ×

排序查詢

一、語法
select 查詢列表
from 表
where 篩選條件
order by 排序列表 【asc}desc】

二、特點
1、asc :升序,如果不寫默認升序
desc:降序

2、排序列表 支持 單個字段、多個字段、函數、表達式、別名

3、order by的位置一般放在查詢語句的最後(除limit語句之外)

常見查詢

一、概述
功能:類似於java中的方法
好處:提高重用性和隱藏實現細節
調用:select 函數名(實參列表);
二、單行函數
1、字符函數
concat:連接
substr:截取子串
upper:變大寫
lower:變小寫
replace:替換
length:獲取字節長度
trim:去前後空格
lpad:左填充
rpad:右填充
instr:獲取子串第一次出現的索引
2、數學函數
ceil:向上取整
round:四舍五入
mod:取模
floor:向下取整
truncate:截斷
rand:獲取隨機數,返回0-1之間的小數

3、日期函數

now:返回當前日期+時間
year:返回年
month:返回月
day:返回日
date_format:將日期轉換成字符
curdate:返回當前日期
str_to_date:將字符轉換成日期
curtime:返回當前時間
hour:小時
minute:分鐘
second:秒
datediff:返回兩個日期相差的天數
monthname:以英文形式返回月


4、其他函數
version 當前數據庫服務器的版本
database 當前打開的數據庫
user當前用戶
password(‘字符‘):返回該字符的密碼形式
md5(‘字符‘):返回該字符的md5加密形式

5、流程控制函數

①if(條件表達式,表達式1,表達式2):如果條件表達式成立,返回表達式1,否則返回表達式2
②case情況1
case 變量或表達式或字段
when 常量1 then 值1
when 常量2 then 值2
...
else 值n
end

③case情況2
case
when 條件1 then 值1
when 條件2 then 值2
...
else 值n
end

三、分組函數
1、分類
max 最大值
min 最小值
sum 和
avg 平均值
count 計算個數

2、特點

①語法
select max(字段) from 表名;

②支持的類型
sum和avg一般用於處理數值型
max、min、count可以處理任何數據類型

③以上分組函數都忽略null
④都可以搭配distinct使用,實現去重的統計
select sum(distinct 字段) from 表;
⑤count函數
count(字段):統計該字段非空值的個數
count(*):統計結果集的行數
案例:查詢每個部門的員工個數
1 xx 10
2 dd 20
3 mm 20
4 aa 40
5 hh 40

count(1):統計結果集的行數

效率上:
MyISAM存儲引擎,count(*)最高
InnoDB存儲引擎,count(*)和count(1)效率>count(字段)

⑥ 和分組函數一同查詢的字段,要求是group by後出現的字段

分組查詢

一、語法
select 分組函數,分組後的字段
from 表
【where 篩選條件】
group by 分組的字段
【having 分組後的篩選】
【order by 排序列表】


二、特點

使用關鍵字 篩選的表 位置
分組前篩選 where 原始表 group by的前面
分組後篩選 having 分組後的結果 group by 的後面

連接查詢

一、含義
當查詢中涉及到了多個表的字段,需要使用多表連接
select 字段1,字段2
from 表1,表2,...;

笛卡爾乘積:當查詢多個表時,沒有添加有效的連接條件,導致多個表所有行實現完全連接
如何解決:添加有效的連接條件


二、分類

按年代分類:
sql92:
等值
非等值
自連接

也支持一部分外連接(用於oracle、sqlserver,mysql不支持)
sql99【推薦使用】
內連接
等值
非等值
自連接
外連接
左外
右外
全外(mysql不支持)
交叉連接


三、SQL92語法
1、等值連接
語法:
select 查詢列表
from 表1 別名,表2 別名
where 表1.key=表2.key
【and 篩選條件】
【group by 分組字段】
【having 分組後的篩選】
【order by 排序字段】

特點:
① 一般為表起別名
②多表的順序可以調換
③n表連接至少需要n-1個連接條件
④等值連接的結果是多表的交集部分


2、非等值連接
語法:
select 查詢列表
from 表1 別名,表2 別名
where 非等值的連接條件
【and 篩選條件】
【group by 分組字段】
【having 分組後的篩選】
【order by 排序字段】
3、自連接

語法:
select 查詢列表
from 表 別名1,表 別名2
where 等值的連接條件
【and 篩選條件】
【group by 分組字段】
【having 分組後的篩選】
【order by 排序字段】


四、SQL99語法
1、內連接
語法:
select 查詢列表
from 表1 別名
【inner】 join 表2 別名 on 連接條件
where 篩選條件
group by 分組列表
having 分組後的篩選
order by 排序列表
limit 子句;

特點:
①表的順序可以調換
②內連接的結果=多表的交集
③n表連接至少需要n-1個連接條件

分類:
等值連接
非等值連接
自連接

2、外連接
語法:
select 查詢列表
from 表1 別名
left|right|full【outer】 join 表2 別名 on 連接條件
where 篩選條件
group by 分組列表
having 分組後的篩選
order by 排序列表
limit 子句;
特點:
①查詢的結果=主表中所有的行,如果從表和它匹配的將顯示匹配行,如果從表沒有匹配的則顯示null
②left join 左邊的就是主表,right join 右邊的就是主表
full join 兩邊都是主表
③一般用於查詢除了交集部分的剩余的不匹配的行

3、交叉連接

語法:
select 查詢列表
from 表1 別名
cross join 表2 別名;

特點:
類似於笛卡爾乘積

子查詢

一、含義
嵌套在其他語句內部的select語句稱為子查詢或內查詢,
外面的語句可以是insert、update、delete、select等,一般select作為外面語句較多
外面如果為select語句,則此語句稱為外查詢或主查詢

二、分類
1、按出現位置
select後面:
僅僅支持標量子查詢
from後面:
表子查詢
where或having後面:
標量子查詢
列子查詢
行子查詢
exists後面:
標量子查詢
列子查詢
行子查詢
表子查詢

2、按結果集的行列
標量子查詢(單行子查詢):結果集為一行一列
列子查詢(多行子查詢):結果集為多行一列
行子查詢:結果集為多行多列
表子查詢:結果集為多行多列


三、示例
where或having後面
1、標量子查詢
案例:查詢最低工資的員工姓名和工資
①最低工資
select min(salary) from employees

②查詢員工的姓名和工資,要求工資=①
select last_name,salary
from employees
where salary=(
select min(salary) from employees
);

2、列子查詢
案例:查詢所有是領導的員工姓名
①查詢所有員工的 manager_id
select manager_id
from employees

②查詢姓名,employee_id屬於①列表的一個
select last_name
from employees
where employee_id in(
select manager_id
from employees
);

分頁查詢

一、應用場景
當要查詢的條目數太多,一頁顯示不全
二、語法

select 查詢列表
from 表
limit 【offset,】size;
註意:
offset代表的是起始的條目索引,默認從0卡死
size代表的是顯示的條目數

公式:
假如要顯示的頁數為page,每一頁條目數為size
select 查詢列表
from 表
limit (page-1)*size,size;

聯合查詢

一、含義
union:合並、聯合,將多次查詢結果合並成一個結果
二、語法
查詢語句1
union 【all】
查詢語句2
union 【all】
...

三、意義
1、將一條比較復雜的查詢語句拆分成多條語句
2、適用於查詢多個表的時候,查詢的列基本是一致

四、特點
1、要求多條查詢語句的查詢列數必須一致
2、要求多條查詢語句的查詢的各列類型、順序最好一致
3、union 去重,union all包含重復項

查詢總結

語法:
select 查詢列表 ⑦
from 表1 別名 ①
連接類型 join 表2 ②
on 連接條件 ③
where 篩選 ④
group by 分組列表 ⑤
having 篩選 ⑥
order by排序列表 ⑧
limit 起始條目索引,條目數; ⑨

DQL查詢語句總結