第三章 关系数据库的标准语言SQL
3.1 SQL概述
SQL(Structured Query Language):结构化查询语言,时候关系数据库的标准语言。
SQL是一个通用的、功能极强的关系数据库语言。
3.1.1 SQL的产生与发展
SQL标准的进展过程:
3.1.2 SQL的特点
1.综合统一
(1)集数据定义语言(DDL),数据操纵语言(DML),数据控制语言
(DCL)功能于一体。
(2)可以独立完成数据库生命周期的全部活动:
定义关系模式,插入数据,建立数据库;对数据库中的数据进行查询和更新;数据库重构和维护;数据库安全性、完整性控制等。
(3)用户数据库投入进行后,可根据需要随时进行修改
(4)数据操作符统一
2.高度非过程化
(1)非关系数据模型的数据操纵语言“面向过程”,必须制定存取路径。
(2)SQL只要提出“做什么”,无需了解存取路径。
(3)存取路径的选择以及SQL的操作过程由系统自动完成。
3.面向集合的操作方式
(1)非关系数据模型采用面向记录的操作方式,操作对象是一条记录。
(2)SQL采用集合操作方式
·操作对象、查找结果可以是元组的集合;
·一次插入、删除、更新操作的对象可以是元组的集合;
4.以同一种语法结构提供多种使用方式
(1)SQL是独立语的言
能够独立的用于练级交互的使用方式。
(2)SQL又是嵌入式语言
SQL能够嵌入到高级语言(例如C,C++,JAVA)程序中供程序员设计程序时使用。
5.语言简洁,易学易用
SQL功能极强,完成核心功能只用了9个动词。
3.1.3 SQL的基本概念
SQL支持关系数据库三级模式结构。
基本表
(1)本身独立存在的表;
(2)SQL中一个关系就对应一个基本表
(3)一个(或多个)基本表对应一个存储文件;
(4)一个表可以带若干指引。
存储文件
(1)逻辑结构组成了关系数据库的内模式;
(2)物理结构是任意的,对用户透明。
视图
(1)从一个或几个基本表导出的表;
(2)数据库中只存放视图的定义而不存放视图对应的数据;
(3)视图是一个虚数;
(4)用户可以在视图上再定义视图
3.2 学生-课程数据库
学生-课程模式S-T
3.3 数据定义
SQL的数据定义功能:模式定义、表定义、视图和索引定义。
3.3.1 模式的定义与删除
1.定义模式
语句格式如下:
例子:
说明:
(1)若没有指定模式名,那么<模式名>隐含为<用户名>
例子:
该语句没有指定<模式名>,因此<模式名>隐含为用户名<WANG>
(2)在CEWATE SCHEMA中可以接受CREATE TABLE(表定义子句),CREATE VIEW(视图定义子句)和GRANT(授权定义子句)
格式如下:
例子:
(3)执行创建模式语句必须拥有DBA权限,或者DBA授予在CREATE SCHEMA的权限。
2.删除模式
语句格式:
说明
(1)CASCADE 和RESTRICT必须二选一。
(2)CASCADE(级联):删除模式的同时吧该模式中的所有数据库对象全部删除。
(3)RESTRICT(限制):如果该模式中定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行。当该模式中没有任何下属的对象时才能执行。
例子:
3.3.2 基本表的定义、删除与修改
1.定义基本表
语句格式:
说明:
如果完整性约束条件涉及到该表的多个属性列,则必须定义在表级上,否则既可以定义在列级也可以定义在表级。
例子:
2.数据类型
3.模式与表
每一个基本表都属于某一个模式,一个模式包含多个基本表。
创建基本表(其他数据库对象也一样)时,若没有指定模式,系统根据搜索路径来确定该对象所属模式。
(1)显示当前的搜索路径:
SHOW search path
(2)搜索路径的当前默认值是:
$user,PUBLIC;
(3)DBA用户可以设置搜索路径。
SET search_path TO “S-T” ,PUBLIC;(第一个模式名S-T)。
若搜索路径中的模式名都不存在,系统将会给出错误。
若搜索路径中的存在模式,RDBMS会使用模式列表中第一个存在的模式作为数据库对象。
创建基本表
一定义一个学生-课程模式S-T为例。
(1)创建表时给出模式名。
CREATE TABLE “S-T” .Students(表名)(........);/*模式名为S-T*/
CREATE TABLE “S-T” .Course(表名)(........);/*模式名为S-T*/
CREATE TABLE “S-T” .SC(表名)(........);/*模式名为S-T*/
(2)在创建模式语句中同时创建表。
(3)设置所属模式,在创建表名中不必给出模式名
例子:
4.修改基本表
语句格式:
ALTER TABLE<表名>
[ADD[COLUMN]<新列名><数据类型>[完整性约束]]
[ADD<表级完整性约束>]
[DROP[COLUMN]<列名>[CASCADE|RESTRICT]]
[DROP CONSTRAINT<完整性约 束>[CASCADE|RESTRICT]]
[ALTER COLUMN<列名><数据类型>];
知识回顾:
CASCADE(联级)
RESTRICT(限制)
说明:
(1)<表名>是要修改的基本表。
(2)ADD子句用于增加新列、新的列级完整性约束条件和新的表级完整性约束条件。
(3)DROP COLUMN子句用于删除表中的列。
如果指定了CASCADE短语,则自动删除引用该列的其他对象。
如果指定了RESTRICT短语,则如果该列被其他对象引用,关系数据库管理系统将拒绝删除该列。
(4)DROP CONSTRAINT子句用于删除指定的完整性约束条件。
(5)ALTER COLUMN子句用于修改原有的列定义,包括修改列名和数据类型。
例子:
AlTER TABLE Student ADD S_entrance DATE
注意:不论基本表中原来是否已有数据,新增的一列一律为空值。
5.删除基本表
语句格式:
DROP TABLE <表名>[CASCADE|RESTRICT];
例子:
说明:
(1)RESTRICT:删除表是有限制的。欲删除的基本表是不能被其他的表的约束所引用。如果存在该表的依赖对象,则此表不能删除。
(2)CASCADE:删除该表没有限制。在删除基本表的同时,相关的依赖对象一起删除。
(3)基本表的定义被删除,数据被删除,表上建立的索引、视图、触发器等一般也将被删除。
例子:
删除表格的软件处理策略:
3.3.3 索引的建立与删除
建立索引的目的:加快查询速度。
谁可以建立索引:DBA或表的属主(即建立表的人)。
DBMS一般会自动建立以下列上的索引:
PRIMARY KEY(主码)
UNIQUE(单位属性约束:唯一性)
谁维护索引:DBMS自动完成。
使用索引:DBMS自动选择是否使用索引及使用哪些索引。
·RDBMS中的索引一般采用B+树 、HASH索引来实现。
B+树索引具有动态平衡的优点,HASH索引具有查找速度快的特点。
采用B+树还是HASH索引由具体的RDBMS来决定。
·索引是关系数据库内部实现技术,属于内模式的范畴。
·CREATE INDEX语句定义索引时,可以定义索引是唯一索引、非唯一索引或聚簇索引。
1.建立索引
语句格式:
CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名>(<列名>[<次序>][,<列名>[<次序>]]...);
说明:
(1)UNIQUE表明此索引每一个索引值只对应唯一的数据。
例子:
升序:由小到大(ASC)
降序:由大到小(DESC)
(2)CLUSTER表示要建立的索引是聚簇索引。聚簇索引是指索引顺序与表中记录的物理顺序一致的索引组织。
例子:
2. 删除索引
语句格式:
DROP INDEX <索引名>;
删除索引时,系统会从数据字典中删去有关该索引的描述。
3.3.4 数据字典
·数据字典是关系数据库管理系统内部的一组系统表。
·数据自带奶记录了数据库中所有的定义信息,包括模式定义、视图定义、索引定义、完整性约束定义、各类用户对数据库的操作权限、统计信息等。
· RDBMS执行SQL数据定义时,实际就是更新数据。
3.4 数据查询
语句格式:
SELECT[ALL|DISTINCT]<目标列表达式>
[,<目标列表达式>].....
FROM<表名或视图名>[,<表名或视图名>].....
[WHERE<条件表达式>]
[GROUP BY<列名 1>[HAVING<条件表达式>]]
[ORDER BY<列名2>[ASC|DESC]];
注意:
(1)语句中字母不分大小写。
(2)语句中的“,;”等标点符号为英文状态下的半角字符。
(3)[]中的内容,不是语句必须的内容,只有为了实现某种功能时才添加
3.4.1 单表查询
功能:对一个表的内容进行查询。
1.选择表中的若干列
(1)查询指定列
格式:在SELECT后面指定列名,FROM后面列所在的表名。
例子:
(2)查询全部列
功能:选出表中所有属性列。
格式:在SELECT关键字后面列出所有列名或将<目标列表达式>指定为*。
例子:
(3)查询经过计算的值
功能:选出表中指定的属性列,并经过计算后输出。
格式:SELECT子句的<目标列表达式>可以为:
(1)算术表达式
(2)字符串常量
(3)函数
(4)列别名
例子:
例子:
2.选择表中若干个元组
(1)消除取值重复的行 DISTINCT
如果没有指定DISTINCT关键词,则缺省为ALL。
例子:
此时指定DISTINCT关键词,去掉表中重复的行。
SELECT DISTINCT Sno FROM SC;
例子:
(2)查询满足条件的元组 WHERE
查询满足条件的元组可以通过where子句实现,where常用的查询条件如下:
三段论分析法:
1.线分析要显示什么数据 (找SELECT后跟随字段)
2.查找显示数据相关的表 (找出FROM后跟的表名)
3.明确查询条件
查询条件示例
(1)比较大小
例子:
(2)确定范围 BETWEEN...AND... 和 NOT BETWEEN...AND...
谓词:BETWEEN...AND... 和 NOT BETWEEN...AND...
例子:
(3)确定集合 IN<值表>,NOT IN<值表>
谓词:IN<值表>,NOT IN<值表>
例子:
(4)字符匹配 [NOT LIKE]'<匹配串>' [ESCAPE'<换码字符>']
谓词:[NOT LIKE]'<匹配串>' [ESCAPE'<换码字符>']
说明:
若匹配串为固定字符串。
例子:
此时LIKE等价于=(等于号)
若匹配串为含通配符的字符串。
例子:
此处的%(百分号)为任意个字符 _(下划线为一个字符)
_为一个占位符%为多个占位符
若使用换码字符将通配符转义为普通字符
例子:
此处在_前加\并用关键词:EACAPE是为了向系统表示此处的_并非一个占位符,而是具有实际意义的存在。
(5)涉及到空值的查询 IS NULL 或 IS NOT NULL
谓词:IS NULL(空) 或 IS NOT NULL(非空)
“IS”不能用“=”代替
例子:
此处学生参见了选课但是没有考试,故查询条件中成绩为空
(6)多重条件查询 AND OR
用逻辑运算符AND和OR来联结多个查询条件,AND的优先级高于OR,可以用括号改变优先级。
可以用来实现多种其他谓词:
[NOT] IN
[NOT] BETWEEN ... AND ...
例子:
3.ORDER BY子句
ORDER BY(排序)子句可以按一个或多个属性列排序:
升序:ASC;
降序:DESC;
缺省(默认)值为升序。
当排序列含空值时:(空值默认为最大值)
ASC:排序列为空值的元组最后显示
DESC:排序列为空值的元组最先显示
例子:
4.聚集函数 COUNT SUM AVG MAX MIN
例子:
注意:
WHERE子句中是不能用聚集函数作为条件表达式的。聚集函数只能用于SELECT子句和GROUPBY中的HAVING子句。
5. GROUP BY子句
GROUP BY子句作用是:按指定的一列或多列值分组,值相等的为一组,来细化聚集函数的作用对象。
说明:
(1)未对查询结果分组,聚集函数将作用于整个查询结果。
(2)对查询结果分组后,聚集函数将分别于每个分组
例子:
此处若没有GROUP BY Cno来分组
则结果为COUNT(Sno)列的总和
GROUP BY子句分组后,可以使用HVING短语指定筛选条件。
例子: