Download as pdf or txt
Download as pdf or txt
You are on page 1of 19

05 SQL:数据操作

5.1 SQL 简介
1. SQL语言是面向转换语言的例子,它将输入关系转换为所需的输出关系。

2. 作为语言,SQL包括两个主要部分:

数据定义语言(DDL):用于定义数据库结构和数据的访问控制。
数据操作语言(DML):用于检索和更新数据。
3. SQL 语言的特点:

非过程化语言:SQL 不需要指定数据的访问方法,用户只需描述所需的信息,不需给出获取
该信息的具体过程。
SQL 语言是无格式的,语句的每一部分不必固定在屏幕上的特定位置。
SQL 命令由标准英语单词组成, 如 CREAT TABLE、INSERT、SELECT等。例如:

5.2 SQL 命令
SQL 语句包括保留字和用户自定义字:

保留字是SQL语言的固定部分,有固定的含义,必须准确拼写且不能跨行拼写。
用户自定义字由用户自己定义(根据一定的语法规则),用于表示表、列、视图和索引等数据库对
象的名称。
用 “ ;” 来标识 SQL 语句的结束。

扩展的巴克斯范式(BNF)定义SQL语句:

大写字母用于表示保留字,必须准确拼写。
小写字母用于表示用户自定义字。
竖线(|)表示从选项中进行选择,例如a|b|c。
大括号表示所需元素,例如 { a }。
中括号表示可选择元素,例如[ a ]。
省略号(…)表示某一项可选择重复零到多次。

5.3 数据操作
SQL DML 语句有以下几种:

SELECT:用于查询数据库中的数据。
INSERT:用于将数据插入表中。
UPDATE:用于更新表中数据。
DELETE:用于删除表中数据。
5.3.1 简单查询

1. SELECT 语句用于检索并显示一个或多个数据库表中的数据。

2. SELECT 的形式
5.3.2 查询结果排序(ORDER BY 子句)

可以使用ORDER BY子句让查询结果按一定顺序显示。

ORDER BY子句包括所需排序的列标识符的列表,用逗号分开。列标识符可能是列名字或是列序号,列
序号是指列在SELECT列表中的位置,“1”标识列表中第一个(最左边)元素,“2”标识列表中第二个元素,以
此类推。
当被排序的列是表达式并且没有使用过AS子句赋予列将来可能引用的名字时,可以用列序号。ORDER
BY子句允许导出的行在任一列或多个列上按升序(ASC)或降序(DESC)排列,而不管列是否出现在查询结
果中。ORDER BY子句只能是SELECT语句的最后一个子句。

5.3.3 使用 SQL 聚集函数

ISO 标准定义了五个聚集函数:

这些函数只对表中的单个列进行操作,返回一个值。

COUNT、MIN 和 MAX 可以用于数值和非数值字段,而 SUM 和 AVG 只能用于数值字段。

除了 COUNT(*) 外,每一个函数首先要去掉空值,然后计算其非空值。

COUNT(*) 是 COUNT 的特殊用法,计算表中所有行的数目,而不管是否有空值或重复出现。

若需要在应用函数之前消除重复,则必须在函数中的列名前使用关键字 DISTINCT。 如果不需要去


掉重复,可以用关键字 ALL。DISTINCT 对 MIN 和 MAX 函数没有任何作用,而对 SUM 和 AVG
函数有效。查询中 DISTINCT 只能指定一次。

聚集函数只能用于 SELECT 列表和 HAVING 子句中。如果 SELECT 列表包括聚集函数,却没有使


用 GROUP BY 子句分组,那么 SELECT 列表的任何项都不能引用列,除了作为聚集函数的参数。

例如,下面的查询是非法的:

因为查询中没有 GROUP BY 子句,且 SELECT 列表中出现了列 staffNo,它并不是聚集函数的参


数。
5.3.4 查询结果分组(GROUP BY 子句)

通常报表中也需要有部分和,可用 GROUP BY 子句实现这种功能。

包括 GROUP BY 子句的查询称为分组查询,按 SELECT 列表中的列进行分组,每一组产生一个综合查询


结果。

GROUP BY 子句的列名又称为组列名。当使用 GROUP BY 时,SELECT 列表中的项必须每组都有单一


值。

SELECT 子句仅可包括以下内容:列名、聚集函数、常量、组合上述各项的表达式。 SELECT 子句中的所


