3.1 SQL概述
3.2 数据定义语言
3.3 数据更新语言
3.4 数据查询语言
3.5 数据控制语言
3.6 嵌入式 SQL
3.7 事务处理
3.8 触发器
3.9 存储过程第三章 关系数据库的标准语言 SQL
SQL语言 1974年被提出,并首先在 IBM公司研制的 RDB原型系统
System R上实现。
1987年 6月,国际标准化组织 (ISO)将其采纳为 国际标准 (称
,SQL86”) 。
趋势,各种计算机 (微机、小型机、大型机 )上的 DBS,都采用
SQL作为共同的数据存取语言和标准接口。成为不同 DBS间互操作的基础。
可预见,在未来一段相当长的时间内,SQL仍将是 RDB的主流语言,而且在知识发现、人工智能、软件工程等领域,也具有广阔的应用前景。
SQL的发展历程

3.1 SQL概述
⑴ 数据定义语言( DDL )
用来定义 RDB的模式基本表、外模式和内模式,以实现对基本表、视图以及索引文件的定义、修改和删除等操作。
⑵ 数据操纵语言( DML )
数据查询,对 DB中的数据查询、统计、分组、排序等操作;
数据更新,数据的插入、删除、修改等数据维护操作。
⑶ 数据控制语言( DCL )
数据控制包括对基本表和视图的授权,完整性规则的描述等。
⑷ 嵌入式 SQL
规定了 SQL语句嵌入在宿主语言程序中使用的各种规则。
SQL的组成与功能
SQL的命令动词表:
SQL语言的特点
1.一体化,SQL集数据定义语言( DDL)、数据操纵语言
( DML)和数据控制语言( DCL)为一体。
2.两种使用方式,自含式和嵌入式自含式 SQL,能够独立地进行联机交互,用户只需在终端键盘上直接键入 SQL命令就可以对 DB进行操作;
嵌入式 SQL,能够嵌入到高级语言,如 C,COBOL、
FORTRAN,PL/1程序中来实现对 DB的数据存取操作,给程序员设计应用程序提供了很大的方便。
3.高度非过程化,只要求用户提出“干什么”,而无需指出“怎么干”; SQL语句操作的过程由系统自动完成。
SQL语言基础
SQL也有自己的数据类型、表达式、关键字和语句结构。当然和其他语言相比,SQL语言要简单的多类型 定义 说明
I N T,S M A L L I N T 定点整数
N U M E R I C,D E C I M A L 定点小数数值型
F L O A T,R E A L 等 浮点数
C H A R ( n ) 定长字符串,n < 2 5 5
字符串型 V A R C H A R ( n ) 不定长字符串,长度不超过 n 个字符
D A T E 日期
T I M E 时间型日期、时间型
T I M E S T A M P 日期时间型
B I T ( n ) 定长二进制位串二进制位串
B I T V A R ( n ) 变长二进制位串标准 SQL语言定义的数据类型
1.数据类型:
数值表达式值表达式 字符串表达式日期表达式逻辑表达式:
逻辑运算,NOT,AND,OR
比较谓词:(=,<,>,<>,<=,>=)
范围谓词( IN,LIKE,IS)
存在谓词( EXIST)
2,SQL表达式:
SQL内置函数
– 统计函数:
COUNT,SUM,AVG,MAX和 MIN,以一个表为范围进行统计
– 字串处理函数:
子串提取函数( Substring),大小写转换函数( Upper,
Lower),子串位置函数( Position)和串长度函数
– 时间日期处理函数:
Current_date(返回当前日期),Current_time(返回当前时间),Current_timestamp(返回当前日期时间)
3.SQL语言的函数
3.2 数据定义语言表索引视图

