2020/5/5 一、 DQL條件查詢 語法:(執行順序已標出) SELECT 查詢列表 3 FORM 表名 1 WHERE 篩選條件; 2 分類: 1. 按條件表達式篩選 條件運算符:> < = != <> >= <= #查找員工月薪>12000的員工信息 SELECT * FROM employ ...
2020/5/5
一、 DQL條件查詢
語法:(執行順序已標出)
SELECT
查詢列表 3
FORM
表名 1
WHERE
篩選條件; 2
分類:
1. 按條件表達式篩選
條件運算符:> < = != <> >= <=
#查找員工月薪>12000的員工信息
SELECT
*
FROM
employees
WHERE
salary>12000;
2. 按邏輯表達式篩選
邏輯運算符:and or not
#查找員工編號在90至120的員工名、薪水以及員工編號
SELECT
last_name,
salary,
employee_id
FROM
employees
WHERE
employee_id >= 90 AND employee_id <= 120;
3. 模糊查詢
關鍵字:
3.1 like
特點:一般和通配符搭配使用,可以判斷字元型或數值型。
通配符
% 可帶表任意多個字元(包括空字元)
_ 只能代表任意一個字元
案例一:查找員工名中含有字元a的員工名和部門編號
運行結果:
案例二:查找員工名中第二個字元為'a',第五個字元為'o'的員工名、部門編號和薪水
運行結果;
註意:若想查找的字元本身就為特殊的字元如_或%,則需要通過對該字元轉義來實現。共有倆種方式
方式一:使用’\’來轉義
方式二: 使用ESCAPE關鍵字配合
如:#查找員工名第二個字元為'_'的員工名、月薪以及獎金率
SELECT
last_name,
salary,
commission_pct
FROM
employees
WHERE
last_name LIKE '_\_%';
-----------------------------------------------------
SELECT
last_name,salary,
commission_pct
FROM
employees
WHERE
last_name
LIKE
'_$_%' ESCAPE '$'; (相當於把‘$‘附上轉義的功能)
3.2 between and
優點:
1. 能夠提高語句的簡潔度
2. 包含臨界值
3. 兩個臨界值不要調換順序
案例: 查找員工部門編號在90到120之間的員工名、部門編號、工作編號
運行結果:
以上兩種方法返回的查詢結果一樣,兩種方式的表達意義完全等價!
3.3 in
特點:
- 可以提高語句簡潔度
- in 列表的值類型必須一致或相容(可以隱式的轉換)
- 不支持使用通配符表示的的模糊字元
#查找員工部門編號是'AD_VP'、'FI_MGR'、'FI_ACCOUNT'的員工名、薪水、部門編號以及部門編號
SELECT
last_name,
salary,
job_id,
department_id
FROM
employees
WHERE
job_id = 'AD_VP' OR job_id = 'FI_MGR' OR job_id = 'FI_ACCOUNT';
---------------------------------------------------------------------
SELECT
last_name,
salary,
job_id,
department_id
FROM
employees
WHERE
job_id IN ('AD_VP','FI_MGR','FI_ACCOUNT');
上面這兩種方式完全等價
3.4 is null 、is not null
特點:=或<>不能用於判斷null值,而is null 或is not null可以判斷null值(is只能用於判斷null,與null搭配,不可以判斷數值如12000)
註意:安全等於<=>即可以判斷NULL值,也可以判斷其他普通的數值,可讀性較差。
#查找獎金率為null的員工名、月薪以及獎金率
SELECT
last_name,
salary,
commission_pct
FROM
employees
WHERE
commission_pct IS NULL;(可讀性很好!)
--------------------------------------------------------
SELECT
last_name,
salary,
commission_pct
FROM
employees
WHERE
commission_pct <=> NULL;(可讀性較差)
以上兩種方式等價,返回查詢結果一致!!!
#查找獎金率不為null的員工名、月薪、獎金率以及年薪
SELECT
last_name,
salary,
commission_pct,
salary * (1 + IFNULL(commission_pct, 0)) * 12 AS 年薪
FROM
employees
WHERE
commission_pct IS NOT NULL;
註意,有個IFNULL()函數,原型為IFNULL(expression, alt_value),如果第一個參數的值expression為null,則替換它並返回第二個參數alt_value。
二、 DOL排序查詢
特點:
1. ASC代表升序,DESC代表降序(若不寫,則預設為升序)
2. order by 字句中可以支持單個欄位,多個欄位,表達式、函數、別名
3. order by 字句一般放在查詢語句的最後面,LIMIT子句除外
語法:(執行順序已標出)
SELECT
查詢列表 3
FROM
表名 1
[WHERE
篩選條件] 2
ORDER BY
排序列表 ASC|DESC; 4
案例一: #查詢員工信息,要求工資從高到低排序
SELECT * FROM employees ORDER BY salary DESC;
案例二:#查詢部門編號>=90的員工信息,按入職時間的先後順序排序
SELECT
*
FROM
employees
WHERE
department_id >= 90
ORDER BY
hiredate DESC;
案例三:#按年薪的高低顯示員工的信息和年薪【按表達式排序】
SELECT
*,salary * 12 * (1 + IFNULL(commission_pct, 0)) AS 年薪
FROM
employees
ORDER BY
salary * 12 * (1 + IFNULL(commission_pct, 0)) DESC;
案例四:#按年薪的高低顯示員工的信息和年薪【按別名排序】
SELECT
*, salary * 12 * (1 + IFNULL(commission_pct, 0)) AS 年薪
FROM
employees
ORDER BY
年薪 DESC;
案例五:#按姓名的長度顯示員工的姓名和工資【按函數排序】
SELECT
last_name,
salary,
LENGTH(last_name) 姓名長度
FROM
employees
ORDER BY
LENGTH(last_name) ASC; (LENGTH(str)函數->返回str的位元組長度)
案例六:#查詢員工信息,要求先按工資排序,再按員工編號排序【按多個欄位排序】
SELECT
*
FROM
employees
ORDER BY
salary DESC, employee_id DESC;
三、 常見函數介紹
調用方法:SELECT 函數名(實參列表)[from 表名];
分類:
1.單行函數
如:concat、length、ifnull、isnull等
2.分組函數
功能:做統計使用,又稱為統計函數、聚合函數、組函數
單行函數分類:
1. 字元函數
# length函數->返回當前參數的位元組數(若字元集使用的是gbk則一個漢字占2個位元組,若是utf8則為3個位元組)
SELECT LENGTH('jane'); ->4
SELECT LENGTH(last_name) AS 姓名長度 FROM employees;
#concat函數->拼接字元
SELECT CONCAT(last_name,'_',first_name) AS 姓名 FROM employees;
#upper、lower函數(類似於python中的str.lower()與str.upper()函數,UPPER(str)->將str轉換為大寫字母返回,LOWER(str)-> 將str轉換為小寫字母返回)
SELECT UPPER(last_name) FROM employees;
SELECT CONCAT(UPPER(last_name),'_',LOWER(first_name)) AS 姓名 FROM employees;
註意!!!索引是從1開始的
#substr,substring(截斷字元串)
截取從指定索引處後面的所有字元
SELECT SUBSTR('abcefghijk',2) AS output;->'cefghijk'
截取從指定索引處指定”字元“長度的字元
SELECT SUBSTR('abcdefghijk',2,3) AS output;->'cde'
SELECT SUBSTR('呀呀呀',2,1) AS output;'呀'
#instr(返回子串第一次出現的索引,如果找不到則返回0)
SELECT INSTR(‘我去上學啦’,’上學啦’);->3
#trim(去”前後”的制定字元,若不指定則預設為去掉空格。註意,字元串中間的內容不會去除)
SELECT TRIM(' lalalla ') AS output; ->’lalalla’
SELECT TRIM( 'a' FROM 'aaaaaaaabbbbbabbbaaabbbbaaaaa');-> bbbbbabbbaaabbbb
#lpad(在左邊用指定字元進行填充並且返回對應長度的字元結果)
SELECT LPAD('aaabbb',10,'c');->'ccccaaabbb'
SELECT LPAD('aaabbb',4,'c');->'aaab'
#rpad(在右邊用指定字元進行填充並且返回對應長度的字元結果)
SELECT RPAD('aaabbb',10,'c');->'aaabbbcccc'
SELECT RPAD('aaabbb',4,'c');->'aaab'
#replace(用指定字元值替換指定字元值)
REPLACE(str,from_str,to_str)(str->作用的字元串,from_str->要被替換的字元串,to_str->用來替換的字元串)
SELECT REPLACE('哈哈哈,我不知道','我不知道','我知道');->'哈哈哈,我知道'
2. 數字函數
#round(對傳入的參數四捨五入並返回)
SELECT ROUND(8.9);->9
SELECT ROUND(-8.9);->-9
SELECT ROUND(1.567,2);->1.57(2代表保留小數點後2位)
#ceil(向上取整,返回>=該參數的最小整數)
SELECT CEIL(1.002);->2
SELECT CEIL(1.00);->1
SELECT CEIL(-1.002);->-1
#floor(向下取整,返回<=該參數的最小整數)
SELECT CEIL(1.002);->1
SELECT CEIL(1.00);->1
SELECT CEIL(-1.002);->-2
#truncate 截斷
TRUNCATE(X,D)->(X->要被處理的參數,D->截斷後的小樹點位數)
SELECT TRUNCATE(1.69999,1);->1.6
#mod(取餘)
MOD(a,b): a-a/b*b(返回的取餘結果的正負值取決於參數a)
SELECT MOD(10,3);->1
SELECT MOD(10,-3);->1
SELECT MOD(-10,-3);->-1
SELECT MOD(-10,3);->-1
3. 日期函數
#now (返回當前系統日期+時間)
SELECT NOW();->2020-05-05 20:20:15
#curdate(返回當前系統日期,不包含時間)
SELECT CURDATE();->2020-05-05
#curtime(返回當前系統時間,不包含日期)
SELECT CURTIME();->20:21:53
#year、month、day、hour、minute、second(用於獲取指定的部分,年、月、日、時、分、秒)
SELECT YEAR(NOW());->2020
SELECT MONTH(NOW());->5
SELECT DAY(NOW());->5
SELECT HOUR(NOW());->20
SELECT MINUTE(NOW());->25
SELECT SECOND(NOW());->4
#str_to_date(將日期格式的字元轉換成指定格式的日期)
相對應的格式符如下:
SELECT STR_TO_DATE('9-13 1999','%c-%d %Y');-> 1999-09-13
#date_format(將日期轉換成字元)
SELECT DATE_FORMAT('2018/6/6','%Y年%m月%d日');-> 2018年06月06日
4. 其他函數
#version(返回當前mysql的版本)
SELECT VERSION();->5.7.25-log
#database(返回當前打開的資料庫)
SELECT DATABASE();->myemployees
#user(返回當前的用戶)
SELECT USER();->root@localhost
5. 流程式控制制函數
#if函數
IF(expr1,expr2,expr3)->(expr1:條件或邏輯表達式,若真則返回expr2,假則返回expr3)
SELECT IF(5>2,'大','小');->'大'
#case函數
使用一:(switch case的效果)
case 要判斷的欄位或表達式
when 常量1 then 要顯示的值1或語句1;
when 常量2 then 要顯示的值2或語句2;
…
else常量n then 要顯示的值n或語句n;
end
案例:查詢員工的工資,要求:
部門號=30,顯示的工資為1.1倍
部門號=40,顯示的工資為1.2倍
部門號=50,顯示的工資為1.3倍
SELECT
salary 原始工資,
department_id,
CASE department_id
WHEN 30 THEN
salary * 1.1
WHEN 40 THEN
salary * 1.2
WHEN 50 THEN
salary * 1.3
ELSE
salary
END AS 新工資
FROM
employees;
使用二:(類似於多重if)
case
when 條件1 then 要顯示的值1語句1;
when 條件2 then 要顯示的值2或語句2;
…
else條件n then 要顯示的值n或語句n;
end
案例:查詢員工的工資,要求:
如果工資>20000,顯示級別A
如果工資>15000,顯示級別B
如果工資>10000,顯示級別C
否則,顯示級別D
SELECT
salary 原始工資,
CASE
WHEN salary > 20000 THEN
'A'
WHEN salary > 15000 THEN
'B'
WHEN salary > 10000 THEN
'C'
ELSE
'D'
END AS 獎金級別
FROM
employees;