基本表(BASE TABLE):是独立存在的表,一个关系对应一个基本表。 视图(VIEW):是一个虚拟的表,是从一个或几个基本表导出的表。它本身不独立存在于数据库中,数据库中只存放视图的定义而不存放视图对应的数据。当基本表中的数据发生变化时,从视图中查询出来的数据也随之改变。
SQL三级模式结构① 基本表构成了数据库的模式。② 视图构成了数据库的外模式。③ 数据库的存储文件和它们的索引文件构成了关系数据库的内模式。
SQL应用现状:SQL是关系数据库的标准语言,对关系模型的发展和商用DBMS的研制起着重要的作用。大部分DBMS产品都支持SQL,成为操作数据库的标准语言。无论是 Oracle,SQL Server 等大型的DBMS,还是像Access,Visual FoxPro, PowerBuilder 这些微机上常用的DBMS,都支持SQL查询语言。 有方言,支持程度不同。
SQL的数据定义 SQL基本规则和数据类型
SQL对象命名约定:SQL对象包括数据库模式、表、视图、属性名等。这些对象名必须符合一定规则或约定,一般遵守下列规则:数据对象名字符长度有限制(在MySQL为64个字符,在Oracle为30个字符) 。数据对象名应以字母开头,其余字符可以由字母、数字、下划线组成。(MySQL:可以是任何数字、字符或符号,不能全部由数字组成;Oracle:任何字符 ) 在编写SQL语句时,应遵从某些准则以提高语句的可读性:SQL语句对大小写不敏感。为提高可读性,关键字通常大写。SQL语句可写成一行或多行,习惯上每个子句占用一行。关键字不能在行与行之间分开。SQL语句的结束符为分号“;”分号必须放在语句中的最后一个子句后面,但可以不在同一行。 在SQL语句语法格式中的一些约定符号:尖括号?< >?中的内容为实际语义。例如:<表名>意味着必须在此处填写一个表名。中括号?[ ]?中的内容为任选项。例如:[UNIQUE]意味着UNIQUE是可写可不写。 大括号?{ }?与竖线?|?表明此处为选择项,在所列出的各项中仅需选择一项。例如:{ A | B | C | D }意思是A、B、C、D中取其一。SQL中的数据项分隔符为?,?。
SQL基本数据类型
SQL模式的创建和撤消
模式概念 模式(schema)是一个命了名的对象的集
合,如表、视图和索引等。
当一个用户被创建时,一个与之相对应的模式也被创建。一个用户只能与一个模式相关。在数据库中,模式对象包括:表(tables)。视图(views)。索引(indexes)。约束(constraints)等。
SQL模式的创建可用CREATE SCHEMA语句定义,其基
本句法如下:
CREATE SCHEMA〈模式名〉 AUTHORIZATION〈用户名〉 定义模式例子
[例]定义一个学生-课程模式S-T
CREATE SCHEMA “S-T” AUTHORIZATION WANG; 为用户WANG定义了一个模式S-T
[例] CREATE SCHEMA AUTHORIZATION WANG; <模式名>隐含为用户名WANG
如果没有指定<模式名>那么<模式名>隐含为<用户名> 删除模式
DROP SCHEMA <模式名>
删除模式的同时把该模式中所有的数据库对象全部删除。
RESTRICT(限制)
如果该模式中定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行。 当该模式中没有任何下属的对象时才能执行。 删除模式(续)
[例] DROP SCHEMA ZHANG CASCADE; 删除模式ZHANG
同时该模式中定义的表TAB1也被删除 基本表的创建、修改和删除 定义基本表
CREATE TABLE <表名>
(<列名> <数据类型>[ <列级完整性约束条件> ] [,<列名> <数据类型>[ <列级完整性约束条件>] ] … [,<表级完整性约束条件> ] ); 基本表的创建 常用完整性约束
主码约束: PRIMARY KEY 唯一性约束:UNIQUE 非空值约束:NOT NULL 学生-课程 数据库
学生-课程模式 S-T : (教材82页)
学生表:Student(Sno,Sname,Ssex,Sage,Sdept) 课程表:Course(Cno,Cname,Cpno,Ccredit) 学生选课表:SC(Sno,Cno,Grade)
例题[例] 建立一个“学生”表Student,它由学号Sno、姓名Sname、性别Ssex、年龄Sage、所在系Sdept五个属性组成。其中学号不能为空,值是唯一的,并且姓名取值也唯一。
CREATE TABLE Student
(Sno CHAR(5) NOT NULL UNIQUE, Sname CHAR(20) UNIQUE, Ssex CHAR(2) , Sage INT,
Sdept CHAR(15));
[练习] 建立“学生”表Student,学号是主码,姓名取值唯一。
CREATE TABLE Student (Sno CHAR(9) PRIMARY KEY, Sname CHAR(20) UNIQUE, Ssex CHAR(2), Sage SMALLINT, Sdept CHAR(20) ); 删除基本表
DROP TABLE <表名> [RESTRICT | CASCADE] ;
基本表删除CASCADE 删除基本表时,基本表定义被删除,数据被删除表上建立的索引、视图、触发器等一般也将被删除 。缺省是RESTRICT删除。 例题
[例] 删除Student表
DROP TABLE Student ;
当某个基本表无用时,可将其删除。删除后,该表中的数据和在此表上所建的索引都被删除,而建立在该表上的视图不会随之删除,系统将继续保留其定义,但已无法使用。如果重新恢复该表,这些视图可重新使用。只能删除自己建立的表,不能删除其他用户所建的表。 修改基本表
ALTER TABLE <表名>
[ ADD <新列名> <数据类型> [ 完整性约束 ] ] [ DROP <完整性约束名> ]
[ ALTER COLUMN <列名> <数据类型> ];
<表名>:要修改的基本表;ADD子句:增加新列和新的
完整性约束条件;DROP子句:删除指定的完整性约束条件;ALTER COLUMN子句:用于修改列名和数据类型 增加属性列
[例]向Student表增加“入学时间”列,其数据类型为日期型。
ALTER TABLE Student ADD Scome DATE;
不论基本表中原来是否已有数据,新增加的列一律为空值。
删除属性列
[例]向Student表删除“姓名”列。 ALTER TABLE Student Drop Sname;
[例] 将年龄的数据类型改为半字长整数。
ALTER TABLE Student ALTER COLUMN Sage SMALLINT; 注:修改原有的列定义有可能会破坏已有数据 [例] 删除学生姓名必须取唯一值的约束。 ALTER TABLE Student DROP UNIQUE(Sname); 例题[例]把S表中的SNO列加宽到8位字符宽度 ALTER TABLE S ALTER COLUMN SNO CHAR(8);
注意:使用此方式有如下一些限制:①不能改变列名;②不能将含有空值的列的定义修改为NOT NULL约束;③若列中已有数据,则不能减少该列的宽度,也不能改变其数据类型;④只能修改NULL|NOT NULL约束,其它类型的约束在修改之前必须先删除,然后再重新添加修改过的约束定义。 建立与删除索引
索引 索引是数据库检索的常用手段.实际上就是记录的关键字与其相应地址的对应表。
索引的作用可归纳为:1. 加快查询速度;2. 保证行的唯一性。
建立索引是加快查询速度的有效手段 建立索引——DBA或表的属主(即建立表的人)根据需要建立;有些DBMS自动建立以下列上的索引 PRIMARY KEY UNIQUE
维护索引——DBMS自动完成
使用索引——DBMS自动选择是否使用索引以及使用哪些索引 建立索引 语句格式
CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…); 用<表名>指定要建索引的基本表名字;索引可以建立在该表的一列或多列上;用<次序>指定索引值的排列次序,升序:ASC,降序:DESC。UNIQUE表明此索引的每一个索引值只对应唯一的数据记录;CLUSTER表示要建立的索引是聚簇索引:索引项的顺序与记录
的物理顺序一致的索引。
例题[例]为学生-课程数据库中的Student,Course,SC三个表建立索引。其中Student表按学号升序建唯一索引,Course表按课程号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引。
CREATE UNIQUE INDEX Stusno ON Student(Sno); CREATE UNIQUE INDEX Coucno ON Course(Cno);
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);
唯一值索引
对于已含重复值的属性列不能建UNIQUE索引。对某个列建立UNIQUE索引后,插入新记录时DBMS会自动检查新记录在该列上是否取了重复值,相当于增加了一个UNIQUE约束。
聚簇索引
建立聚簇索引后,基表中数据也需要按指定的聚簇属性值的升序或降序存放,即聚簇索引的索引项顺序与表中记录的物理顺序一致。
例:CREATE CLUSTER INDEX Stusname ON
Student(Sname);
在Student表的Sname(姓名)列上建立一个聚簇索引,而且Student表中的记录将按照Sname值的升序存放 在一个基本表上最多只能建立一个聚簇索引;聚簇索引的用途:对于某些类型的查询,可以提高查询效率;聚簇索引的适用范围;很少对基表进行增删操作;很少对其中的变长列进行修改操作 ;经常更新的列不适合聚簇索引 删除索引
DROP INDEX <索引名>;
删除索引时,系统会从数据字典中删去有关该索引的描述。
[例] 删除Student表的Stusname索引。 DROP INDEX Stusname; 总结
本节问题
1、试叙述SQL语言的特点
2、了解SQL的四大功能。
3、掌握模式、表、索引的定义、修改和删除。
第三章 关系数据库标准语言SQL
概述
语句格式
SELECT [ALL|DISTINCT] <目标列表达式> [,<目标列表达式>] …
FROM <表名或视图名>[, <表名或视图名> ] … [ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ] [ ORDER BY <列名2> [ ASC|DESC ] ]; 语句格式
SELECT子句:指定要显示的属性列
FROM子句:指定查询对象(基本表或视图)
WHERE子句:指定查询条件
GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。
HAVING短语:筛选出只有满足指定条件的组 ORDER BY子句:对查询结果表按指定列值的升序或降序排序
单表查询
查询仅涉及一个表,是一种最简单的查询操作 一、选择表中的若干列二、选择表中的若干元组三、对查询结果排序四、使用聚集函数五、对查询结果分组
选择表中的若干列 查询指定列
[例1] 查询全体学生的学号与姓名。 SELECT Sno,Sname
FROM Student;
查询全部列
选出所有属性列:
在SELECT关键字后面列出所有列名 将<目标列表达式>指定为 *
[例3] 查询全体学生的详细记录。 SELECT Sno,Sname,Ssex,Sage,Sdept FROM Student; 或 SELECT *
FROM Student;
查询经过计算的值
SELECT子句的<目标列表达式>可以为:算术表达式;字符串常量;函数;列别名
SELECT子句的<目标列表达式>可以为:算术表达式;字符串常量;函数;列别名
[例4] 查全体学生的姓名及其出生年份。
SELECT Sname,2008-Sage /*假定当年的年份为2008年*/
FROM Student;
输出结果: Sname 2008-Sage 李勇 1988 刘晨 1989 王敏 1990 张立 1989
[例5] 查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名
SELECT Sname,?Year of Birth: ',2008-Sage,
(1) 比较大小
在WHERE子句的<比较条件>中使用比较运算符 =,>,<,>=,<=,!= 或 <>,!>,!<; NOT+上述运算
LOWER(Sdept) FROM Student; 符
输出结果:Sname 'Year of Birth:' 2008-Sage [例8] 查询所有年龄在20岁以下的学生姓名及其年LOWER(Sdept)
李勇 Year of Birth: 1988 cs 刘晨 Year of Birth: 1989 is 王敏 Year of Birth: 1990 ma 张立 Year of Birth: 1989 is 使用列别名改变查询结果的列标题:
SELECT Sname NAME,'Year of Birth: ’ BIRTH, 2000-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT FROM Student;
输出结果: NAME BIRTH BIRTHDAY DEPARTMENT
李勇 Year of Birth: 1984 cs 刘晨 Year of Birth: 1985 is 王敏 Year of Birth: 1986 ma 张立 Year of Birth: 1985 is 选择表中的若干元组——消除取值重复的行;查询满足条件的元组
1. 消除取值重复的行:如果没有指定DISTINCT关键词,则缺省为ALL
[例6] 查询选修了课程的学生学号。 SELECT Sno FROM SC;等价于: SELECT ALL Sno FROM SC;
执行上面的SELECT语句后,结果为: Sno 200215121 200215121 200215121 200215122 200215122 消除取值重复的行(续)
指定DISTINCT关键词,去掉表中重复的行 SELECT DISTINCT Sno FROM SC; 执行结果:Sno 200215121
200215122
查询满足条件的元组 WHERE子句常用的查询条件
龄。
SELECT Sname,Sage FROM Student WHERE Sage < 20;
(2) 确定范围
使用谓词 BETWEEN … AND …
NOT BETWEEN … AND …
[例10] 查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。
SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23;
[例11] 查询年龄不在20~23岁之间的学生姓名、系别和年龄。
SELECT Sname,Sdept,Sage FROM Student
WHERE Sage NOT BETWEEN 20 AND 23; (3) 确定集合
使用谓词 IN <值表>, NOT IN <值表> <值表>:用逗号分隔的一组取值 [例12]查询信息系(IS)、数学系(MA)和计
算机科学系(CS)学生的姓名和性别。 SELECT Sname,Ssex FROM Student
WHERE Sdept IN ( 'IS','MA','CS' ); [例13]查询既不是信息系、数学系,也不是计算机科学系的学生的姓名和性别。 SELECT Sname,Ssex FROM Student
WHERE Sdept NOT IN ( 'IS','MA','CS' ); (4) 字符串匹配
[NOT] LIKE‘<匹配串>’[ESCAPE ‘ <换码字符>’] <匹配串>:指定匹配模板
匹配模板:固定字符串或含通配符的字符串,当匹配模板为固定字符串时,可以用 = 运算符取代 LIKE 谓词。用 != 或 < >运算符取代 NOT LIKE 谓词 通配符
% (百分号) 代表任意长度(长度可以为0)的字符串 例:a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab 等都满足该匹配串 _ (下横线) 代表任意单个字符 例:a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满足该匹配串
ESCAPE 短语:当用户要查询的字符串本身就含有 % 或 _ 时,要使用ESCAPE '<换码字符>' 短语对通配符进行转义。
例题
1) 匹配模板为固定字符串
[例14] 查询学号为95001的学生的详细情况。 SELECT * FROM Student
WHERE Sno LIKE '95001'; 等价于: SELECT *
FROM Student
WHERE Sno = '95001'; 2) 匹配模板为含通配符的字符串
[例15] 查询所有姓刘学生的姓名、学号和性别。 SELECT Sname,Sno,Ssex FROM Student
WHERE Sname LIKE ?刘%?;
[例16] 查询姓\欧阳\且全名为三个汉字学生的姓名。 SELECT Sname FROM Student
WHERE Sname LIKE '欧阳__';
[例17] 查询名字中第2个字为\阳\字的学生的姓名和学号。
SELECT Sname,Sno
FROM Student
WHERE Sname LIKE '__阳%';
[例18] 查询所有不姓刘的学生姓名。 SELECT Sname,Sno,Ssex FROM Student
WHERE Sname NOT LIKE '刘%';
3) 使用换码字符将通配符转义为普通字符
[例19] 查询DB_Design课程的课程号和学分。 SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE ‘DB\\_Design’
ESCAPE ‘\\’;
[例20] 查询以\开头,且倒数第3个字符为 i 的课程的详细情况。 SELECT *
FROM Course
WHERE Cname LIKE 'DB\\_%i_ _' ESCAPE ' \\ ';
(5) 涉及空值的查询:使用谓词 IS NULL 或 IS NOT NULL;“IS NULL” 不能用 “= NULL” 代替
[例21] 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。
SELECT Sno,Cno FROM SC
WHERE Grade IS NULL;
[例22] 查所有有成绩的学生学号和课程号。 SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL; (6) 多重条件查询
用逻辑运算符AND和 OR来联结多个查询条件:AND的优先级高于OR;可以用括号改变优先级 可用来实现多种其他谓词 [NOT] IN
[NOT] BETWEEN … AND …
[例23] 查询计算机系年龄在20岁以下的学生姓名。 SELECT Sname FROM Student
WHERE Sdept= 'CS' AND Sage<20;
改写[例12] [例12] 查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。 SELECT Sname,Ssex FROM Student
WHERE Sdept IN ( ?IS?,?MA?,?CS? ); 可改写为:
SELECT Sname,Ssex FROM Student
WHERE Sdept= ' IS ' OR Sdept= ' MA' OR Sdept= ‘ CS ’; 改写[例10]
[例10] 查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。 SELECT Sname,Sdept,Sage FROM Student
WHERE Sage BETWEEN 20 AND 23; 可改写为:
SELECT Sname,Sdept,Sage FROM Student
WHERE Sage>=20 AND Sage<=23; 对查询结果排序
使用ORDER BY子句:可以按一个或多个属性列排序(升序:ASC;缺省值;降序:DESC;)
当排序列含空值时:ASC: 排序列为空值的元组最后显示;DESC:排序列为空值的元组最先显示
[例24] 查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。