S Q L 的数据定义语句操 作 方 式操 作 对象创 建 删 除 修 改表 C R E A T E
T A B L E
D R O P
T A B L E
A L T E R
T A B L E
视 图 C R E A T E
V I E W
D R O P V I E W
索 引 C R E A T E
I N D E X
D R O P
I N D E X
一、表
1,创建基本表
2,完整性约束
3,修改基本表
4,撤消基本表
1,创建基本表语句格式:
CREATE TABLE <表名 >
(<列名 ><数据类型 >[<列级完整性约束条件 >]
[,<列名 >[<数据类型 >[<列级完整性约束条件 >]]? ]
[<表级完整性约束条件 >]);
功能,定义基本表的表名及其结构。
若完整性约束条件涉及到该表的多个属性列,则必须定义在表级上,否则既可定义在列级也可定义在表级。

例 1:建立学生管理 DB中的基本表:
学生 (学号,姓名,性别,年龄,班级号 )
课程 (课程号,课称名,学分,周学时 )
考试 (学号,课程号,成绩 )
create table 学生 (学号 char(6),
姓名 char(10),
性别 char(2),
年龄 smallint,
班级号 char(5));
create table 课程 (课程号 char(6),
课称名 char(20),
学分 smallint,
周学时 smallint) ;
create table 考试 (学号 char(6),
课程号 char(6),
成绩 smallint);?
2.完整性约束
⑴ PRIMARY KEY约束
⑵ FOREIGN KEY约束
⑶ UNIQUE约束
⑷ CHECK约束
⑸ NOT NULL或 NULL约束

完整性约束的用途是 限制输入到基本表中的值的范围 。
⑴ PRIMARY KEY约束
也称 主关键字约束,是实体完整性约束。
该约束用于定义 主关键字,它能保证主关键字的 惟一性 和 非空性 。

① PRIMARY KEY约束直接写在列名及其类型之后例 2,在创建学生基本表时,将学号定义为主关键字,列级
PRIMARY KEY约束。
create table 学生 (学号 char(6),primary key,
姓名 char(10),
性别 char(2),
年龄 smallint,
班级号 char(5));
例 3,在创建课程基本表时,将课程号定义为主关键字,并指定
PK_KCH为 PRIMARY KEY约束名 (列级约束 )。
create table 课程 (课程号 char(6) constraint pk_kch primary key,
课称名 char(20),
学分 smallint,
周学时 smallint);
② 按照语法在相应列名及类型后单独列出:
CONSTRAINT <约束名 > PRIMARY KEY
例 4,在创建考试基本表时定义了一个名为 PK_KS的表级
PRIMARY KEY约束。
create table 考试 (学号 char(6),
课程号 char(6),
成绩 smallint,
constraint pk_ks primary key(学号,课程号 ));
③ 在 CREATE TABLE语句列出基本表的所有列之后,再附加一个声明:
PRIMARY KEY(<列名 1>[,<列名 2>,…])
⑵ FOREIGN KEY约束
也称为 外部关键字 或 参照表约束,用于定义参照完整性,即用来维护两个基本表之间的一致性关系。

CONSTRAINT <约束名 > FOREIGN KEY(<列名 >)REFERENCES <表名 >(<列名 >)
例 5,在创建考试基本表时,定义相应外部关键字。
create table 考试
(学号 char(6),
课程号 char(6),
成绩 smallint,
constraint pk_ks1 primary key(学号,课程号 ),
constraint pk_ks2 foreign key(学号 )references 学生 (学号 ),
constraint pk_ks3 foreign key(课程号 )references 课程
(课程号 ));
学生、考试和课程三个基本表之间所建立的 FOREIGN KEY约束
⑶ UNIQUE约束
主要是用来确保不受 PRIMARY KEY约束的列上的数据的惟一性。
PRIMARY KEY约束与 UNIQUE约束区别:
UNIQUE约束,主要用在非主关键字的一列或多列上要求数据惟一的情况;
UNIQUE约束,允许该列上存在 NULL值,而主关键字决不允许出现 NULL值;
可在一个表上设置多个 UNIQUE约束,而在一个表上只能设置一个主关键字。

