例子:选取出 product_type 商品中高于该类商品的平均销售单价的商品了。
-- 错误写法:因为是 WHERE 比较的值不是标量 SELECT product_id, product_name, sale_price FROM Product WHERE sale_price > ( SELECT AVG(sale_price) FROM Product GROUP BY product_type ); -- 正确写法 SELECT product_type, product_name, sale_price FROM Product AS P1 WHERE sale_price > ( SELECT AVG(sale_price) FROM Product AS P2 WHERE P1.product_type = P2.product_type -- 这句起作用 GROUP BY product_type -- 这句可要可不要 ); -- 错误写法:作用域错误。子查询内部可以看到外部,而外部看不到内部。 SELECT product_type, product_name, sale_price FROM Product AS P1 WHERE P1.product_type = P2.product_type AND sale_price > ( SELECT AVG(sale_price) FROM Product AS P2 GROUP BY product_type );关联子查询的缺点:
可读性差
性能未必好
第 6 章 函数、谓词、CASE 表达式为什么把这三块合并成一章,因为 谓词 和 CASE 表达式 本质上也是函数。
1、函数函数大致可以分为以下几种:
1、算术函数(用来进行数值计算的函数)
2、字符串函数(用来进行字符串操作的函数)
3、日期函数(用来进行日期操作的函数)
4、转换函数(用来转换数据类型和值的函数
5、聚合函数(用来进行数据聚合的函数)
(1)COALESC —— 将 NULL 转换为其他值 SELECT COALESCE ( NULL, 1 ) AS col_1, COALESCE ( NULL, 'test', NULL ) AS col_2, COALESCE ( NULL, NULL, '2009-11-01' ) AS col_3; 2、谓词(运算符)与 NULL【重难点】 (1)三值逻辑普通语言里的布尔型只有 true 和 false 两个值,这种逻辑体系被称为二值逻辑。
而 SQL 语言里,除此之外还有第三个值 unknown,这种逻辑体系被称为三值逻辑(three-valued logic)。关系数据库里引进了NULL,所以不得不同时引进第三个布尔值(但是 unknown 值不能被直接引用,直接使用的只能是 NULL)。
历史上最早提出三值逻辑(three-valued-logic)体系的是波兰的著名逻辑学家卢卡西维茨(Jan Lukasiewicz, 1878—1956)。在二十世纪二十年代,他定义了“真”和“假”之外的第三个逻辑值“可能”。
(2)谓词逻辑谓词逻辑中,原子命题分解成个体词和谓词。 个体词是可以独立存在的事或物,包括现实物、精神物和精神事三种。谓词则是用来刻划个体词的性质的词,即刻画事和物之间的某种关系表现的词。如“苹果”是一个现实物个体词,"苹果可以吃"是一个原子命题,“可以吃”是谓词,刻划“苹果”的一个性质,即与动物或人的一个关系。
所以,在谓词逻辑中,谓词的作用是,“判断(个体词)是否存在满足某种条件”,且返回真值(在三值逻辑里,即 TRUE/ FALSE/ UNKNOWN)。
在逻辑中,真值(truth value),又称逻辑值(logical value),是指示一个陈述在什么程度上是真的。在计算机编程上多称做布林值、布尔值。
拓展 —— 排中律(Law of Excluded Middle)就是指不认可中间状态,对命题真伪的判定黑白分明。是否承认这一定律被认为是古典逻辑学和非古典逻辑学的分界线。如,约翰的年龄,在现实世界中,“要么是20 岁,要么不是20 岁”——这样的常识在三值逻辑里却未必正确,也有可能未知,即 unknown。故,在 SQL 的世界里,排中律是不成立的。
谓词逻辑的出现具有划时代的意义,原因就在于为命题分析提供了函数式的方法。所以谓词可以通俗理解为函数,区别在于返回值:
函数的返回值有可能是数字、字符串或者日期等
谓词的返回值全都是真值
(3)谓词逻辑在 SQL 中的应用表常常被认为是行的集合,但从谓词逻辑的观点看,也可以认为是命题的集合。
同样,如 WHERE 子句,其实也可以看成是由多个谓词组合而成的新谓词。只有能让WHERE 子句的返回值为真的命题,才能从表(命题的集合)中查询到。
(4)SQL 中的谓词 —— 比较谓词=、<>、>=、>、<=、<
不等于也可以写作 != ,但是为了兼容性,还是推荐使用 标准sql 里的 <>。
(5)SQL 中的谓词 —— 其他谓词1、LIKE
2、BETWEEN
如:WHERE sale_price BETWEEN 100 AND 1000;
左闭右闭
3、IS NULL、IS NOT NULL
判断是否为 NULL 就不要用 <> 了,而是用这个。
4、限定谓词 - IN (ANY)
IN 是多个 OR 的简便用法,如 "col" IN (320, 500, 5000); 或 200 IN ("col1", "col2", "col3");
IN 还有个别称叫 ANY,为了跟下面的 ALL 对应。
5、限定谓词 - ALL
ALL 是 多个AND 的简便用法,如 "col" ALL (320, 500, 5000); 或 200 ALL ("col1", "col2", "col3");
拓展:推荐使用极值函数代替 ALL
SELECT * FROM Class_A WHERE age < ( SELECT MIN(age) FROM Class_B WHERE city = '东京' );推荐原因:极值函数在统计时会把为 NULL 的数据排除掉,避免出错。
ALL 跟 极值函数在语义上还是有细微区别的:
● ALL 谓词:他的年龄比在东京住的所有学生都小
● 极值函数:他的年龄比在东京住的年龄最小的学生还要小
但是极值函数也有隐患,极值函数(聚合函数)在输入为空表(空集)时会返回 NULL。
建议:使用 COALESCE 函数将极值函数返回的 NULL 处理成合适的值。
很像 lodash 的 get 方法,给个返回的默认值。
6、EXISTS