视图
视图的定义是从一个或几个基本表导出来的表,它与基本表不同,是一个虚表,在数据库中,视图就像一个窗口,表的数据变化了,视图的数据也就变化了。
是否保存了实际的数据!!!
为什么会存在视图?
- 通过定义视图可以将频繁使用的 SELECT 语句保存以提高效率。
- 通过定义视图可以使用户看到的数据更加清晰。
- 通过定义视图可以不对外公开数据表全部字段,增强数据的保密性。
- 通过定义视图可以降低数据的冗余。
SQL 语言建立视图的一般语句如下:
CREATE VIEW <视图名称>(<列名1>,<列名2>,...)
AS <子查询>
我们现在有一张表,数据如下:
我们在 student 表的基础上创建一个视图,如下:
CREATE VIEW stusum(性别,cou)
AS
SELECT 性别, COUNT(*)
FROM student
GROUP BY 性别;
查看视图数据:
SQL 语言修改视图结构的基本语法如下:
ALTER VIEW <视图名> AS <SELECT语句>
现在我们将之前创建的stusum视图进行修改:
ALTER VIEW stusum
AS
SELECT 性别,班级,年龄,成绩
FROM student
WHERE 年龄 > 17;
查看修改后的视图数据:
对于一个视图来说,如果包含以下结构的任意一种都是不可以被更新的:
- 聚合函数 SUM()、MIN()、MAX()、COUNT() 等。
- DISTINCT 关键字。
- GROUP BY 子句。
- HAVING 子句。
- UNION 或 UNION ALL 运算符。
- FROM 子句中包含多个表。
视图归根结底还是从表派生出来的,因此,如果原表可以更新,那么 视图中的数据也可以更新。反之亦然,如果视图发生了改变,而原表没有进行相应更新的话,就无法保证数据的一致性了。
我们改一下刚刚的视图:
UPDATE stusum
SET 成绩=100
WHERE 年龄=20;
查看视图:
可见在没有以上的结构是可以更新视图数据的。并且在原表的数据也更新了!
注意:这里虽然修改成功了,但是并不推荐这种使用方式。而且我们在创建视图时也尽量使用限制不允许通过视图来修改表
SQL 删除视图的语法如下:
DROP VIEW <视图名1> [ , <视图名2> …]
当我们执行如下语句,即可删除之前创建的视图:
DROP VIEW stusum;
子查询
子查询即一个查询嵌套一个或多个查询,先从最里层开始,依次向外查询得到结果。
比如我们查询之前的student表,查询成绩大于90的姓名和班级(emm,例子举的不太好)
SELECT 姓名,班级
FROM (
SELECT 姓名,性别,班级
FROM student
WHERE 成绩>90) AS gre;
各种各样的函数
- 算术函数(+、-、*、/、abs、mod、round)
- 字符串函数(concat、length、lower、replace、substring)
- 日期函数
CURRENT_DATE – 获取当前日期
CURRENT_TIME – 当前时间
CURRENT_TIMESTAMP – 当前日期和时间
EXTRACT – 截取日期元素 语法:EXTRACT(日期元素 FROM 日期)
- 转换函数
- CAST – 类型转换
语法:
CAST(转换前的值 AS 想要转换的数据类型)
- COALESCE – 将NULL转换为其他值
语法:
COALESCE(数据1,数据2,数据3……)
该函数会返回可变参数 A 中左侧开始第 1个不是NULL的值 - 聚合函数 (用来进行数据聚合的函数)
谓词
谓词就是返回值为真值的函数。包括TRUE / FALSE / UNKNOWN
。
- LIKE
用来进行字符串的匹配,常和%、_一起用
- BETWEEN
常和and一起使用,代表在某个范围
- IS NULL、IS NOT NULL
判断是否为空或不为空
- IN
实际上是多个or的缩写
- EXISTS
只有True和False,判断是否存在满足某种条件的记录
- %
表示任意长度的字符串
- _
表示任意单个字符
CASE 表达式
语法:
CASE WHEN <求值表达式> THEN <表达式>
WHEN <求值表达式> THEN <表达式>
WHEN <求值表达式> THEN <表达式>
.
.
.
ELSE <表达式>
END
上述语句执行时,依次判断 when 表达式是否为真值,是则执行 THEN 后的语句,如果所有的 when 表达式均为假,则执行 ELSE 后的语句。ELSE 子句也可以省略不写,这时会被默认为 ELSE NULL