MySQL6天筆記——day02

MySQL數據庫

全部SQL源文件鏈接:https://pan.baidu.com/s/1wc51qkVetSRybFzcIYGBIg
提取碼:3wpt

DQL語言

在這裏插入圖片描述

基礎查詢

  • 語法:select 查詢列表 from 表名;

  • 類似於System.out.println(打印東西);

  • 特點:

    • 1.查詢列表可以是:表中的字段、常量值、表達式、函數
    • 2.查詢的結果可以是一個虛擬表格;
  • 案例

USE myemployees;

#1.查詢表中的單個字段
SELECT last_name FROM employees;

#2.查詢表中多個字段
SELECT last_name,salary,email FROM employees;

#3.查詢表中的所有字段
SELECT * FROM employees;

#4.查詢常量
# select 常量值;
# 注意:字符型和日期型的常量值必須用單引號引起來,數值型不需要
SELECT 100;
SELECT 'join';

#5.查詢函數
#select 函數名(實參列表);
SELECT VERSION();

#6.查詢表達式 
SELECT 100%98;

#7.起別名
/*
1.便於理解
2.如果要查詢的字段有重名的情況,使用別名區分
*/
#方式一:使用AS
SELECT 100%98 AS 結果;
SELECT last_name AS,first_name ASFROM employees;

#方式二:使用空格
SELECT last_name 姓,first_name 名 FROM employees;

#案例:查詢salary,結果顯示 out put
SELECT salary AS "out put" FROM employees;

#8.去重
# select distinct 字段名 from 表名;
#案例:查詢員工表中涉及的所有部門編號
SELECT DISTINCT department_id FROM employees;

#9.+號的作用
#案例:查詢員工的名和姓,並顯示爲姓名
/*
java中的+號:
1.運算符:兩個操作數都爲數據型
2.連接符:只要有一個操作數爲字符串


mysql中的+號:
只能作爲運算符

select 100+90; 兩個操作數都爲數值型,做加法運算
select '123+90';其中一方爲字符型,試圖將字符型數值轉換爲數值型
		如果轉換成功,則繼續做加法運算
select 'john'+90; 如果轉換失敗,則將字符型數值轉換成0

select null+0; 只要其中一方爲null,則結果肯定爲null.
*/
SELECT last_name+first_name AS 姓名 FROM employees; 

#10.【補充】concat函數 
/*
功能:拼接字符
select concat(字符1,字符2,字符3,...);
*/
SELECT CONCAT('a','b','c') AS 結果 FROM employees;

SELECT CONCAT(last_name,first_name) AS 姓名 FROM employees;

#11.【補充】ifnull函數
#功能:判斷某字段或表達式是否爲null,如果爲null 返回指定的值,否則返回原本的值

SELECT IFNULL(commission_pct,0) FROM employees;

#12.【補充】isnull函數
#功能:判斷某字段或表達式是否爲null,如果是,則返回1,否則返回0

條件查詢

  • 語法:select 查詢列表 from 表名 where 篩選條件;

  • 分類

    一、按條件表達式篩選
    	條件運算符:> < = != <> >= <= <=>安全等於
    二、按邏輯表達式篩選
    	邏輯運算符:&& || |
    	and or not
    	
    	&&and:兩個條件都爲true,結果爲true,反之爲false
    	||or:只要有一個條件爲true,結果爲true,反之爲false
    	!not:如果連接的條件本身爲false,結果爲true,反之爲false	
    	
    三、模糊查詢
    	like:一般搭配通配符使用,可以判斷字符型或數值型
    	通配符:%任意多個字符,_任意單個字符
    	likebetween andinis null
    
  • 案例

#一.按條件表達式篩選

#案例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 department_id <90 OR department_id>110 OR salary>15000;


#三、模糊查詢

#1.like

#案例1:查詢員工名中包含字符a的員工信息
SELECT * FROM employees WHERE last_name LIKE '%a%';

#案例2:查詢員工名中第三個字符爲b,第五個字符爲a的員工名和工資
SELECT last_name,salary FROM employees WHERE last_name LIKE '__b_a%';

