1
关系型数据库标准语言 — SQL
? SQL语言 --结构化查询语言 。
? SQL-92标准, 是由美国国家标准局
( ANSI) 于 1992年制定的 。
? 数据库厂商都对 SQL语言进行了扩展,
形成了扩展 SQL语言 。
例如,SQL Server的 Transact-SQL,
Oracle 的 PL/SQL,INFORMIX 的 ESQL等,
这里主要介绍标准 SQL 语言 。
2
常用运算符
? 算数运算符, +,-,*,/ (加、减、乘、除 )
? 逻辑运算符,=,>,<,>=,<= (等于、大于、
小于、大于等于、小于等于 )
? 连接运算符,||,AND,OR (联结、与、或 )
3
基本数据库对象的创建
? 表( table) 是数据库中最基本的结构,从逻
辑上讲它是一个二维结构,由若干行组成,每
一行由多个列构成
? 视图( view) 是建立在表之上的,根据用户需
求而设立的数据的逻辑表示方式。它是虚拟的,
并不表示任何物理数据,只是用来察看数据的
窗口而已。
? 索引( index) 是建立于一个基本表之上,用
于加快数据访问速度的一种结构。可以在一个
表上建立多个索引。
4
1,表的定义与修改
( 1)定义表的基本语句
CREATE TABLE table_name (
column_name1 datatype[column_constraint],
column_name2 datatype[column_constraint],...)
其中 table_name 为表名
column_name1,column_name2 为各列的名称
datatype 为数据类型,例如 int,char等
column_constraint 为各列的约束条件,例如 not
null(非空 )
5
例,下列语句创建一个 student表,并且限定 Name
为非空,Std_ID为主关键字
CREATE TABLE student (
Name varchar(30) NOT NULL,
Std_ID int Primary Key,
Sex varchar(10),
Faculty varchar(50),
class varchar(30) )
Varchar是可变长的字符类型,括号中的数字
为字符长度的最大值。
6
(2)修改表的基本语句
– 添加字段:
ALTER TABLE table_name ADD column_name
datatype [column_constraint]
– 删除字段:
ALTER TABLE table_name DROP COLUMN
column_name
其中,table_name 为表名
column_name 为待修改的字段名
datatype 为数据类型
column_constraint 为待修改的字段的约
束条件
7
例:利用下面语句在 student表增加 grade字段,却省
值为 0
ALTER TABLE student ADD grade int default 0
例:利用下面语句在 student表中删除擦 Faculty字段
ALTER TABLE student DROP COLUMN Faculty
(3)删除表的基本语句
DROP TABLE table_name
例:用下面语句删除 student表
DROP TABLE student
8
2,视图的定义与删除
(1)定义视图的基本语句
CREATE VIEW view_name [column_name1,
column_name2,… ] AS
select_statement
其中 view_name为视图名
column_name1,column_name2 为列名
select_statement 为 Select查询语句,用于
在基本表中检索出视图所需数据
9
例, 下列语句定义了一个名为 grade_list的视图,
包含 Std_ID,Name,grade三列,并且限
定 grade>=60
CREATE VIEW grade_list AS
SELECT Std_ID,Name,grade FROM
student WHERE grade>=60
10
( 2)删除视图的基本语句
DROP VIEW view_name
其中,view_name为视图名
例:利用下面语句删除 grade_list视图
DROP VIEW grade_list
11
3.索引的定义与删除
( 1)定义索引的基本语句
CREATE [UNIQUE] INDEX indexname ON
table_name(column_name1,
column_name2,… )
其中,indexname 为索引名
column_name1,column_name2 为字段名
例:利用下面语句在表 student上建立字段 Std_ID的索引,
名为 StdIDindex
CREATE UNIQUE INDEX StdIDindex ON stduent ( Std_ID )
12
( 2)删除索引的基本语句
DROP INDEX indexname
其中,indexname为 索引 名
例:利用下面语句删除 StdIDindex索引
DROP INDEX StdIDindex
13
SQL的数据操纵功能
SQL语言的数据操纵功能主要包括对数据
库 表、视图等对象 进行的
查询记录( Select)、
插入记录( Insert)、
更新记录( Update)、
删除记录( delete) 等操作。
14
1,查询与检索记录 (SELECT语句 ) 其简化形式为,
SELECT select_list [INTO new_table]
FROM table_name
[WHERE search_condition]
[GROUP BY expression]
[ORDER BY expression [ASC|DESC] ]
其中,select_list 为所选择列的列名
new_table 为一个新表
table_name 为信息来源表
WHERE的子句 search_condition 为约束条件
GROUP BY 的子句 expression 为分组条件
ORDER BY 的子句 expression 为排序条件,ASC|DESC
为升序或降序
15
16
17
18
例,从 NorthWind数据库的表 Products 中选择字段
ProductName和 UnitPrice 两列的所有值返回。
SELECT ProductName,UnitPrice FROM Products
? 以下为返回值:
ProductName UnitPrice
------------------------------------ ------------------
Chai 18.0000
Chang 19.0000
..................,
Chef Anton's Gumbo Mix 21.3500
...................
...................(以下省略)
(77 row(s) affected)
共有 77行记录。
19
例,下列语句除了从数据库的表中选择 ProductName
和 UnitPrice两列的所有值返回之外,还为各列
重新命名。
SELECT ProductName "产品名称 ",
UnitPrice "单价 " FROM Products
? 以下为返回值:
产品名称 单价
-------------------------------- ---------------------
Chai 18.0000
Chang 19.0000
Aniseed Syrup 10.0000
Chef Anton's Cajun Seasoning 22.0000
...................(以下省略)
20
(2)条件查询 --带 Where子句的查询
最基本的条件语句是判断某一个字段等于或不等于
某一个值,大于或小于某一个数等。可以用 =,<>,
>,<,>=,<= 等符号来进行判断。
例,在 Employees表中查找职位为 Sales
Representative 的雇员,并将其名称按照
,LastName,FirstName”的形式显示在重新命名的
列 employee中。
SELECT LastName+','+FirstName"employee",Title FROM
Employees Where Title='Sales Representative'
21
? 其返回结果为:
employee Title
-------------------- ----------------------
Davolio,Nancy Sales Representative
Leverling,Janet Sales Representative
Peacock,Margaret Sales Representative
Suyama,Michael Sales Representative
King,Robert Sales Representative
Dodsworth,Anne Sales Representative
(6 row(s) affected)
22
( 3)条件查询 — 在 Where子句中使用 BETWEEN…
AND … 限制条件
这是用来在为某一字段加限制范围的语法。常
用于价格、年龄等易于比较大小的数字字段。
23
例:下列语句从 Products中选出 UnitPrice在 25
与 26(包括 25和 26)之间的产品。
SELECT ProductName,UnitPrice FROM Products
where UnitPrice BETWEEN 25 and 26
其返回结果为:
ProductName UnitPrice
-------------------------- --------------
Grandma's Boysenberry Spread 25.0000
Nord-Ost Matjeshering 25.8900
Gravad lax 26.0000
(3 row(s) affected)
24
( 4)条件查询 --在 Where子句中使用 Like … 限
制条件
用来 选出某一字段含有特定字符 的记录,一般
与通配符 %(百分号),_(下划线)及 [](方
括号)连用。
通配符 意义
% 任意个数的任意字符
_ 任意单个字符
[] 可选括号内的任一字符
? 注意,% 和 _ 方法被 ANSI-SQL支持,[]方法
只被 SQL Server所支持。
25
例:下列语句从 Products表中选出以 A或 B开头的
产品返回给用户。
SELECT ProductName,UnitPrice FROM Products
where ProductName like "[A-B]%"
其返回结果为:
ProductName UnitPrice
--------------- ---------------
Aniseed Syrup 10.0000
Alice Mutton 39.0000
Boston Crab Meat 18.4000
(3 row(s) affected)
26
( 5)条件查询 --在 Where子句中使用 IN ( … )
限制条件
例:下列语句从 Employees表中选出职位是 Sales
Representative或 Sales Manager的所有雇员。
SELECT LastName+','+FirstName"employee",Title
FROM Employees
Where Title in ('Sales Representative','Sales Manager')
? 其返回结果为,
27
employee Title
--------------------- ------------------------
Davolio,Nancy Sales Representative
Leverling,Janet Sales Representative
Peacock,Margaret Sales Representative
Buchanan,Steven Sales Manager
Suyama,Michael Sales Representative
King,Robert Sales Representative
Dodsworth,Anne Sales Representative
(7 row(s) affected)
与下面的语句等价,返回结果集相同,其形式为:
SELECT LastName+','+FirstName"employee",Title FROM
Employees Where Title like ('Sales%')
28
( 6)带排序条件 Order by子句的查询
一般情况下,简单的查询所返回的记录是无序
的。为了将输出按照一个特定字段来排序,必
须指定一个 Order by子句。
例:下列语句从 Products表中选出所有记录的
ProductName和 UnitPrice字段,并按照
UnitPrice排序。
SELECT ProductName,UnitPrice FROM Products
Order by UnitPrice
29
其返回结果为,
ProductName UnitPrice
------------------------ ---------------------
Geitost 2.5000
GuaranáFantástica 4.5000
...................(中间省略)
Thüringer Rostbratwurst 123.7900
C?te de Blaye 263.5000
(77 row(s) affected)
30
( 7)集合函数的在查询语句中的使用
SQL提供了一些函数用于对整个数据集合进行
处理并将结果返回给用户。下表列除了一些称
之为, 集合函数, 的常用函数。
函数 描述
Sum() 对多个数值表达式求和
Avg() 对多个数值表达式求平均数
Min() 返回最小的数值表达式或有序串表达式
Max() 返回最大的数值表达式或有序串表达式
Count() 返回非空表达式的个数
Count(*) 返回找到的行数
31
例,下面的语句是从表 Products中选出以 A或 B开头
的产品,而后将他们的单价平均后显示在列 avg下
面,将他们的单价求和后显示在列 sum下面。
SELECT avg(UnitPrice)"avg",sum(UnitPrice)"sum"
FROM Products where ProductName like '[A-B]%'
? 以下为返回结果:
avg sum
--------------------- ---------------------
22.4666 67.4000
(1 row(s) affected)
32
例:下面的语句是从表 Products中求出以 A或 B开
头的产品的数目并返回。
SELECT count(*) FROM Products where
ProductName like '[A-B]% '
以下为返回结果:
-----------
3
(1 row(s) affected)
33
( 8) GROUP BY子句在查询语句中的使用
GROUP BY的作用是将返回的记录分组输出。
GROUP BY后面一般跟随记录的一个字段或一个
与记录相关表达式,凡是该字段或表达式结果
相同的记录都被分为一组。最终每一组只返回
一条记录。
因此。在表 Products中使用 SELECT ProductName
FROM Products GROUP BY CategoryID是非法
的,这是因为某一类商品( CategoryID值相同)
的 ProductName是各不相同的。因而无法合并
为一条记录。
34
例:下列语句计算表 Products各类商品的平均价,并分
组显示,
SELECT CategoryID,Avg(UnitPrice)"AvgPrice" FROM
Products GROUP BY CategoryID
其返回结果为:
CategoryID AvgPrice
----------- ---------------------
1 37.9791
2 23.0625
...................(中间省略)
8 20.6825
(8 row(s) affected)
35
( 9)子查询的使用
子查询是在 SELECT以及下面介绍的 UPDATE、
INSERT,DELETE等语句中表达式可以出现的地方,
用 SELECT语句代替,即将 SELECT语句嵌入到上述
基本语句中,并将嵌入语句的查询结果返回给上
一层语句作为进一步执行的基础。
36
例:下列语句首先从表 Products中查询商品组
CategoryID和各组平均价格 AvgPrice并将结果
放入临时表 a中,然后再从表 Categories(商品
分组表)和表 a中查询商品组名 CategoryName和
各组平均价格。在 FROM子句中嵌入了一个
SELECT语句。
SELECT CategoryName,a.AvgPrice FROM Categories,
(SELECT CategoryID,Avg(UnitPrice)"AvgPrice"
FROM Products GROUP BY CategoryID ) a
WHERE Categories.CategoryID=a.CategoryID
37
其返回结果为:
CategoryName AvgPrice
--------------- ---------------------
Beverages 37.9791
Condiments 23.0625
...................(中间省略)
Seafood 20.6825
(8 row(s) affected)
38
4,插入记录
在 SQL语言中,常用的向数据库中添加新记
录的方法主要有三种:利用 INSERT… VALUE语
句,INSERT… SELECT语句和 SELECT… INTO语句。
其中 INSERT… VALUE是最简单的、使用最多的
语句。
39
( 1) INSERT… VALUE语句
这条语句的功能是向一个表中添加一条新记录。
其简化的语法定义如下:
INSERT [INTO] table_name(column1,column2,… )
VALUES(value1,value2,… )
其中,table_name 为待添加记录的表名称
column1,column2,… 为新记录中待赋值的字
段名称
value1,value2,… 为新记录中待赋值字段的值
40
例:要向 Products表插入一新记录,新记录的
ProductName字段为 ’ Coca Cola’,UnitPrice为 2.0,
Discontinued为 0,则可使用下列语句:
INSERT INTO
Products(ProductName,UnitPrice,Discontinued)
VALUES('Coca Cola',2.0,0)
如果新加入的记录将为每个定义的字段赋值,则可省略
待赋值的字段列表 (column1,column2,… ),简写成
INSERT INTO table_name VALUES(value1,value2,… )
41
( 2) INSERT… SELECT语句
这条语句可以将源表中由 SELECT语句检索的结果(源表若
干记录的全部字段或部分字段的值)一次性加入到目标
表中。
其简化的语法定义如下:
INSERT INTO table_name SELECT column1,column2,…
FROM table_source [WHERE condition]
其中,table_name 为待添加记录的表名称
column1,column2,… 为源表中需要添加到新表
的若干字段名称
table_source 为记录来源表的名称
WHERE的子句用来限制选取记录的范围
42
例:首先定义一个新表 table1,包含 ProductName和
UnitPrice两个字段,且字段约束与表 Products中的字
段 ProductName和 UnitPrice的约束相同。下列语句从
表 Products中选取所有记录的字段 ProductName和
UnitPrice的值,添加到表 table1中。
INSERT INTO table1 SELECT
ProductName,UnitPrice FROM Products
结果,Products表中 ProductName和 UnitPrice字段的两
列值被加入到表 table1中。这里应注意的是,SELECT
子句查询的结果所包含的字段应满足表 table1对应字
段的约束条件(数据类型、字段非空等)。
43
(3)SELECT… INTO语句
这条语句的功能是创建一个新表,同时将 SELECT
语句从源表中检索的结果(源表若干记录的全
部字段或部分字段的值)加入到该表中。其简
化的语法定义如下:
SELECT column1,column2,… [INTO new_table]
FROM table_source
[WHERE condition]
其中,column1,column2,… 为源表中需要添加到新
表的若干字段名称
new_table 为创建的新表名称
table_source 为记录来源表的名称
WHERE的子句用来限制选取记录的范围
44
例:下列语句从 Products表中选取每一条记录的
ProductName,UnitPrice,Discontinued三个
字段的值,且限定 UnitPrice>50,生成一个新
表 Simple。
SELECT ProductName,UnitPrice,
Discontinued
INTO Simple FROM Products
WHERE UnitPrice>50
需要注意的是,这条语句只能创建新表并加入数
据,无法向已存在的表添加数据 。
45
5,更新记录
对于数据库表中记录的修改是经常要做的事。
在修改表中的记录时,最常用的语句就是
UPDATE语句。其简化的语法定义如下:
UPDATE table_name SET column =
expression[,…] [WHERE condition]
其中,table_name 为待修改表名称
column 为待修改字段的名称
expression 表达式的值被赋给待修改字段
WHERE子句 condition 为限制更新记录范围的条件
46
例:要将 Employees表中的职工 ID号为 7的先生的职位变
为 Vice Manager,使用命令:
UPDATE employees SET Title='Vice Manager'
WHERE EmployeeID=7
这时,可以利用 SELECT命令查询 EmployeeID=7的记录,
结果为:
EmployeeID LastName FirstName Title
---------------------------------------------------------------------
7 King Robert Vice Manager
可以看到其 Title字段的值从 Sales Representative变成
了 Vice Manager。
47
6,删除记录
在 SQL语言中,DELETE语句的作用是在数据库
表中删除记录的。
注意,即使 DELETE语句在表中删除了所有记录,
这个表对象仍然存在。 DELETE语句并没有删除
表的定义及相关索引。
其简化的语法定义如下:
DELETE table_name [WHERE condition]
其中,table_name 为待删除记录的表名称
WHERE子句 condition 为限制删除记录范围的条件
48
例:下列语句将把 Employees表中所有记录删除。
DELETE Employees
例:下列语句将把表 Products中所有 UnitPrice<50
的记录删除。
DELETE Products WHERE UnitPrice<50
完成后,运行命令 SELECT ProductName,UnitPrice FROM
Products结果为:
ProductName UnitPrice
----------------------------------- ---------------------
Mishi Kobe Niku 97.0000
Carnarvon Tigers 62.5000
Sir Rodney's Marmalade 81.0000
Thüringer Rostbratwurst 123.7900
49
C?te de Blaye 263.5000
Manjimup Dried Apples 53.0000
Raclette Courdavault 55.0000
(7 row(s) affected)
原 Products表从 77条记录减少到 7条记录。
END