MySQL必知必會讀書筆記一

這篇文章主要是自己閱讀《Mysql必知必會》的時候自己寫的sql,前面的一部分用的是自己的建立的一個user表,後面用的就是原書的表了

#檢索
SELECT id  FROM account; #檢索單列
SELECT id,name FROM account; #檢索多個列
SELECT *  FROM account; #檢索所有列
SELECT DISTINCT name FROM account; #DISTINCT關鍵字只返回不同的值,放在列名之前,只能應用於所有的列
SELECT name FROM account LIMIT 2; #LIMIT限制返回結果的條數5條
SELECT name FROM account LIMIT 1,2; #第一個參數開始位置,第二個參數要檢索的條數(注意第一行從0開始)
SELECT name FROM account LIMIT 2 OFFSET 1; #與上一條意思等價,MYSQL5支持的新寫法
SELECT account.name FROM account; #使用完全限定名的表名

#排序檢索的數據
SELECT name FROM account ORDER BY name; #使用order by子句進行排序
SELECT id, name, money FROM account ORDER BY name, id; #多個列的排序,檢索了三個列,
					#當出現多個排序規則時,僅當前一個規則相同時,才進行下一規則的排序
SELECT name FROM account ORDER BY name DESC;#添加關鍵字DESC倒序排序					
SELECT id, name, money FROM account ORDER BY name DESC, id; #多個列排序的降序的使用,name倒序,id正序
SELECT money FROM account ORDER BY money DESC LIMIT 1; #一個綜合運用,找出最貴的存款的值

#過濾數據
SELECT * FROM account WHERE id = 2; #通過where子句進行過濾
			#注意點:order by 應該在 where後面
	#單個值的匹配
	#WHERE子句操作符 不等於<>, 在a,b兩個值之間BETWEEN a AND b
SELECT * FROM account WHERE name = "aaa"; #字符串匹配(串類型需要加引號),默認不區分大小寫
SELECT * FROM account WHERE money > 2000;
SELECT * FROM account WHERE money BETWEEN 1500 AND 2500;
	#空值檢查
SELECT id,name FROM account WHERE money IS NULL;

#數據過濾(用ADN,OR,NOT對where子句進行加強)
SELECT * FROM account WHERE id > 2 AND money > 2000; #AND操作符
SELECT * FROM account WHERE id > 2 OR money > 2000; #OR操作符
	#AND的優先級比OR高,如果需要改變次序,需要加上括號
	#推薦使用括號,消除歧義
SELECT * FROM account WHERE id IN (2,3) ORDER BY id; #IN指定範圍
SELECT * FROM account WHERE id NOT IN (2,3) ORDER BY id; #使用NOT在WHERE子句中來否定後跟條件的關鍵字

#用通配符LIKE進行過濾
SELECT * FROM account WHERE name LIKE 'aa%'; # % 表示任意(可以爲0個)字符出現任意次數,但是NULL和尾空格不可匹配
SELECT * FROM account WHERE name LIKE 'aa_'; # _ 表示單個字符
	#通配符使用建議:儘量少使用,也不要放在開頭

#正則表達式
SELECT * FROM account WHERE name REGEXP '.aa' ORDER BY name; #基本字符匹配
SELECT * FROM account WHERE name REGEXP 'aaa|bbb' ORDER BY name; #進行OR匹配
SELECT * FROM account WHERE name REGEXP 'aa[a-z]' ORDER BY name; #範圍匹配
SELECT * FROM account WHERE name REGEXP '\\.' ORDER BY name; #使用 \\ 轉義,搜索.的行
	#寫幾個正則表達式的例子
	'\\([0-9] sticks?\\)' #匹配(1 sticks),(2.stick) ?讓s可選
	'[[:digit:]]{4}' #匹配任意一個4位數字
	#定位符的例子
	'^[0-0-9\\.]' #匹配.或者數字開頭

#創建計算字段
SELECT Concat(name, '(', money, ')') FROM account ORDER BY name; #使用Concat函數拼接
	#Trim,LTrim,RTrim函數可去掉空格
SELECT Concat(name, '(', money, ')') AS a_title FROM account ORDER BY name; #使用AS給拼接的字段創建別名
	#執行算術運算(這個例子不是user表的)
	SELECT id, quantity, price, quantity*item_price AS expanded_price FROM orderitems WHERE xxx; #增加一個計算字段總價

