SQL Server 2008 中文版标准教程阅读笔记 -- 第二章


增强 XQuery

declare @x xml
set @x = 
'<Invoices>
    <Invoice>
        <Customer>Zhang San</Customer>
        <Items>
            <Item ProductID="2" Price="1.99" Quantity="1" />
            <Item ProductID="3" Price="2.99" Quantity="2" />
            <Item ProductID="5" Price="1.99" Quantity="1" />
        </Items>
    </Invoice>
    <Invoice>
        <Customer>Li Si</Customer>
        <Items>
            <Item ProductID="2" Price="1.99" Quantity="1" />
        </Items>
    </Invoice>
</Invoices>'


select @x.query(
    '<Orders>
    {
        for $invoice in /Invoices/Invoice
        let $count := count($invoice/Items/Item)
        order by $count
        return
        <Order>
            {$invoice/Customer}
            <ItemCount>{$count}</ItemCount>
        </Order>
    }
    </Orders>'
)

增强 XML DML

使用 XQuery 表达式对 XML 数据执行操作一样,XML 数据类型支持 XML DML 表达式,通过它的 Modify 方法来支持 Insert、Replace value of 和 Delete。还可以使用这些 XML DML 表达式来操纵一个 XML 列或变量中的 XML 数据。

declare @BookList xml
set @BookList = 
'
    <Books>
        <Book> C# 2008 入门经典</Book>
        <Book> 网络服务器安全配置 </Book>
    </Books>
'

declare @newBook xml
set @newBook = '<Book>数据库系统原理与应用教程</Book>'
set @BookList.modify('insert sql:variable("@newBook") as last into (/Books)[1]')

select @BookList

用户自定义标数据类型

使用 SQL Server 2008 的表类型时,有如下约束

  • 用户自定义表类型不能作为表的列或者用户自定义类型的域
  • 基于用户自定义表类型的别名类型
  • 不允许 NOT FOR REPLICATION 选项
  • CHECK 约束需要一个计算列
  • 在计算列上的主键必须包含 NOT NULL 和 PERSISTED 约束
  • 不能在用户自定义表类型上创建非簇索引。除非索引是创建 PRIMARY KEY 或 UNIQUE 约束的返回值
  • 不能指定 DEFAULT 值
  • 一旦用户自定义表类型被创建就无法更改
  • 如果没有定义用户自定义表类型上的计算列,则用户自定义函数无法调用

    create type LocalTableType as table (LocalName varchar(50), CostRate INT) go

SELECT 语法

SELECT 语句是一个查询表达式,包括 SELECT、FROM、WHERE、GROUP BY 和 ORDER BY 子句,具有数据查询、统计、分组和排序的功能。

完整语法

SELECT [ALL|DISTINCT] select_list
[INTO new_table]
From table_source
[WHERE search_conditions]
[GROUP BY group_by_expression]
[HAVING search_conditions]
[ORDER BY order_expression [ASC|DESC]]

执行顺序

  1. FROM 子句
  2. [WHERE 子句]
  3. [GROUP BY 子句]
  4. [HAVING 子句]
  5. SELECT 子句
  6. [ORDER BY 子句]

一个语句中最多可使用 256 个表源,单个查询可能不支持最多有 256 个表源。

WHERE 子句

按行为单位,逐个检查每个行是否满足条件,将不满足的行筛选掉。

字符匹配符

  • % 任意多个字符
  • _ 单个字符
  • [] 指定范围内的单个字符
  • [^] 不在指定范围内的单个字符

GROUP BY 子句

将查询结果按照某一列数据值进行分类

GROUP BY group_by_expression [WITH ROLLUP|CUBE]
  • ROLLUP 只返回第一个分组条件指定的列的统计行,如果改变列的顺序就会使返回的结果行数据发生变化。
  • CUBE 是 ROLLUP 的扩展,表示出了返回由 GROUP BY 子句指定的列外,还返回按组统计的行

在使用 GROUP BY 子句时,将 GROUP BY 子句中的列称为分割列或分组列,而且必须保证 SELECT 语句中的列是可以计算的值并且在 GROUP 列表中。

通常用于对某个子集或其中的一组数据,而不是对整个数据集中的数据进行合计运算。在 SELECT 语句中指定的列必须是 GROUP BY 子句中的列明或者被聚合使用的列,并且在 GROUP BY 子句中必须使用列的名称而不能使用 AS 子句中指定的列的别名。

HAVING 子句

指定组或聚合的搜索条件,通常与 GROUP BY 子句一起使用。

使用规则:

  • 如果指定了 GROUP BY 子句,则 HAVING 子句的查询条件将应用于 GROUP BY 子句创建的组。
  • 如果指定了 WHERE 子句而没有指定 GROUP BY 子句,则 HAVING 子句的查询条件将应用于 WHERE 子句的输出结果集。
  • 如果既没有指定 WHERE 子句又没有指定 GROUP BY 子句,则 HAVING 子句的查询条件将应用于 FROM 子句的输出结果集。

HAVING 子句中可以包含聚集函数,WHERE 子句不可以,而且 HAVING 子句中的每一元素都必须出现在 SELECT 语句的列表中。

JOIN 连接

遵循的基本原则

  • SELECT 子句列表中,每个目标列前面都要加上基表名称
  • FROM 子句应包括所有使用的基表
  • WHERE 子句应该定义一个同等连接

内连接

使用比较运算符进行多个基表键数据的比较操作,并且列出这些基表中与连接条件相匹配的所有数据行。一般使用 INNER JOIN 或 JOIN 关键字指定,它是连接查询默认的连接方式

