PostgreSQL基础知识(四)

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....)


















 

猜你喜欢

转载自blog.csdn.net/Akanarika520/article/details/81590277