ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

SQL基础教程(第2版)第6章 函数、谓词、CASE表达式:6-2 谓词

2020-01-24 16:04:28  阅读:324  来源: 互联网

标签:CASE shop INSERT INTO VALUES 谓词 SQL id


● 谓词就是返回值为真值的函数。
● 可以将子查询作为IN和EXISTS的参数。

本节将会和大家一起学习 SQL 的抽出条件中不可或缺的工具——谓词(predicate)。例如, =、 <、 >、 <> 等比较运算符,其正式的名称就是比较谓词。

谓词的返回值全都是真值(TRUE/FALSE/UNKNOWN)。 这也是谓词和函数的最大区别。

● LIKE
● BETWEEN
● IS NULL、 IS NOT NULL
● IN
● EXISTS


LIKE谓词——字符串的部分一致查询
部分一致大体可以分为前方一致、中间一致和后方一致三种类型。

--MySQL
--DDL:创建表
CREATE TABLE SampleLike
( strcol VARCHAR(6) NOT NULL,
  PRIMARY KEY (strcol));

--DML:插入数据
START TRANSACTION;

INSERT INTO SampleLike (strcol) VALUES ('abcddd');
INSERT INTO SampleLike (strcol) VALUES ('dddabc');
INSERT INTO SampleLike (strcol) VALUES ('abdddc');
INSERT INTO SampleLike (strcol) VALUES ('abcdd');
INSERT INTO SampleLike (strcol) VALUES ('ddabc');
INSERT INTO SampleLike (strcol) VALUES ('abddc');

COMMIT;
List6_21_MySQL
--Oracle, DB2
--DDL:创建表
CREATE TABLE SampleLike
( strcol VARCHAR(6) NOT NULL,
  PRIMARY KEY (strcol));

--DML:插入数据

INSERT INTO SampleLike (strcol) VALUES ('abcddd');
INSERT INTO SampleLike (strcol) VALUES ('dddabc');
INSERT INTO SampleLike (strcol) VALUES ('abdddc');
INSERT INTO SampleLike (strcol) VALUES ('abcdd');
INSERT INTO SampleLike (strcol) VALUES ('ddabc');
INSERT INTO SampleLike (strcol) VALUES ('abddc');

COMMIT;
List6_21_Oracle_DB2


BETWEEN谓词——范围查询

 

 

IS NULL、 IS NOT NULL——判断是否为NULL


IN谓词——OR的简便用法

但需要注意的是,在使用IN 和 NOT IN 时是无法选取出NULL 数据的。
NULL 终究还是需要使用IS NULL 和IS NOT NULL 来进行判断。


使用子查询作为IN谓词的参数
■ IN和子查询
IN 谓词(NOT IN 谓词)具有其他谓词所没有的用法,那就是可以
使用子查询作为其参数。我们已经在 5-2 节中学习过了,子查询就是 SQL
内部生成的表,因此也可以说“能够将表作为 IN 的参数”。同理,我们
还可以说“能够将视图作为 IN 的参数”。

CREATE TABLE ShopProduct
(shop_id    CHAR(4)       NOT NULL,
 shop_name  VARCHAR(200)  NOT NULL,
 product_id CHAR(4)       NOT NULL,
 quantity   INTEGER       NOT NULL,
 PRIMARY KEY (shop_id, product_id));
--MySQL
START TRANSACTION;

INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000A',    '东京',        '0001',    30);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000A',    '东京',        '0002',    50);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000A',    '东京',        '0003',    15);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000B',    '名古屋',    '0002',    30);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000B',    '名古屋',    '0003',    120);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000B',    '名古屋',    '0004',    20);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000B',    '名古屋',    '0006',    10);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000B',    '名古屋',    '0007',    40);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000C',    '大阪',        '0003',    20);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000C',    '大阪',        '0004',    50);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000C',    '大阪',        '0006',    90);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000C',    '大阪',        '0007',    70);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000D',    '福冈',        '0001',    100);

COMMIT;
代码清单6-35 向ShopProduct表中插入数据

■ NOT IN和子查询

IN 的否定形式 NOT IN 同样可以使用子查询作为参数,其语法也和IN 完全一样。 


EXIST谓词

本节最后将要给大家介绍的是 EXIST 谓词。将它放到最后进行学习
的原因有以下 3 点。
① EXIST 的使用方法与之前的都不相同
② 语法理解起来比较困难
③ 实际上即使不使用 EXIST,基本上也都可以使用 IN(或者 NOT IN)来代替

但是一旦能够熟练使用 EXIST 谓词,就能体会到它极大的便利性。

■ EXIST谓词的使用方法

EXISTS 只需要在右侧书写 1 个参数,该参数通常都会是一个关联子查询。

大家可以把在 EXIST 的子查询中书写 SELECT * 当作 SQL 的一种习惯。

●使用NOT EXIST替换NOT IN

NOT EXISTS 与 EXISTS 相反,当“不存在”满足子查询中指定条件的记录时返回真(TRUE)。 

标签:CASE,shop,INSERT,INTO,VALUES,谓词,SQL,id
来源: https://www.cnblogs.com/MarlonKang/p/12232128.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有