記錄自己學(xué)習(xí)這本書的過程
此篇文章包括高級數(shù)據(jù)過濾华糖、用通配符進(jìn)行過濾和創(chuàng)建計算字段
通往其他文章的入口:
SQL必知必會----第四版(一)
SQL必知必會----第四版(三)
SQL必知必會----第四版(四)
SQL必知必會----第四版(五)
SQL必知必會----第四版(六)
SQL必知必會----第四版(七)
一、高級數(shù)據(jù)過濾
- AND操作符
SELECT p_name, p_country, p_price
FROM product
WHERE p_country = 'CN' AND p_price = 7.7;
??用在WHERE子句中的關(guān)鍵字穆趴,用來指示檢索滿足所有給定條件的行衩匣。- OR操作符
SELECT id, p_name, p_country
FROM product
WHERE id = 3 OR p_country = 'CN';
??WHERE子句中使用的關(guān)鍵字,用來表示檢索匹配任一給定條件的行。- 求值順序
SELECT id, p_name, p_price
FROM product
WHERE (id = 2 OR id = 3) AND p_price >= 5;
??檢索出表中id列的值為2或者id列的值為3并且p_price列的值大于等于5的所有行。??任何時候使用具有AND和OR操作符的WHERE子句漓柑,都應(yīng)該使用小括號明確地分組操作符。不要過分依賴默認(rèn)求值順序司澎,即使它確實如你希望的那樣欺缘。使用小括號沒有什么壞處栋豫,它能消除歧義挤安。
- IN操作符
SELECT id, p_name, p_price
FROM product
WHERE p_price IN (3.7, 7.7)
ORDER BY id;
??檢索表中p_price列為3.7或7.7的所有行,并根據(jù)id排序等同于下面這句
SELECT id, p_name, p_price
FROM product
WHERE p_price = 3.7 OR p_price = 7.7
ORDER BY id;
IN操作符的優(yōu)點(diǎn):
- 在有很多合法選項時丧鸯,IN操作符的語法更清楚蛤铜,更直觀。
- 在與其他AND和OR操作符組合使用IN時,求值順序上更容易管理围肥。
- IN操作符一般比一組OR操作符執(zhí)行得更快
- 最大的優(yōu)點(diǎn)是可以包含其他SELECT語句剿干,能夠更動態(tài)地建立WHERE子句。詳見SQL必知必會----第四版(四)
- NOT操作符
WHERE子句中的NOT操作符有且只有一個功能穆刻,那就是否定其后所跟的任何條件置尔。
SELECT id, p_name, p_country
FROM product
WHERE NOT p_country = 'CN'
ORDER BY id;
??檢索表中p_country不等于CN的所有行,并用id排序氢伟。等同于下面這句
SELECT id, p_name, p_country
FROM product
WHERE p_country != 'CN'
ORDER BY id;
??NOT操作符的有點(diǎn)與IN相似榜轿。
二、用通配符進(jìn)行過濾
- LIKE操作符
通配符:用來匹配值的一部分的特殊字符朵锣。
搜索模式:由字面值谬盐、通配符或兩者組合構(gòu)成的搜索條件。
通配符搜索只能用于文本字段(字符串)诚些,非文本數(shù)據(jù)類型字段不能使用通配符搜索飞傀。
- %通配符
%表示任何字符串出現(xiàn)任意次數(shù)。
SELECT p_id, p_name
FROM product
WHERE p_id LIKE 'L%';
??檢索p_id的值以L為開頭的所有行诬烹。SELECT p_id, p_name
FROM product
WHERE p_id LIKE '%35%';
??檢索p_id的值包含35的所有行砸烦。SELECT p_id, p_name
FROM product
WHERE p_id LIKE 'D%9';
??檢索p_id的值以D為開頭并且以9為結(jié)尾的所有行。如果結(jié)尾是空格則匹配不到绞吁。??%匹配不到NULL
- _通配符
_的作用于%一致外冀,但它只能匹配單個字符,而不是多個字符掀泳。
SELECT p_id, p_name
FROM product
WHERE p_id LIKE '_L35H9';
??檢索p_id的值以任意一個字符為開頭并以L35H9為結(jié)尾的所有行雪隧。例如:ABL35H9, ACL35H9。ABCL35H9則不可以员舵,因為_只能匹配單個字符脑沿。
- [ ]通配符
[ ]用來制定一個字符集庄拇,它必須匹配指定位置(通配符的位置)的一個字符。
SELECT p_id, p_name
FROM product
WHERE p_id LIKE '[L, D]%';
??檢索表中p_id值是以L或者D為開頭的所有行韭邓。此通配符可以用前綴字符^來否定
SELECT p_id, p_name
FROM product
WHERE p_id LIKE '[^L, D]%';
??檢索表中p_id值不是以L或者D為開頭的所有行措近。
SELECT p_id, p_name
FROM product
WHERE NOT p_id LIKE '[L, D]%';
- 使用通配符的技巧
通配符很有用。但這種功能是有代價的女淑,即通配符搜索一般比前面討論的其他搜索要耗費(fèi)更長的處理時間瞭郑。
??不要過度使用通配符。如果其他操作能到到相同的目的鸭你,應(yīng)該使用其他操作符屈张。
??在確實需要使用通配符時擒权,也盡量不要把它們用在搜索模式的開始處。把通配符置于開始處阁谆,搜索起來是最慢的碳抄。
??仔細(xì)注意通配符的位置,如果放錯地方场绿,可能不會返回想要的數(shù)據(jù)剖效。
三、創(chuàng)建計算字段
- 計算字段
??存儲在表中的數(shù)據(jù)都不是應(yīng)用程序所需要的焰盗。我們需要直接從數(shù)據(jù)庫中檢索出轉(zhuǎn)換贱鄙、計算或格式化過的數(shù)據(jù),而不是檢索出數(shù)據(jù)姨谷,然后再在客戶端應(yīng)用程序中重新格式化逗宁。
??這時計算字段就可以派上用場了。計算字段并不實際存在于數(shù)據(jù)庫表中梦湘。計算字段是運(yùn)行時在SELECT語句內(nèi)創(chuàng)建的瞎颗。
??在SQL語句內(nèi)可完成的許多轉(zhuǎn)換和格式化工作都可以直接在客戶端應(yīng)用程序內(nèi)完成。但一般來說捌议,在數(shù)據(jù)庫服務(wù)器上完成這些操作比在客戶端完成要快得多 - 拼接字段
拼接:將值聯(lián)結(jié)到一起(將一個值附加到另一個值)構(gòu)成單個值哼拔。
SELECT p_name || '(' || p_country || ')'
FROM product
ORDER BY p_country;
- 使用別名
??從上個例子可以看出,SELECT語句可以很好地拼接國家字段瓣颅。但是倦逐,這個新計算列的名字是什么呢?實際上它沒有名字宫补,它只是一個值檬姥。一個未命名的列不能用于客戶端應(yīng)用中。為了解決這個問題粉怕,SQL支持列別名健民。別名(alias)是一個字段或值得替換名。別名用AS
關(guān)鍵字賦予贫贝。
SELECT p_name || '(' || p_country || ')' AS p_title
FROM product
ORDER BY p_country;
??檢索出所有商品名和國家秉犹,并合并到一列。
??別名還有其他用途。常見的用途包括在實際的表列名包含不合法的字符(如空格)時重新命名它,在原來的名字含混或容易誤解時擴(kuò)充它砾省。
??別名的名字即可以是一個單詞,也可以是一個字符串鸳劳。如果是后者,字符串應(yīng)該括在引號中幸逆。雖然這樣做法是合法的棍辕,但不建議這么去做暮现。多單詞的名字可讀性高还绘,不會給客戶端應(yīng)用帶來各種問題楚昭。因此,別名最常見的使用時將多個單詞的列名重命名為一個單詞的名字拍顷。
??別名有時也稱為導(dǎo)出列抚太,不管怎么叫,它所代表的是相同的東西昔案。
- 執(zhí)行算術(shù)計算
SELECT p_id, p_name, p_price * p_count AS total
FROM product
WHERE p_price > 7.7
ORDER BY p_id;
??檢索所有商品單價大于7.7的商品尿贫,按p_id正序排列,并計算出總價踏揣。
- SQL算術(shù)操作符
操作符 | 說明 |
---|---|
+ | 加 |
- | 減 |
* | 乘 |
/ | 除 |