例 6,在创建学生基本表时,创建一个列级 UNIQUE约束。
create table 学生
(学号 char(6),primary key,
姓名 char(10),constraint un_xm unique,
性别 char(2),
年龄 smallint,
班级号 char(5));
① 列级 UNIQUE约束
CONSTRAINT <约束名 > UNIQUE
例 7,在创建课程基本表时,创建一个表级 UNIQUE约束。
create table 课程
(课程号 char(6),
课称名 char(20),
学分 smallint,
周学时 smallint,
constraint un_one unique(课称名,学分 ));
② 表级 UNIQUE约束
CONSTRAINT <约束名 >UNIQUE(<列名 1>[,<列名 2>,…])
⑷ CHECK约束
CHECK约束通过检查输入表列的数据的值来维护值域的完整性。

定义 CHECK约束的语法格式 为:
CONSTRAINT <约束名 > CHECK(<约束条件表达式 >)
例 8:规定学生的年龄在 20岁到 65岁之间 。
create table 学生
(学号 char(6) primary key,
姓名 char (10),
性别 char (2),
年龄 smallint,constraint ch_nl check (年龄>= 20 and 年龄<= 65),
班级号 char (5));
⑸ NOT NULL或 NULL约束
NOT NULL约束不允许列值为空,而 NULL约束允许列值为空。
3,修改基本表语句格式:
ALTER TABLE <表名 >
[ADD <新列名 > <数据类型 >[<完整性约束 >][,?n]]
[DROP[[[CONSTRAINT]<约束名 >]|[COLUMN<列名 >]][,?n]]
[MODIFY <列名 > <数据类型 >[,?n]] ;
功能,修改指定基本表的结构。

例 9,在学生基本表中增加“入学时间”列,其数据类型为日期型 。
alter table 学生 add 入学时间 datetime;
例 10,将课程基本表中的“周学时”列删除。
alter table 课程 drop column 周学时;
例 11,删除考试基本表中的学号外部关键字,其名为 pk_ks2。
alter table 考试 drop constraint pk_ks2;
4,撤消基本表语句格式:
DROP TABLE <表名 >
功能,撤消指定的基本表。
说明:
⑴ <表名 >是所要撤消的基本表的名字;
⑵ 基本表一旦撤消,表中的数据以及此表上建立的索引和视图都将自动被删除,并且无法恢复,此时系统释放其所占用的存储空间;
⑶ 只有基本表的拥有者才可使用此语句;
二、索引
1,索引的创建
2,索引的撤消
1.索引的创建语句格式:
CREATE[UNIQUE][CLUSTERED]INDEX<索引名 >
ON<表名 >(<列名 1>[<次序 >][,<列名 2>[<次序 >]]?) ;
功能,为基本表创建索引 。
说明:
⑴ <表名 >是要创建索引的基本表名字。
⑵ 次序可选 ASC(升序 )或 DESC(降序 ),默认值为 ASC;
⑶ UNIQUE表示该索引的每一个索引值只对应惟一的数据记录 ;
⑷ CLUSTERED表示建立聚簇索引,使基本表中数据的物理顺序与索引项的排列顺序一致。

例 12,为学生管理 DB中的基本表,学生、考试、课程创建索引 。
学生,按学号升序创建惟一的聚簇索引;
create unique clustered index idx_xh on 学生 (学号 );
考试,按学号降序和课程号升序创建惟一的聚簇索引;
create unique clustered index idx_xh_kch
on 考试 (学号 desc,课程号 asc);
课程,按课程号升序创建惟一的索引。
create unique index idx_kch on 课程 (课程号 );
索引前后的学生与考试基本表
按学号升序创建惟一的聚簇索引按学号降序和课程号升序创建惟一的聚簇索引 按课程号升序创建惟一的索引
2.索引的撤消语句格式:
DROP INDEX <索引名 >[,?n]
功能,在 DB中撤消指定的索引。
说明:
⑴ <索引名 >是要撤消的索引的名字;
⑵ 撤消索引时,系统会同时从 DD中删除有关对该索引的描述;
⑶ 一次可撤消一个或多个指定的索引,索引名间逗号间隔。

