结构化查询语句
SQL数据库体系结构
在SQL中,外模式对应视图,模式对应于基本表,内模式对应于存储文件。元组称为行,属性称为列。
特征
- 一个SQL模式是表和约束的集合。
- 一个表是行的集合,每行的列是一个序列,每列对应一个数据项。
- 一个表可以是基本表,也可以是视图。基本表是实际存储在数据库中的表,视图是从基本表或其他视图导出的表,它本身不独立存储在数据库中,也就是数据库中只存放视图的定义而不存放视图的数据,这些数据仍然存放在导出视图的基本表中。因此视图是一个虚表。
- 一个基本表可以跨一个或多个存储文件,一个存储文件也可存放一个或多个基本表,一个表可以存放若干索引,索引也存放在存储文件中。每个存储文件与外部存储器上一个物理文件对应,存储文件的逻辑结构组成了关系数据库的内模式。
- 用户可以用SQL语句对视图基本表进行查询操作。在用户看来,视图和基本表都是一样的,都是关系(即表格)。
- SQL用户可以是应用程序,也可以是终端。
SQL的数据定义
SQL的数据定义包括对SQL模式,基本表(table),视图(view),索引(index)的创建和销毁。
SQL模式的创建和销毁
CREATE SCHEMA<模式名> AUTHORIZATION<用户名>
<!-- eg. 该模式名为 ST_COURSE,拥有者 Dali -->
CREATE SCHEMA ST_COURSE AUTHORIZATION Dali
DROP SCHEMA<模式名>[CASCADE | RESTRICT]
撤销有两种方式:
CASCADE(连锁式):执行DROP时,把SQL模式及其以下属性的基本表,视图,索引等所有元素全部撤销。
RESTRICT(约束式):执行DROP时,只有当SQL模式中没有任何下属元素时,才能撤销SQL模式,否则拒绝执行DROP语句。
SQL提供的基本数据类型
-
数值型
INTEGER 长整型(也可写INT)
SMALLINT 短整型
REAL 取决于机器精度的浮点数
DOUBLE PRECISION 取决于机器精度的双精度浮点数
FLOAT(n) 浮点数,精度至少为n位数字
NUMERIC(p,d) 定点数,由p位数字(不包括符号,小数点)组成,小数点后有d位数字(也可写
成DECIMAL(p,d)或DEC(p,d))
-
字符串型
CHAR(n) 长度为n的定长字符串
VACHAR(n) 具有最大长度n的变长字符串
-
位串型
BIT(n) 长度为n的二进制位串
BIT VARYING(n) 最大长度为n的变长二进制位串
-
时间型
DATE 日期,包含年,月,日,形为 YYYY-MM-DD
TIME 时间,包含一日的时,分,秒,形为HH:MM:SS
SQL允许在上面列出的域上执行比较操作,但算术操作只限于数值型。
SQL允许用户使用 “CREATE DOMAIN”语句定义新的域。
CREATE DOMAIN PERSON_NAME CHAR(10)
定义了一个新的域 PERSON_NAME,以后就可以把它作为基本数据类型看待,用户在定义其他列的时候可以采用 PERSON_NAME 作为数据类型
基本表的创建,修改,撤销
基本表结构的创建
定义基本表结构,需要指出它在哪个模式中,后面为了简单起见,模式名可以省略不写。每个属性的类型可以是基本数据类型,也可以是用户自定义的域名。
完整性规则主要有三种子句:主键子句(PRIMARY KEY),检查子句(CHECK),外键子句(FPREIGN KEY)
CREATE TABLE SQL模式名.基本表名
(列名1 类型1,
列名1 类型,
...
完整性约束,
...)
<!-- eg. 创建基本表 S,主键约束是SNO -->
CREATE TABLE S
(SNO CHAR(4) NOT NULL,
SNAME CHAR(20) NOT NULL,
SADDR CHAR(20),
PRIMARY KEY(SNO));
<!-- eg. 创建基本表 P,主键约束是PNO -->
CREATE TABLE P
(PNO CHAR(4) NOT NULL,
PNAME CHAR(20) NOT NULL,
COLOR CHAR(8),
WEIGHT SMALLINT,
PRIMARY KEY(PNO));
<!-- eg. 创建基本表 J,主键约束是JNO -->
CREATE TABLE J
(JNO CHAR(4) NOT NULL,
JNAME CHAR(20) NOT NULL,
COLOR CHAR(8),
JCITY CHAR(20),
BALANCE NUMERIC(7,2),
PRIMARY KEY(JNO));
<!-- eg. 创建基本表 SPJ,主键约束是SNO,PNO,JNO, 外键是 SNO,PNO,JNO,条件是QTY在[0,10000]-->
CREATE TABLE SPJ
(SNO CHAR(4) NOT NULL,
PNO CHAR(4) NOT NULL,
JNO CHAR(4) NOT NULL,
PRICE NUMERIC(7,2),
QTY SMALLINT,
PRIMARY KEY(SNO,PNO,JNO),
FOREIGN KEY(SNO) REFERENCES S(SNO),
FOREIGN KEY(PNO) REFERENCES P(PNO),
FOREIGN KEY(JNO) REFERENCES J(JNO),
CHECK(QTY BETWEEN 0 AND 10000));
基本表结构的修改
-
增加新的属性 ALERT … ADD ...
ALERT TABLE 基本表名 ADD 新属性名 新属性类型 <!-- eg. 在S表中增加一个电话属性(TELE) --> ALERT TABLE S ADD TELE CHAR(12);
新增加的属性不能定义为 NOT NULL。基本表在新增加属性后,原有元组在新增加的属性列上的值都被定义为空值(NULL)
-
删除原有属性 ALERT … DROP ...
ALERT TABLE 基本表名 DROP 属性名 [CASCADE | RESTRICT] <!-- eg. 删除S表电话属性(TELE) --> ALERT TABLE S DROP TELE CASCADE;
CASCADE:在基本表中删除某属性时,所有引用到该属性的视图和约束也要一起自动被删除。
RESTRICT:在没有视图或约束引用该属性时,才能在本表中删除该属性,否则拒绝删除操作。
-
撤销基本表 DROP TABLE
DROP TABLE 基本表名 [CASCADE | RESTRICT] <!-- eg. 撤销S表 --> DROP TABLE S RESTRICT;
撤销基本表后,其所有数据会丢失。
只有在没有视图或约束引用基本表S中的列时才能撤销,否则拒绝撤销。
视图的创建和撤销
-
视图的创建 CREATE VIEW
CREATE VIEW 视图名(列表名) AS SELECT 查询语句 <!-- eg. 创建视图 JSP_NAME --> CREATE VIEW JSP_NAME(JNO,JNAME,SNO,SNAME,PNO,PNAME,QTY) AS SELECT J.JNO,JNAME,S.SNO,SNAME,P.PNO,PNAME,QTY FROM S,P,J,SPJ WHERE S.SNO = SPJ.SNO AND P.PNO = SPJ.PNO J.JNO = SPJ.JNO;
在SQL中,外模式一级数据结构的基本单位是视图(VIEW),视图是若干基本表或其他视图构造出来的表。
在创建一个视图时,系统把视图定义存放在数据字典中,而并不存储视图对应的数据,在用户使用视图的时采取求对应的数据,因此视图被视为 “虚表”。
-
视图的撤销 DROP VIEW
DROP VIEW 视图名 <!-- eg. 撤销视图 JSP_NAME --> DROP VIEW JSP_NAME;
SQL的数据查询
-
SELECT语句
SELECT A1,A2....An FROM R1,R2....Rm WHERE F
WHERE 子句条件表达式F中可以使用下列运算符。
- 算术比较运算符:<,<=,>,>=,<> 或 !=
- 逻辑运算符:AND,OR,NOT
- 集合成员资格运算符:IN,NOT IN
- 谓词:EXISTS(存在量词),ALL,SOME,UNIQUE
- 聚合函数:AVG(平均值),MIN(最小值),MAX(最大值),SUM(和),COUNT(计数)
- F中的运算对象还可以是另一个SELECT语句,即 SELECT语句嵌套
SELECT语句查询结果之间还可以进行集合的并,交,差操作。运算符是:并(UNION),交(INTERSECT),差(EXCEPT)
SELECT [DISTINCT] 目标表的列名或列表达式序列 FROM 基本表名和(或)视图序列|表引用 [WHERE 行条件表达式] <!-- GROUP BY 对指定列的值进行分组,同时提取满足 HAVING 子句中组条件表达式的那些组 --> [GROUP BY 列名序列 [HAVING 组条件表达式]] <!-- ORDER 子句对输出的目标表进行排序,附加说明 ASC 升序,DESC 降序,默认是升序--> [ORDER BY 列名[ASC|DESC],...]
联接操作
-
内联接(INNER UNION):结果为两个联接表中匹配行的联接
//两个子句等价 SELECT * FROM R,S WHERE R.r_id = S.s_id; SELECT * FROM R inner join S on R.r_id = S.s_id;
-
外联接
左外联接(LEFT OUTER JOIN):结果中包括左表(JOIN子句最左边)中所有的行,不包括右表中不匹配的行
SELECT * FROM R LEFT OUTER JOIN S ON R.r_id = S.s_id;
右外联接(RIGHT OUTER JOIN):结果包括右表(出现在JOIN右边)中所有的行,不包括左表中不匹配的行
SELECT * FROM R RIGHT OUTER JOIN S ON R.r_id = S.s_id;
-
完全外联接(FULL OUTER JOIN)
结果包含所有联接表中的所有行,不论他们是否匹配
SELECT * FROM R FULL OUTER JOIN SPJ ON R.r_id = SPJ.s_id 左外联接 UNION 右外联接 可以实现全联接 SELECT * FROM R RIGHT OUTER JOIN S AND R LEFT OUTER JOIN S ON R.r_id = S.s_id;
- 交叉联接(CROSS JOIN)
结果包括两个联接表中所有行组合,交叉联接返回的是两个表的笛卡尔积。
SELECT * FROM R CROSS JOIN S ON R.r_id = S.s_id;
SQL的更新操作
插入
INSERT INTO 表名(列名表) VALUES(元组值)
VALUES中的元组值的列的顺序必须和表中的列名表一一对应。
删除
DELETE FROM <表名> WHERE <条件表达式>
修改
UPDATE 表名 SET 列名 = 值表达式[,列名 = 值表达式...]
[WHERE 条件表达式]