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

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

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

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

一、高级数据过滤

  • AND操作符
SELECT p_name, p_country, p_price
FROM product
WHERE p_country = 'CN' AND p_price = 7.7;

  用在WHERE子句中的关键字,用来指示检索满足所有给定条件的行。
AND操作符.png
  • OR操作符
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子句,都应该使用小括号明确地分组操作符。不要过分依赖默认求值顺序,即使它确实如你希望的那样。使用小括号没有什么坏处,它能消除歧义。

  • 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排序
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必知必会----第四版(四)
  • NOT操作符
    WHERE子句中的NOT操作符有且只有一个功能,那就是否定其后所跟的任何条件。
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相似。

二、用通配符进行过滤

  • LIKE操作符
    通配符:用来匹配值的一部分的特殊字符。
    搜索模式:由字面值、通配符或两者组合构成的搜索条件。

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

  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语句内创建的。
      在SQL语句内可完成的许多转换和格式化工作都可以直接在客户端应用程序内完成。但一般来说,在数据库服务器上完成这些操作比在客户端完成要快得多
  • 拼接字段
    拼接:将值联结到一起(将一个值附加到另一个值)构成单个值。
SELECT p_name || '(' || p_country || ')'
FROM product
ORDER BY p_country;
拼接字段.png
  • 使用别名
      从上个例子可以看出,SELECT语句可以很好地拼接国家字段。但是,这个新计算列的名字是什么呢?实际上它没有名字,它只是一个值。一个未命名的列不能用于客户端应用中。为了解决这个问题,SQL支持列别名。别名(alias)是一个字段或值得替换名。别名用AS关键字赋予。
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
  • SQL算术操作符
操作符 说明
+
-
*
/
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 表 存储在表中的数据是同一种类型的数据或清单。 数据库中的表有为一个名字来标识自己。 表具有一些特性,这些特性定义...
    蛐蛐囍阅读 1,300评论 0 7
  • 第三课: 排序检索数据 distinct关键字:distinct 列名1,列名2,列名3DISTINCT 关键字会...
    VictorBXv阅读 1,463评论 0 8
  • 2019.2.8.星期五.阴 上午忙里偷闲先把这两天写的日记传上,我觉得自己跟小时候上学一样的坚持,就像没完...
    lay李阅读 244评论 0 0
  • 冬天到了,很冷。这里下了雪。 看,冬夜的潮水多美呀,像一位仙女,文静;像一面镜子,平静;像现在一样,安静…… 冬汐...
    唐小清呀阅读 283评论 3 2
  • 花了一周时间阅读了叶圣陶和夏丐尊合写的《文心》,读来酣畅淋漓,爱不释手,有茅塞顿开之感。因为工作的缘故,常常需要写...
    Sunshine_snail阅读 454评论 0 1