例 13:撤消学生管理 DB中课程基本表的 idx_kch索引和考试基本表的 idx_xh_kch索引。
drop index 课程,idx_kch,考试,idx_xh_kch;
三,视图
1,视图的创建
2,视图的撤消
3,视图的查询

视图 (窗口 ):
存储在 DB中的预先定义好的查询,具有基本表的外观,可像基本表一样对其进行存取,但不占据物理存储空间。
1.视图的创建
创建视图实际上就是 DB执行定义该视图的查询语句。
语句格式:
CREATE VIEW <视图名 >[(<列名 >[,<列名 >]?)]
AS <子查询 >
[WITH CHECK OPTION];
功能,定义视图名和视图结构,并将 <子查询 >得到的元组作为视图的内容。

例 14:在学生管理 DB中,建立 01001班学生的视图 VIEW_01001,其结构包括学号,姓名,年龄,班级号。
create view view_01001
as select 学号,姓名,年龄,班级号
from 学生
where 班级号= ′01001′ ;
说明:
⑴ <子查询 >可以是任意复杂的 SELECT语句,但通常不允许含有
ORDER BY(对查询结果进行排序 )和 DISTINCT(从查询返回结果中删除重复行 )短语;
⑵ WITH CHECK OPTION表示对视图进行 UPDATE,INSERT和 DELETE
操作时要保证更新、插入和删除的行满足视图定义中的谓词条件,即 <子查询 >中 WHERE子句的条件表达式。
选择该子句,则系统对 UPDATE,INSERT和 DELETE操作进行检查;
⑶ 不准引用临时表?
CREATE VIEW <视图名 >[(<列名 >[,<列名 >]…)]
AS <子查询 >
[WITH CHECK OPTION];
例 14:在学生管理 DB中,建立 01001班学生的视图 VIEW_01001,其结构包括学号,姓名,年龄,班级号。
create view view_01001
as select 学号,姓名,年龄,班级号
from 学生
where 班级号= ′01001′ ;
2.视图的撤消语句格式:
DROP VIEW <视图名 >
功能,从 DB中删除指定的视图。
说明:
⑴ DROP VIEW是删除视图在 DD中的定义信息,而由该视图导出的其他视图的定义却仍存在 DD中,但这些视图已失效;
⑵ 视图创建后,若导出此视图的基本表被删除了,则该视图将失效 (一般不会被自动删除 ),用 DROP VIEW语句将其删除。
3.视图的查询
一个视图查询,在不同的执行时间可能得到不同的结果。

例 15,在例 14创建的 01001班学生的视图 VIEW_01001中,找出年龄小于 21岁的学生。
select 学号,年龄
from view_01001
where 年龄< 21 ;
本例对视图的查询转换成对基本表的查询语句为:
select 学号,年龄
from 学生
where 年龄< 21 and 班级号= ′01001′ ;
3.3 数据更新语言
1 插入数据
2 修改数据
3 删除数据
插入数据
1,插入单个元组
2,插入多元组
1.插入单个元组语句格式:
INSERT INTO <表名 >[(<列名 1>[,<列名 2>,?])]
VALUES ([<常量 1>[,<常量 2>,?]]) ;
功能,将一个新元组插入指定的基本表中。
说明:
⑴ INTO子句中的 <列名 1>[,<列名 2>,?] 指出在基本表中插入新值的列,VALUES子句中的 <常量 1>[,<常量 2>,?] 指出在基本表中插入新值的列的具体值;

