Ssex CHAR(2), Sage SMALLINT, Sdept CHAR(20) );
[例2] 建立一个“课程”表Course CREATE TABLE Course
( Cno CHAR(4) PRIMARY KEY, Cname CHAR(40),
Cpno CHAR(4) , Ccredit SMALLINT,
FOREIGN KEY (Cpno) REFERENCES Course(Cno) );
[例3] 建立一个“学生选课”表SC
CREATE TABLE SC
(Sno CHAR(9), Cno CHAR(4), Grade SMALLINT, PRIMARY KEY (Sno,Cno),
/* 主码由两个属性构成,必须作为表级完整性进行定义*/ FOREIGN KEY (Sno) REFERENCES Student(Sno),
/* 表级完整性约束条件,Sno是外码,被参照表是Student */ FOREIGN KEY (Cno) REFERENCES Course(Cno)
/* 表级完整性约束条件, Cno是外码,被参照表是Course*/
);
表结构的修改 ALTER TABLE <表名>
[ ADD <新列名> <数据类型> [ 完整性约束 ] ] [ DROP <完整性约束名> ]
[ ALTER COLUMN<列名> <数据类型> ];
[例1]向Student表增加“入学时间”列,其数据类型为日期型。 ALTER TABLE Student ADD S_entrance DATE;
[例2]将年龄的数据类型由字符型(假设原来的数据类型是字符型)改为整数。
16
ALTER TABLE Student ALTER COLUMN Sage INT;
[例3]增加课程名称必须取唯一值的约束条件。
ALTER TABLE Course ADD UNIQUE(Cname);
基本表的删除
DROP TABLE <表名>[RESTRICT| CASCADE]; RESTRICT:删除表是有限制的。
欲删除的基本表不能被其他表的约束所引用 如果存在依赖该表的对象,则此表不能被删除 CASCADE:删除该表没有限制。
在删除基本表的同时,相关的依赖对象一起删除 [例1] 删除Student表
DROP TABLE Student CASCADE ; 基本表定义被删除,数据被删除
表上建立的索引、视图、触发器等一般也将被删除 [例2]若表上建有视图,选择RESTRICT时表不能删除 CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage FROM Student
WHERE Sdept='IS';
DROP TABLE Student RESTRICT;
--ERROR: cannot drop table Student because other objects depend on it [例3]如果选择CASCADE时可以删除表,视图也自动被删除 DROP TABLE Student CASCADE;
--NOTICE: drop cascades to view IS_Student SELECT * FROM IS_Student;
--ERROR: relation \索引的建立与删除。
CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]?)
17
例 1 CREATE CLUSTER INDEX Stusname ON Student(Sname);
例 2 CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC); DROP INDEX <索引名>; DROP INDEX Stusname;
3 掌握数据查询命令: SELECT 语句,要求: SELECT [ALL|DISTINCT] <目标列表达式> [,<目标列表达式>] ? FROM <表名或视图名>[, <表名或视图名> ] ? [ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ] [ ORDER BY <列名2> [ ASC|DESC ] ];
1 )简单查询(单表查询),包括正确书写选择条件、排序输出、聚合运算以及分组处理; [例1] 查询全体学生的学号与姓名。
SELECT Sno,Sname FROM Student;
[例2] 查询全体学生的姓名、学号、所在系。
SELECT Sname,Sno,Sdept FROM Student;
[例3] 查询计算机科学系全体学生的名单。 SELECT Sname FROM Student WHERE Sdept=?CS?;
[例4] 查询所有年龄在20岁以下的学生姓名及其年龄。 SELECT Sname,Sage FROM Student WHERE Sage < 20;
[例5] 查询考试成绩有不及格的学生的学号。 SELECT DISTINCT Sno FROM SC
WHERE Grade<60;
[例6] 查询年龄在20~23岁(包括20岁和23岁)之间的学生的
18
姓名、系别和年龄 SELECT Sname,Sdept,Sage FROM Student
WHERE Sage BETWEEN 20 AND 23;
[例7] 查询年龄不在20~23岁之间的学生姓名、系别和年龄
SELECT Sname,Sdept,Sage FROM Student
WHERE Sage NOT BETWEEN 20 AND 23;
[例8]查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。
SELECT Sname,Ssex FROM Student
WHERE Sdept IN ( 'IS','MA','CS' );
[例9]查询既不是信息系、数学系,也不是计算机科学系的学生的姓名和性别。 SELECT Sname,Ssex FROM Student
WHERE Sdept NOT IN ( 'IS','MA','CS' );
[例10] 查询学号为200215121的学生的详细情况。 SELECT * FROM Student
WHERE Sno LIKE ?200215121';
[例11] 查询姓\欧阳\且全名为三个汉字的学生的姓名。 SELECT Sname FROM Student
WHERE Sname LIKE '欧阳__';
[例12] 某些学生选修课程后没有参加考试,所以有选课记录,但没 有考试成绩。查询缺少成绩的学生的学号和相应的课程号。
SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL
[例13] 查所有有成绩的学生学号和课程号。 SELECT Sno,Cno FROM SC
19
[例14] 查询计算机系年龄在20岁以下的学生姓名。 SELECT Sname FROM Student
WHERE Sdept= 'CS' AND Sage<20; WHERE Grade IS NOT NULL; 排序输出
[例15] 查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。 SELECT Sno,Grade FROM SC
WHERE Cno= ' 3 ' ORDER BY Grade DESC;
[例16] 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。
SELECT * FROM Student
ORDER BY Sdept,Sage DESC; 聚合运算 聚集函数: 计数
COUNT([DISTINCT|ALL] *) COUNT([DISTINCT|ALL] <列名>) 计算总和
SUM([DISTINCT|ALL] <列名>) 计算平均值
AVG([DISTINCT|ALL] <列名>) 最大最小值
MAX([DISTINCT|ALL] <列名>)
MIN([DISTINCT|ALL] <列名>)
[例17] 查询学生总人数。 SELECT COUNT(*) FROM Student;
[例18] 查询选修了课程的学生人数。
20