第三章 关系数据库标准语言SQL

发布于:2025-06-29 ⋅ 阅读:(16) ⋅ 点赞:(0)

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  <视图名>;

该语句从数据字典中删除指定的视图定义

由该视图导出的其他视图定义仍在数据字典中,但已不能使用,必须显式删除

删除基表时,由该基表导出的所有视图定义都必须显式删除