⑵ VALUES子句中各常量的数据类型必须与 INTO子句中所对应列的数据类型兼容,VALUES子句中常量的数量必须匹配 INTO子句中的列数;
⑶ INTO子句中没有出现的列,新插入的元组在这些列上取空值;
⑷ 如果省略 INTO子句中的 <列名 1>[,<列名 2>,?],则新插入元组的每一列必须在 VALUES子句中均有值对应;
⑸ 如果在基本表中存在定义为 NOT NULL的列,则该列的值必须要出现在 VALUES子句中的常量列表中,否则错误。
⑹ 这种插入数据的方法一次只能向基本表中插入一行数据,并且每次插入数据都必须输入基本表的名字以及要插入的列的数值。
例 16,将一个新生的数据 (020011,张三,男,19,02005)插入到学生基本表中。
insert into 学生
Values (′020011′,′ 张三 ′,′ 男 ′,19,′02005′) ;
2.插入多元组语句格式:
INSERT INTO <表名 >[(<列名 1>[,<列名 2>,?])]
<子查询 >;
功能,一次向基本表中插入多个元组。
说明:
⑴ SQL先处理 <子查询 >,得到查询结果,再将结果插入到 <表名 >所指的基本表中;
⑵ <子查询 >结果集合中的列数、列序和数据类型必须与 <表名 >所指的基本表中相应各项匹配或兼容。

例 17,在学生管理中,要求将所有女学生的学号、姓名和年龄单独存放在一个基本表中。
(在学生管理数据库中创建女学生基本表 → 查询 → 插入)
create table 女学生
(学号 char(6) not null,
姓名 char (10),
年龄 smallint);
insert into 女学生
select 学号,姓名,年龄
from 学生
where 性别 =′ 女 ′ ;
修改数据语句格式:
UPDATE <表名 >
SET <列名 >=<表达式 >[,<列名 >=<表达式 >][,?n]
[WHERE <条件 >];
功能,修改指定表中满足 WHERE子句所指定条件的元组。

说明:
⑴ <表名 >指出要修改数据的基本表的名字;
⑵ SET子句用于指定修改方法,用 <表达式 >的值取代相应 <
列名 >的列值,且一次可以修改多个列的列值;
⑶ WHERE子句指出基本表中需要修改数据的元组应满足的条件,如果省略 WHERE子句,则修改基本表中的全部元组;
⑷ 在 WHERE子句中也可以嵌入子查询。
例 18,将“数据库”的周学时在原来的基础上再加 2学时。
update 课程
set 周学时=周学时 +2
where 课程名= ′ 数据库 ′
例 19,将考试基本表中的“数据库”课程的考试成绩乘以难度系数
0.8。
update 考试
set 成绩=成绩 *0.8
where 课程号= (select课程号
from 课程
where 课程名= ′ 数据库 ′) ;
删除数据语句格式:
DELETE FROM <表名 > [WHERE<条件 >];
功能,删除指定表中满足 WHERE子句条件的所有元组。
说明:
⑴ DELETE语句删除的是基本表中的数据,而不是表的定义;
⑵ 省略 WHERE子句,表示删除基本表中的全部元组;
⑶ 在 WHERE子句中也可以嵌入子查询;
⑷ 数据一旦被删除将无法恢复,除非事先有备份。

例 20,删除 01001班所有学生的考试成绩。
delete from 考试
where 学号 in (select 学号
from 学生
where 班级号= ′01001′) ;
3.4 数据查询语言
1 SELECT语句
2 单表查询
3 多表连接查询
4 嵌套查询
5 函数查询

