一、MySQL查询学习笔记(基础查询、条件查询、排序查询、常见函数、分组查询 详解)
DQL語言的學習
一、基礎查詢
語法: **SELECT 要查詢的東西 【FROM 表名】;**類似于Java中 :System.out.println(要打印的東西); 特點: ①通過select查詢完的結果 ,是一個虛擬的表格,不是真實存在 ② 要查詢的東西 可以是常量值、可以是表達式、可以是字段、可以是函數 USE myemployees;1. 查詢表中的單個字段
SELECT last_name FROM employees;2. 查詢表中的多個字段
SELECT last_name,salary,email FROM employees;3. 查詢表中的所有字段
#方式一: SELECT `employee_id`,`first_name`,`last_name`,`phone_number`,`last_name`,`job_id`,`phone_number`,`job_id`,`salary`,`commission_pct`,`manager_id`,`department_id`,`hiredate` FROMemployees ; #方式二: SELECT * FROM employees;4. 查詢常量值
SELECT 100;SELECT 'john';5. 查詢表達式
SELECT 100%98;6. 查詢函數
SELECT VERSION();7. 起別名
①便于理解
②如果要查詢的字段有重名的情況,使用別名可以區分開來
方式一:使用as
SELECT 100%98 AS 結果; SELECT last_name AS 姓,first_name AS 名 FROM employees;方式二:使用空格
SELECT last_name 姓,first_name 名 FROM employees;案例:查詢salary,顯示結果為 out put
SELECT salary AS "out put" FROM employees;8. 去重
案例:查詢員工表中涉及到的所有的部門編號
SELECT DISTINCT department_id FROM employees;9. +號的作用
1)java中的+號:
①運算符,兩個操作數都為數值型
②連接符,只要有一個操作數為字符串
2)mysql中的+號:
僅僅只有一個功能:運算符
select 100+90; 兩個操作數都為數值型,則做加法運算 select
‘123’+90;只要其中一方為字符型,試圖將字符型數值轉換成數值型 如果轉換成功,則繼續做加法運算 select
‘john’+90; 如果轉換失敗,則將字符型數值轉換成0
select null+10; 只要其中一方為null,則結果肯定為null
案例:查詢員工名和姓連接成一個字段,并顯示為 姓名
SELECT CONCAT('a','b','c') AS 結果;SELECT CONCAT(last_name,first_name) AS 姓名 FROMemployees;二、條件查詢
條件查詢:根據條件過濾原始表的數據,查詢到想要的數據語法:
select 查詢列表 from 表名
where 篩選條件;
分類:
一、按條件表達式篩選
簡單條件運算符:> < = != <> >= <=
示例:salary>10000
二、按邏輯表達式篩選
邏輯運算符:
作用:用于連接條件表達式
&& || !
and or not
&&和and:兩個條件都為true,結果為true,反之為false
||或or: 只要有一個條件為true,結果為true,反之為false
!或not: 如果連接的條件本身為false,結果為true,反之為false
示例:salary>10000 && salary<20000
三、模糊查詢
like
between and
in
is null
示例:last_name like ‘a%’
一、按條件表達式篩選
案例1:查詢工資>12000的員工信息
SELECT * FROMemployees WHEREsalary>12000;案例2:查詢部門編號不等于90號的員工名和部門編號
SELECT last_name,department_id FROMemployees WHEREdepartment_id<>90;二、按邏輯表達式篩選
案例1:查詢工資z在10000到20000之間的員工名、工資以及獎金
SELECTlast_name,salary,commission_pct FROMemployees WHEREsalary>=10000 AND salary<=20000;案例2:查詢部門編號不是在90到110之間,或者工資高于15000的員工信息
SELECT* FROMemployees WHERENOT(department_id>=90 AND department_id<=110) OR salary>15000;三、模糊查詢
like
between and
in
is null | is not null
1.like
特點:
①一般和通配符搭配使用
案例1:查詢員工名中包含字符a的員工信息
select * fromemployees wherelast_name like '%a%';#abc案例2:查詢員工名中第三個字符為e,第五個字符為a的員工名和工資
selectlast_name,salary FROMemployees WHERElast_name LIKE '__n_l%';案例3:查詢員工名中第二個字符為_的員工名
SELECTlast_name FROMemployees WHERElast_name LIKE '_$_%' ESCAPE '$';2.between and
①使用between and 可以提高語句的簡潔度
②包含臨界值
③兩個臨界值不要調換順序
案例1:查詢員工編號在100到120之間的員工信息
SELECT* FROMemployees WHEREemployee_id >= 120 AND employee_id<=100; #---------------------- SELECT* FROMemployees WHEREemployee_id BETWEEN 120 AND 100;3.in
含義:判斷某字段的值是否屬于in列表中的某一項
特點:
①使用in提高語句簡潔度
②in列表的值類型必須一致或兼容
③in列表中不支持通配符
案例:查詢員工的工種編號是 IT_PROG、AD_VP、AD_PRES中的一個員工名和工種編號
SELECTlast_name,job_id FROMemployees WHEREjob_id = 'IT_PROT' OR job_id = 'AD_VP' OR JOB_ID ='AD_PRES';#------------------SELECTlast_name,job_id FROMemployees WHEREjob_id IN( 'IT_PROT' ,'AD_VP','AD_PRES');4、is null
=或<>不能用于判斷null值
is null或is not null 可以判斷null值
案例1:查詢沒有獎金的員工名和獎金率
SELECTlast_name,commission_pct FROMemployees WHEREcommission_pct IS NULL;案例1:查詢有獎金的員工名和獎金率
SELECTlast_name,commission_pct FROMemployees WHEREcommission_pct IS NOT NULL;#----------以下為× SELECTlast_name,commission_pct FROMemployeesWHERE salary IS 12000;案例1:查詢沒有獎金的員工名和獎金率
#安全等于 <=>SELECTlast_name,commission_pct FROMemployees WHEREcommission_pct <=>NULL;案例2:查詢工資為12000的員工信息
SELECTlast_name,salary FROMemployeesWHERE salary <=> 12000;#is null pk <=>IS NULL:僅僅可以判斷NULL值,可讀性較高,建議使用
<=> :既可以判斷NULL值,又可以判斷普通的數值,可讀性較低
三、排序查詢
語法: select要查詢的東西 from表 where 條件 order by 排序的字段|表達式|函數|別名 【asc|desc】特點: 1、asc代表的是升序,可以省略 desc代表的是降序2、order by子句可以支持 單個字段、別名、表達式、函數、多個字段3、order by子句在查詢語句的最后面,除了limit子句1、按單個字段排序
SELECT * FROM employees ORDER BY salary DESC;2、添加篩選條件再排序
案例:查詢部門編號>=90的員工信息,并按員工編號降序
SELECT * FROM employees WHERE department_id>=90 ORDER BY employee_id DESC;3、按表達式排序
案例:查詢員工信息 按年薪降序
4、按別名排序
案例:查詢員工信息 按年薪升序
5、按函數排序
案例:查詢員工名,并且按名字的長度降序
6、按多個字段排序
案例:查詢員工信息,要求先按工資降序,再按employee_id升序
SELECT * FROM employees ORDER BY salary DESC,employee_id ASC;7、強化練習
四、常見函數
概念:類似于java的方法,將一組邏輯語句封裝在方法體中,對外暴露方法名
好處:1、隱藏了實現細節 2、提高代碼的重用性
調用:select 函數名(實參列表) 【from 表】;
特點:
①叫什么(函數名)
②干什么(函數功能)
分類:
1、單行函數
如 concat、length、ifnull等
2、分組函數
一、字符函數
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('李莫愁愛上了陸展元',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;二、數學函數
1.round 四舍五入
SELECT ROUND(-1.55); SELECT ROUND(1.567,2);2.ceil 向上取整,返回>=該參數的最小整數
SELECT CEIL(-1.02);3.floor 向下取整,返回<=該參數的最大整數
SELECT FLOOR(-9.99);4.truncate 截斷
SELECT TRUNCATE(1.69999,1);5.mod取余
/* mod(a,b) : a-a/b*bmod(-10,-3):-10- (-10)/(-3)*(-3)=-1 */ SELECT MOD(10,-3); SELECT 10%3;三、日期函數
1.now 返回當前系統日期+時間
SELECT NOW();2.curdate 返回當前系統日期,不包含時間
SELECT CURDATE();3.curtime 返回當前時間,不包含日期
SELECT CURTIME();4.可以獲取指定的部分,年、月、日、小時、分鐘、秒
SELECT YEAR(NOW()) 年; SELECT YEAR('1998-1-1') 年;SELECT YEAR(hiredate) 年 FROM employees;SELECT MONTH(NOW()) 月; SELECT MONTHNAME(NOW()) 月;5.str_to_date 將字符通過指定的格式轉換成日期
SELECT STR_TO_DATE('1998-3-2','%Y-%c-%d') AS out_put;6.查詢入職日期為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');7.date_format 將日期轉換成字符
SELECT DATE_FORMAT(NOW(),'%y年%m月%d日') AS out_put;8.查詢有獎金的員工名和入職日期(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倍
其他部門,顯示的工資為原工資
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級別
4.強化練習:
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 <salary> monthly but wants <salary*3> Dream Salary King earns 24000 monthly but wants 72000SELECT CONCAT(last_name,' earns ',salary,' monthly but wants ',salary*3) AS "Dream Salary" FROM employees WHERE salary=24000;二、分組函數
sum 求和max 最大值min 最小值avg 平均值count 計數特點:1、以上五個分組函數都忽略null值,除了count(*)2、sum和avg一般用于處理數值型max、min、count可以處理任何數據類型3、都可以搭配distinct使用,用于統計去重后的結果4、count的參數可以支持:字段、*、常量值,一般放1建議使用 count(*)功能:用作統計使用,又稱為聚合函數或統計函數或組函數
分類:
sum 求和、avg 平均值、max 最大值 、min 最小值 、count 計算個數
特點:
1、sum、avg一般用于處理數值型
max、min、count可以處理任何類型
2、以上分組函數都忽略null值
3、可以和distinct搭配實現去重的運算
4、count函數的單獨介紹
一般使用count(*)用作統計行數
5、和分組函數一同查詢的字段要求是group by后的字段
代碼演示:
1、簡單 的使用
SELECT SUM(salary) FROM employees; SELECT AVG(salary) FROM employees; SELECT MIN(salary) FROM employees; SELECT MAX(salary) FROM employees; SELECT COUNT(salary) FROM employees;SELECT SUM(salary) 和,AVG(salary) 平均,MAX(salary) 最高,MIN(salary) 最低,COUNT(salary) 個數 FROM employees;SELECT SUM(salary) 和,ROUND(AVG(salary),2) 平均,MAX(salary) 最高,MIN(salary) 最低,COUNT(salary) 個數 FROM employees;2、參數支持哪些類型
SELECT SUM(last_name) ,AVG(last_name) FROM employees; SELECT SUM(hiredate) ,AVG(hiredate) FROM employees;SELECT MAX(last_name),MIN(last_name) FROM employees;SELECT MAX(hiredate),MIN(hiredate) FROM employees;SELECT COUNT(commission_pct) FROM employees; SELECT COUNT(last_name) FROM employees;3、是否忽略null
SELECT SUM(commission_pct) ,AVG(commission_pct),SUM(commission_pct)/35,SUM(commission_pct)/107 FROM employees;SELECT MAX(commission_pct) ,MIN(commission_pct) FROM employees;SELECT COUNT(commission_pct) FROM employees; SELECT commission_pct FROM employees;4、和distinct搭配
SELECT SUM(DISTINCT salary),SUM(salary) FROM employees;SELECT COUNT(DISTINCT salary),COUNT(salary) FROM employees;5、count函數的詳細介紹
SELECT COUNT(salary) FROM employees;SELECT COUNT(*) FROM employees;SELECT COUNT(1) FROM employees;效率:
MYISAM存儲引擎下 ,COUNT()的效率高
INNODB存儲引擎下,COUNT()和COUNT(1)的效率差不多,比COUNT(字段)要高一些
6、和分組函數一同查詢的字段有限制
SELECT AVG(salary),employee_id FROM employees;5:分組查詢
語法: select 查詢列表 from 表 【where 篩選條件】 group by 分組的字段 【order by 排序的字段】;特點: 1、可以按單個字段分組 2、和分組函數一同查詢的字段必須是group by后出現的字段 3、分組篩選針對的表 位置 關鍵字 分組前篩選: 原始表 group by的前面 where 分組后篩選: 分組后的結果集 group by的后面 having4、分組可以按多個字段分組,字段之間用逗號隔開 5、可以搭配著排序 6、having后可以支持別名問題1:分組函數做篩選能不能放在where后面
答:不能
問題2:where——group by——having
一般來講,能用分組前篩選的,盡量使用分組前篩選,提高效率
引入:查詢每個部門的員工個數
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 employeesGROUP BY department_idHAVING 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>102SELECT 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;6.強化練習
1.查詢各job_id的員工工資的最大值,最小值,平均值,總和,并按job_id升序
#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)
#2.查詢員工最高工資和最低工資的差距(DIFFERENCE) SELECT MAX(salary)-MIN(salary) DIFFRENCE FROM employees;3.查詢各個管理者手下員工的最低工資,其中最低工資不能低于6000,沒有管理者的員工不計算在內
#3.查詢各個管理者手下員工的最低工資,其中最低工資不能低于6000,沒有管理者的員工不計算在內 SELECT MIN(salary),manager_id FROM employees WHERE manager_id IS NOT NULL GROUP BY manager_id HAVING MIN(salary)>=6000;4.查詢所有部門的編號,員工數量和工資平均值,并按平均工資降序
#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;總結
以上是生活随笔為你收集整理的一、MySQL查询学习笔记(基础查询、条件查询、排序查询、常见函数、分组查询 详解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 五、实例:在波士顿房价数据集上用随机森林
- 下一篇: ES6(一)——字面量的增强、解构、le