SQL概述
数据定义功能
3.1SQL概述
SQL的特点
(1)数据描述、操纵、控制等功能一体化
(2)两种使用方式,统一的语法结构
(3)高度非过程化
(4)语言简洁,易学易用
3.2SQL的定义功能
3.2.1基本表的定义
CREATE TABLE <表名>
(<列名> <数据类型>[ <列级完整性约束条件> ]
[,<列名> <数据类型>[ <列级完整性约束条件
>] ] ……
[,<表级完整性约束条件> ]
);
[例1]建立一个“学生”表S,它由学号Sno、姓名Sname、性别Ssex、年龄Sage、所在系Sdept五个属性组成。其中学号不能为空,值是唯一的,并且姓名取值也唯一。
CREATE TABLE S
(Sno CHAR(8) NOT NULL UNIQUE, #字符型长度为8,不能为空
Sname CHAR(8) UNIQUE, #字符型长度为8
Ssex CHAR(2) , #字符型长度为2
Sage INT, #整数
Sdept CHAR(15)); #字符型长度为15
数据类型
1)定长和变长字符串CHAR(n) VARCHAR(n)
2)定长和变长二进制串 BIT(n) BITVARING(n)
3)整型数 INT SMALLINT
4)浮点数 FLOAT DOUBLE PRECISION
5)日期型 DATE
6)时间型 TIME
7)时标 TIMESTAMP
常用完整性约束
主关键字约束:PRIMARY KEY
唯一性约束:UNIQUE
非空值约束:NOT NULL
参照完整性约束
主关键字的定义
1)在列出关系模式的属性时,在属性及其类型后加上保留字PRIMARY KEY;
2)在列出关系模式的所有属性后,再附加一个声明:
PRIMARY KEY (<属性1>[,<属性2>,…]) 说明:如果关键字由多个属性构成,则必须使用第二种方法。
外部关键字的定义
1)如果外部关键字只有一个属性,可以在它的属性名和类型后面直接用“REFERENCES”说明它参照了某个表的某些属性,
其格式为: REFERENCES <表名>(<属性>)
2)在CREATE TABLE语句的属性列表后面增加一个或几个外部关键字说明,
其格式为: FOREIGN KEY (<属性>) REFERENCES <表名>(<属性>)
缺省值定义
可以在定义属性时增加保留字DEFAULT和一个合适的值。
例如:
性别 CHAR(1) DEFAULT ‘男’;
年龄 SMALLINT DEFAULT 1;
1、修改基本表
ALTER TABLE <表名>
[ ADD <新列名> <数据类型> [ 完整性约束 ] ]
[ DROP <列名>|<完整性约束名> ]
[ ALTER <列名> <数据类型> ];
<表名>:要修改的基本表
ADD子句:增加新列和新的完整性约束条件 (新增的列一律为空值)
DROP子句:删除指定的列或完整性约束条件
若一个属性被说明为NOT NULL,则不允许修改或删除。
ALTER子句:用于修改列名和数据类型
删除基本表
DROP TABLE <表名> [RESTRICT/ CASCADE];
删除基本表时,系统会从数据字典中删去有关该基本表及其索引的描述 RESTRICT 表示如果有视图或约束条件涉及到删除的表时,就禁止DBMS执行该命令
CASCADE 则将该表与其涉及的对象一起删除。
索引的建立与删除
索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。
索引包含由表或视图中的一列或多列生成的键。这些键存储在一个树结构中,使数据库可以快速有效地查找与键值关联的行。
建立索引
格式:CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
用<次序>指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASC
UNIQUE表明此索引的每一个索引值只对应唯一的数据记录
CLUSTER表示要建立的索引是聚集索引
唯一值索引
对于已含重复值的属性列不能建UNIQUE索引
对某个列建立UNIQUE索引后,插入新记录时DBMS会自动检查新记录在该列上是否取了重复值。这相当于增加了一个UNIQUE约束。
聚簇索引
建立聚簇索引后,基表中数据也需要按指定的聚簇属性值的升序或降序存放。也即聚簇索引的索引项顺序与表中记录的物理顺序一致
在一个基本表上最多只能建立一个聚簇索引
聚簇索引的用途:对于某些类型的查询,可以提高查询效率
聚簇索引的适用范围 很少对基表进行增删操作 很少对其中的变长列进行修改操作
删除索引
DROP INDEX <索引名>; 删除索引时,系统会从数据字典中删去有关该索引的描述
数据操纵功能——数据查询
语句格式
SELECT [ALL|DISTINCT] <目标列表达式>
[,<目标列表达式>] …
FROM <表名或视图名>[, <表名或视图名> ] …
[ WHERE <条件表达式> ]
[ GROUP BY <列名1>
[ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
单表查询(查询仅涉及一个表)
SELECT子句的<目标列表达式>为表达式 算术表达式 字符串常量 函数 列别名等
使用列别名改变查询结果的列标题 as
DISTINCT短语 消除取值重复的行 作用范围是所有目标列
查询满足条件的元组
带有where子句的查询
常用的查询条件
查询条件 谓 词
比较 =,<>,>,>=,<,<=
算术运算 + - * /
确定范围 Between And , Not Between And
确定集合 IN , NOT IN
字符匹配 Like , Not Like
空值 IS NULL ,IS NOT NULL
多重条件 AND , OR
当用户要查询的字符串本身就含有 % 或 _ 时,要使用ESCAPE ‘<转义字符>’ 短语对通配符进行转义。
使用ORDER BY子句
可以按一个或多个属性列排序
升序:ASC;降序:DESC;
当排序列含空值时
ASC:排序列为空值的元组最后显示
DESC:排序列为空值的元组最先显示
GROUP BY子句的作用对象是查询的中间结果表
分组方法:按指定的一列或多列值分组,值相等的为一组
使用GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性和集函数
使用HAVING短语筛选最终输出结果
同时涉及多个表的查询称为连接查询
用来连接两个表的条件称为连接条件或连接谓词
一般格式:
[<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2> 比较运算符:=、>、<、>=、<=、!=
SQL中连接查询的主要类型
等值连接(含自然连接)
非等值连接查询
自身连接查询
外连接查询
复合条件连接查询
自身连接
一个表与其自己进行连接,称为表的自身连接;
需要给表起别名以示区别;
由于所有属性名都是同名属性,因此必须使用别名前缀。
外连接与普通连接的区别
普通连接操作只输出满足连接条件的元组
外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出
左外连接 LEFT (OUTER) JOIN <表名> ON <条件>;
右外连接 RIGHT (OUTER) JOIN <表名> ON <条件>;
集合查询
并操作:<查询块> UNION <查询块>
参加UNION操作的各结果表的列数必须相同;对应项的数据类型也必须相同
交操作:标准SQL中没有提供集合交操作,但可用其他方法间接实现。
有些DBMS支持交运算:
形式 <查询块> INTERSECT <查询块>
差操作:
有些DBMS支持交运算: 形式 <查询块> EXCEPT <查询块>
嵌套查询
嵌套查询概述
嵌套查询分类
不相关子查询 子查询的查询条件不依赖于父查询
相关子查询 子查询的查询条件依赖于父查询
嵌套查询求解方法
引出子查询的谓词
一个SELECT-FROM-WHERE语句称为一个查询块 将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询
ANY:任意一个值
ALL:所有值
EXISTS谓词
存在量词
带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。
若内层查询结果非空,则返回真值
若内层查询结果为空,则返回假值
NOT EXISTS谓词
若内层查询结果非空,则返回假值
若内层查询结果为空,则返回真值
由EXISTS引出的子查询,其目标列表达式通常都用* ,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义
SELECT [ALL|DISTINCT] <目标列表达式> [别名] [ ,<目标列表达式> [别名]] …
FROM <表名或视图名> [别名] [ ,<表名或视图名>[别名]] …
[WHERE <条件表达式>] [GROUP BY <列名1>[,<列名1’>] ...
[HAVING <条件表达式>]] [ORDER BY <列名2> [ASC|DESC] [,<列名2’>[ASC|DESC]]…];
当WHERE子句、GROUP BY子句、 HAVING子句和集函数同时出现在一个查询中时,SQL查询语句的执行顺序如下:
执行WHERE子句,从表中选取行
由GROUP BY对选取的行进行分组
执行聚集函数
执行HAVING子句选择满足条件的分组
插入单个元组
INSERT INTO <表名> [(<属性列1>[,<属性列2 >…)] VALUES (<常量1> [,<常量2>] … ) 功能 将新元组插入指定表中。
插入子查询结果
INSERT INTO <表名> [(<属性列1> [,<属性列2>… )] 子查询;
功能 将子查询结果插入指定表中
DBMS在执行插入语句时会检查所插元组是 否破坏表上已定义的完整性规则
实体完整性
参照完整性
用户定义的完整性
对于有NOT NULL约束的属性列是否提供了非空值
对于有UNIQUE约束的属性列是否提供了非重复值
对于有值域约束的属性列所提供的属性值是否在值域范围内
修改数据
UPDATE <表名>
SET <列名>=<表达式>[,<列名>=<表达式>]… [WHERE <条件>];
功能: 修改指定表中满足WHERE子句条件的元组
三种修改方式:
修改某一个元组的值
修改多个元组的值
带子查询的修改语句
SET子句 指定修改方式 要修改的列 修改后取值
WHERE子句 指定要修改的元组 缺省表示要修改表中的所有元组
DBMS在执行修改语句时会检查修改操作 是否破坏表上已定义的完整性规则
实体完整性
主码不允许修改
用户定义的完整性 NOT NULL约束 UNIQUE约束 值域约束
删除数据
DELETE
FROM <表名>
[WHERE <条件>];
功能 删除指定表中满足WHERE子句条件的元组 WHERE子句
指定要删除的元组
缺省表示要修改表中的所有元组
三种删除方式:
删除某一个元组的值
删除多个元组的值
带子查询的删除语句
DBMS在执行删除语句时会检查所插元组 是否破坏表上已定义的完整性规则
参照完整性 不允许删除 级联删除
视图
特点:①虚表,是从一个或几个基本表(或视图)导出的表 ②只存放视图的定义,不会出现数据冗余 ③基表中的数据发生变化,从视图中查询出的数据也随之改变
基于视图的操作:查询;删除;受限更新;定义基于视图的新视图
建立视图:
CREATE VIEW
<视图名> [(<列名> [,<列名>]…)]
AS <子查询>
[WITH CHECK OPTION];
DBMS执行CREATE VIEW语句时只是把视图的定义存入数据字典,并不执行其中的SELECT语句。
在对视图查询时,按视图的定义从基本表中将数据查出。
行列子集视图:从单个基本表导出;只是去掉了基本表的某些行和某些列;保留了码
WITH CHECK OPTION
透过视图进行增删改操作时,不得破坏视 图定义中的谓词条件 (即子查询中的条件表达式)
基于多个基表的视图
基于视图的视图
带表达式的视图
建立分组视图
删除视图
DROP VIEW <视图名>;
该语句从数据字典中删除指定的视图定义
由该视图导出的其他视图定义仍在数据字典中,但已不能使用,必须显式删除
删除基表时,由该基表导出的所有视图定义都必须显式删除