功能:
是指根据用户的需要以一种可读的方式从 DB库中提取所需数据,由 SQL的数据操纵语言的 SELECT语句实现。
数据查询:
DB的核心操作。
1 SELECT语句
SELECT [ALL|DISTINCT][<目标列表达式 >[,?n]]
FROM <表名或视图名 >[,<表名或视图名 >,?]
[WHERE <条件表达式 >]
GROUP BY <列名 1>[ HAVING <条件表达式 >]]
ORDER BY <列名 2>[ASC|DESC],? ] ;
功能,从指定的基本表或视图中,选择满足条件的元组数据,并对它们进行分组、统计、排序和投影,形成查询结果集。
– SELECT子句,指定要显示的属性列
– FROM子句,指定查询对象 (基本表或视图 )
– WHERE子句,指定查询条件
– GROUP BY子句,对查询结果按指定列的值分组,该属性列值相等的元组为一个组 。 通常会在每组中作用集函数 。
– HAVING短语,筛选出只有满足指定条件的组
– ORDER BY子句,对查询结果表按指定列值的升序或降序排序
SELECT语句的执行过程:
根据 WHERE子句的条件表达式,从 FROM子句指定的基本表或视图中找出满足条件的元组,再按 SELECT子句中的目标列表达式,选出元组中的列值形成结果集。
若有 GROUP子句,则将结果集按 <列名 1>的值进行分组,该属性列值相等的元组为一个组,每个组产生结果集中的一个元组。
若 GROUP BY子句后带 HAVING短语,则只有满足指定条件的组才予以输出。
若有 ORDER BY子句,则结果集还要按 <列名 2>的值的升序或降序排序。
SELECT [ALL|DISTINCT][<目标列表达式 >[,…n]]
FROM <表名或视图名 >[,<表名或视图名 >,…]
[WHERE <条件表达式 >]
GROUP BY <列名 1>[ HAVING <条件表达式 >]]
ORDER BY <列名 2>[ASC|DESC],… ] ;
2 单表查询单表查询:
指在查询过程中只涉及一个表或视图的查询语句。
例,在学生表中查询 20-22岁之间的学生的学号、姓名和年龄。

select 学号,姓名,年龄
from 学生
where 年龄 between 20 and 22;
使用谓词查询例 21,求修读课程号为 A004课程的学生学号和成绩,并将成绩乘以难度系数 0.8,结果按学号降序且成绩升序排列。
select distinct 班级号
from 学生
select 学号,成绩 *0.8
from 考试
where 课程号= ′a004′
order by 学号 desc,成绩 ;
例 22,求 01001或 02001班的姓“王”的学生的所有信息。
select *
from 学生
where 班级号 in (′01001′,′02001′) and 姓名 like′王 %′;
例 23,求学校的班级个数。
消除取值重复的行对查询结果排序使用范围谓词进行集合查询
[例 24] 求各个课程号及相应的选课人数 。
SELECT 课程号,COUNT(课程号 )
FROM 考试
GROUP BY课程号;
结果 课程号 COUNT(课程号 )
1 22
2 34
3 44
4 33
5 48
使用 GROUPBY对查询结果分组使用 HAVING短语筛选最终输出结果[例 25] 查询选修了 3门以上课程的学生学号 。
SELECT 学号
FROM 考试
GROUP BY 学号
HAVING COUNT(*) >3;
[例 26] 查询有 3门以上课程是 90分以上的学生的学号及 ( 90分以上的 ) 课程数
SELECT 学号,COUNT(*)
FROM 考试
WHERE 成绩 >=90
GROUP BY 学号
HAVING COUNT(*)>=3;
例 27,察看每个学生的基本情况及其所选课程情况。
select 学生,*,考试,*
from 学生,考试
where 学生,学号=考试,学号;
例 28,将 例 27结果集中的重复列“学号”去掉,则表示学生基本表与考试基本表进行的是自然连接查询。
select学生,学号,姓名,性别,年龄,班级号,课程号,成绩
from 学生,考试
where 学生,学号=考试,学号;
3.多表连接查询例 28,连接查询执行过程
表 1 表 2 结果表
自身连接查询,基本表自身的连接操作。
例 29,查询每一门课程的间接先修课 (即先修课的先修课 )。
select a.课程号,a.课程名,b.先修课
from 课程 a,课程 b
where a.先修课= b.课程号;

