本笔记为阿里云天池龙珠计划SQL训练营的学习内容,链接为:https://tianchi.aliyun.com/specials/promotion/aicampsql
视图是一张虚拟的表,其上为了将频繁使用的select语句保存提高效率,增强数据保密性,降低数据冗余。
创建视图一般不使用order by语句,因为视图的数据行没有顺序;在 MySQL中视图的定义是允许使用 ORDER BY 语句的,但是若从特定视图进行选择,而该视图使用了自己的 ORDER BY 语句,则视图定义中的 ORDER BY 将被忽略。
视图的结构调整和删除创建其实都可以简单理解为是将表的语句中的table换成view;对视图的操作就是对底层基础表的操作,所以在修改时只有满足底层基本表的定义才能成功修改。
如果原表可以更新,那么 视图中的数据也可以更新。反之亦然,如果视图发生了改变(因为视图的改变只能改变其窗口看到的内容,不能改视图外的数据),而原表没有进行相应更新的话,就无法保证数据的一致性了。
子查询指一个查询语句嵌套在另一个查询语句内部的查询,是将用来定义视图的 SELECT 语句直接用于 FROM 子句当中。其中AS studentSum可以看作是子查询的名称,而且由于子查询是一次性的,所以子查询不会像视图那样保存在存储介质中, 而是在 SELECT 语句执行之后就消失了。
虽然嵌套子查询可以查询出结果,但是随着子查询嵌套的层数的叠加,SQL语句不仅会难以理解而且执行效率也会很差,所以要尽量避免这样的使用。
在子查询中像标量子查询,嵌套子查询或者关联子查询可以看作是子查询的一种操作方式即可。
不同的是标量子查询指的是只返回一行一列的值,关联子查询可以理解为根据表关联进行了分组然后根据分组返回一行一列的值;前者适合查询销售单价高于平均销售单价的商品,后者则是适合各商品种类中高于该商品种类平均销售单价的商品。
函数大致分为如下几类:算术函数 (用来进行数值计算的函数);字符串函数 (用来进行字符串操作的函数);日期函数 (用来进行日期操作的函数);转换函数 (用来转换数据类型和值的函数);聚合函数 (用来进行数据聚合的函数)。
函数种类很多,靠人脑全部记住大可不必,建议在日常使用中学习。
不同DBMS的日期函数语法各有不同,本文以mysql为例:
CURRENT_DATE – 获取当前日期
CURRENT_TIME – 当前时间
CURRENT_TIMESTAMP – 当前日期和时间
EXTRACT – 截取日期元素
语法:EXTRACT(日期元素 FROM 日期)
使用 EXTRACT 函数可以截取出日期数据中的一部分,例如“年”,“月”,或者“小时”“秒”等。该函数的返回值并不是日期类型而是数值类型
转换”这个词的含义非常广泛,在 SQL 中主要有两层意思:一是数据类型的转换,简称为类型转换,在英语中称为cast;另一层意思是值的转换。
CAST – 类型转换
COALESCE – 将NULL转换为其他值
语法:COALESCE(数据1,数据2,数据3……)
COALESCE 是 SQL 特有的函数。该函数会返回可变参数 A 中左侧开始第 1个不是NULL的值。参数个数是可变的,因此可以根据需要无限增加。
在 SQL 语句中将 NULL 转换为其他值时就会用到转换函数。
谓词就是返回值为真值的函数。包括TRUE / FALSE / UNKNOWN。
谓词主要有以下几个:
LIKE–模糊匹配
BETWEEN–在什么和什么之间,左右均闭合
IS NULL、IS NOT NULL–是null,不是null
IN–该字段的数据包含在另外一组数据中(in和not in无法取出为null的数据)
EXISTS–这一行的数据是否是另外许多行的数据中一行
CASE 表达式是在区分情况时使用的,执行时,依次判断 when 表达式是否为真值,是则执行 THEN 后的语句,如果所有的 when 表达式均为假,则执行 ELSE 后的语句。
无论多么庞大的 CASE 表达式,最后也只会返回一个值。
ELSE 子句也可以省略不写,这时会被默认为 ELSE NULL。但为了防止有人漏读,还是希望大家能够显示地写出 ELSE 子句,此外, CASE 表达式最后的“END”是不能省略的。