SQL复习04 | 复杂查询

1. 视图

视图和表的区别:

  • 表保存的是实际的数据
  • 视图保存的是SELECT语句

视图的优点:

  1. 视图无需保存数据,可节省存储设备的容量
  2. 可以将频繁使用的SELECT语句保存成视图,可大大提高效率

1.1 创建视图

CREATE VIEW 视图名称(<视图列名1>, <视图列名2>, ……) 
AS 
<SELECT 语句> 
  • AS不能省略
  • 多重视图,以视图为基础创建的视图(会降低SQL的性能,不建议使用)

1.2 视图的限制

(一)不能使用ORDER BY子句

在定义视图时,通常不允许使用F语句,因为ORDER BY只对查询结果进行排序。而视图本身只是对一个已经存在的查询结果的引用,不涉及对数据的修改操作,因此ORDER BY语句是没有实际意义的。

注意:这不是一个通用的语法,但在某些DBMS中可以在视图中使用ORDER BY子句,如PostgreSQL

(二)对视图进行更新

如果定义视图的SELECT语句能够满足某些条件,那么这个视图就可以被更新。

  1. SELECT子句中未使用DISTINCT
  2. FROM子句中只有一张表
  3. 未使用GROUP BY子句
  4. 未使用HAVING子句

视图是从表派生出来的,因此,原表可以更新,那么视图中的数据也可以更新。反之亦然,如果视图发生了变化,而原表没有进行相应更新的话,就无法保证数据的一致性

  • 视图和表需要同时更新,因此通过汇总得到的视图无法进行更新。

1.3 删除视图

DROP VIEW 视图名称 ;
  • 删除视图只会删除视图的定义,不会删除视图所引用的表中的数据

  • PostgreSQL中,如果删除以视图为基础创建出来的多重视图,由于存在关联的视图,需要使用如下语法:

    DROP VIEW <视图名称> CASCADE;
    

2. 子查询

子查询是一张一次性的视图,就是将用来定义视图的SELECT语句直接用于FROM子句当中

  • 子查询作为内层查询会首先执行
  • 避免使用多层嵌套的子查询
  • 子查询的名称需要使用AS关键字,但在Oracle中需要省略

2.1 标量子查询

标量子查询就是返回单一值的子查询

  • 必须而且只能返回1行1列的结果
  • 标量子查询的返回值可以用在=或者<>这样需要单一值的比较运算符之中

2.2 标量子查询的书写位置

  • 能够使用常数或者列名的地方都可使用,如SELECT、GROUP BY、HAVING、ORDER BY等子句

2.3 标量子查询时的注意事项

  1. 注意返回值:标量子查询必须只返回一个单一值,并且必须与要查询的行一一对应。
  2. 注意操作符:使用标量子查询的运算符是子查询运算符,常用的有=、>、<、>=、<=、IN、BETWEEN等。
  3. 子查询嵌套:标量子查询可以嵌套在另一个查询中使用,但是要注意保证子查询只返回一个结果。
  4. 性能问题:标量子查询的性能问题需要考虑,在使用时应尽可能避免使用在大型数据集上的查询,否则可能会导致性能问题。
  5. 数据类型问题:标量子查询返回的数据类型必须与要查询的列的数据类型兼容,否则会产生错误或类型转换问题。
  6. 注意空值(NULL):使用标量子查询进行查询时必须考虑到空值的情况,因为子查询可能返回空结果,导致查询结果不准确。
  7. 子查询的过滤条件:在使用子查询时,应该加上必要的过滤条件使子查询返回的数据结果满足业务需求。

3. 关联子查询

  • 在细分组内进行比较时,需要使用关联子查询

关联子查询常见应用场景:

  1. 条件限制

不同的数据查询之间存在不同的条件限制,也就是一些数据之间存在联系。这个时候,如果使用子查询或联结查询就不能实现,而使用嵌套查询则是一个不错的选择。

  1. 关联两个或多个表的数据

当需要从两个或多个表中获取数据时,可以使用关联子查询来实现。这时候典型的情况是,一个表中有主键(或外键),而另一个表中存储的是它的详细数据,这个时候关联这两个表就是必要的。

  1. 数据输出的定制性更高

如果需要对查询结果进行一些更为复杂的处理,例如排序、条件过滤等,关联子查询就是一种灵活的解决方法。关联子查询可以让你更好地控制查询结果的数量、类型、处理方式等,形成适合当前场景的查询语句。

  1. 对数据进行分组

关联子查询还可以通过分组将数据分离,以便更容易统计汇总等。根据分组的规则,我们可以对数据进行更加细致的操作,实现更为精细的数据过滤。

你可能感兴趣的:(#,SQL基础,sql,视图,子查询,标量子查询,关联子查询)