SQL 高级(6)

SQL 高级(6)

SQL VIEW(视图)

        视图是可视化的表。本章讲解如何创建、更新和删除视图。

SQL CREATE VIEW 语句

什么是视图?

        在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。
        视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表。
        注释:数据库的设计和结构不会受到视图中的函数、where 或 join 语句的影响。

SQL CREATE VIEW 语法

CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
        注释:视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用 SQL 语句来重建数据。

SQL CREATE VIEW 实例

        可以从某个查询内部、某个存储过程内部,或者从另一个视图内部来使用视图。通过向视图添加函数、join 等等,我们可以向用户精确地提交我们希望提交的数据。
        样本数据库 Northwind 拥有一些被默认安装的视图。视图 "Current Product List" 会从 Products 表列出所有正在使用的产品。这个视图使用下列 SQL 创建:
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products
WHERE Discontinued=No
        我们可以查询上面这个视图:
SELECT * FROM [Current Product List]
        Northwind 样本数据库的另一个视图会选取 Products 表中所有单位价格高于平均单位价格的产品:
CREATE VIEW [Products Above Average Price] AS
SELECT ProductName,UnitPrice
FROM Products
WHERE UnitPrice>(SELECT AVG(UnitPrice) FROM Products) 
        我们可以像这样查询上面这个视图:
SELECT * FROM [Products Above Average Price]
        另一个来自 Northwind 数据库的视图实例会计算在 1997 年每个种类的销售总数。请注意,这个视图会从另一个名为 "Product Sales for 1997" 的视图那里选取数据:
CREATE VIEW [Category Sales For 1997] AS
SELECT DISTINCT CategoryName,Sum(ProductSales) AS CategorySales
FROM [Product Sales for 1997]
GROUP BY CategoryName 
        我们可以像这样查询上面这个视图:
SELECT * FROM [Category Sales For 1997]
        我们也可以向查询添加条件。现在,我们仅仅需要查看 "Beverages" 类的全部销量:
SELECT * FROM [Category Sales For 1997]
WHERE CategoryName='Beverages'

SQL 更新视图

        您可以使用下面的语法来更新视图:
SQL CREATE OR REPLACE VIEW Syntax
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
        现在,我们希望向 "Current Product List" 视图添加 "Category" 列。我们将通过下列 SQL 更新视图:
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName,Category
FROM Products
WHERE Discontinued=No

SQL 撤销视图

        您可以通过 DROP VIEW 命令来删除视图。
SQL DROP VIEW Syntax
DROP VIEW view_name

SQL NULL 值

        NULL 值是遗漏的未知数据。
        默认地,表的列可以存放 NULL 值。
        本章讲解 IS NULL 和 IS NOT NULL 操作符。

SQL NULL 值

        如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新纪录或更新已有的记录。这意味着该字段将以 NULL 值保存。
        NULL 值的处理方式与其他值不同。
        NULL 用作未知的或不适用的值的占位符。
        注释:无法比较 NULL 和 0;它们是不等价的。

SQL 的 NULL 值处理

        请看下面的 "Persons" 表:
Id LastName FirstName Address City
1 Adams John   London
2 Bush George Fifth Avenue New York
3 Carter Thomas   Beijing
        假如 "Persons" 表中的 "Address" 列是可选的。这意味着如果在 "Address" 列插入一条不带值的记录,"Address" 列会使用 NULL 值保存。
        那么我们如何测试 NULL 值呢?
        无法使用比较运算符来测试 NULL 值,比如 =, <, 或者 <>。
        我们必须使用 IS NULL 和 IS NOT NULL 操作符。

SQL IS NULL

        我们如何仅仅选取在 "Address" 列中带有 NULL 值的记录呢?
        我们必须使用 IS NULL 操作符:
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NULL
        结果集:
LastName FirstName Address
Adams John  
Carter Thomas  
        提示:请始终使用 IS NULL 来查找 NULL 值。

SQL IS NOT NULL

        我们如何选取在 "Address" 列中不带有 NULL 值的记录呢?
        我们必须使用 IS NOT NULL 操作符:
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NOT NULL
        结果集:
LastName FirstName Address
Bush George Fifth Avenue
        在下一节中,我们了解 ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数。

SQL NULL 函数

SQL ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数

        请看下面的 "Products" 表:
P_Id ProductName UnitPrice UnitsInStock UnitsOnOrder
1 computer 699 25 15
2 printer 365 36  
3 telephone 280 159 57
        假如 "UnitsOnOrder" 是可选的,而且可以包含 NULL 值。
        我们使用如下 SELECT 语句:
SELECT ProductName,UnitPrice*(UnitsInStock+UnitsOnOrder)
FROM Products
        在上面的例子中,如果有 "UnitsOnOrder" 值是 NULL,那么结果是 NULL。
        微软的 ISNULL() 函数用于规定如何处理 NULL 值。
        NVL(), IFNULL() 和 COALESCE() 函数也可以达到相同的结果。
        在这里,我们希望 NULL 值为 0。
        下面,如果 "UnitsOnOrder" 是 NULL,则不利于计算,因此如果值是 NULL 则 ISNULL() 返回 0。
SQL Server / MS Access
SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0))
FROM Products
Oracle
        Oracle 没有 ISNULL() 函数。不过,我们可以使用 NVL() 函数达到相同的结果:
SELECT ProductName,UnitPrice*(UnitsInStock+NVL(UnitsOnOrder,0))
FROM Products
MySQL
        MySQL 也拥有类似 ISNULL() 的函数。不过它的工作方式与微软的 ISNULL() 函数有点不同。
        在 MySQL 中,我们可以使用 IFNULL() 函数,就像这样:
SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0))
FROM Products
        或者我们可以使用 COALESCE() 函数,就像这样:
SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0))
FROM Products

SQL 高级(6)

上一篇:SQL 高级(4)


下一篇:SQL 高级(3)