高性能 SQL 計(jì)劃 Day 1

鑒于畢業(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ù)....

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末帽衙,一起剝皮案震驚了整個(gè)濱河市菜皂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌厉萝,老刑警劉巖恍飘,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榨崩,死亡現(xiàn)場離奇詭異,居然都是意外死亡章母,警方通過查閱死者的電腦和手機(jī)母蛛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乳怎,“玉大人彩郊,你說我怎么就攤上這事◎阶海” “怎么了秫逝?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長询枚。 經(jīng)常有香客問我筷登,道長,這世上最難降的妖魔是什么哩盲? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任前方,我火速辦了婚禮,結(jié)果婚禮上廉油,老公的妹妹穿的比我還像新娘惠险。我一直安慰自己,他們只是感情好抒线,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布班巩。 她就那樣靜靜地躺著,像睡著了一般嘶炭。 火紅的嫁衣襯著肌膚如雪抱慌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天眨猎,我揣著相機(jī)與錄音抑进,去河邊找鬼。 笑死睡陪,一個(gè)胖子當(dāng)著我的面吹牛寺渗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播兰迫,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼信殊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了汁果?” 一聲冷哼從身側(cè)響起涡拘,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎据德,沒想到半個(gè)月后鳄乏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體府蔗,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年汞窗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了姓赤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡仲吏,死狀恐怖不铆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情裹唆,我是刑警寧澤誓斥,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站许帐,受9級特大地震影響劳坑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜成畦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一距芬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧循帐,春花似錦框仔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瘪匿,卻和暖如春跛梗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背棋弥。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工核偿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嘁锯。 一個(gè)月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓宪祥,卻偏偏與公主長得像聂薪,于是被迫代替她去往敵國和親家乘。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354