四五20

SQL必知必会----第四版(二)

2019-06-22  本文已影响0人  四五20

记录自己学习这本书的过程
此篇文章包括高级数据过滤、用通配符进行过滤和创建计算字段

通往其他文章的入口:
SQL必知必会----第四版(一)
SQL必知必会----第四版(三)
SQL必知必会----第四版(四)
SQL必知必会----第四版(五)
SQL必知必会----第四版(六)
SQL必知必会----第四版(七)

所有例子都基于product表 product表.png

一、高级数据过滤

SELECT p_name, p_country, p_price
FROM product
WHERE p_country = 'CN' AND p_price = 7.7;
  用在WHERE子句中的关键字,用来指示检索满足所有给定条件的行。 AND操作符.png
SELECT id, p_name, p_country
FROM product
WHERE id = 3 OR p_country = 'CN';
  WHERE子句中使用的关键字,用来表示检索匹配任一给定条件的行。 OR操作符.png
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的所有行。 求值顺序.png

  任何时候使用具有AND和OR操作符的WHERE子句,都应该使用小括号明确地分组操作符。不要过分依赖默认求值顺序,即使它确实如你希望的那样。使用小括号没有什么坏处,它能消除歧义。

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排序 IN操作符.png

等同于下面这句

SELECT id, p_name, p_price
FROM product
WHERE p_price = 3.7 OR p_price = 7.7
ORDER BY id;

IN操作符的优点:

  1. 在有很多合法选项时,IN操作符的语法更清楚,更直观。
  2. 在与其他AND和OR操作符组合使用IN时,求值顺序上更容易管理。
  3. IN操作符一般比一组OR操作符执行得更快
  4. 最大的优点是可以包含其他SELECT语句,能够更动态地建立WHERE子句。详见SQL必知必会----第四版(四)
SELECT id, p_name, p_country
FROM product
WHERE NOT p_country = 'CN'
ORDER BY id;
  检索表中p_country不等于CN的所有行,并用id排序。 NOT操作符.png

等同于下面这句

SELECT id, p_name, p_country
FROM product
WHERE p_country != 'CN'
ORDER BY id;

  NOT操作符的有点与IN相似。

二、用通配符进行过滤

通配符搜索只能用于文本字段(字符串),非文本数据类型字段不能使用通配符搜索。

  1. %通配符
    %表示任何字符串出现任意次数。
SELECT p_id, p_name
FROM product
WHERE p_id LIKE 'L%';
  检索p_id的值以L为开头的所有行。 %通配符-1.png
SELECT p_id, p_name
FROM product
WHERE p_id LIKE '%35%';
  检索p_id的值包含35的所有行。 %通配符-2.png
SELECT p_id, p_name
FROM product
WHERE p_id LIKE 'D%9';
  检索p_id的值以D为开头并且以9为结尾的所有行。如果结尾是空格则匹配不到。 %通配符-3.png

  %匹配不到NULL

  1. _通配符
    _的作用于%一致,但它只能匹配单个字符,而不是多个字符。
SELECT p_id, p_name
FROM product
WHERE p_id LIKE '_L35H9';

  检索p_id的值以任意一个字符为开头并以L35H9为结尾的所有行。例如:ABL35H9, ACL35H9。ABCL35H9则不可以,因为_只能匹配单个字符。

其他位置与%类似,不举过多例子。 _通配符.png
  1. [ ]通配符
    [ ]用来制定一个字符集,它必须匹配指定位置(通配符的位置)的一个字符。
SELECT p_id, p_name
FROM product
WHERE p_id LIKE '[L, D]%';
  检索表中p_id值是以L或者D为开头的所有行。 [ ]通配符-1.png

此通配符可以用前缀字符^来否定

SELECT p_id, p_name
FROM product
WHERE p_id LIKE '[^L, D]%';

  检索表中p_id值不是以L或者D为开头的所有行。

等同于 [ ]通配符-2.png
SELECT p_id, p_name
FROM product
WHERE NOT p_id LIKE '[L, D]%';
  1. 使用通配符的技巧
    通配符很有用。但这种功能是有代价的,即通配符搜索一般比前面讨论的其他搜索要耗费更长的处理时间。
      不要过度使用通配符。如果其他操作能到到相同的目的,应该使用其他操作符。
      在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处。把通配符置于开始处,搜索起来是最慢的。
      仔细注意通配符的位置,如果放错地方,可能不会返回想要的数据。

三、创建计算字段

SELECT p_name || '(' || p_country || ')'
FROM product
ORDER BY p_country;
拼接字段.png
SELECT p_name || '(' || p_country || ')' AS p_title
FROM product
ORDER BY p_country;

  检索出所有商品名和国家,并合并到一列。


使用别名.png

  别名还有其他用途。常见的用途包括在实际的表列名包含不合法的字符(如空格)时重新命名它,在原来的名字含混或容易误解时扩充它。
  别名的名字即可以是一个单词,也可以是一个字符串。如果是后者,字符串应该括在引号中。虽然这样做法是合法的,但不建议这么去做。多单词的名字可读性高,不会给客户端应用带来各种问题。因此,别名最常见的使用时将多个单词的列名重命名为一个单词的名字。
  别名有时也称为导出列,不管怎么叫,它所代表的是相同的东西。

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正序排列,并计算出总价。


执行算术计算.png
操作符 说明
+
-
*
/
上一篇下一篇

猜你喜欢

热点阅读