#案例3:查詢員工名種第二個字符爲_的員工名
SELECT last_name FROM employees WHERE last_name LIKE '_\_%';

#2.between and

#案例1:查詢員工編號在100到120之間的員工信息
SELECT * FROM employees WHERE employee_id>=100 AND employee_id<=120;

SELECT * FROM employees WHERE employee_id BETWEEN 100 AND 120;

/*注意事項:
1.提高語句簡潔度
2.包含臨界值
3.兩個臨界值不能調換順序
*/

#3.in
/*
含義:判斷某字段的值是否屬於in列表中的某一項
特點:
 1.使用in提高語句簡潔度
 2.in列表的值類型必須一致或兼容
*/
#案例1:查詢員工的工種編號是IT_PROG、AD_VP、AD_PRES中的一個員工名和工種編號

SELECT last_name,job_id FROM employees WHERE job_id='IT_PROG' OR job_id='AD_PRES' OR job_id='AD_VP';

SELECT last_name,job_id FROM employees WHERE job_id IN('IT_PROG','AD_PRES','AD_VP');

#4.is null
/*
=或<>不能用於判斷null值
is null 或 is not null 可以判斷null值
*/
#案例1:查詢沒有獎金的員工名和獎金率

SELECT last_name,commission_pct FROM employees WHERE commission_pct IS NULL;

SELECT last_name,commission_pct FROM employees WHERE commission_pct IS NOT NULL;

#安全等於<=>

#案例1:查詢沒有獎金的員工名和獎金率

SELECT last_name,commission_pct FROM employees WHERE commission_pct <=> NULL;

#案例2:查詢工資爲12000的員工信息
SELECT last_name,commission_pct FROM employees WHERE salary <=> 12000;

#is null PK <=>
#	      普通類型的數值	null值		可讀性
# is null	×		  √		  √
# <=>		√		  √		  ×

排序查詢

  • 引入:select * from employees;

  • 語法:select 查詢列表 from 表 【where 篩選條件】 order by

  • 特點:

    • 1.asc代表的是升序,desc代表降序,不寫默認爲升序
    • 2.order by子句中可以支持單個字段、多個字段、表達式、函數、別名
    • 3.order by子句一般是放在查詢語句的最後面,limit子句除外
  • 案例

#案例1:查詢員工信息,要求工資從高到低排序
SELECT * FROM employees ORDER BY salary DESC;
SELECT * FROM employees ORDER BY salary;

#案例2:查詢部門編號是>=90,按入職時間的先後進行排序
SELECT * FROM employees WHERE department_id>=90 ORDER BY hiredate ASC;

#案例3:按年薪的高低顯示員工的信息和年薪【按表達式排序】
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪 FROM employees 
ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC; 

#案例4:按年薪的高低顯示員工的信息和年薪【按別名排序】
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪 FROM employees 
ORDER BY salary*12*(1+IFNULL(commission_pct,0)) 年薪 DESC; 

#案例5:按姓名的長度顯示員工的姓名和工資【按函數排序】
SELECT LENGTH(last_name) 字節長度,last_name,salary
FROM employees
ORDER BY LENGTH(last_name) DESC;

#案例6:查詢員工共信息,要求按工資排序,再按員工編號排序【按多個字段排序】
SELECT * FROM employees
ORDER BY salary ASC,employee_id DESC;

常見函數

  • 概念:類似於Java的方法,將一組邏輯語句封裝在方法體中,對外暴露方法名

  • 優點:1.隱藏了實現細節 2.提高了代碼的重用性

  • 語法:select 函數名(實參列表) 【from 表】;

  • 特點:

    • 1.叫什麼(函數名)

    • 2.幹什麼(函數功能)

  • 分類:

    • 1.單行函數,如concat、length、ifnull等
    • 2.分組函數,做統計使用

單行函數

  • 單行函數分類:字符函數、數學函數、日期函數、其他函數、流程控制函數

字符函數具體案例:

