注:這一系列的文章是《SQL必知必會(huì)》第四版的讀書(shū)筆記慕匠。
1.了解SQL
1.1 數(shù)據(jù)庫(kù)基礎(chǔ)
數(shù)據(jù)庫(kù):保存有組織的數(shù)據(jù)的容器瘸彤。
數(shù)據(jù)庫(kù)軟件應(yīng)稱為數(shù)據(jù)庫(kù)管理系統(tǒng)DBMS。
表:某種特定類型數(shù)據(jù)的結(jié)構(gòu)化清單肛响。
模式:關(guān)于數(shù)據(jù)庫(kù)和表的布局及特性的信息郭膛。
列:表中的一個(gè)字段闪檬。所有表都是一個(gè)或多個(gè)列組成的星著。
數(shù)據(jù)類型:所允許的數(shù)據(jù)的類型。每個(gè)表列都有相應(yīng)的數(shù)據(jù)類型粗悯,它限制(或允許)該列中存儲(chǔ)的數(shù)據(jù)虚循。
行:表中的一個(gè)記錄。
主鍵:一列(或一組列)样傍,其值能唯一的標(biāo)識(shí)表中的每一行横缔。
1.2 什么是SQL
SQL:結(jié)構(gòu)化查詢語(yǔ)言,專門用來(lái)與數(shù)據(jù)庫(kù)溝通的語(yǔ)言衫哥。
2.檢索數(shù)據(jù)
使用SELECT語(yǔ)句從表中檢索一個(gè)或多個(gè)數(shù)據(jù)列茎刚。
2.1 SELECT語(yǔ)句
SELECT語(yǔ)句的用途是從一個(gè)或多個(gè)表中檢索信息。為了使用SELECT檢索表數(shù)據(jù)撤逢,必須至少給出兩條信息---想選擇什么膛锭,從哪里選擇。
2.2?檢索單個(gè)列
輸入:
SELECT?prod_name
FROM Products;
上面的SELECT語(yǔ)句返回的結(jié)果是沒(méi)有排序的笛质。
注意:
(1)多條SQL語(yǔ)句必須以分號(hào)(;)分隔泉沾。多數(shù)的DBMS不需要在單條SQL語(yǔ)句后加分號(hào),但是還是建議加上妇押。
(2)SQL語(yǔ)句不區(qū)分大小寫跷究,SELECT與select等價(jià)。但是表名敲霍,列名和值有可能是要區(qū)分大小寫的俊马,這取決于DBMS如何配置。
(3)處理SQL語(yǔ)句時(shí)肩杈,其中所有的空格都被忽略柴我。因此SQL語(yǔ)句可以寫成一行,也能分寫成多行扩然。
2.3?檢索多個(gè)列
輸入:
SELECT?prod_name,prod_price
FROM Products;
在選擇多個(gè)列時(shí)艘儒,列名之間一定要加上逗號(hào)(,),最后一個(gè)列名后不加夫偶。
2.4?檢索所有列
輸入:
SELECT *
FROM Products;
在列名的位置使用星號(hào)(*)通配符界睁,檢索出所有列。
注意:除非確實(shí)需要檢索出所有的列兵拢,否則最后別使用*通配符翻斟。檢索出不需要的列通常會(huì)降低檢索和應(yīng)用程序的性能。
2.5?檢索不同的值
如果不希望每個(gè)值重復(fù)的出現(xiàn)说铃,可以使用關(guān)鍵字DISTINCT访惜。
輸入:
SELECT DISTINCT?vend_id
FROM Products;
注意:DISTINCT作用于所有列嘹履,而不是單單一列。
2.6?限制結(jié)果
如果只希望返回一定數(shù)量的行债热,在MySQL中需要使用LIMIT關(guān)鍵字砾嫉。
下面的例子只返回前面五行,默認(rèn)從第0行開(kāi)始阳柔。
注意:第一個(gè)被檢索的行是第0行焰枢。
輸入:
SELECT prod_name
FROM Products
LIMIT 5
如果需要指定從第幾行開(kāi)始檢索,那么就要將LIMIT和OFFSET關(guān)鍵字一起使用舌剂。
其中LIMIT?a OFFSET b ,a指出檢索幾行暑椰,b指出從第幾行開(kāi)始檢索霍转。
輸入:
SELECT?prod_name
FROM Products
LIMIT 5 OFFSET 5;
MySQL支持簡(jiǎn)化版的LIMIT?a OFFSET?b?語(yǔ)句,即:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?LIMIT?a OFFSET?b=LIMIT?b,a
2.7?使用注釋
注釋使用--(兩個(gè)連字符)嵌在行內(nèi)一汽,之后的文本就是注釋避消。
輸入:
--?這是注釋
SELECT?prod_name
FROM Products;
上面的是單行注釋,如果要進(jìn)行多行注釋召夹,需要用到 /*......*/ 岩喷,如下例。
輸入:
/* SELECT prod_name,vend_id
FROM Products; */
SELECT prod_name
FROM Products;
3.排序檢索數(shù)據(jù)
使用SELECT語(yǔ)句的ORDER BY子句监憎,根據(jù)需要排序檢索出的數(shù)據(jù)纱意。
3.1?排序數(shù)據(jù)
為了明確的排序用SELECT語(yǔ)句檢索出的數(shù)據(jù),可使用ORDER BY子句鲸阔。
輸入:
SELECT?prod_name
FROM Products
ORDER BY prod_name;
注意:在指定一條ORDER BY子句時(shí)偷霉,應(yīng)保證它是SELECT語(yǔ)句中的最后一個(gè)子句。否則會(huì)出現(xiàn)錯(cuò)誤褐筛。
3.2?按多個(gè)列排列
要按多個(gè)列排列类少,簡(jiǎn)單指定列名,列名之間用逗號(hào)分開(kāi)渔扎。
輸入:
SELECT?prod_id,prod_price,prod_name
FROM Products
ORDER BY prod_price,prod_name;
3.3?按列位置排序
除了能用列名指出排序順序外硫狞,ORDER BY?還支持相對(duì)列位置進(jìn)行排序。
輸入:
SELECT prod_id,prod_price,prod_name
FROM Products
ORDER BY 2,3;
如果進(jìn)行排序的列不在SELECT清單中晃痴,顯然不能使用這種方法残吩。
3.4?指定排序方向
默認(rèn)排序?yàn)樯蚺帕校且材苓M(jìn)行降序排列愧旦,這里需要使用到關(guān)鍵字DESC世剖。
輸入:
SELECT?prod_id,prod_price,prod_name
FROM Products
ORDER BY prod_price DESC;
DESC只應(yīng)用到直接位于其前面的列名。若要在多個(gè)列上進(jìn)行降序排序笤虫,則應(yīng)該對(duì)每一列指定DESC關(guān)鍵字旁瘫。
4.過(guò)濾數(shù)據(jù)
使用SELECT語(yǔ)句的WHERE子句指定搜索條件祖凫。
4.1?使用WHERE子句
在SELECT語(yǔ)句中,數(shù)據(jù)根據(jù)WHERE子句中指定的搜索條件進(jìn)行過(guò)濾酬凳。WHERE子句在FROM子句之后給出惠况。
輸入:
SELECT?prod_name,prod_price
FROM Products
WHERE prod_price=3.49;
注意,在同時(shí)使用WHERE子句和ORDER BY子句時(shí)宁仔,應(yīng)讓ORDER BY子句位于WHERE子句之后稠屠。
4.2 WHERE子句操作符
4.2.1?檢查單個(gè)值
輸入:
SELECT?prod_name,prod_price
FROM Products
WHERE prod_price<10;
4.2.2?不匹配檢查
輸入:
SELECT vend_id,prod_name
FROM Products
WHERE vend_id='DLL01';
4.2.3?范圍值檢查
使用BETWEEN操作符,用AND隔開(kāi)兩個(gè)值翎苫。
輸入:
SELECT?prod_name,prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10;
4.2.4?空值檢查
在一個(gè)列不包含值時(shí)权埠,稱其包含空值NULL。
NULL:無(wú)值煎谍,與0攘蔽、空字符串以及空格不同。
SELECT語(yǔ)句中有一個(gè)特殊的WHERE子句呐粘,用來(lái)檢查具有NULL值得列满俗,這個(gè)WHERE子句就是IS NULL子句。
輸入:
SELECT?prod_name
FROM Products
WHERE prod_price IS NULL;
5.高級(jí)數(shù)據(jù)過(guò)濾
組合WHERE子句建立功能更強(qiáng)作岖、更高級(jí)的搜索條件唆垃。
使用NOT和IN操作符。
5.1?組合WHERE子句
SQL語(yǔ)句允許給出多個(gè)WHERE子句痘儡,以AND子句或OR子句的方式使用辕万。
操作符:用來(lái)聯(lián)結(jié)或改變WHERE子句中的子句的關(guān)鍵字,也稱為邏輯操作符谤辜。
5.1.1 AND操作符
AND:用在WHERE子句中的關(guān)鍵字蓄坏,用來(lái)指示檢索滿足所有給定條件的行。
輸入:
SELECT?prod_id,prod_price,prod_name
FROM Products
WHERE vend_id='DLL01' AND prod_price<=4;
5.1.2 OR操作符
OR:WHERE子句中使用的關(guān)鍵字丑念,用來(lái)表示檢索匹配任一給定條件的行涡戳。
輸入:
SELECT prod_price,prod_name
FROM Products
WHERE vend_id='DLL01' OR?vend_id='BRS01';
5.1.3?求值順序
使用具有AND和OR操作符的WHERE子句,使用括號(hào)明確求值順序脯倚,避免出錯(cuò)渔彰。
輸入:
SELECT prod_price,prod_name
FROM Products
WHERE (vend_id='DLL01' OR?vend_id='BRS01') AND prod_price>=10;
5.2 IN操作符
IN:WHERE子句中用來(lái)指定要匹配值的清單的關(guān)鍵字,功能與OR相當(dāng)推正。
IN操作符用來(lái)指定條件范圍恍涂,取一組由逗號(hào)分隔,括在圓括號(hào)中的合法值植榕。
輸入:
SELECT prod_price,prod_name
FROM Products
WHERE vend_id IN (‘DLL01’,'BRS01')
ORDER BY?prod_name;
IN操作符的優(yōu)點(diǎn):
(1)在有很多合法選項(xiàng)時(shí)再沧,IN操作符的語(yǔ)法更清楚,直觀尊残。
(2)在與其他AND和OR操作符組合使用IN時(shí)炒瘸,求值順序更容易管理淤堵。
(3)IN操作符一般比一組OR操作符執(zhí)行的快。
(4)IN最大優(yōu)點(diǎn)是可以包含其他SELECT語(yǔ)句顷扩,能夠動(dòng)態(tài)的建立WHERE子句拐邪。
5.3 NOT操作符
NOT:WHERE子句中用來(lái)否定其后條件的關(guān)鍵字。
輸入:
SELECT prod_name
FROM Products
WHERE NOT vend_id=‘DLL01’
ORDER BY?prod_name;
6.用通配符進(jìn)行過(guò)濾
如何使用通配符以及使用LIKE操作符進(jìn)行通配搜索隘截。
6.1 LIKE操作符
通配符:用來(lái)匹配值得一部分的特殊字符扎阶。
搜索模式:由字面值、通配符或兩者組合構(gòu)成的搜索條件婶芭。
搜索子句中使用通配符必須使用LIKE操作符东臀。通配符搜索只能用于文本字段。
6.1.1?百分號(hào)(%)通配符
%表示任何字符出現(xiàn)任意次數(shù)犀农,包括0個(gè)字符啡邑,0次。
通配符不能匹配NULL井赌,如:WHERE?prod_name LIKE '%';?不會(huì)匹配產(chǎn)品名稱為NULL的行。
輸入:
SELECT prod_id,prod_name
FROM Products
WHERE prod_name LIKE 'Fish%';
輸入:
SELECT prod_id,prod_name
FROM Products
WHERE prod_name LIKE '%bean bag%';
6.1.2?下劃線(_)通配符
下劃線(_)只匹配單個(gè)字符贵扰。
輸入:
SELECT prod_id,prod_name
FROM Products
WHERE prod_name LIKE '__ inch teddy bear';
6.1.3?方括號(hào)([])通配符
方括號(hào)([])通配符用來(lái)指定一個(gè)字符集仇穗,必須匹配指定位置的一個(gè)字符。只能匹配單個(gè)字符戚绕。
輸入:
SELECT?cust_contact
FROM Customers
WHERE cust_contact LIKE '[JM]%'
ORDER BY cust_contact;
注意:在MySQL 5.7.18中實(shí)踐之后纹坐,MySQL不支持方括號(hào)通配符。
6.2?使用通配符的技巧
通配符的搜索一般比前面討論的其他搜索要耗費(fèi)更長(zhǎng)的處理時(shí)間舞丛。
注意:
(1)不要過(guò)度使用通配符耘子,如果其他操作符能達(dá)到目的,使用其他操作符球切。
(2)需要使用通配符時(shí)谷誓,盡量不要放在搜索模式的開(kāi)始處。通配符在開(kāi)始處吨凑,搜索起來(lái)最慢捍歪。
(3)注意通配符的位置。