记录自己学习这本书的过程
此篇文章包括高级数据过滤、用通配符进行过滤和创建计算字段
通往其他文章的入口:
SQL必知必会----第四版(一)
SQL必知必会----第四版(三)
SQL必知必会----第四版(四)
SQL必知必会----第四版(五)
SQL必知必会----第四版(六)
SQL必知必会----第四版(七)
一、高级数据过滤
- AND操作符
SELECT p_name, p_country, p_price
FROM product
WHERE p_country = 'CN' AND p_price = 7.7;
用在WHERE子句中的关键字,用来指示检索满足所有给定条件的行。
- OR操作符
SELECT id, p_name, p_country
FROM product
WHERE id = 3 OR p_country = 'CN';
WHERE子句中使用的关键字,用来表示检索匹配任一给定条件的行。
- 求值顺序
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子句,都应该使用小括号明确地分组操作符。不要过分依赖默认求值顺序,即使它确实如你希望的那样。使用小括号没有什么坏处,它能消除歧义。
- 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的所有行,并根据id排序
等同于下面这句
SELECT id, p_name, p_price
FROM product
WHERE p_price = 3.7 OR p_price = 7.7
ORDER BY id;
IN操作符的优点:
- 在有很多合法选项时,IN操作符的语法更清楚,更直观。
- 在与其他AND和OR操作符组合使用IN时,求值顺序上更容易管理。
- IN操作符一般比一组OR操作符执行得更快
- 最大的优点是可以包含其他SELECT语句,能够更动态地建立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操作符的有点与IN相似。
二、用通配符进行过滤
- LIKE操作符
通配符:用来匹配值的一部分的特殊字符。
搜索模式:由字面值、通配符或两者组合构成的搜索条件。
通配符搜索只能用于文本字段(字符串),非文本数据类型字段不能使用通配符搜索。
- %通配符
%表示任何字符串出现任意次数。
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为结尾的所有行。如果结尾是空格则匹配不到。
%匹配不到NULL
- _通配符
_的作用于%一致,但它只能匹配单个字符,而不是多个字符。
SELECT p_id, p_name
FROM product
WHERE p_id LIKE '_L35H9';
检索p_id的值以任意一个字符为开头并以L35H9为结尾的所有行。例如: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]%';
- 使用通配符的技巧
通配符很有用。但这种功能是有代价的,即通配符搜索一般比前面讨论的其他搜索要耗费更长的处理时间。
不要过度使用通配符。如果其他操作能到到相同的目的,应该使用其他操作符。
在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处。把通配符置于开始处,搜索起来是最慢的。
仔细注意通配符的位置,如果放错地方,可能不会返回想要的数据。
三、创建计算字段
- 计算字段
存储在表中的数据都不是应用程序所需要的。我们需要直接从数据库中检索出转换、计算或格式化过的数据,而不是检索出数据,然后再在客户端应用程序中重新格式化。
这时计算字段就可以派上用场了。计算字段并不实际存在于数据库表中。计算字段是运行时在SELECT语句内创建的。
在SQL语句内可完成的许多转换和格式化工作都可以直接在客户端应用程序内完成。但一般来说,在数据库服务器上完成这些操作比在客户端完成要快得多 - 拼接字段
拼接:将值联结到一起(将一个值附加到另一个值)构成单个值。
SELECT p_name || '(' || p_country || ')'
FROM product
ORDER BY p_country;
- 使用别名
从上个例子可以看出,SELECT语句可以很好地拼接国家字段。但是,这个新计算列的名字是什么呢?实际上它没有名字,它只是一个值。一个未命名的列不能用于客户端应用中。为了解决这个问题,SQL支持列别名。别名(alias)是一个字段或值得替换名。别名用AS
关键字赋予。
SELECT p_name || '(' || p_country || ')' AS p_title
FROM product
ORDER BY p_country;
检索出所有商品名和国家,并合并到一列。
别名还有其他用途。常见的用途包括在实际的表列名包含不合法的字符(如空格)时重新命名它,在原来的名字含混或容易误解时扩充它。
别名的名字即可以是一个单词,也可以是一个字符串。如果是后者,字符串应该括在引号中。虽然这样做法是合法的,但不建议这么去做。多单词的名字可读性高,不会给客户端应用带来各种问题。因此,别名最常见的使用时将多个单词的列名重命名为一个单词的名字。
别名有时也称为导出列,不管怎么叫,它所代表的是相同的东西。
- 执行算术计算
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算术操作符
操作符 | 说明 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |