六安市建设局网站凡科网小程序
1. 视图
视图和表的区别:
- 表保存的是实际的数据
- 视图保存的是
SELECT
语句
视图的优点:
- 视图无需保存数据,可节省存储设备的容量
- 可以将频繁使用的
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
语句能够满足某些条件,那么这个视图就可以被更新。
SELECT
子句中未使用DISTINCT
FROM
子句中只有一张表- 未使用
GROUP BY
子句 - 未使用
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 标量子查询时的注意事项
- 注意返回值:标量子查询必须只返回一个单一值,并且必须与要查询的行一一对应。
- 注意操作符:使用标量子查询的运算符是子查询运算符,常用的有
=、>、<、>=、<=、IN、BETWEEN
等。 - 子查询嵌套:标量子查询可以嵌套在另一个查询中使用,但是要注意保证子查询只返回一个结果。
- 性能问题:标量子查询的性能问题需要考虑,在使用时应尽可能避免使用在大型数据集上的查询,否则可能会导致性能问题。
- 数据类型问题:标量子查询返回的数据类型必须与要查询的列的数据类型兼容,否则会产生错误或类型转换问题。
- 注意空值(NULL):使用标量子查询进行查询时必须考虑到空值的情况,因为子查询可能返回空结果,导致查询结果不准确。
- 子查询的过滤条件:在使用子查询时,应该加上必要的过滤条件使子查询返回的数据结果满足业务需求。
3. 关联子查询
- 在细分组内进行比较时,需要使用关联子查询
关联子查询常见应用场景:
- 条件限制
不同的数据查询之间存在不同的条件限制,也就是一些数据之间存在联系。这个时候,如果使用子查询或联结查询就不能实现,而使用嵌套查询则是一个不错的选择。
- 关联两个或多个表的数据
当需要从两个或多个表中获取数据时,可以使用关联子查询来实现。这时候典型的情况是,一个表中有主键(或外键),而另一个表中存储的是它的详细数据,这个时候关联这两个表就是必要的。
- 数据输出的定制性更高
如果需要对查询结果进行一些更为复杂的处理,例如排序、条件过滤等,关联子查询就是一种灵活的解决方法。关联子查询可以让你更好地控制查询结果的数量、类型、处理方式等,形成适合当前场景的查询语句。
- 对数据进行分组
关联子查询还可以通过分组将数据分离,以便更容易统计汇总等。根据分组的规则,我们可以对数据进行更加细致的操作,实现更为精细的数据过滤。