#使用數據處理函數
	#文本處理函數
	SELECT name Upper(name) AS upper_name FROM account ORDER BY name;	#Upper()轉換爲大寫 
	#日期和時間處理函數
	SELECT id, num FROM orders WHERE DATE(order_date) = '2020-03-23'; #返回日期時間的日期部分

#聚集函數
	#AVG()平均,COUNT()行數,MAX()最大,MIN()最小,SUM()總和	
SELECT AVG(money) AS avg_money FROM account;
	#NULL會被忽略
SELECT AVG(DISTINCT money) AS avg_money FROM account; #DISTINCT去掉了相同的值
SELECT AVG(money), COUNT(money), MIN(money), MAX(money), SUM(money) FROM account; #組合聚集函數

#分組數據
	#GROUP BY子句和HAVING子句
SELECT name, COUNT(*) FROM account GROUP BY name; #分組
SELECT name, COUNT(*) FROM account GROUP BY name HAVING COUNT(*) > 2; #過濾分組

#子查詢(少用)
	#第一個查詢
	#SELECT id FROM account WHERE name = "aaa";
	#第二個查詢
	#SELECT money FROM account WHERE id IN (1,7,3);
	SELECT money FROM account WHERE id IN 
		(SELECT id FROM account WHERE name = "aaa"); #列必須匹配

#聯結表
SELECT vend_name, prod_name, prod_price FROM vendors, products 
	WHERE vendors.vend_id = products.vend_id ORDER BY vend_name, prod_name; #聯結產品和供應商的信息
SELECT prod_name, vend_name, prod_price, quantity FROM orderitems, products, vendors
WHERE products.vend_id = vendors.vend_id
AND orderitems.prod_id = products.prod_id
AND order_num = 20005; #多個表的聯結 

#高級聯結
	#別名
SELECT Concat(RTrim(vend_name), '(', RTrim(vend_country), ')') AS vend_title
FROM vendors ORDER BY vend_name; #複習之前的別名用法
SELECT cust_name, cust_contact FROM customers AS c, orders AS o, orderitems AS oi
WHERE c.cust_id = o.cust_id
AND oi.order_num = o.order_num
AND prod_id = 'TNT2'; #給表取別名
	#使用不同類型的聯結
		#自聯結
		SELECT p1.prod_id, p1.prod_name FROM products AS p1, products AS p2 
			WHERE p1.vend_id = p2.vend_id
			AND p2.vend_id = 'DTNTR'; #首先找出ID爲xx的物品的供應商,然後用找出這個供應商生產的物品
			#使用別名消除引用的二義性
		#自然聯結: 排除多次出現的列
		#書籤126
		

#組合查詢
SELECT vend_id, prod_id, prod_price FROM products WHERE prod_price <= 5
UNION
SELECT vend_id, prod_id, prod_price FROM products WHERE vend_id IN (1001,1002); #用UNION關鍵字,將多個查詢組合成一個結果集
	#包含或取消重複的行
SELECT vend_id, prod_id, prod_price FROM products WHERE prod_price <= 5
UNION All
SELECT vend_id, prod_id, prod_price FROM products WHERE vend_id IN (1001,1002); #默認不包含,這裏選擇包含
	#只准使用一個ORDER BY 子句進行排序
		
#全文本搜索
	#某些引擎才支持
CREATE TABLE productnotes
(
	note_id		int  		NOT NULL, AUTO_INCREMENT,
	prod_id     char		NOT NULL, 
	note_date	datetime	NOT NULL,
	note_text	text 		NULL,	
	PRIMARY KEY(note_id),
	FULLTEXT	#索引單個列
)	ENGINE=MyISAM;
	#進行全文本搜索
SELECT note_text FROM productnotes WHERE Match(note_text) Against('rabbit'); #Match指定被搜索的列,Against指定使用的搜索表達式
	#使用擴展搜索
SELECT note_text FROM productnotes WHERE Match(note_text) Against('anvils' WITH QUERY EXPANSION);
	#使用布爾文本搜索
SELECT note_text FROM productnotes WHERE Match(note_text) Against('heavy -rope*' IN BOOLEAN MODE); #排除rope*

 

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