單行函數(shù)
length():獲取參數(shù)的字節(jié)值
concat():拼接字符串
upper():變大寫(xiě)
lower():變小寫(xiě)
substr():截取字符
instr():獲取字符串第一次出現(xiàn)的索引
replace():替換
trim():去除前后空格或者指定字符
SELECT TRIM('+' FROM '++++李剛+++劉邦+++') AS out_put;
lpad():用指定的字符實(shí)現(xiàn)左填充指定長(zhǎng)度
Rpad():右填充
SELECT LPAD('梅林',8,'+') AS out_put;
8是字符串總長(zhǎng)度
流程控制
有兩種情況
方式一:
case 后面加變量 匹配 then后面的東西
SELECT salary 原始工資,department_id,
CASE department_id
WHEN 30 THEN salary1.1
WHEN 40 THEN salary1.2
WHEN 50 THEN salary*1.3
ELSE salary
END AS 新工資
FROM employees;
方式二:
case后面無(wú)表達(dá)式伪朽,when后加表達(dá)式
SELECT salary,
CASE
WHEN salary>20000 THEN 'A'
WHEN salary>15000 THEN 'B'
WHEN salary>10000 THEN 'C'
ELSE 'D'
END AS 工資等級(jí)
FROM employees;
組函數(shù)
介紹:作統(tǒng)計(jì)使用,又稱(chēng)聚合函數(shù)/統(tǒng)計(jì)函數(shù)/組函數(shù)
分類(lèi):sum实苞,avg,max烈疚,min黔牵,count
特點(diǎn):
1、
Where后面不能加 組函數(shù)爷肝,Having 后面可
分組查詢(xún)
結(jié)構(gòu)
select 分組函數(shù),分組后的字段
from 表
【where 篩選條件】
group by 分組的字段
【having 分組后的篩選】
【order by 排序列表】
注意;帧!
group by 后面的分組的字段 和 select 后面分組的字段要寫(xiě)成一樣的灯抛。
分組的操作消耗的資源比較大金赦,所以先過(guò)濾掉一些,再分組对嚼,這樣的效率比較高夹抗。
*案例
#引入:查詢(xún)每個(gè)部門(mén)的平均工資
SELECT AVG(salary) FROM employees;
#案例1:查詢(xún)每個(gè)工種的最高工資
SELECT MAX(salary),job_id FROM employees
GROUP BY job_id;
#案例2:查詢(xún)每個(gè)位置上的部門(mén)個(gè)數(shù)
SELECT COUNT(*),location_id
FROM departments
GROUP BY location_id;
#添加篩選條件
#案例1:查詢(xún)郵箱中包含a字符的,每個(gè)部門(mén)的平均工資
SELECT AVG(salary),department_id FROM employees
WHERE email LIKE '%a%' GROUP BY department_id;
#案例2:查詢(xún)有獎(jiǎng)金的每個(gè)領(lǐng)導(dǎo)手下員工的最高工資
SELECT MAX(salary),manager_id FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id;
#添加復(fù)雜的篩選條件
#案例1:查詢(xún)哪個(gè)部門(mén)的員工個(gè)數(shù)>2
#1.查詢(xún)每個(gè)部門(mén)的員工個(gè)數(shù)
SELECT COUNT(*),department_id FROM employees
GROUP BY department_id;
#2.根據(jù)1的結(jié)果進(jìn)行篩選猪半,查詢(xún)哪個(gè)部門(mén)的員工個(gè)數(shù)大于2
SELECT COUNT(*),department_id FROM employees
GROUP BY department_id HAVING COUNT(*)>2;
#案例2:查詢(xún)每個(gè)工種有獎(jiǎng)金的員工的最高工資>12000的工種編號(hào)和最高工資
#1.查詢(xún)每個(gè)工種有獎(jiǎng)金的員工的最高工資
SELECT MAX(salary),job_id FROM employees
WHERE commission_pct IS NOT NULL GROUP BY job_id;
#2.根據(jù)結(jié)果繼續(xù)篩選兔朦,最高工資>12000
SELECT MAX(salary), job_id FROM employees
WHERE commission_pct IS NOT NULL GROUP BY job_id
HAVING MAX(salary)>12000;
#按表達(dá)式或函數(shù)分組
#案例:按員工姓名的長(zhǎng)度分組,查詢(xún)每一組的員工個(gè)數(shù),篩選員工個(gè)數(shù)>5
#1.查詢(xún)每個(gè)長(zhǎng)度的員工個(gè)數(shù)
SELECT COUNT(*),LENGTH(last_name) len_name
FROM employees GROUP BY LENGTH(last_name);
#2.添加篩選條件
SELECT COUNT(*) c,LENGTH(last_name) len_name
FROM employees GROUP BY len_name HAVING c>5;
#按多個(gè)字段查詢(xún)
#案例:查詢(xún)每個(gè)部門(mén)每個(gè)工種的員工的平均工資
SELECT AVG(salary),department_id,job_id
FROM employees GROUP BY department_id,job_id;
#添加排序
#案例:查詢(xún)每個(gè)部門(mén)每個(gè)工種的員工的平均工資,按平均工資的高低查詢(xún)
SELECT AVG(salary),department_id,job_id
FROM employees GROUP BY department_id,job_id
ORDER BY AVG(salary) DESC;
連接查詢(xún)
使用范圍:數(shù)據(jù)來(lái)源于多個(gè)表
按功能分類(lèi):
-等值連接
-非等值連接
-自連接
-內(nèi)連接
-外連接
??左外連接
??右外連接
??全外連接
-交叉連接
內(nèi)連接:就是普通的連接
外連接:分左外連接偷线,和右外連接
左外連接:搜索的結(jié)果左邊,包含一些沒(méi)有匹配的信息(如空值等)
右連接同理沽甥。
%代表任意個(gè)声邦,一個(gè)零個(gè)或多個(gè);
等值連接:
sql92摆舟,sql99連接的有區(qū)別亥曹,
但是只記住sql99標(biāo)準(zhǔn)就好了。
SQL99的語(yǔ)法
select 查詢(xún)列表
from 表1 別名 【連接類(lèi)型】
join 表2 別名
on 連接條件
【where 篩選條件】
【group by 分組】
【having 篩選條件】
【order by 排序列表】
內(nèi)連接(★):inner
外連接
左外(★):left 【outer】
右外(★):right 【outer】
全外:full【outer】
交叉連接:cross
Inner 可以省略
Outer可以省略
子查詢(xún)
多表連接
笛卡爾積的錯(cuò)誤
自連接
非自連接
非等值連接
三張表連接
[圖片上傳失敗...(image-ab5f74-1600854090108)]
笛卡機(jī)的錯(cuò)誤
自連接
自己連接自己
基表恨诱,輔表
非等值連接
使用`` 媳瞪,代表里面的內(nèi)容是字段名,而非關(guān)鍵字照宝。
外連接蛇受。
左半連接
內(nèi)連接:就是普通的連接
外連接:分左外連接,和右外連接厕鹃。
左外連接:搜索的結(jié)果左邊兢仰,包含一些沒(méi)有匹配的信息(如空值等)
%代表任意個(gè),一個(gè)零個(gè)或多個(gè)剂碴;
Inner 可以省略
Outer可以省略
函數(shù)(方法)
字符函數(shù)
Lower把将,upper
SQL
初始下標(biāo)為1,不是0
后面位置為5忆矛,
(index,length)
LPAD 左邊填充察蹲,右對(duì)齊
RPAD 右邊填充,左對(duì)齊
TRIM 去除兩端的東西
[圖片上傳失敗...(image-b0e7a7-1600854090108)]
Ifnull
Case 表達(dá)式
Case 1
When 2 then3
When 3 then 4
Else
other
End
Case
When 表達(dá)式1 then 2
When 表達(dá)式3 then4
別名加在end后面
值 case后面 加
表達(dá)式 case后面 不加?xùn)|西
組函數(shù)
Avg 求平均值 沒(méi)把 null 算在里面
Sum
Max
對(duì)任何類(lèi)型的數(shù)值做運(yùn)算
Min
Count
統(tǒng)計(jì)不為null 的數(shù)據(jù)
Count(*), 統(tǒng)計(jì)表中有多少條數(shù)據(jù)催训。
Count(1) 和Count(2)
Count (數(shù)值)比count(*)效率高
Select 后面出現(xiàn)組函數(shù)洽议,
后面不能加字段,
若加 瞳腌,必須出現(xiàn)在group by后面
Group by
Where 約束
Having 用來(lái)過(guò)濾
Having和where
用having就一定要和group by連用,
用group by不一有having (它只是一個(gè)篩選條件用的)
[圖片上傳失敗...(image-16f96b-1600854090108)]
Max是組函數(shù)的一種绞铃,
Where 不能和組函數(shù)和一起用,
Having 可以和組函數(shù)一起用嫂侍。
Where一般放 group by前面
Having 放group 后面
分組的操作消耗的資源比較大儿捧,所以先過(guò)濾掉一些,再分組挑宠,這樣的效率比較高菲盾。
[圖片上傳失敗...(image-1f8e76-1600854090108)]
組函數(shù)
Where 和having
位置上:
Where在group by 前面
Having 在group by 后面
Where后面不能出現(xiàn)組函數(shù)
Having 能
過(guò)濾時(shí)間
Where 先過(guò)濾再分組
Having 先分組再過(guò)濾 ?
先過(guò)濾再分組
[圖片上傳失敗...(image-ef3f23-1600854090107)]
子查詢(xún)
在查詢(xún)語(yǔ)句中再嵌套其他查詢(xún)語(yǔ)句各淀。
單行子查詢(xún):結(jié)果只有一條
多行子查詢(xún):結(jié)果有多條
單行子查詢(xún): > > =
多行子查詢(xún):