use SalaryMS
select Name, Gender, Department  from tbEmployee
join tbDepartment on tbEmployee.DepartmentID = tbDepartment.ID

内连接有返回信息的条件是当且仅当至少有一个同属于两个表的行符合连接条件。内连接从第一个表中消除与另一个表中任何不匹配的行。

外连接

外连接返回 FROM 子句中至少一个表或视图中的所有行,只要这些行符合任何搜索条件。因为在外连接中参与连接的表有主从之分,以主表的数据行去匹配从表中的数据行,如果符合连接条件则直接返回到查询结果集中;如果主表中的行在从表中没有找到匹配的行,主表的行仍然保留并返回到查询结果中,相应的从表中的行被填上空值后也返回到查询结果中。

外连接类型

  • 左外连接(LEFT OUTER JOIN) 返回所有匹配行并从关键字 JOIN 左边的表中返回所有不匹配的行。
  • 右外连接(RIGHT OUTER JOIN) 返回所有匹配行并从关键字 JOIN 右边的表中返回所有不匹配的行。
  • 完全连接(FULL OUTER JOIN) 返回两个表中所有匹配行和不匹配行。

交叉连接 CROSS JOIN

当对两个基表使用交叉连接查询时,将生成来自这两个基表各行所有可能的组合。即在结果集中,两个基表中的每两个可能成对的行占一行。在交叉连接中,查询条件一般限定在 WHERE 子句中,查询生成的结果集可分以下两种情况。

  • 不使用 WHERE 子句 返回的结果集是被连接的两个基表所有行的笛卡儿积
  • 使用 WHERE 子句 返回的结果集是被连接的两个基表所有行的笛卡儿积减去 WHERE 子句条件搜索到的数据的行数。

自连接 INNER JOIN

自连接是指一个表与自身相连接的查询。自连接操作通过给基表定义别名的方式来实现。实质上,这种自连接方式与两个表的连接操作完全相似,只是在每次列出这个表时为它命名一个别名。

在自连接中可以使用内链接或外连接等连接方式。

联合查询

将多个不同的查询结果连接在一起组成一组数据的查询方式。联合查询使用 UNION 关键字连接各个 SELECT 子句,将两个或者更多的查询结果集组合为单个结果集,该结果集包含所有查询结果集中的全部行数据。联合查询不同于对两个表中的列进行连接查询,前者是组合两个表中的行,后者是匹配两个表中的列数据。

语法格式:

SELECT select_list FROM TABLE table_source [WHERE search_conditions] { UNION [ALL] SELECT select_list FROM table_source [WHERE search_conditions] } [ORDER BY order_expression]

使用 ALL 表示返回全部满足匹配的结果,不使用,则在返回结果中删除满足匹配的重复行。

在使用 UNION 关键字进行联合查询时,应保证每个联合查询语句的选择列表中具有相同数量的表达式,并且每个查询选择表达式应具有相同的数据类型,或者可以自动将它们转换为相同的数据类型,在自动转换时,对于数值类型,系统将低精度的数据类型转换为高精度的数据类型。

使用子查询

子查询和连接查询一样提供了使用单个查询操作多个表中数据的方法。子查询在其他查询结果的基础上提供了一种有效的方式来表示 WHERE 子句的条件。

子查询的 3 种类别:

  1. 返回多行的子查询
    • IN 关键字:用来判断一个表中指定列的值是否包含在已定义的列表或另一个表中。
    • EXISTS 关键字:表示子查询不需要返回多行数据,而只要返回一个真值或假值
    • 比较运算符:与使用 IN 关键字引入的子查询一样,由比较运算符和一些关键字(ANY|ALL|SOME)引入的子查询返回一个值列表
  2. 返回单值的子查询 返回单值的子查询就是子查询的查询结果只返回一个值,然后将一列值与这个返回的值进行比较。在返回单值的子查询中,比较运算符不需要使用 ANY、SOME 等关键字,在 WHERE 子句中可以使用比较运算符来连接子查询。
  3. 嵌套子查询 在 SQL SERVER 中子查询可以是嵌套使用的,并且用户可以在一个查询中嵌套任意多个子查询,即一个子查询中还可以包含另一个子查询,这种查询方式成为嵌套子查询。

INSERT

INSERT [INTO] table_or_view [(column_list)] VALUES (data_values)

Insert ... Select

使用 Insert ... Select 语句可以把其他数据表的行记录添加到现有的表中。使用 Insert ... Select 语句比使用多个单行的 Insert 语句效率要高得多。

遵循原则: - 在最外面的查询表中插入所有满足 SELECT 语句的行 - 必须检验要插入新行的表是否在数据库中 - 必须保证接受新值的表中列的数据类型与源表中相应列的数据类型一致。 - 必须明确是否存在默认值,或所有被忽略的列是否允许为空值。如果不允许空值,则必须为这些列提供值。

INSERT table_name
SELECT column_list
FROM table_list
WHERE search_conditions

在把数据值从一列复制到另一列时,值所在列不必具有相同的数据类型,只要插入目标表的值符合该表的数据限制即可。

使用 SELECT INTO 语句创建表

一个#代表会话临时表 两个#代表全局临时表

知识共享许可协议
《SQL Server 2008 中文版标准教程阅读笔记 -- 第二章》 常伟华 创作。
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议 | 3.0 中国大陆许可协议进行许可。

站内公告

A PHP Error was encountered

Severity: Core Warning

Message: PHP Startup: zip: Unable to initialize module Module compiled with module API=20060613 PHP compiled with module API=20090626 These options need to match

Filename: Unknown

Line Number: 0

Backtrace: