第三章:关系数据库标准语言SQL
1.SQL概述
SQL:结构化查询语言,是关系数据库的标准语言
SQL:是一个通用的,功能极强的关系数据库语言
基本表:
- 本身独立存在的表
- SQL中一个关系就对应一个基本表
- 一个 或 多个 基本表对应一个存储文件
- 一个表可以带若干索引
存储文件:
- 逻辑结构组成关系数据库的内模式
- 物理结构对用户是隐蔽的
视图:
- 从一个或多个基本表导出的表
- 数据库中只存放试图的定义而不存放试图对应的数据
- 试图是一个虚表
- 用户可以在试图上在定义试图
学生-课程 数据库:
学生表:Student(Sno,Sname,Ssex,Ssge,Sdept)
课程表:Course(Cno,Cname,Cpno,Ccredit)
学生选课表:SC(Sno,Cno,Greda)
Student表:
SQL的数据定义功能:
- 模式定义
- 表定义
- 视图和索引的定义
现代关系数据库管理系统提供了一个层次化的数据库对象命名机制
一个关系数据库系统的实例中可以建立多个数据库
一个数据库中可以建立多模式
一个模式下通常包括多个表,视图和索引等数据库对象
定义模式实际上定义一个命名空间。
在这空间中可以定义该模式包含的数据库对象,例如基本表,视图,索引等。
在CREATE SCHEMA 中可以接受CREATE TABLE,CREATE VIEW和GRANT子句。
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>[<表定义子句>|<视图定义子句>|<授权定义子句>]
删除模式
DROP SCHEMA <模式名> <CASCADE|RESTRICT>
-
- 1. CASCADE(级联)
- 删除模式的同时把该模式中的所有数据库对象全部删除
- RESTRICT(限制)
- 如果该模式中定义了下属的数据库对象,则拒绝该删除语句的执行
- 仅当该模式中没有任何下属的对象时才能执行
- 例:DROP SCHEMA ZHANG CASCADE;
- 删除模式ZHANG
- 同时该模式中定义的表TAB1也被删除
- 1. CASCADE(级联)
基本表的定义,删除与修改
- 定义基本表:
- 格式:CREATE TABLE <表名>
(<列名> <数据类型>[ <列级完整性约束条件> ]
[,<列名> <数据类型>[ <列级完整性约束条件>] ]
…
[,<表级完整性约束条件> ] );
-
- 表名:索要定义的基本表的名字
- 列名:组成改表的各个属性(列)
- 列级完整性约束条件:涉及相应的属性列的完整性约束条件
- 表级完整性约束条件:涉及一个或多个属性列的完整性约束条件
- 如果完整性约束条件涉及到该表的多个属性列,则必须定义在表级上,否则即可以定义在列级也可以定义在表级
- 学生表Student:
- CREATE TABLE Student
- {Sno CHAR(9)PRIMARY KAY,/列级完整约束
- Sname CHAR(2)UNIQUE,/取唯一值
- Ssex SMALLINT,
- Sdept CHAR(20)
- }
- 课程表Course
- CREATE TABLE Course
- (Cno CHAR(4) PRIMARY KEY,
- Cname CAHR(40),
- Cpno CHAR(4),
- Ccredit SMALLINT,
- FOREIGN KEY(Cpno) REFERENCES Course(Cno)
- );
- 学生选课表SC
- CREATE TABLE SC
-
-
- (Sno CHAR(9),
- Cno CHAR(4),
- Grade SMALLINT,
- PRIMARY KEY (Sno,Cno),
- FOREIGN KEY(Sno) REFERENCES Student(Sno),
- FOREIGN KEY(Cno) REFERENCES Course(Cno)
- );
-
- 数据类型
- SQL中域的概念用数据类型
- 定义表的属性时需要指明其数据类型及长度
- 选用那种数据类型
- 取值范围
-
-
- 要做哪些运算
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 模式与表
- 每一个基本表都属于某一个模式
- 一个模式包含多个基本表
- 定义基本表所属模式
- 方法一:在表中明显地给出模式名
- Create table“s-t”.student(……);
- Create table”s-t”.course(……);
- Create table”s-t”.SC(……)
- 方法二:在创建模式语句中同时创建表
- 方法三:设置吧所属的模式
- 方法一:在表中明显地给出模式名
- 创建基本表(其他数据库对象也一样)时,若没有指定模式,系统根据探索路径来确定该对象所属的模式
- 关系数据库管理系统会使用模式列表的第一个存在的模式作为数据库对象的模式名
- 若搜索路径中的模式名都不存在,系统将给出错误
- 显示当前的搜索路径:show search_path
- 搜索路径的当前默认值是:$user,public
- 数据库管理员用户可以设置搜索路径,然后定义基本表
- Set search-path to“s-t”,public
- Create table student(……);
- 结果建立了S-T.Student基本表。
- 关系数据库管理系统发现搜索路径中第一个模式名S-T,就把该模式作为基本表Student所属的模式。
- 修改基本表
- Alter table<表名>
- [add[column]<新列名><数据类型>[完整性约束]]
- [add<表级完整性约束>]
- [drop[column]<列名>[cascade]|cascade]
- [drop constraint<完整性约束名><restrict|cascade>]]
- [alter column <列名><数据类型>];
- 表名 是要修改的基本表
- Add 语句用来添加新列,新的列级完整性约束条件和新的表级完整性约束条件
- Drop column 子句用来删除表中的列
- 如果制定了cascade短语,则自动删除引用了该列 的其他对象
-
-
- 如果指定restrict短语,则如果该列被其他对象引用,关系数据库管理系统将拒绝删除该列
- Drop constraint 子句用于删除指定的完整性约束条件
- Alter column子句用于修改原有的列定义,包括修改列名和数据类型
- 向student表中添加“入学时间”列,其数据类型为日期型
- Alter table student add s-entrance date;
-
-
-
- 不管基本表中原来是否已有数据,新增加的列一律为空值
- 将年龄的数据类型由字符型(假设原来的数据类型是字符型)改为整数。
- Alter table student alter column sage int
- 增加课程名称必须取唯一值得约束条件
- Alter table Course add unique (cname);
-
- 删除基本表:
- Drop table<表名>[restrict|cascade];
- Restrict:删除表是有限制的。
- 欲删除的基本表不能被其他表的约束所引用
-
-
- 如果存在依赖该表的对象,则此表不能被删除
- Cascade:删除该表没有限制。
- 在删除基本表的同时,相关的依赖对象一起删除
- 删除Student表
- 基本表定义被删除,数据被删除
-
-
-
- 表上建立的索引视图,触发器等一般也会被删除
- 若表上建有视图,选择restrict时表不能删除表,选择casxade时可以删除表,视图也自动删除。
- Create view is_student
-
-
-
- As
- Select sno,sname,sage
- From student
- Where sdept=”is”;
- Drop table student restrict;
- Eorror:connot drop table student because other objects on it
- 如果选择cascade时可以删除表,视图也自动被删除
- Drop table student cascade;
-
-
-
- Notice:drop cascades to view is_student
- Select *from is_student;
- Error:relation”is_student”does not exist
-
- 索引的建立与删除
- 建立索引的目的:加快查询速度
- 关系数据库管理系统中常见索引:
- 顺序文件上的索引
-
-
- B+树索引
- 散列索引
- 位图索引
- 特点:
- B+树索引具有动态平衡的有点
-
-
-
- Hash索引具有查找快速快的特点
- 索引:
- 谁可以建立索引:
- 数据库管理员或表的属主
- 谁可以建立索引:
-
-
-
- 谁维护索引
- 关系数据库管理系统自动完成
- 使用索引
- 关系数据库管理系统自动选择合适的索引作为存储路径,用户不必也不能显式的选择索引
- 谁维护索引
- 建立索引
- 语句格式;
- Create[unique][cluster]index<索引名>
- ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
- 表明:要建立索引的基本表的名字
- 索引 :要建立在该表的一列或多列上,各列名之间用逗号分隔
- 次序:指定索引值的排列次序,升序:asc,降序:desc 缺省值 asc
- Unique:此索引的每一个索引值只对应只对应唯一的数据记录
- Cluster:表示要建立的索引是聚簇索引
- 建立索引:
- 为学生-课程数据库中的Student,Course,SC三个表建立索引。Student表按学号升序建唯一索引,Course表按课程号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引
- Create unique index student on student(sno);
- Create unique index course on course(cno);
- Create unique index scno on sc(sno asc,cno desc);
- 修改索引
- Alter index <旧索引名>rename to <新索引名>
- 将sc表的scno索引名改为scsno alter index scno rename to scsno;
- Alter index <旧索引名>rename to <新索引名>
- 删除索引
- Drop index<索引名>;
- 删除索引时,系统会从数据字典中删除有关的该索引的描述。
- 删除student表的stuname 索引
- Drop index stuname;
- 数据字典
- 数据字典是关系数据库管理系统内部的一组系统表,它记录了数据库中所有的定义信息:、
- 关系模式定义
- 数据字典是关系数据库管理系统内部的一组系统表,它记录了数据库中所有的定义信息:、
- 语句格式;
-
-
-
-
-
-
- 视图定义
- 索引定义
- 完整性约束定义
- 各类用户对数据看的操作权限
- 统计信息等
- 关系数据库管理系统在执行SQL的数据定义语句时,实际上就是在更新数据字典表中的相应信息。
-
- 数据查询
- 语句格式
- SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>] …
- 语句格式
-
-
-
-
-
-
-
-
- FROM <表名或视图名>[,<表名或视图名> ]…|(SELECT 语句)
- [AS]<别名>
- [ WHERE <条件表达式> ]
- [ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
- [ ORDER BY <列名2> [ ASC|DESC ] ];
- Select子句:指定要显示的属性列
- From语句:指定查询对象
- Where子句:指定查询条件
- Group by子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数
- Having短语:只有满足指定条件的组才给于输出
- Order by子句:对查询结果表按指定列值的升序或降序排序
-
- 数据查询
- 单表查询:
- 查询仅涉及一个表
- 选择表中的若干列
- 查询指定列
- 查询全体学生的学号与姓名
- 查询指定列
- 选择表中的若干列
- 查询仅涉及一个表
- 单表查询:
-
-
-
-
-
-
-
-
-
-
-
- Select sno,sname
- From student;
- 查询全体学生的姓名,学号,所在系
- Select sname,sno,sdept
- From student;
- 查询全部列
- 选出所有属性列:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 在select关键字后面列出所有列明
- 将<目标列表达式>指定为 *
- 查询全体学生的详细记录
- Select sno,sname,ssex,sage,sdept
- From student;
- 或
- Select *
- From student
- 查询经过计算的值
- Select 子句的目标列表达式 不仅可以为表中的属性列,也可以是表达式
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 查全体学生的姓名及其出生年份
- Select sname,2014-sage
- From student;
- 使用列名改变查询结果的列表题:
-
- Select sname name,years of birth:birth, 2014-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT FROM Student;
- 选择表中的若干元组
- 取消取值重复的行
- 如果没有指定distinct 关键词,则缺省为all
- 取消取值重复的行
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 查询选修了课程的学生号。
- Select sno from sc;
- 等价于
- Select all sno from sc
- 指定distinct关键词,去掉表中重复的行
- Select distinct sno
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- From sc;
- 查询满足条件的元组
- 比较大小
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 查询计算机系全体学生的名单
- Select sname
- From student
- Where sdept=”cs”;
- 查询所有年龄在20以下的学生姓名及其年龄
- Select sname,sage
- From student
- Where asge<20;
- 查询考试成绩有不及格的学生的学号
- Select distinct sn
- From sc
- Where grade<60;
- 确定范围
- 谓词 between…and …
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Not between and
- 确定集合
- 谓词in<值表>,not in<值表>
- 字符匹配
- 谓词:[NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <换码字符>’]
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- % (百分号) 代表任意长度(长度可以为0)的字符串
- 例如a%b表示以a开头,以b结尾的任意长度的字符串
- _ (下横线) 代表任意单个字符。
- 例如a_b表示以a开头,以b结尾的长度为3的任意字符串
- 涉及空值的查询
- 谓词:is null 或 is not null
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 查询缺少成绩的学生的学号和相应的课程号
- Select Sno,cno
- From sc
- Where grade is null
- 查询所有有成绩的学生学号和课程号
- Select sno,cno
- fROM sc
- where grade is not null;
- 多重条件查询
- 逻辑运算符:and 和or 来连接多个查询条件
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- And 的优先级高与or
- 可以用括号来改变优先级
- 查询计算机系年龄在20以下的学生 的姓名
- Select sname
- From student
- Where sdept=”sc”and sage <20;
-
- Order by 子句
- 可以按一个或多个属性列排序
- 升序:asc 降序desc:缺省值为升序
- 对于空值,排序是显示的次序哟具体系统实现来决定
- 查询选修了3号课程的学生的学号即其成绩,查询结果按分数的降序来排列
- Select sno.grade
- From sc
- Where cno=”3”
- Order’ by grade desc
- 聚集函数
- 统计元组个数 count(*)
- 统计一列中是的个数 COUNT([DISTINCT|ALL] <列名>)
- 计算一列值得总和 此列必须为数值型
- SUM([DISTINCT|ALL] <列名>)
- 计算一列值的平均值 此列必须为数值型
- AVG([DISTINCT|ALL] <列名>)
- 求一列中的最大值和最小值
- MAX([DISTINCT|ALL] <列名>)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- MIN([DISTINCT|ALL] <列名>)
- 查询学生总人数
- Select count*
- From student
- 查询选修了课程的=学生人数
- Select count(distinct sno)
- From sc
- 计算1号课程的学生的平均成绩
- Select avg(grade)
- From sc0
- Where cno=“1”;’
-
- Group by子句
- 细化聚集函数的作用对象
- 如果未对查询呢结果分组。聚集函数将作用于整个查询结果
- 细化聚集函数的作用对象
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 对查询结果分组后,聚集函数将分别作用于每个元组
- 按之定的一列或多列分组 值相等呢的为一组
- Having短语与where子句的区别:
- 作用对象不同
- Where 子句作用于基表或试图,从中选取满足条件的元组
- Having 短语作用于组,从中选择满足条件的组
-
-
-
-
-
-
-