数据库系统概论第3章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SQL支持关系数据库三级模式结构
SQL
视图1
视图2
外模式
基本表1
基本表2
基本表3
基本表4
模式
存储文件1
存储文件2
内模式
3.2 数据定义
SQL的数据定义功能:
表 3.2 SQL 的数据定义语句 操作对象 模式 表 视 图 索 引 操 作 方 式 创 建 CREATE SCHEMA CREATE TABLE CREATE VIEW CREATE INDEX 删 除 DROP SCHEMA DROP TABLE DROP VIEW DROP INDEX 修 改 ALTER TABLE
Cno Pcno
1
3 5
7
5 6
外连接(1)
查询每门课程号及其间接先行课程号(如果存在的话)
SELECT FIRST.CnoFirst.cno ,SECOND.Cpno Second.cpno 1 OUT JOIN Course 7 FROM Course FIRST LEFT SECOND 2 null ON(FIRST.Cno=SECOND.Cpno) 3 5 4 null 5 6 6 null 7 null
3.2.1 模式的定义与删除
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>[<表定义子句>|<视图定义子句>|<授 权定义子句>]
CREATE SCHEMA StuCourse AUTHORIZATION WANG;
DROP SCHEMA <模式名> <CASCADE|RESTRICT>
连接查询的种类
一、等值与非等值连接查询 二、自身连接 三、外连接 四、复合条件连接
等值与非等值连接查询
查询学生的姓名及获得的成绩
SELECT Student.sname,SC.grade
FROM
Student, SC
问题:此查询有多 少条记录满足条件?
WHERE Student.Sno = SC.Sno
[例] 查询学生总人数。
SELECT COUNT(*) FROM Student;
[例] 查询选修了课程的学生人数。
SELECT COUNT(DISTINCT Sno)
FROM SC;
GROUP BY子句
对查询的中间结果表进行分组,以细化聚集函数的作用
[例] 求各个课程号及相应的选课人数。 SELECT Cno,COUNT(Sno) FROM SC Cno COUNT(Sno) GROUP BY Cno; 1 22 2 34 3 44 4 33 5 48
);
课程表Course
[例] 建立一个“课程”表Course
CREATE TABLE Course ( Cno CHAR(4) PRIMARY KEY, Cname CHAR(40), 先修课 Cpno CHAR(4) , Ccredit SMALLINT, FOREIGN KEY (Cpno) REFERENCES Course(Cno) );
第三章 关系数据库标准语言SQL
3.1 SQL概述 3.2 数据定义 3.3 数据查询 3.4 数据更新 3.5 视图
3.1 SQL概述
SQL(Structured Query Language)
结构化查询语言,是关系数据库的标准语言
数据查询 数据定义 数据操纵 数据控制
表 3.1 SQL 语言的动词 SQL 功 能 数 据 查 询 数 据 定 义 数 据 操 纵 数 据 控 制 动 词 SELECT CREATE, DROP, ALTER INSERT,UPDATE DELETE GRANT,REVOKE
确定集合
SELECT Sname,Ssex FROM Student
WHERE Sdept IN ( 'IS','MA','CS' );
字符匹配
SELECT *
FROM Student WHERE Sname LIKE ‘刘%’;
空值的查询 SELECT Sno,Cno FROM SC WHERE Grade IS NULL 多重条件查询
3.3.3嵌套查询
一个SELECT-FROM-WHERE语句称为一个查询块
嵌套查询:嵌套两个以上的查询块
SELECT Sname /*外层查询/父查询*/ FROM Student WHERE Sno IN (SELECT Sno /*内层查询/子查询*/ FROM SC WHERE Cno= ‘ 2 ’);
having子句
对分组后的数据进行筛选,选出满足条件的组
[例] 查询选修了3门以上课程的学生学号。
SELECT Sno
FROM SC GROUP BY Sno HAVING COUNT(*) >3;
问题
Select、from、where、order by、group by、 having子句在查询过程中的执行顺序?
3.3.2 连接查询
连接条件或连接谓词:用来连接两个表的条件
[<表1>.]<列1> <比较运算符> [<表2>.]<列2> [<表1>.]<列1> BETWEEN [<表2>.]<列2> AND [<表2>.]<列3>
连接操作的执行方法
嵌套循环法(NESTED-LOOP) 排序合并法(SORT-MERGE) 索引连接(INDEX-JOIN
索引的建立
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
CREATE CLUSTER INDEX Stusname
ON Student(Sname);
索引的删除
DROP INDEX Stusname;
DESC:排序列为空值的元组最先显示
聚集函数
计数 COUNT([DISTINCT|ALL] <列名>)
计算总和
SUM([DISTINCT|ALL] <列名>) 计算平均值 AVG([DISTINCT|ALL] <列名>) 最值
MAX([DISTINCT|ALL] <列名>)
MIN([DISTINCT|ALL] <列名>)
Cpno是外码 被参照表是Course 被参照列是Cno
问题
下面建立一个“学生选课”表SC方法是否正确?
CREATE SC (Sno CHAR(9) PRIMARY KEY null, Cno CHAR(4) PRIMARY KEY , Grade SMALLINT null, FOREIGN KEY (Sno) REFERENCES Student(Sno), FOREIGN KEY (Cno) REFERENCES Course(Cno), );
确定范围
确定集合
字符匹配 空 值
多重条件
AND,OR,NOT
比较大小 SELECT DISTINCT Sno FROM SC WHERE Grade<60; 确定范围 SELECT Sname,Sdept,Sage
FROM Student WHERE Sage BETWEEN 20 AND 23;
Unicode字符型 文本型 二进制型 日期时间类型 时间戳型 图像型
符号标识
nchar, nvarchar、 text, ntext binary, varbinary
datetime, smalldatetime, date, time
timestamp image
cursor, sql_variant, table, uniqueidentifier, xml
选择表中的若干元组(1)
消除取值重复的行:DISTINCT SELECT DISTINCT Sno FROM SC;
选择表中的若干元组(2)
查询条件 比 较
谓 词 =,>,<,>=,<=,!=,<>,!>,!<; NOT+上述比较运算符 BETWEEN AND, NOT BETWEEN AND IN,NOT IN LIKE,NOT LIKE IS NULL,IS NOT NULL
SELECT Sname FROM Student WHERE Sdept= 'CS' AND Sage<20;
ORDER BY子句
可以按一个或多个属性列排序
SELECT * FROM Student ORDER BY Sdept,Sage DESC;
当排序列含空值时
ASC:排序列为空值的元组最后显示
带有比较运算符的子查询(1)
当能确切知道内层查询返回单值时,可用比较运
算符(>,<,=,>=,<=,!=或< >)。
与ANY、some、ALL谓词配合使用
带有比较运算符的子查询(2)
3.3数据查询
SELECT [ALL|DISTINCT] <目标列表达式>
[,<目标列表达式>] … FROM <表名或视图名>[, <表名或视图名> ] … [ WHERE <条件表达式> ] [ GROUP BY <列名1> [ HAVING <条件表达式> ] ] [ ORDER BY <列名2> [ ASC|DESC ] ];
3.2.2 基本表的定义、删除与修改(2)
修改基本表 [ ADD <新列名> <数据类型> [ 完整性约束 ] ] [ DROP <完整性约束名> ] [ ALTER COLUMN<列名> <数据类型> ]; 例:向Student表增加“入学时间”列,其数据类 型为日期型。 ALTER TABLE Student ADD S_entrance DATE;
3.3 数据查询
3.3.1 单表查询
3.3.2 连接查询
3.3.3 嵌套查询
3.3.4 集合查询
3.3.5 Select语句的一般形式
3.3.1 单表查询
查询仅涉及一个表:
选择表中的若干列 选择表中的若干元组 ORDER BY子句 聚集函数 GROUP BY子句 Having 子句
DROP SCHEMA StuCourse RESTRICT
3.2.2 基本表的定义、删除与修改(1)
基本表的定义
CREATE TABLE <表名>
( <列名> <数据类型>[ <列级完整性约束条件> ]
[,<列名> <数据类型>[ <列级完整性约束条 件>] ] …
[,<表级完整性约束条件> ]
ALTER TABLE <表名>
3.2.2 基本表的定义、删除与修改(3)
ຫໍສະໝຸດ Baidu
删除基本表
DROP TABLE <表名>[RESTRICT| CASCADE]; 例:删除Student表,同时删除表上定义的索引等其 他对象 DROP TABLE Student CASCADE ;
3.2.3 索引的建立与删除
外连接(2)
左外连接
列出左边关系(如本例Student)中所有的元组
右外连接
列出右边关系中所有的元组
全外连接
列出两个连接表中的所有元组
复合条件连接
复合条件连接:WHERE子句中含多个连接条件
查询选修2号课程且成绩在90分以上的所有学生 SELECT Student.Sno, Sname FROM Student, SC WHERE Student.Sno = SC.Sno AND SC.Cno= ‘2’ AND SC.Grade > 90;
Sql server 主要数据类型
数据类型
整数型 精确数值型 浮点型 货币型 位型 字符型 其他
符号标识
bigint, int, smallint, tinyint decimal, numeric float, real money, smallmoney bit char, varchar
数据类型
选择表中的若干列
[例1] 选择部分列 SELECT Sno,Sname FROM Student;
[例]选择所有列 SELECT * FROM Student [例]获得经过计算的列 SELECT Sname,2012-Sage FROM Student; [例]使用列别名 SELECT Sname,2012-Sage year-of-birth FROM Student;
注意:当两个以上的表具有相同的列名时,一定
要再列名前加上表名作为限制
自身连接
查询存在间接先行课程的课程号及其间接先行课 程号
SELECT FIRST.Cno,SECOND.Cpno pcno
FROM Course FIRST,Course SECOND
WHERE FIRST.Cpno = SECOND.Cno;