《SQL基础教程》+ 《SQL进阶教程》 学习笔记 (5)

例子:选取出 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)三值逻辑

普通语言里的布尔型只有 truefalse 两个值,这种逻辑体系被称为二值逻辑。

而 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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygdwg.html