#一.字符函數
#1.length 獲取參數值的字節值
SELECT LENGTH('subei');
SELECT LENGTH('鬼谷子qwe');

SHOW VARIABLES LIKE '%char%';

#2.concat 拼接字符串
SELECT CONCAT(last_name,'_',first_name) 姓名 FROM employees;

#3.upper:變大寫、lower:變小寫

SELECT UPPER('ton');
SELECT LOWER('ton');

#示例:將姓變大寫,名變小寫,然後拼接
SELECT CONCAT(UPPER(last_name),LOWER(first_name)) 姓名 FROM employees;


#4.substr、substring
#注意:索引從1開始

#截取從指定所有處後面的所以字符
SELECT SUBSTR('吳剛伐桂在天上',4) out_put;

#截取從指定索引處指定字符長度的字符
SELECT SUBSTR('吳剛伐桂在天上',1,2) out_put;

#案例:姓名中首字符大寫,其他字符小寫,然後用_拼接,顯示出來
SELECT CONCAT(UPPER(SUBSTR(last_name,1,1)),'_',LOWER(SUBSTR(last_name,2))) out_put FROM employees;

#5.instr:獲取子串第一次出現的索引,找不到返回0
SELECT INSTR('MySQL技術進階','技術') AS out_put;

#6.trim:去前後空格

SELECT LENGTH(TRIM('	霍山	')) AS out_put;

SELECT TRIM('+' FROM '++++李剛+++劉邦+++') AS out_put;

#7.lpad:用指定的字符實現左填充指定長度
SELECT LPAD('梅林',8,'+') AS out_put;

#8.rpad:用指定的字符實現右填充指定長度
SELECT RPAD('梅林',5,'&') AS out_put;

#9.replace:替換
SELECT REPLACE('莉莉伊萬斯的青梅竹馬是詹姆','詹姆','斯內普') AS out_put;

數學函數具體案例:

#1.round:四捨五入
SELECT ROUND(1.45);
SELECT ROUND(1.567,2);

#2.ceil:向上取整,返回>=該參數的最小整數
SELECT CEIL(1.005);
SELECT CEIL(-1.002);

#3.floor:向下取整,返回<=該參數的最大整數
SELECT FLOOR(-9.99);

#4.truncate:截斷
SELECT TRUNCATE(1.65,1);

#5.mod:取餘
SELECT MOD(10,3);

#6.rand:獲取隨機數,返回0-1之間的小數
SELECT RAND();

日期函數具體案例:

#1.now:返回當前系統時間+日期
SELECT NOW();

#2.year:返回年
SELECT YEAR(NOW());
SELECT YEAR(hiredate)FROM employees;

#3.month:返回月
#MONTHNAME:以英文形式返回月
SELECT MONTH(NOW());
SELECT MONTHNAME(NOW());

#4.day:返回日
#DATEDIFF:返回兩個日期相差的天數
SELECT DAY(NOW());
SELECT DATEDIFF('2020/06/30','2020/06/21');

#5.str_to_date:將字符通過指定格式轉換成日期
SELECT STR_TO_DATE('2020-5-13','%Y-%c-%d') AS out_put;

#6.date_format:將日期轉換成字符
SELECT DATE_FORMAT('2020/6/6','%Y年%m月%d日') AS out_put;
SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日') AS out_put;

#7.curdate:返回當前日期
SELECT CURDATE();

#8.curtime:返回當前時間
SELECT CURTIME();

其他函數具體案例:

#version 當前數據庫服務器的版本
SELECT VERSION();

#database 當前打開的數據庫
SELECT DATABASE();

#user當前用戶
SELECT USER();

#password('字符'):返回該字符的密碼形式
SELECT PASSWORD('a');

#md5('字符'):返回該字符的md5加密形式
SELECT MD5('a');

流程控制函數具體案例:

#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 salary*1.1
WHEN 40 THEN salary*1.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;

