DQL語(yǔ)言學(xué)習(xí)
一、基礎(chǔ)查詢
語(yǔ)法:
SELECT 查詢列表 FROM 表名稱 WHERE 篩選條件 ORDER BY 排序;
特點(diǎn):
- 查詢列表可以是:表中的字段、常量值、表達(dá)式(SELECT 100*9;)、函數(shù)(SELECT version();)
- 查詢的結(jié)果是一個(gè)虛擬表格
著重號(hào):
``
SELECT `FROM`, `salary`, `email` FROM `employees`;
為查詢結(jié)果起一個(gè)別名
SELECT 100 % 98 AS 結(jié)果;
SELECT last_name AS 姓, first_name AS 名 FROM employees;
SELECT last_name 姓, first_name 名 FROM employees;
SELECT salary AS "out put" FROM employees;
去重
SELECT DISTINCT department_id FROM employees;
mysql中+號(hào)作用
加號(hào)只是運(yùn)算符
SELECT 100 + 99; 如果都為數(shù)值型,則進(jìn)行加法
SELECT '123' + 99; 如果一方為字符型,則試圖把字符型轉(zhuǎn)換為數(shù)值型,再做加法,
SELECT 'john' + 99; 如果轉(zhuǎn)換失敗,則把字符轉(zhuǎn)換為0,再做加法
SELECT NULL + 99; 如果其中一方為null,則結(jié)果肯定為null
二、條件查詢
語(yǔ)法:
SELECT 查詢列表 FROM 表名 WHERE 篩選條件;
執(zhí)行順序:from 表明 WHERE 條件 SELECT 查詢
條件運(yùn)算符:> < = ,!= <> 安全等于號(hào):<=>
邏輯運(yùn)算符:and or not , 主要是用于連接條件表達(dá)式
模糊查詢 : like BETWEEN AND in is null|is not null
三、排序查詢
語(yǔ)法:
SELECT 查詢列表 FROM 表名 WHERE 篩選條件 ORDER BY 排序列表 ASC | DESC
特點(diǎn):
1 . ASC 代表升序,如果不寫默認(rèn)是升序排序
2 . ORDER BY 子句中可以支持 單個(gè)字段、多個(gè)字段、表達(dá)式、函數(shù)、別名
3 . ORDER BY 一般都是放到最后邊,limit除外;
4 . 執(zhí)行順序 :from 表名 WHERE 條件 SELECT 查詢 ORDER BY
四、常見(jiàn)函數(shù)
函數(shù)可分為六類
- 字符函數(shù)
- 數(shù)學(xué)函數(shù)
- 日期函數(shù)
- 其他函數(shù)
- 流程控制函數(shù)
下邊詳細(xì)說(shuō)明:
# 字符函數(shù)
LENGTH(str) 獲取字節(jié)個(gè)數(shù)
CONCAT(str1,str2,...) 拼接字符串
UPPER() 小寫變大寫
LOWER(str) 大寫變小寫
SUBSTR(str FROM pos FOR len) 截取字符串,mysql中索引是從1開始的
eg : SELECT SUBSTR('123456',2,5)
SUBSTRING(str FROM pos FOR len)
INSTR(str,substr) 返回子串在字符串中第一次出現(xiàn)的起始索引,如果找不到返回0
TRIM([remstr FROM] str) 去掉前后空格,也可以自定義不是空格也可以 SELECT TRIM('a' from 'aaaazhaojieaaa');
LPAD(str,len,padstr) 指定長(zhǎng)度左填充 SELECT lpad('趙杰',4,'a');
RPAD(str,len,padstr) 指定長(zhǎng)度右填充
REPLACE 全部替換
# 數(shù)學(xué)函數(shù)
ROUND(X) 四舍五入
ROUND(X,D) 小數(shù)點(diǎn)后保留D位
CEIL() 向上取整
FLOOR(X) 向下取整
TRUNCATE(X,D) 截?cái)啵?shù)點(diǎn)后保留D位
MOD 取余
# 日期函數(shù)
now 返回系統(tǒng)日期+時(shí)間
curdate 返回系統(tǒng)日期,不包含時(shí)間
curtime 返回系統(tǒng)時(shí)間,不包含日期
YEAR
MONTH
MONTHNAME(date)
datadiff 查詢兩個(gè)時(shí)間之間距離多少天
STR_TO_DATE(str,format)
DATE_FORMAT(date,format)
# 其他函數(shù)
VERSION()
DATABASE
USER
# 流程控制函數(shù)
IF(expr1,result,result) eg:SELECT IF(commission_pct IS NULL,'no','yes') FROM employees
CASE
五、分組函數(shù)
因?yàn)榉纸M函數(shù)比較常用也比較特殊,這里單獨(dú)拆開記憶
# 分組函數(shù) (又名 聚合函數(shù),統(tǒng)計(jì)使用)
sum 求和
count(1) count(*) 計(jì)數(shù)
avg 平均數(shù)
max 最大
min 最小
特點(diǎn):
1. sum,avg一般處理數(shù)值,max min count 可以是任意類型
2. 以上分組函數(shù)都忽略null值
3. 可以和 DISTINCT 搭配使用
4. count函數(shù):
- count(字段):統(tǒng)計(jì)該字段非空值得個(gè)數(shù)
- count(*) :統(tǒng)計(jì)結(jié)果集行數(shù)
效率:
- MyISAM存儲(chǔ)引擎,count(*)效率最高
- InnoDB存儲(chǔ)引擎,count(1) 和 count(*) 差不多
六、分組查詢
語(yǔ)法:
SELECT 分組函數(shù),分組后的字段 5
FROM 表 1
WHERE 篩選條件 2
GROUP BY 分組的字段 3
HAVING 分組后的篩選 4
ORDER BY 排序列表 6
語(yǔ)句順序如上,上邊語(yǔ)句后邊是每個(gè)字句執(zhí)行的順序編號(hào)。
特點(diǎn):
| 使用關(guān)鍵字 | 篩選的表 | 使用關(guān)鍵字 | |
|---|---|---|---|
| 分組前篩選 | where | 原始表 | GROUP BY 的前邊 |
| 分組后篩選 | HAVING | 分組后的結(jié)果 | GROUP BY 的后邊 |
七、連接查詢
含義:
查詢中涉及到了多個(gè)表的字段,需要使用連接查詢,又名 多表查詢。
SELECT 字段1,字段2 FROM 表1,表2
分類:
-
sql 92
-
sql 99
sql92
等值連接
非等值連接
自連接
sql99
內(nèi)連接
等值
非等值
自連接
外連接
左外
右外
全外(mysql不支持)
交叉連接
特點(diǎn):
1.一般為表起別名
2.多表的順序可以調(diào)換
3.n表連接至少需要n-1個(gè)條件
4.等值連接的結(jié)果是多表的交集部分
sql92 語(yǔ)法:
SELECT 查詢列表
FROM 表1 別名 表2 別名
WHERE 表1.key = 表2.key
AND 篩選條件
GROUP BY 分組字段
HAVING 分組后的篩選
ORDER BY 排序字段
sql99 語(yǔ)法:
SELECT 查詢列表
FROM 表1 別名
連接類型 join 表2 別名
on 連接條件
WHERE 篩選條件
GROUP BY 分組
HAVING 分組后的篩選條件
ORDER BY 排序
---------------------------------------------------------------------------------------------
分類:
內(nèi)連接:INNER
外鏈接
左外:LEFT (OUTER)
右外:RIGHT (OUTER)
全外:FULL (OUTER) mysql不支持
交叉連接:CROSS
---------------------------------------------------------------------------------------------
內(nèi)連接:
等值
內(nèi)連接特點(diǎn):
1.inner可以省略
2.篩選條件放在where后邊,連接條件放在on后邊
3.和sql92一樣,都是查詢交集
非等值
自連接
外鏈接:
應(yīng)用場(chǎng)景:用于查詢一個(gè)表中有,另一個(gè)表中沒(méi)有的記錄
特點(diǎn):
1.外連接的查詢結(jié)果為主表中的所有記錄
如果從表中有和他匹配的值,則顯示匹配值
如果從表中沒(méi)有和它匹配的,則顯示null
外連接查詢結(jié)果=內(nèi)連接查詢結(jié)果+主表中有而從表中沒(méi)有的記錄
2.左外連接,left join 左邊是主表
右外連接,right join 右邊是主表
3.左外和右外交換兩個(gè)表的順序,可以實(shí)現(xiàn)同樣的效果
交叉連接:
99語(yǔ)法的笛卡爾積效果
cross JOIN

image.png

image.png
八、子查詢
概念:
出現(xiàn)在其他語(yǔ)句內(nèi)部的select語(yǔ)句,稱為子查詢或內(nèi)查詢,內(nèi)部嵌套其他select語(yǔ)句的查詢,稱為外查詢或主查詢。
語(yǔ)法:
SELECT last_name
FROM employees
WHERE departments_id
in
(SELECT departments_id FROM departments WHERE locations_is = 10)