MySQL基礎筆記(2) - 排序查詢,分組查詢&常見函數


排序查詢,分組查詢&常見函數

1. 排序查詢

語法:select [查詢列表] from [表] where [篩選條件] order by [排序列表] [asc|desc]

#1.對單個列排序
#將產品名以字母順序顯示出來
SELECT prod_name
FROM products
ORDER BY prod_name;

#2.對多個列排序
#將信息按價格順序和字母順序顯示出來
SELECT prod_id,prod_price,prod_name
FROM products
ORDER BY prod_price,prod_name;
#排序具有優先級,如上例子,只有當價格相同時才會使用字母排序

#3.指定排序方向
#將信息按價格順序"降序"顯示后,按字母"升序"順序顯示出來
SELECT prod_id,prod_price,prod_name
FROM products
ORDER BY prod_price DESC,prod_name;
#ASC升序,DESC降序,不寫默認升序

#order by子句可以支持單個字段,多個字段,表達式,函數,別名

2. 函數

定義:myspl中的函數,類似於java的方法,將一組邏輯語句封裝在方法體中,對外暴露方法名

語法:select [函數名] (實參列表) from [表]

2.1 單行函數

#一.字符函數
#1.length 獲取參數值的字節個數
SELECT LENGTH('john');	#4

#2.concat 拼接字符串
SELECT CONCAT(vend_name,'(',vend_country,')')
FROM vendors
ORDER BY vend_name;

#3.upper,lower 大小寫變化
SELECT UPPER('John');	#JOHN

#4.substr,substring 截取字符串
#截取從指定索引處后面的所有字符
SELECT SUBSTR('this is a sentence',6) out_put; #is a sentence
#截取從指定索引處指定字符長度的字符
SELECT SUBSTR('this is a sentence',1,3) out_put; #thi
#注意:截取所使用的索引是從1開始的,而非從0開始

#5.instr 返回子串第一次出現的索引,如果找不到就返回0
SELECT INSTR ('this is a this') AS out_put;

#6.trim 去除首尾指定字符(默認去除空格)
SELECT LENGTH(TRIM('  this   ')) AS out_put; #this
SELECT TRIM('a' FROM 'aaaaataahisaaaaa') AS out_put; #taaahis

#7.lpad/rpad 用指定的字符實現左/有填充指定長度
SELECT LPAD('this',8,'*') AS out_put;	#****this

#8.replace 替換
SELECT REPLACE('thisthisthisaaathis','this','b') AS output; #bbbaaab


#二.數學函數
#1.round 四舍五入
SELECT ROUND(-1.556,2); #-1.56(保留小數點后兩位)

#2.ceil向上取整/ floor向下取整
SELECT CEIL (-1.02); #-1
SELECT FLOOR (-9.99);#-10

#3.truncate 截斷
SELECT TRUNCATE(1.65,1); #1.6(保留小數點后一位)

#4.mod 取余
SELECT MOD(10,3); #3


#三.日期函數
#now 返回當前系統日期+時間
SELECT NOW();
#curdate 返回當前系統日期,不包含時間
SELECT CURDATE();
#curtime 返回當前時間,不包含日期
SELECT CURTIME();

#獲取指定的部分(年月日,小時,分,秒)
SELECT YEAR(NOW()) AS 年;
SELECT DATE(NOW()) AS 日;

#str_to_date 將字符通過指定的格式轉換成日期
SELECT STR_TO_DATE('1988-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;


#四.流程控制函數
#1.if函數
#mysql中的if函數有些類似Java中的三目運算符
SELECT IF(x<y,'x小','y小'); #若x<y為true則返回第二欄,否則返回第三欄

#2.case函數
#mysql中的case函數兼具Java中switch-case和if-else的功能
#2.1
/*	
	case 要判斷的字段或表達式
	when 常量1 then 要顯示的值1
	when 常量2 then 要顯示的值2
	...
	else 要顯示的值n或語句n;
	end
*/
SELECT prod_price,vend_id,
CASE vend_id		#注意CASE依舊為SELECT語句后的一部分
WHEN 1001 THEN prod_price*10
WHEN 1002 THEN prod_price*20
WHEN 1003 THEN prod_price*30
ELSE prod_price
END AS final_price
FROM products;

#2.2
/*	case
	when 條件1 then 要顯示的值1
	when 條件2 then 要顯示的值2
	...
	else 要顯示的值n或語句n
	end
*/

2.2 聚集函數

定義:聚集函數是運行在組上,計算和返回單個值的函數;聚集函數主要用於統計數據

#1.簡單使用
SELECT AVG(prod_price) AS avg_price
FROM products;
SELECT SUM(item_price*quantity) AS total_price
FROM orderitems
WHERE order_num = 20005;
SELECT MIN(prod_price) AS min_price
FROM products;
SELECT MAX(prod_price) AS max_price
FROM products;
SELECT COUNT(cust_email) AS num_cust
FROM customers;

#2.和distinct搭配實現去重運算
SELECT AVG(DISTINCT prod_price) AS avg_price
FROM products
WHERE vend_id = 1003;
#添加DISTINCT后平均價格提高了,因為部分價格相同的低價商品被去重,不納入平均值計算

#3.count函數的特殊使用
SELECT COUNT(*) AS num_cust
FROM customers;
#(由於主鍵不可能為null)此處count函數會統計所有行的個數

#4.如果要將聚集函數結果和一般字段一起查詢,必須使用group by
SELECT prod_name,AVG(prod_price) AS avg_price
FROM products; #報錯
#AVG最終只會輸出一行結果,而prod_name會有多行,兩者無法匹配

#sum,avg函數一般用於處理數值型;max,min,count可以處理任何類型(包括字符)
#聚集函數全部都會忽略null值(不將null值及其個數加入計算)

3. 分組查詢

語法:select [聚集函數],[列名] from [表名] group by [需要分組的列表]

#查詢每個供應商生產的產品數量
SELECT vend_id,COUNT(*) AS num_prods
FROM products
GROUP BY vend_id;

#當需要對分組后的結果進行篩選時,就要用到having
#查詢具有2個以上,價格10以上的產品的供應商
SELECT vend_id,COUNT(*) AS num_prods
FROM products
WHERE prod_price >= 10
GROUP BY vend_id
HAVING COUNT(*) >= 2;
#WHERE不能替代HAVING,因為WHERE只能對具體的行進行篩選,如果查詢中使用了聚集函數,那么就相當於對行進行了分組,WHERE並不認識分組后的表

/*	
	分組查詢中的篩選條件分為兩類
				數據源			位置				關鍵字
	分組前篩選	 原始表		 group by子句前	where
	分組后篩選	 分組后的結果集  group by子句后	  having
*/

分組查詢注意事項:

  • GROUP BY子句可以包含任意數目的列,這意味着可以對分組進行嵌套。如果嵌套了分組,數據將在最后規定的分組上進行匯總
  • GROUP BY子句中列出的每個列都必須是檢索列或有效的表達式(不能是聚集函數)。如果在SELECT中使用表達式,則必須在GROUP BY子句中指定相同的表達式。不能使用別名
  • 除聚集計算語句外,SELECT語句中的每個列都必須在GROUP BY子句中給出
  • 如果分組列中具有NULL值,則NULL將作為一個分組返回,如果列中有多行NULL值,它們將分為一組


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM