常见查询语句
條件查詢
/*
語法:
select
查詢列表
from
表名
where
篩選條件;
分類:
一、按條件表達式篩選
*/
#一、按條件表達式篩選
#案例1:查詢工資>12000的員工信息
SELECT
*
FROM
employees
WHERE
salary>12000;
#案例2:查詢部門編號不等于90號的員工名和部門編號
SELECT
last_name,
department_id
FROM
employees
WHERE
department_id<>90;
#二、按邏輯表達式篩選
#案例1:查詢工資z在10000到20000之間的員工名、工資以及獎金
SELECT
last_name,
salary,
commission_pct
FROM
employees
WHERE
salary>=10000 AND salary<=20000;
#案例2:查詢部門編號不是在90到110之間,或者工資高于15000的員工信息
SELECT
*
FROM
employees
WHERE
NOT(department_id>=90 AND department_id<=110) OR salary>15000;
#三、模糊查詢
/*
like
between and
in
is null|is not null
/
#1.like
/
特點:
①一般和通配符搭配使用
通配符:
% 任意多個字符,包含0個字符
_ 任意單個字符
*、
#案例1:查詢員工名中包含字符a的員工信息
select
*
from
employees
where
last_name like ‘%a%’;#abc
#案例2:查詢員工名中第三個字符為e,第五個字符為a的員工名和工資
select
last_name,
salary
FROM
employees
WHERE
last_name LIKE ‘__n_l%’;
#案例3:查詢員工名中第二個字符為_的員工名
SELECT
last_name
FROM
employees
WHERE
last_name LIKE ‘_KaTeX parse error: Expected group after '_' at position 1: _?%' ESCAPE '’;
#2.between and
/*
①使用between and 可以提高語句的簡潔度
②包含臨界值
③兩個臨界值不要調換順序
*/
#案例1:查詢員工編號在100到120之間的員工信息
SELECT
*
FROM
employees
WHERE
employee_id >= 120 AND employee_id<=100;
#----------------------
SELECT
*
FROM
employees
WHERE
employee_id BETWEEN 120 AND 100;
#3.in
/*
含義:判斷某字段的值是否屬于in列表中的某一項
特點:
①使用in提高語句簡潔度
②in列表的值類型必須一致或兼容
③in列表中不支持通配符
*/
#案例:查詢員工的工種編號是 IT_PROG、AD_VP、AD_PRES中的一個員工名和工種編號
SELECT
last_name,
job_id
FROM
employees
WHERE
job_id = ‘IT_PROT’ OR job_id = ‘AD_VP’ OR JOB_ID =‘AD_PRES’;
#------------------
SELECT
last_name,
job_id
FROM
employees
WHERE
job_id IN( ‘IT_PROT’ ,‘AD_VP’,‘AD_PRES’);
#4、is null
/*
=或<>不能用于判斷null值
is null或is not null 可以判斷null值
*/
#案例1:查詢沒有獎金的員工名和獎金率
SELECT
last_name,
commission_pct
FROM
employees
WHERE
commission_pct IS NULL;
#案例1:查詢有獎金的員工名和獎金率
SELECT
last_name,
commission_pct
FROM
employees
WHERE
commission_pct IS NOT NULL;
#----------以下為×
SELECT
last_name,
commission_pct
FROM
employees
WHERE
salary IS 12000;
#安全等于 <=>
#案例1:查詢沒有獎金的員工名和獎金率
SELECT
last_name,
commission_pct
FROM
employees
WHERE
commission_pct <=>NULL;
#案例2:查詢工資為12000的員工信息
SELECT
last_name,
salary
FROM
employees
WHERE
salary <=> 12000;
#is null pk <=>
IS NULL:僅僅可以判斷NULL值,可讀性較高,建議使用
<=> :既可以判斷NULL值,又可以判斷普通的數值,可讀性較低
#1. 顯示系統時間(注:日期+時間)
SELECT NOW();
#2. 查詢員工號,姓名,工資,以及工資提高百分之20%后的結果(new salary)
SELECT employee_id,last_name,salary,salary*1.2 “new salary”
FROM employees;
#3. 將員工的姓名按首字母排序,并寫出姓名的長度(length)
SELECT LENGTH(last_name) 長度,SUBSTR(last_name,1,1) 首字符,last_name
FROM employees
ORDER BY 首字符;
#4. 做一個查詢,產生下面的結果
<last_name> earns monthly but wants <salary*3>
Dream Salary
King earns 24000 monthly but wants 72000
SELECT CONCAT(last_name,’ earns ‘,salary,’ monthly but wants ',salary*3) AS “Dream Salary”
FROM employees
WHERE salary=24000;
分組查詢
#1.查詢各job_id的員工工資的最大值,最小值,平均值,總和,并按job_id升序
SELECT MAX(salary),MIN(salary),AVG(salary),SUM(salary),job_id
FROM employees
GROUP BY job_id
ORDER BY job_id;
#2.查詢員工最高工資和最低工資的差距(DIFFERENCE)
SELECT MAX(salary)-MIN(salary) DIFFRENCE
FROM employees;
#3.查詢各個管理者手下員工的最低工資,其中最低工資不能低于6000,沒有管理者的員工不計算在內
SELECT MIN(salary),manager_id
FROM employees
WHERE manager_id IS NOT NULL
GROUP BY manager_id
HAVING MIN(salary)>=6000;
#4.查詢所有部門的編號,員工數量和工資平均值,并按平均工資降序
SELECT department_id,COUNT(),AVG(salary) a
FROM employees
GROUP BY department_id
ORDER BY a DESC;
#5.選擇具有各個job_id的員工人數
SELECT COUNT() 個數,job_id
FROM employees
GROUP BY job_id;
排序查詢
#1.查詢員工的姓名和部門號和年薪,按年薪降序 按姓名升序
SELECT last_name,department_id,salary12(1+IFNULL(commission_pct,0)) 年薪
FROM employees
ORDER BY 年薪 DESC,last_name ASC;
#2.選擇工資不在8000到17000的員工的姓名和工資,按工資降序
SELECT last_name,salary
FROM employees
WHERE salary NOT BETWEEN 8000 AND 17000
ORDER BY salary DESC;
#3.查詢郵箱中包含e的員工信息,并先按郵箱的字節數降序,再按部門號升序
SELECT *,LENGTH(email)
FROM employees
WHERE email LIKE ‘%e%’
ORDER BY LENGTH(email) DESC,department_id ASC;
分組查詢
語法:
select 查詢列表
from 表
【where 篩選條件】
group by 分組的字段
【order by 排序的字段】;
特點:
1、和分組函數一同查詢的字段必須是group by后出現的字段
2、篩選分為兩類:分組前篩選和分組后篩選
針對的表 位置 連接的關鍵字
分組前篩選 原始表 group by前 where
分組后篩選 group by后的結果集 group by后 having
問題1:分組函數做篩選能不能放在where后面
答:不能
問題2:where——group by——having
一般來講,能用分組前篩選的,盡量使用分組前篩選,提高效率
3、分組可以按單個字段也可以按多個字段
4、可以搭配著排序使用
#1.查詢公司員工工資的最大值,最小值,平均值,總和
SELECT MAX(salary) 最大值,MIN(salary) 最小值,AVG(salary) 平均值,SUM(salary) 和
FROM employees;
#2.查詢員工表中的最大入職時間和最小入職時間的相差天數 (DIFFRENCE)
SELECT MAX(hiredate) 最大,MIN(hiredate) 最小,(MAX(hiredate)-MIN(hiredate))/1000/3600/24 DIFFRENCE
FROM employees;
SELECT DATEDIFF(MAX(hiredate),MIN(hiredate)) DIFFRENCE
FROM employees;
SELECT DATEDIFF(‘1995-2-7’,‘1995-2-6’);
#3.查詢部門編號為90的員工個數
SELECT COUNT(*) FROM employees WHERE department_id = 90;
#引入:查詢每個部門的員工個數
SELECT COUNT(*) FROM employees WHERE department_id=90;
#1.簡單的分組
#案例1:查詢每個工種的員工平均工資
SELECT AVG(salary),job_id
FROM employees
GROUP BY job_id;
#案例2:查詢每個位置的部門個數
SELECT COUNT(*),location_id
FROM departments
GROUP BY location_id;
#2、可以實現分組前的篩選
#案例1:查詢郵箱中包含a字符的 每個部門的最高工資
SELECT MAX(salary),department_id
FROM employees
WHERE email LIKE ‘%a%’
GROUP BY department_id;
#案例2:查詢有獎金的每個領導手下員工的平均工資
SELECT AVG(salary),manager_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id;
#3、分組后篩選
#案例:查詢哪個部門的員工個數>5
#①查詢每個部門的員工個數
SELECT COUNT(*),department_id
FROM employees
GROUP BY department_id;
#② 篩選剛才①結果
SELECT COUNT(*),department_id
FROM employees
GROUP BY department_id
HAVING COUNT(*)>5;
#案例2:每個工種有獎金的員工的最高工資>12000的工種編號和最高工資
SELECT job_id,MAX(salary)
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>12000;
#案例3:領導編號>102的每個領導手下的最低工資大于5000的領導編號和最低工資
manager_id>102
SELECT manager_id,MIN(salary)
FROM employees
GROUP BY manager_id
HAVING MIN(salary)>5000;
#4.添加排序
#案例:每個工種有獎金的員工的最高工資>6000的工種編號和最高工資,按最高工資升序
SELECT job_id,MAX(salary) m
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING m>6000
ORDER BY m ;
#5.按多個字段分組
#案例:查詢每個工種每個部門的最低工資,并按最低工資降序
SELECT MIN(salary),job_id,department_id
FROM employees
GROUP BY department_id,job_id
ORDER BY MIN(salary) DESC;
常見函數
#進階4:常見函數
/*
概念:類似于java的方法,將一組邏輯語句封裝在方法體中,對外暴露方法名
好處:1、隱藏了實現細節 2、提高代碼的重用性
調用:select 函數名(實參列表) 【from 表】;
特點:
①叫什么(函數名)
②干什么(函數功能)
分類:
1、單行函數
如 concat、length、ifnull等
2、分組函數
常見函數:
一、單行函數
字符函數:
length:獲取字節個數(utf-8一個漢字代表3個字節,gbk為2個字節)
concat
substr
instr
trim
upper
lower
lpad
rpad
replace
*/
#一、字符函數
#1.length 獲取參數值的字節個數
SELECT LENGTH(‘john’);
SELECT LENGTH(‘張三豐hahaha’);
SHOW VARIABLES LIKE ‘%char%’
#2.concat 拼接字符串
SELECT CONCAT(last_name,’_’,first_name) 姓名 FROM employees;
#3.upper、lower
SELECT UPPER(‘john’);
SELECT LOWER(‘joHn’);
#示例:將姓變大寫,名變小寫,然后拼接
SELECT CONCAT(UPPER(last_name),LOWER(first_name)) 姓名 FROM employees;
#4.substr、substring
注意:索引從1開始
#截取從指定索引處后面所有字符
SELECT SUBSTR(‘李莫愁愛上了陸展元’,7) out_put;
#截取從指定索引處指定字符長度的字符
SELECT SUBSTR(‘李莫愁愛上了陸展元’,1,3) out_put;
#案例:姓名中首字符大寫,其他字符小寫然后用_拼接,顯示出來
SELECT CONCAT(UPPER(SUBSTR(last_name,1,1)),’_’,LOWER(SUBSTR(last_name,2))) out_put
FROM employees;
#5.instr 返回子串第一次出現的索引,如果找不到返回0
SELECT INSTR(‘楊不殷六俠悔愛上了殷六俠’,‘殷八俠’) AS out_put;
#6.trim
SELECT LENGTH(TRIM(’ 張翠山 ')) AS out_put;
SELECT TRIM(‘aa’ FROM ‘aaaaaaaaa張aaaaaaaaaaaa翠山aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa’) AS out_put;
#7.lpad 用指定的字符實現左填充指定長度
SELECT LPAD(‘殷素素’,2,’*’) AS out_put;
#8.rpad 用指定的字符實現右填充指定長度
SELECT RPAD(‘殷素素’,12,‘ab’) AS out_put;
#9.replace 替換
SELECT REPLACE(‘周芷若周芷若周芷若周芷若張無忌愛上了周芷若’,‘周芷若’,‘趙敏’) AS out_put;
#二、數學函數
#round 四舍五入
SELECT ROUND(-1.55);
SELECT ROUND(1.567,2);
#ceil 向上取整,返回>=該參數的最小整數
SELECT CEIL(-1.02);
#floor 向下取整,返回<=該參數的最大整數
SELECT FLOOR(-9.99);
#truncate 截斷
SELECT TRUNCATE(1.69999,1);
#mod取余
/*
mod(a,b) : a-a/b*b
mod(-10,-3):-10- (-10)/(-3)*(-3)=-1
*/
SELECT MOD(10,-3);
SELECT 10%3;
#三、日期函數
#now 返回當前系統日期+時間
SELECT NOW();
#curdate 返回當前系統日期,不包含時間
SELECT CURDATE();
#curtime 返回當前時間,不包含日期
SELECT CURTIME();
#可以獲取指定的部分,年、月、日、小時、分鐘、秒
SELECT YEAR(NOW()) 年;
SELECT YEAR(‘1998-1-1’) 年;
SELECT YEAR(hiredate) 年 FROM employees;
SELECT MONTH(NOW()) 月;
SELECT MONTHNAME(NOW()) 月;
#str_to_date 將字符通過指定的格式轉換成日期
SELECT STR_TO_DATE(‘1998-3-2’,’%Y-%c-%d’) AS out_put;
#查詢入職日期為1992–4-3的員工信息
SELECT * FROM employees WHERE hiredate = ‘1992-4-3’;
SELECT * FROM employees WHERE hiredate = STR_TO_DATE(‘4-3 1992’,’%c-%d %Y’);
#date_format 將日期轉換成字符
SELECT DATE_FORMAT(NOW(),’%y年%m月%d日’) AS out_put;
#查詢有獎金的員工名和入職日期(xx月/xx日 xx年)
SELECT last_name,DATE_FORMAT(hiredate,’%m月/%d日 %y年’) 入職日期
FROM employees
WHERE commission_pct IS NOT NULL;
#四、其他函數
SELECT VERSION();
SELECT DATABASE();
SELECT USER();
#五、流程控制函數
#1.if函數: if else 的效果
SELECT IF(10<5,‘大’,‘小’);
SELECT last_name,commission_pct,IF(commission_pct IS NULL,‘沒獎金,呵呵’,‘有獎金,嘻嘻’) 備注
FROM employees;
#2.case函數的使用一: switch case 的效果
/*
java中
switch(變量或表達式){
case 常量1:語句1;break;
…
default:語句n;break;
}
mysql中
case 要判斷的字段或表達式
when 常量1 then 要顯示的值1或語句1;
when 常量2 then 要顯示的值2或語句2;
…
else 要顯示的值n或語句n;
end
*/
/*案例:查詢員工的工資,要求
部門號=30,顯示的工資為1.1倍
部門號=40,顯示的工資為1.2倍
部門號=50,顯示的工資為1.3倍
其他部門,顯示的工資為原工資
*/
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;
#3.case 函數的使用二:類似于 多重if
/*
java中:
if(條件1){
語句1;
}else if(條件2){
語句2;
}
…
else{
語句n;
}
mysql中:
case
when 條件1 then 要顯示的值1或語句1
when 條件2 then 要顯示的值2或語句2
。。。
else 要顯示的值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;
總結
- 上一篇: java生成树(generateTree
- 下一篇: vant weapp message:发