复杂一点的查询

视图

视图的定义是从一个或几个基本表导出来的表,它与基本表不同,是一个虚表,在数据库中,视图就像一个窗口,表的数据变化了,视图的数据也就变化了。

视图与表的区别:
是否保存了实际的数据!!!

为什么会存在视图?

  1. 通过定义视图可以将频繁使用的 SELECT 语句保存以提高效率。
  2. 通过定义视图可以使用户看到的数据更加清晰
  3. 通过定义视图可以不对外公开数据表全部字段,增强数据的保密性
  4. 通过定义视图可以降低数据的冗余

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

Guess you like

Origin blog.csdn.net/lhrfighting/article/details/120423344