鑒于畢業(yè)之后大概率去當(dāng) CURD 程序員的需要筐高,本計(jì)劃應(yīng)運(yùn)而生挽放。但是我目前寫 SQL 的水平僅僅停留在基礎(chǔ)的增刪改查階段捐友,甚至比較復(fù)雜的多表查詢都不熟練量愧,顯然無法勝任該崗位钾菊。為了提高 SQL 水平,從今天開始偎肃,我將主要圍繞 《MySQL 必知必會》煞烫、《SQL 進(jìn)階教程》、《高性能 MySQL》展開學(xué)習(xí)累颂,開啟“高性能 SQL”計(jì)劃滞详。
Part I. SQL 基礎(chǔ)入門
1.了解數(shù)據(jù)庫和表
SHOW DATABASES; #顯示所有的數(shù)據(jù)庫
SHOW TABLES; #顯示正在使用的數(shù)據(jù)庫中所有的表
SHOW COLUMNS FROM customers;#顯示表的列的信息,包含字段名、數(shù)據(jù)類型料饥、默認(rèn)值等信息
DESCRIBE customers;#與上一條功能相同
SHOW STATUS;#顯示服務(wù)器狀態(tài)
SHOW CREATE DATABASE stu_info;#顯示創(chuàng)建數(shù)據(jù)庫的SQL語句
SHOW CREATE TABLE stu;#顯示創(chuàng)建表的SQL語句
SHOW GRANTS;#顯示授予用戶的安全權(quán)限
SHOW ERRORS;#顯示錯(cuò)誤信息
SHOW WARNINGS;#顯示警告信息
2.SELECT 語句
SELECT prod_name
FROM products;#檢索單列
SELECT prod_id, prod_name, prod_price
FROM products;#檢索多列
SELECT * from products;#檢索所有列蒲犬。一般來說,除非你確實(shí)需要表中的每個(gè)列稀火,否則最好別使用*通配符
SELECT DISTINCT vend_id
FROM products;#使用DISTINCT關(guān)鍵字來實(shí)現(xiàn)結(jié)果去重
SELECT prod_name
FROM products
LIMIT 5,5;#使用LIMIT關(guān)鍵字來限制結(jié)果暖哨。表示返回五個(gè)結(jié)果(從第一行開始)。
SELECT prod_name
FROM products
LIMIT 5,5;#表示返回從第五行開始的五行結(jié)果凰狞。
SELECT prod_name
FROM products
LIMIT 5 OFFSET 5;#與上一語句功能相同篇裁,使用OFFSET關(guān)鍵字增強(qiáng)可讀性。
3.排序檢索數(shù)據(jù)
SELECT prod_name
FROM products
ORDER BY prod_name;#對檢索出的結(jié)果按照prod_name字母順序排序
SELECT prod_id, prod_price, prod_name
FROM products
ORDER BY prod_price, prod_name;#先按照prod_price進(jìn)行排序赡若,價(jià)格相同的項(xiàng)再按照prod_name排序
SELECT prod_id, prod_price, prod_name
FROM products
ORDER BY prod_price DESC;#使用DESC關(guān)鍵字進(jìn)行降序排序达布。進(jìn)行升序的關(guān)鍵字是ASC,MySQL默認(rèn)使用升序逾冬。
SELECT prod_id, prod_price, prod_name
FROM products
ORDER BY prod_price DESC, prod_name;#DESC關(guān)鍵字只作用于其前面的一列黍聂。該語句prod_price為降序,prod_name為升序
4.過濾數(shù)據(jù)
注意:WHERE 子句應(yīng)該在 ORDER BY 子句之后身腻。
SELECT prod_name,prod_price
FROM products
WHERE prod_price = 2.50;#例子
#WHERE子句中的操作符基本與平時(shí)使用的基本一致产还,但有三個(gè)值得注意的點(diǎn)
#1.MySQL中的不等于既可以使用 <> ,也可以使用 !=。
#2.MySQL對于varchar類型的字段默認(rèn)不區(qū)分大小寫嘀趟。
#3.進(jìn)行值比較時(shí)脐区,如果將值與串類型(varchar類型)的列比較時(shí)要使用引號,與數(shù)值列進(jìn)行比較時(shí)則不需要引號她按。
SELECT prod_name, prod_price
FROM products
WHERE prod_price BETWEEN 5 AND 10; //范圍值檢查
SELECT prod_name
FROM products
WHERE prod_price IS NULL;//空值檢查
以上介紹了WHERE子句的基本用法牛隅,接下來是其進(jìn)階的組合用法。
#1.AND 邏輯操作符
SELECT prod_id, prod_price, prod_name
FROM products
WHERE vend_id = 1003 AND prod_price <= 10;
#2.OR 邏輯操作符
SELECT prod_name, prod_price
FROM products
WHERE vend_id = 1002 OR vend_id = 1003;
#注意:AND 和 OR 操作符存在優(yōu)先級的問題酌泰,AND 的優(yōu)先級高于 OR媒佣,可以通過括號來改變優(yōu)先級。
#“任何時(shí)候使用具有AND和OR操作符的WHERE子句陵刹,都應(yīng)該使用圓括號明確地分組操作符默伍。不要過分依賴默認(rèn)計(jì)算次序,即使它確實(shí)是你想要的東西也是如此衰琐∫埠”
#3.IN 操作符
SELECT prod_name, prod_price
FROM products
WHERE vend_id IN (1002,1003)
ORDER BY prod_name;
#使用 IN 操作符實(shí)際上完成了與 OR 相同的功能。但是使用 IN 操作符書寫簡單碘耳、邏輯清晰而且速度快显设。
#4.NOT 操作符
SELECT prod_name, prod_price
FROM products
WHERE vend_id NOT IN (1002,1003)
ORDER BY prod_name;
5.使用通配符進(jìn)行過濾
MySQL 中主要是使用 LIKE 操作符進(jìn)行通配操作,LIKE指示MySQL辛辨,后跟的搜索模式利用通配符匹配而不是直接相等匹配進(jìn)行比較捕捂。
首先是幾個(gè)名詞的解釋:
- 通配符(wildcard): 用來匹配值的一部分的特殊字符瑟枫。
- “搜索模式(search pattern): 由字面值、通配符或兩者組合構(gòu)成的搜索條件指攒。
- 謂詞(predicate): 返回值為真值(true/false/unknown)的函數(shù)慷妙。從技術(shù)上說,LIKE是謂詞而不是操作符允悦。
#1.百分號通配符
# % 表示任何字符出現(xiàn)任意次數(shù)膝擂,包括0次
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE 'jet%';#找出所有以jet起頭的產(chǎn)品
# % 可以有很多種使用方式,如'%anvil%'隙弛、's%e'等架馋。
#注意:即使是WHERE prod_name LIKE '%'也不能匹配用值NULL作為產(chǎn)品名的行。
#2.下劃線通配符
# _ 表示任意字符出現(xiàn)一次全闷,并且只能是一次
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE '_ ton anvil';
使用通配符的注意事項(xiàng):
- 不要過度使用通配符叉寂。如果其他操作符能達(dá)到相同的目的,應(yīng)該使用其他操作符总珠;
- 在確實(shí)需要使用通配符時(shí)屏鳍,除非絕對有必要,否則不要把它們用在搜索模式的開始處局服。把通配符置于搜索模式的開始處钓瞭,搜索起來是最慢的;
- 仔細(xì)注意通配符的位置淫奔。如果放錯(cuò)地方山涡,可能不會返回想要的數(shù)據(jù)。
6.使用正則表達(dá)式進(jìn)行搜索
#1.基本字符匹配
SELECT prod_name
FROM products
WHERE prod_name REGEXP '.000'
ORDER BY prod_name;#使用REGEXP關(guān)鍵字匹配搏讶,匹配以任意字符開頭以000結(jié)尾的產(chǎn)品名稱
#注意:使用正則表達(dá)式匹配默認(rèn)是不區(qū)分大小寫的佳鳖,可以在 REGEXP 后面添加 BINARY 關(guān)鍵字區(qū)分大小寫
#2.OR 匹配
“SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000|2000'
ORDER BY prod_name;#匹配產(chǎn)品名包含1000或2000的產(chǎn)品
#注意:使用正則表達(dá)式的匹配不是整列匹配霍殴,而且包含即可
#3.范圍匹配
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[1-5] Ton'
ORDER BY prod_name;
#4.特殊匹配
SELECT vend_name
FROM vendors
WHERE vend_name REGEXP '\\.'
ORDER BY vend_name; #轉(zhuǎn)義字符:\\
#5.匹配字符類
#[:alnum:] 任意字母和數(shù)字(同[a-zA-Z0-9])
#[:alpha:] 任意字符(同[a-zA-Z])
#[:blank:] 空格和制表(同[\\t])
#[:cntrl:] ASCII控制字符(ASCII 0到31和127)
#[:digit:] 任意數(shù)字(同[0-9])
#[:graph:] 與[:print:]相同媒惕,但不包括空格
#[:lower:] 任意小寫字母(同[a-z])
#[:print:] 任意可打印字符
#[:punct:] 既不在[:alnum:]又不在[:cntrl:]中的任意字符
#[:space:] 包括空格在內(nèi)的任意空白字符(同[\\f\\n\\r\\t\\v])
#[:upper:] 任意大寫字母(同[A-Z])
#[:xdigit:] 任意十六進(jìn)制數(shù)字(同[a-fA-F0-9])
#6.匹配多個(gè)實(shí)例
#* 0個(gè)或多個(gè)匹配
#+ 1個(gè)或多個(gè)匹配(等于{1,})
#? 0個(gè)或1個(gè)匹配(等于{0,1})
#{n} 指定數(shù)目的匹配
#{n,} 不少于指定數(shù)目的匹配
#{n,m} 匹配數(shù)目的范圍(m不超過255)
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[[:digit:]]{4}'
ORDER BY prod_name;
#7.定位符
#^ 文本的開始
#$ 文本的結(jié)尾
#[[: 詞的開始
#[[:>:]] 詞的結(jié)尾
SELECT prod_name
FROM products
WHERE prod_name REGEXP '^[0-9\\.]'
ORDER BY prod_name;
#注意:“LIKE和REGEXP的不同在于,LIKE匹配整個(gè)串而REGEXP匹配子串来庭。利用定位符妒蔚,通過用^開始每個(gè)表達(dá)式,用$結(jié)束每個(gè)表達(dá)式月弛,可以使REGEXP的作用與LIKE一樣肴盏。”
未完待續(xù)....