Data QueryLanguage 數據查詢語言
基礎查詢:select 查詢列表 from 表名;
查詢列表可以是表中字段,常量值,表達式,函數
取別名:as(可省略)
去重:查詢字段名前加distinct
+的作用:加法,有字符串試圖轉換,轉換不了直接爲0,有null結果爲null
concat(str1,str2…)拼接字符串,有null則全部爲null
ifnull(可能爲空字段,爲空時值) null字段操作
條件查詢:select 查詢列表 from 表名 where 篩選條件
條件運算符:> < = != <> >= <=
邏輯表達式:&& || ! and or not
模糊查詢:like between and in is null is not null
like:%包含任意字符;_包含一個字符;查詢下劃線用轉義,escape “$”自定義轉義符
between and:等價於>=… and <=… 語句簡潔,包含臨界值,範圍數值不能顛倒
in:某字段值是否屬於in列表某項,列表項值類型兼容,比or簡潔
is null is not null
安全等於:<=> 可判空或其他數值: <=> null 等於空 ;可讀性差;
排序查詢:篩選條件後order by desc降序 asc升序(默認)
相同值排序亂序解決:加入唯一性字段排序,例如id
支持按別名、按函數、按多字段
一般放於最後(limit子句除外)
常見函數:
length(字節個數):中文gbk一個漢字佔兩個字節,utf8佔三個字節
upper() lower()大小寫轉化
substr(字段,索引位置截取) 索引從1開始 同substring()
substr(字段,指定索引位置,字符長度)
instr(給定字段,查詢字段) 查出需要查詢字段的起始索引,查不出爲0
trim(指定內容 from 給定字段) 去除給定字段前後指定內容
lpad(給定字段,填充後總長度,填充內容) 左填充
rpad(給定字段,填充後總長度,填充內容) 右填充
replace(給定字段,需要替換的內容,替換成的內容)
數學函數:
round(數字) 四捨五入
round(數字,小數點後取位數) 四捨五入
ceil(數字) 向上取整,返回>=該數字的最小整數
floor(數字) 向下取整,返回<=該數字的最大整數
truncate(數字,截斷小數點後幾位)
mod(被除數,除數) 取模 符號同被除數
日期函數
#返回日期日期比較大小,>0 DATE1大,<0 +++DATE2大
DATEDIFF(DATE1,DATE2);
#返回當前系統年月日時分秒
SELECT NOW();
#時間戳,適用於datetime
SELECT CURRENT_TIMESTAMP();
#返回年月日
SELECT CURDATE();
SELECT CURRENT_DATE();
#返回時分秒
SELECT CURTIME();
SELECT CURRENT_TIME();
#年
SELECT YEAR(NOW());
#年加今年第幾周
SELECT YEARWEEK(NOW());
#年加?
SELECT YEARWEEK(NOW(),2);
#月
SELECT MONTH(NOW());
#英文幾月
SELECT MONTHNAME(NOW());
#日
SELECT DAY(NOW());
SELECT DATEDIFF('2018-5-2','2018-4-22'); 前面日期減後面日期的天數
#星期幾
SELECT DAYNAME(NOW());
#本月第幾天
SELECT DAYOFMONTH('2017-9-4');
#1-7:星期天到週六
SELECT DAYOFWEEK(NOW());
#今年第幾天
SELECT DAYOFYEAR(NOW());
#日期格式化:都轉化爲1990-3-23
SELECT STR_TO_DATE('1990-3/23','%Y-%c/%d');
#日期轉化爲指定字符串
SELECT DATE_FORMAT(NOW(),'%Y年%c月%d日');
其他函數:
SELECT VERSION();
SELECT DATABASE();
SELECT USER();
流程控制函數:
#同三元運算符
SELECT IF(10>11,'大','小');
#case:
一、同switch case
SELECT CASE 'ok'
WHEN 'o' THEN 'o'
WHEN 'o1' THEN 'o1'
WHEN 'o2' THEN 'o2'
ELSE 'ok1'
END AS result;
二、多重if
SELECT CASE
WHEN 1>2 THEN '1>2'
WHEN 2>2 THEN '2>2'
WHEN 3>2 THEN '3>2'
END AS result;
分組函數:用作統計,叫做聚合函數、統計函數、組函數(可distinct去重使用)
sum 求和、avg 平均值、max 最大值、min 最小值、count 計數
sum、avg 支持數值型,忽略null
max、min 支持數值、字符、日期,忽略null
count 計算非空字段行數,忽略null,count(*)(效率較高)、count(1)統計總行數
和分組查詢一起查詢的字段都是group by 後的字段
分組查詢
select 分組函數 from 表 where 篩選條件 group by 分組的字段 order by 子句
分組函數做條件則使用having在group by 之後
分組前篩選效率好即用where
支持按表達式或函數分組(用地少)
按多個字段分組
Oracle不支持group by having
連接查詢:多表查詢
笛卡爾乘積表一m行,表二n行,結果m*n行
原因:沒有有效連接條件
避免:添加有效的連接條件
標準分類
年代分類:
Sql92標準:僅支持內連接
Sql99標準【推薦】:支持所有內連接、外連接(左、右)、交叉連接
92標準:
功能分類:
內連接:
等值連接:結果爲多表交集部分,n表連接至少有n-1個,多表順序隨意,可搭配排序分組篩選使用
注意:爲表起別名(查詢也要用別名(視圖))
非等值連接:A表值between B表值1 and B表值2
自連接:同表起別名
99標準:
一、內連接:同上
特點:1、表的順序可以互換
2、結果爲表的連接交集
3、n表連接需要n-1給個連接條件
二、外連接:
特點:1、查詢結果爲主表中所有行,從表匹配的行或者null
2、left jion左邊爲主表,right jion 右邊爲主表,full join兩邊都是主表
左外連接:select 查詢列表 from 表1 as別名 【連接類型】
jion表2 as別名
on 連接條件
where 篩選條件
右外連接:類似左外連接
全外連接:表1有表2沒有,表2有表1沒有,表1表2都有
mysql暫不支持
三、交叉連接:兩表全查
select 表1.*,表2.* from 表1 cross jion 表2
子查詢:查詢字表爲查詢條件
where或having後面:1、標量子查詢(結果集只有一行一列)
2、列子查詢(多行子查詢)
in /not in :在什麼範圍中的值
any/some:任意一個值
all:所有的值
select 後面(多用):
from後面:查詢結果做結果集表,必須起別名
(not)exists後面:子查詢有沒有值,有爲1,否則爲0,可用in代替
分頁查詢:
limit offset,size
offset:起始位置,可省略默認值爲0;(page-1)*size
size:查詢數量
union聯合查詢
特點:查詢的表沒有連接關係但是查詢信息(列數、列的類型和順序)一致,自動去重,不去重用union all查詢
查詢語句1
union
查詢語句2
union
……