MySQL排序查詢,常見函式,分組查詢,連線查詢
阿新 • • 發佈:2020-12-03
MySQL排序查詢,常見函式,分組查詢,連線查詢
2020-12-1
排序查詢
常見函式
分組查詢
連線查詢
排序查詢
1. 語法
select 查詢列表
from 表
where 篩選條件
order by 排序列表 【asc升序/desc降序】
2. 特點
- asc :升序,如果不寫預設升序
desc:降序 - 排序列表 支援 單個欄位、多個欄位、函式、表示式、別名
- order by的位置一般放在查詢語句的最後(除limit語句之外)
常見函式
1. 概述
功能:類似於java中的方法
好處:提高重用性和隱藏實現細節
呼叫:select 函式名(實參列表);
2. 單行函式
- 字元函式
concat
:連線
substr
:擷取子串
upper
:變大寫
lowe
r:變小寫
replace
:替換
length
:獲取位元組長度
trim
:去前後空格
lpad
:左填充
rpad
:右填充
instr
:獲取子串第一次出現的索引 - 數學函式
ceil
:向上取整
round
:四捨五入
mod
:取模
floor
:向下取整
truncate
:截斷
rand
:獲取隨機數,返回0-1之間的小數 - 日期函式
now
:返回當前日期+時間
curdate
:返回當前日期
curtime
:返回當前時間
year
:返回年
month
:返回月
monthname
:以英文形式返回月
day
:返回日
hour
minute
:返回分鐘
second
:返回秒
date_format
:將日期轉換成字元
str_to_date
:將字元轉換成日期
datediff
:返回兩個日期相差的天數 - 其他函式
version
: 當前資料庫伺服器的版本
database
: 當前開啟的資料庫
user
: 當前使用者
password('字元')
:返回該字元的密碼形式
md5('字元')
: 返回該字元的md5加密形式 - 流程控制函式
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
3. 分組函式
- 分類
max
: 最大值
min
: 最小值
sum
: 和
avg
: 平均值
count
: 計算個數 - 特點
①語法
②支援的型別select max(欄位) from 表名;
sum
和avg
一般用於處理數值型
max
、min
、count
可以處理任何資料型別
③以上分組函式都忽略null
④都可以搭配distinct
使用,實現去重的統計
⑤count函式select sum(distinct 欄位) from 表;
count(欄位)
:統計該欄位非空值的個數
count(*)
:統計結果集的行數
效率上:
MyISAM儲存引擎,count(*)
最高
InnoDB儲存引擎,count(*)
和count(1)
效率高於count(欄位)
⑥ 和分組函式一同查詢的欄位,要求是group by
後出現的欄位
分組查詢
1. 語法
select 分組函式,分組後的欄位
from 表
【where 篩選條件】
group by 分組的欄位
【having 分組後的篩選】
【order by 排序列表】
(【】
)表示可選
2. 特點
使用關鍵字 | 篩選的表 | 位置 | |
---|---|---|---|
分組前篩選 | where | 原始表 | group by的前面 |
分組後篩選 | having | 分組後的結果 | group by 的後面 |
連線查詢
1. 含義
當查詢中涉及到了多個表的欄位,需要使用多表連線
select 欄位1,欄位2
from 表1,表2,...;
笛卡爾乘積:當查詢多個表時,沒有新增有效的連線條件,導致多個表所有行實現完全連線
如何解決:新增有效的連線條件
2. 分類
按年代分類:
sql92:
等值
非等值
自連線
也支援一部分外連線(用於oracle、sqlserver,mysql不支援)
sql99【推薦使用】
- 內連線
等值
非等值
自連線
- 外連線
左外
右外
全外(mysql不支援)
- 交叉連線
3. 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 排序欄位】
4. 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 別名;
特點:
類似於笛卡爾乘積