A表 B表
A表与 B表关系如下:
例 30,用 SQL表达学生基本表和考试基本表之间的左外部连接查询。
select 学生,*,课程号,成绩
from 学生,考试
where 学生,学号 *=考试,学号;
外部连接查询,在查询结果集中除保留满足条件的元组外,
还保留不满足连接条件的元组。
4,嵌套查询
查询块,一个 SELECT-FROM-WHERE语句称为一个查询块。
嵌套查询,一个查询块嵌套在另一个查询块的 WHERE子句或
HAVING短语的条件中的查询。
例 31:察看所有修读课程号为 A004课程的学生学号、姓名、性别和班级号。
select 姓名,姓名,性别,班级号
from 学生
where 学号 in (select 学号
from 考试
where 课程号= ′a004′) ;
执行顺序,由里向外或由下层向上层处理。即先执行子查询再执行父查询,子查询的结果集用于建立其父查询的查找条件。
在嵌套查询中,子查询的结果往往是一个 集合 。

例 32,求 A004号课程的成绩高于刘芳的学生学号和成绩。
select 学号,成绩
from 考试
where 课程号= ′a004′and 成绩> (select 成绩
from 考试
where课程号= ′a004′and 学号 =(select学号
from 学生
where 姓名= ′ 刘芳 ′) );
例 33,求其他班中比 01001班某一学生年龄小的学生,即求年龄 小于 01001班中年龄最大者的学生。
select *
from 学生
where 年龄 <any (select 年龄
from 学生
where 班级号= ′01001′) and 班级号 <> ′01001′ ;
例 34,求其他班中比 01001班学生年龄都小的学生。
select *
from 学生
where 年龄 <all (select 年龄
from 学生
where 班级号= ′01001′) and 班级号 <> ′01001′ ;
基本的 SQL函数及功能:
函数 功能
COUNT([DISTINCT|ALL]*)
COUNT([DISTINCT|ALL]<列名 >)
SUM([DISTINCT|ALL]<列名 >)
AVG(DISTINCT|ALL]<列名 >)
MAX([DISTINCT|ALL]<列名 >)
MIN([DISTINCT|ALL]<列名 >)
统计元组个数计算一列中值的个数计算一列值的总和 (此列必须是数值型 )
计算一列值的平均值 (此列必须是数值型 )
求一列值中的最大值求一列值中的最小值
5.函数查询例 35,求学生的总人数。
select count(*)
from 学生;
例 36,求修读了课程的学生人数。
select count(distinct 学号 )
from 考试;
例 37,求课程基本表中所有的课程和修读各门课程的人数。
select 课程号,count(学号 )
from 考试
group by 课程号;
例 38,求修读的课程超过 3门的学生学号。
select 学号,count(学号 )
from 考试
group by 学号 having count(*)>3;
3.5 数据控制语言

SQL的数据控制功能是指控制用户对数据的存取权力。
,语句有两条:
– 授权语句( GRANT):授权语句是使某个用户具有某些权限;
– 收权语句( REVOKE):收回已授给用户的权限。
用户对数据的存取操作包括:
– 增 ( INSERT ),删 ( DELETE ),改 ( UPDATE ),查
( SELECT) 。
– 只有被授以了某项操作的权限的用户才能进行某项操作 。
( 1),授予权限语句格式:
GRANT <权限 > [,<权限 >,?]
[ ON <对象类型 > <对象名 >]
TO <用户 >[,<用户 >,?]| PCBLIC
[ WITH GRANT OPTION] ;
功能,将对指定操作对象的指定操作权限授予指定的用户 。
例 39,将修改学生年龄和查询学生基本表的权限授予用户张三。
grant update(年龄 ),select on 学生 to 张三;

( 2),撤消权限语句格式:
REVOKE <权限 > [,<权限 >,?]
[ON <对象类型 > <对象名 >]
FROM <用户 >[,<用户 >,?]|PUBLIC ;
功能,将指定的用户对指定操作对象的指定操作权限撤消。

例 40,撤消用户张三对学生基本表修改年龄的权限。
revoke update(年龄 ) on 学生 from 张三;