有列除非用在聚集函数中,否则必须在 GROUP BY 子句中出现。反之,GROUP BY 子句中出现的列不
一定出现在 SELECT 列表中。
当 WHERE 子句和 GROUP BY 子句同时使用时,必须首先使用 WHERE 子句,分组由满足 WHERE 子
句查询条件的那些行为产生。

应用 GROUP BY 子句时,两个空值被认为是相等的,即如果两行在同一分组列上的值都为空值,并且
在不含空值的分组列上值相等,则这两行将被合并到同一组中。

分组约束(HAVING 子句)

1. HAVING 子句与 GROUP BY 子句一起使用,限定哪些分组将出现在最终查询结果中。


2. WHERE 子句将单个行过滤到查询结果中,而 HAVING 子句则将分组过滤到查询结果表中。
3. HAVING 子句使用的列名必须出现在 GROUP BY 子句列表中或包括在聚集函数中,实际中
HAVING 子句的条件运算至少包括一个聚集函数,否则可以把查询条件移到 WHERE 子句中来过滤
单个行。
4. 聚集函数不能用在 WHERE 子句中。
5.3.5 子查询

1. SELECT 语句可以完全嵌套在另一个 SELECT 语句中,内部 SELECT 语句(子查询)的结构用在外


部语句中以决定最后的查询结果。
2. 子查询可以被使用在外部 SELECT 语句的 WHERE 和 HAVING 语句中,也可以出现在 INSERT、
UPDATE 和 DELETE 语句中。
3. 子查询有三种类型:

标量子查询:返回单个列和单个行,即单个值,可用于任何需要单个值的地方。
行子查询:返回多个列,但只有单个行,可用于任何需要行值构造器的时候,如谓词中。
表子查询:返回多个行,每行有一个或多个列,用于需要一个表的情况,例如作为谓词 IN 的操作
数。

4. 子查询产生一个临时表,便于外部语句访问和利用。在 WHERE 子句和 HAVING 子句中,子查询可


以紧邻这关系运算符 。子查询本身通常包括在圆括号中。

5. 子查询应遵循如下规则:

ORDER BY 子句不能用于子查询,可用在最外面的 SELECT 语句中。


子查询 SELECT 列表必须由单个列名或表达式组成,除非子查询使用了关键词 EXISTS。
默认的情况下,子查询中列名取自子查询的 FROM 子句中给出的表,也可通过限定列名的方
法指定取自外查询的 FROM 子句中的表。
当子查询是比较表达式中的一个操作数时,子查询必须出现在表达式的右面。
5.3.6 ANY 和 ALL

1. 关键字 ANY 和 ALL 用于产生单个列的子查询。

若子查询前缀关键字 ALL,那么仅当子查询产生的所有值都满足条件时,条件才为真。
若子查询前缀关键字 ANY,那么子查询产生的任何一个或多个值满足条件时,条件就为真。
如果子查询是空值,ALL 条件返回真值,ANY 条件返回假值。

5.3.7 多表查询

1. 要从多个表中得出查询结果,可用子查询,也可用连接操作。如果最终结果表包括了多个表中的
列,则必须用连接操作。
2. 连接操作中,FROM 子句列出多个表名,可以用别名代替表名,表名之间用逗号分开。通常还要用
WHERE 子句来指明连接列。
如果两个表的查询不使用 WHERE 子句,那么 SQL 产生的查询结果就是两个表的笛卡尔乘积。事实上,
ISO 标准为笛卡尔乘积提供了特殊的 SELECT 语句格式:

ISO 标准提供的另一类连接操作是外连接,保留不满足连接条件的行:
5.3.8 EXISTS 和 NOT EXISTS

1. 关键字 EXISTS 和 NOT EXISTS 仅用于子查询中,返回结果为真/假。

当且仅当子查询返回的结果表至少存在一行时,EXISTS 为真。当子查询返回的结果表为假时
EXISTS为假。 NOT EXISTS 相反。
由于 EXISTS 和 NOT EXISTS 仅检查子查询结果表中是否存在行,所以子查询可查询任意数目
的列。
子查询通常用下列形式表示:

5.3.9 合并结果表(UNION、INTERSECT、EXCEPT)
5.3.10 数据库更新

修改数据库内容的三种 SQL 语句:

INSERT:向表中添加新的行。
UPDATE:修改表中现有的行。
DELETE:修改表中已有的行。

(一)向数据库中添加数据 INSERT
(二)修改数据库中的数据 UPDATE
(三)删除数据库中的数据 DELETE

You might also like