這篇文章主要是自己閱讀《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*