数据库系统概论第3章

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;
相关文档
最新文档