分組函數

  • 功能:用作統計使用,又稱爲聚合函數或統計函數或組函數
  • 分類:sum 求和、avg 平均值、max 最大值、min最小值count 計算個數
  • 特點:
    • 1.sum和avg一般用於處理數值型
      max、min、count可以處理任何數據類型
    • 2.以上分組函數都忽略null
    • 3.都可以搭配distinct使用,實現去重的統計
      select sum(distinct 字段) from 表;
    • 4.count函數
      count(字段):統計該字段非空值的個數
      count(*):統計結果集的行數
    • 5.和分組函數一同查詢的字段,要求是group by後出現的字段
#1.簡單使用
SELECT SUM(salary) FROM employees;
SELECT AVG(salary) FROM employees;
SELECT MAX(salary) FROM employees;
SELECT MIN(salary) FROM employees;
SELECT 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) FROM employees;

SELECT commission_pct FROM employees;

SELECT SUM(commission_pct),AVG(commission_pct),SUM(commission_pct)/35,AVG(commission_pct)/107 FROM employees;

SELECT MAX(commission_pct),MIN(commission_pct) FROM employees;

SELECT COUNT(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;

分組查詢

  • 語法:

    select 分組函數,分組後的字段
    from 表
    【where 篩選條件】
    group by 分組的字段
    【having 分組後的篩選】
    【order by 排序列表】
    
    • 注意:查詢列表必須特殊,要求是分組函數和group by後出現的字段
  • 特點:

    • 1.分組查詢中的篩選條件分爲兩類

      			使用關鍵字	篩選的表	位置
      分組前篩選	where		原始表		group by的前面
      分組後篩選	having		分組後的結果	group by的後面
      1.分組函數做條件肯定是放在having子句中
      2.能用分組前篩選的,就優先考慮使用分組前篩選
      
    • 2.group by子句支持單個字段分組,多個字段分組(多個字段之間用逗號隔開沒有順序要求),表達式或函數(使用較少)

    • 3.也可以添加排序(排序放在整個分組查詢的最後)

  • 案例

#引入:查詢每個部門的平均工資
SELECT AVG(salary) FROM employees;

#案例1:查詢每個工種的最高工資
SELECT MAX(salary),job_id FROM employees 
GROUP BY job_id;


#案例2:查詢每個位置上的部門個數
SELECT COUNT(*),location_id
FROM departments
GROUP BY location_id;

#添加篩選條件
#案例1:查詢郵箱中包含a字符的,每個部門的平均工資
SELECT AVG(salary),department_id FROM employees
WHERE email LIKE '%a%' GROUP BY department_id;

#案例2:查詢有獎金的每個領導手下員工的最高工資
SELECT MAX(salary),manager_id FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id;

#添加複雜的篩選條件
#案例1:查詢哪個部門的員工個數>2
#1.查詢每個部門的員工個數
SELECT COUNT(*),department_id FROM employees
GROUP BY department_id;

#2.根據1的結果進行篩選,查詢哪個部門的員工個數大於2
SELECT COUNT(*),department_id FROM employees
GROUP BY department_id HAVING COUNT(*)>2;


#案例2:查詢每個工種有獎金的員工的最高工資>12000的工種編號和最高工資 
#1.查詢每個工種有獎金的員工的最高工資 
SELECT MAX(salary),job_id FROM employees 
WHERE commission_pct IS NOT NULL GROUP BY job_id; 

#2.根據結果繼續篩選,最高工資>12000 

SELECT MAX(salary), job_id FROM employees 
WHERE commission_pct IS NOT NULL GROUP BY job_id 
HAVING MAX(salary)>12000; 

#按表達式或函數分組

#案例:按員工姓名的長度分組,查詢每一組的員工個數,篩選員工個數>5

#1.查詢每個長度的員工個數 
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;

#按多個字段查詢
#案例:查詢每個部門每個工種的員工的平均工資

SELECT AVG(salary),department_id,job_id
FROM employees GROUP BY department_id,job_id;

#添加排序
#案例:查詢每個部門每個工種的員工的平均工資,按平均工資的高低查詢

SELECT AVG(salary),department_id,job_id
FROM employees GROUP BY department_id,job_id
ORDER BY AVG(salary) DESC;

歡迎斧正!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章