SQL简介
SQL数据库的体系结构要点
一个SQL模式 ( Schema )是表和约束的集合。
一个表由行集构成,一行是列的序列 。
表有三种类型: 基本表、视图和导出表。
基本表与存储文件间的联系是M:N。每个存储文件与外部存储器上一个物理文件对应。
用户可以用SQL语句对基本表和视图进行查询等操作。在用户看来,两者是一样的,都是表。
SQL用户可以是应用程序,也可以是终端用户
SQL的组成
数据定义语言,即SQL DDL。
用于定义SQL模式、基本表、视图、索引等结构。
数据操纵语言,即SQL DML。
数据操纵分成数据查询和数据更新两类。
其中数据更新又分成插入、删除和修改三种操作。
嵌入式SQL语言的使用规定。
SQL语句嵌入在宿主语言程序中的规则。
数据控制语言,即SQL DCL。
对基本表和视图的授权、完整性规则的描述、事务控制等内容。
SQL的数据定义
1、SQL模式的创建
CREATE SCHEMA〈模式名〉AUTHORIZATION〈用户名〉
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>[<表定义子句>|<视图定义子句>|<授权定义子句>]
2、SQL模式的撤销
DROP SCHEMA〈模式名〉[CASCADE│RESTRICT]
CASCADE (级联式)方式:执行DROP语句时,把SQL模式及其下属的基本表、视图、索引等所有元素全部撤消。
RESTRICT (约束式)方式:执行DROP语句时,只有当SQL模式中没有任何下属元素时,才能撤消SQL模式,否则拒绝执行DROP语句。
注意:
“SQL模式”这个名词学术味太重,比较抽象,所以在大多数DBMS中不愿采用这个名词,而是采用“数据库”这个名词。
也就是大多数系统中把“创建SQL模式”称为“创建数据库”,语句采用 CREATE DATABASE…字样。
3、自定义类型
CREATE DOMAIN PERSON_NAME CHAR(8);
4、基本表的创建
CREATE TABLE 基本表名
(列名 类型 [ 列级完整性约束条件 ],
……
[表级完整性约束条件],
……)
5、完整性约束主要有3种子句:
主键子句:PRIMARY KEY
外键子句:FOREIGN KEY
检查字句:CHECK
6、基本表结构的修改
(1)增加新的列用“ALTER … ADD …”语句,其句法如下:
ALTER TABLE <基本表名> ADD <列名> <类型>
(2)删除原有的列用“ALTER … DROP …”语句,句法如下:
ALTER TABLE <基本表名> DROP <列名>[CASCADE│RESTRICT]
此处CASCADE方式表示:在基本表中删除某列时,所有引用到该列的视图和约束也要一起自动地被删除。
而RESTRICT方式表示在没有视图或约束引用该属性时,才能在基本表中删除该列,否则拒绝删除操作。
(3)修改原有列的类型、宽度用“ALTER … MODIFY …”语句,句法如下:
ALTER TABLE <基本表名> MODIFY <列名> <类型>
7、基本表的撤销
DROP TABLE <基本表名>[CASCADE│RESTRICT]
8、索引的创建
CREATE [UNIQUE] INDEX <索引名> ON <基本表名>(<列名表>)
9、索引的撤销
DROP INDEX <索引名>
SQL的数据查询
SELECT语句的完整句法:
SELECT <目标表的列名或列表达式序列>
FROM <基本表名和(或)视图序列>
[ WHERE <行条件表达式>]
[GROUP BY <列名序列>
[HAVING <组条件表达式>]]
[ORDER BY <列名[ASC|DESC]>,…]
SELECT—FROM—WHERE 句型:
SELECT A1,…,An --属性列
FROM R1,…,Rm --数据源·
WHERE F --条件
F中使用的运算符
1.算术比较运算符:<,<=,>,>=,=,<>或!=
2.逻辑运算符:AND,OR,NOT
3.集合成员资格运算符:IN,NOT IN
4.谓词:EXISTS(存在量词),ALL,SOME,UNIQUE
5.聚合函数:AVG,MIN,MAX,SUM,COUNT
6.嵌套:F≡(SELECT语句)
SELECT查询结果运算符
UNION(并)、INTERSECT(交)、EXCEPT(差)
SELECT语句使用时的3种写法:
连接查询
嵌套查询
带存在量词的嵌套查询
“元组 [NOT] IN(集合)”,表示元组在集合内。
带有SOME(ANY)或ALL谓词的子查询
谓词语义
SOME(ANY):任意一个值
ALL:所有值
EXISTS谓词
存在量词
带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。
若内层查询结果非空,则外层的WHERE子句返回真值
若内层查询结果为空,则外层的WHERE子句返回假值
由EXISTS引出的子查询,其目标列表达式通常都用* ,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义
SELECT [ ALL|DISTINCT ] <列名或列表达式序列> | *
ALL:默认,保留重复行
DISTINCT:去除重复行
列和基本表的改名操作
结构:“旧名 AS 新名”
常用的比较运算符
算术比较判断:<,<=,>,>=,=,<>或!=
之间判断:[NOT] BETWEEN…AND…
相同判断: [NOT] LIKE
空值判断:IS [NOT] NULL
之内判断:[NOT] IN
限定比较判断:ALL|SOME|ANY
存在判断: [NOT] EXISTS
唯一判断: [NOT] UNIQUE
字符串的匹配操作
匹配操作符:[NOT] LIKE
匹配串为含通配符的字符串
%:与零个或多个字符组成的字符串匹配
_:与单个字符匹配
SQL允许使用“ESCAPE”定义转义字符。
用户用WITH子句定义一个临时视图(即子查询),置于SELECT语句的开始处,而临时视图本身是用SELECT语句定义的。
WITH RESULT(AVG_SCORE)AS
SELECT AVG(SCORE)
FROM SC
GROUP BY S#
SELECT S#
FROM SC, RESULT
GROUP BY S#
HAVING AVG(SCORE)>=ALL(AVG_SCORE) ;
基本表的连接操作
连接类型
INNER JOIN | 内连接 |
---|---|
LEFT OUTER JOIN | 左外连接 |
RIGHT OUTER JOIN | 右外连接 |
FULL OUTER JOIN | 完全外连接 |
连接条件
NATURAL | 应写在连接类型的左边 |
---|---|
ON等值联接条件 | 应写在连接类型的右边 |
USING(A1, A2, …, An) | 应写在连接类型的右边 |
SQL的数据更新
1.单元组的插入
INSERT INTO 基本表名 [(列名表)] VALUES (元组值)
2.多元组的插入
INSERT INTO 基本表名 [(列名表)]
VALUES (元组值) , (元组值) ,……, (元组值)
3.查询结果的插入
INSERT INTO 基本表名 [(列名表)]<SELECT查询语句>
4.表的插入
INSERT INTO 基本表名1 [(列名表)]TABLE 基本表名2
5.数据删除
DELETE FROM 基本表名
[WHERE 条件表达式]
6.数据修改
UPDATE 基本表名
SET 列名=值表达式[,列名=值表达式…]│ROW=(元组)
[WHERE 条件表达式]
视图
虚表,是从一个或几个基本表(或视图)导出的表。
只存放视图的定义,不存放视图对应的数据。
基本表中的数据发生变化,从视图中查询出的数据也随之改变。
1.视图的创建
CREATE VIEW <视图名>(<列名序列>)
AS <SELECT 查询语句>
2.视图的撤销
DROP VIEW 视图名
如果视图是从单个基本表只使用选择、投影操作导出的,并且包含了基本表的主键,
那么这样的视图称为“行列子集视图”,并且可以被执行更新操作。
Ks允许用户更新的视图在定义时必须加上“WITH CHECK OPTION”短语。