34、子查询:子查询就是讲用来定义视图的SELECT语句直接用于FROM子句中。但是子查询是一次性的,因此不会像视图那样保存在存储介质当中,而是在执行完SELECT之后就消失了。
之前我们定义的视图的语句是这样的。
CREATE VIEW ProductSum (product_type,cnt_product)
AS SELECT product_type ,COUNT(*) FROM 表名 GROUP BY product_type ;
然后使用这个视图的语句是这样的。 SELECT product_type,cnt_product FROM ProductSum ;
这是对应的子查询的语句,SELECT product_type,cnt_product FROM( SELECT product_type ,COUNT(*) FROM 表名 GROUP BY product_type)AS ProductSum ;它和上面执行视图语句的结果是一样的,其实就是定义视图的SELECT语句直接用于FROM子句中。AS ProductSum 就是这个子查询的名称(在这个例子中和视图的名字是一样的),执行完SELECT之后就消失了。
另外要注意的是子查询中是SELECT语句的嵌套,执行顺序是 先内层SELECT 再外层SELECT 。在原则上子查询的层数是没有限制的,但是随着嵌套层数的增加,SQL语句会变得越来越难读懂,而且性能也会变差,所以尽量避免多次嵌套的子查询。
35、标量子查询 :就是返回单一值的子查询。(必须而且只能返回1行1列的结果!),由于返回的是单一的值,所以标量子查询几乎在所有的地方都可以使用。
例如:SELECT procuct_id,product_name,sale_price FROM Product WHERE sale_price > (SELECT AVG(sale_price) FROM Product ); >号后面的即为 标量子查询。
36、关联子查询
上一个例子中的SQL语句 :SELECT procuct_id,product_name,sale_price FROM Product WHERE sale_price > (SELECT AVG(sale_price) FROM Product ); 我们通过这个语句可以查询出来,表里面大于 所有商品售价平均值的东西。但是我们现在有了新的需求,假如表里面有3组商品, 每组商品有若干个,我们要求出每组里面哪些商品大于了该组的平均售价。如果是这样写的话,就会发生错误。SELECT procuct_id,product_name,sale_price FROM Product WHERE sale_price > (SELECT AVG(sale_price) FROM Product GROUP BY product_type ); 错误的原因就是:后面不是标量子查询,它返回的值有3个。可是这3个值,都是我们想用的值,那么SQL语句该怎么写呢?
SELECT procuct_id,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 );
当中, WHERE P1.product_type = P2.product_type 这句话就是关键。因为2次都是查询的一个表,P1 ,P2只是为了区分使用的别名。
关联子查询3个知识点 :1. 对细分的组内进行比较时,用关联子查询。 2. 关联子查询可以对表中的数据进行切分 3. 结合的条件一定要写在子查询中。
37、函数 。 函数的种类很多,大致分为算数函数,字符串函数,日期函数,转换函数和聚合函数。这里介绍常用的函数。
算数函数:
37.1 绝对值函数。ABS(数值)
37.2 求余函数 。 MOD(被除数,除数)
37.3 四舍五入函数。 (对象数值,保留的小数的位数)
字符串函数:
字符串拼接函数。 字符串1 | | 字符串2
求字符串长度函数。 LENGTH(字符串)
小写转换函数。 LOWER(字符串)
字符替换函数。 REPLACE(对象字符串,替换前的字符串,替换后的字符串)
字符串的截取函数。 SUBSTRING(对象字符串 FROM 截取的起始位置 FOR 截取的字符数)
大写转换函数。 UPPER(字符串)
日期函数:
当前日期函数 。 CURRENT_DATE
当前时间函数。 CURRENT_TIME
当前日期和时间。CURRENT_TIMESTAMP
截取日期元素。 EXTRACT(日期元素 FROM 日期)
转换函数:
类型转换函数。 CAST(转换前的值 AS 想要转换的数据类型)
将NULL转换为其他值。 COALESCE(数据1,数据2,数据3....)