SQL语言
文章目录
一、SQL概述
SQL语言最早称为Sequel,是Boyce和Chamberlin在1974年提出
的。1975-1979年IBM公司的San Jose研究实验室研制的关系数据
库管理系统原型系统System R实现了这种语言。此后,Sequel不
断发展,并更名为SQL
1.SQL的功能
- SQL的数据定义语言(DDL)提供了模式定义、修改和删除,基本表定
义、修改和删除、域定义修改和删除、 视图的定义和删除 - SQL的数据操纵语言(DML)提供了数据查询子语言
- DML还提供数据更新(数据插入、删除和修改)语句,允许用户更新数
据 - SQL DML允许用户对视图进行查询和受限的更新操作
- SQL的数据控制语言(DCL)定义用户对数据对象的访问权限和审计
2.SQL的特点
-
集多种数据库语言于一体
- SQL语言集数据定义语言(DDL),数据操纵语言(DML), 数据控制语言(DCL)功能于一体
- 可以独立完成数据管理的核心操作
- 用户数据库投入运行后,可根据需要随时逐步修改模式,不影 响数据的运行
- 数据操作符统一,查找、插入、删除、更新等只需一种操作符
-
高度非过程化
- 非关系数据模型的数据操纵语言“面向过程”,必须使用类 似于指针的机制,指定存取路径
- SQL只要提出“做什么”,无须了解存取路径
- 系统将考察多种执行方案,选择并运行一个最优的执行方案 得到结果
-
面向集合的操作方式
- 非关系数据模型采用面向记录的操作方式,操作对象是一条记录
- SQL采用集合操作方式
- 操作对象、查找结果可以是元组的集合
- 一次插入、删除、更新操作的对象可以是元组的集合
-
一种语法两种使用方式
- SQL是独立的语言
- 能够独立地用于联机交互的使用方式
- SQL又是嵌入式语言
- SQL能够嵌入到高级语言(例如C,C++,Java)程序中,供程序员设计程序时使用
-
功能强大,语言简洁
- SQL是一种完整地数据库语言,其功能涵盖数据定义、数据 操纵、数据控制等数据管理的主要需求
- 但SQL语言相对比较简洁,其核心动词只有9个
CREATE
,ALTER
,DROP
,SELECT
,INSERT
,DELETE
,UPDATE
,GRANT
,REVOKE
- SQL 语言的语法简单,与英语口语的风格类似,易学易用
二、SQL的数据类型
-
CHAR(n):定长字符串,长度n由用户指定。省略n时,长度为1,CHAR的全称是CHARACTER
-
VARCHAR(n):变长字符串,最大长度n由用户指定,VARCHAR的全称是CHARACTER VARYING定长和变长字符串的差别主要表现在前者需要固定长度的空间,而后者占用的空间在最大长度范围内是可改变的
-
BIT(n):定长二进位串,长度n由用户指定。省略n时,长度为1
-
BIT VARYING(n):变长二进位串,最大长度n由用户指定
-
INT:整数,其值域依赖于具体实现。INT的全称是INTEGER
-
SMALLINT:小整数,其值域依赖于具体实现,但小于INT的值域
-
DEC(p, d):p位有效数字的定点数,其中小数点右边占d位。DEC的全称是DECIMAL
-
FLOAT(n):精度至少为n位数字的浮点数,其值域依赖于实现
-
REAL:实数,精度依赖于实现
-
DOUBLE PRECISION:双精度实数,精度依赖于实现,但精度比REAL高 DATE:日期,包括年、月、日,格式为YYYY-MM-DD
-
TIME:时间,包括时、分、秒,格式为HH:MM:SS。TIME(n)可以表示比秒更小的单位,秒后取n位 TIMESTAMP:时间戳,是DATE和TIME的结合
-
INTERVAL:时间间隔。SQL允许对DATE、TIME和INTERVAL类型的值进行计算
三、表的定义、修改和删除
1.创建表
CREATE TABLE <表名>
(<列名><数据类型> [DEFAULT <缺省值>] [列级约束定义],
<列名><数据类型> [DEFAULT <缺省值>] [列级约束定义],
…,
[<表级约束定义>, …, <表级约束定义>]);
-
可选短语“DEFAULT <缺省值>”定义列上的缺省值,<缺省值>是<类型>中的一个特定值或空值(NULL)
-
列级约束定义和该列相关的完整性约束
[CONSTRAINT <约束名>] <列约束>
- NOT NULL:不允许该列取空值
- PRIMARY KEY:指明该列是主码
- UNIQUE:该列上的值必须惟一
- CHECK (<条件>):指明该列的值必须满足的条件,其中<条件>是一个涉及该列的布尔表达式
-
表级约束定义和一个列或者多个列同时相关的完整性约束
[CONSTRAINT <约束名>] <表约束>
-
PRIMARY KEY (A1, …, Ak):说明属性列A1, …, Ak构成该关系的主码
-
UNIQUE (A1, …, Ak):说明属性列A1, …, Ak上的值必须惟一,这相当于说明A1, …, Ak构成该关系的候选码
-
CHECK (<条件>):说明该表上的一个完整性约束条件
-
FOREIGN KEY (A1, …, Ak) REFERENCES <外表名> (<外表主码>) [<参照触发动作>]
-
2.修改表
ALTER TABLE <表名> [ADD [COLUMN] <列名><数据类型>[列级约束定义]]
[ALTER [COLUMN] <列名> {SET DEFAULT <缺省值> |
DROP DEFAULT}]
[DROP [ COLUMN ] <列名> {CASCADE | RESTRICT}]
[ADD <表约束定义>]
[DROP CONSTRAINT <约束名>{CASCADE | RESTRICT}]
3.删除表
DROP TABLE <表名> {CASCADE∣RESTRICT}
四、索引的创建和删除
1.索引的创建
CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON
<表名> (<列名> [<次序>]{,<列名> [<次序>]})
-
<索引名>为建立的索引命名
-
<表名>是要建立索引的基本表的名字
-
索引可以建在该表的一列或多列上,各列名间用逗号分隔;每个<列名>后可以用<次序>指定索引值的排列次序
-
次序可以是ASC(升序)和DESC(降序),缺省值为ASC
-
UNIQUE 表示该索引为惟一性索引UNIQUE缺省时,创建的索引为非唯一性
索引 -
CLUSTER表示建立的索引是聚簇索引,缺省时为非聚簇索引
-
创建索引不仅创建索引结构,而且将索引的定义存储在数据字典中
2.索引删除
DROP INDEX <索引名>
删除索引时,系统将删除索引结构,并同时从数据字典中删去有关该索引的定义
五、SELECT语句
SELECT语句的一般形式如下:
SELECT [ALL︱DISTINCT] <选择序列> FROM <表引用>, …, <表引用>
[WHERE <查询条件>]
[GROUP BY <分组列> {,<分组列>} [HAVING <分组选择条件>]]
[ORDER BY <排序列> [ASC︱DESC] {, <排序列> [ASC︱DESC]}]
六、数据更新
1.插入
向基本表插入单个元组
INSERT INTO T [(A1, ..., Ak) ]VALUES (c1, …, ck)
将查询的结果(多个元组)插入基本表
INSERT INTO T [(A1, ..., Ak) ]
<查询表达式>
2.删除
DELETE FROM T
[ WHERE <删除条件> ]
3.修改
UPDATE T
SET A1 = e1, …, Ak = ek
[WHERE <修改条件> ]
七、视图的创建和删除
1.视图的创建
CREATE VIEW <视图名> [ (<列名> , …, <列名>)]
AS <查询表达式>
[WITH CHECK OPTION]
- <视图名>对定义的视图命名
- <列名>为<查询表达式>结果的诸列命名
- <查询表达式>通常是一个SELECT查询
- WITH CHECK OPTION表示该视图是可更新的,并且对视图进行更
新时要满足<查询表达式>的查询条件
2.视图删除
DROP VIEW <视图名> [ CASCADE | RESTRICT ]
- CASCADE或RESTRICT是可选的,缺省时为RESTRICT
八、断言与触发器
1.断言
断言(Assertion)是一种命名约束,它表达了数据库状态必须满足的逻辑条件
SQL创建断言的语句具有如下格式:
CREATE ASSERTION <断言名>
CHECK (<条件>) [<约束性质> ]
可以用如下形式的语句直接删除断言:
DROP ASSERTION <断言名>
2.触发器
创建触发器语句的一般格式如下:
CREATE TRIGGER <触发器名> <触发时间> <触发事件> ON <表名>
[REFERENCING <旧/新值别名>, …, <旧/新值别名>]
[FOR EACH {ROW | STATEMENT}]
[WHEN (<触发条件>)] <被触发的SQL语句>
-
<触发时间>可以是 BEFORE:事件前, AFTER:事件后
-
<触发事件>可以是T上的INSERT、DELETE、UPDATE或UPDATE OF <触发列>, …, <触发列> REFERENCING子句创建一些过渡变量用来存放表T和表T的行更新前的旧值和更新后的新值。
-
<旧/新值别名>可以是如下形式之一
- OLD/NEW [ROW] [AS] <变量>:创建行过渡变量<变量>存放表T的行更新前/后的值
- OLD/NEW TABLE [AS] <变量>:创建表过渡变量<变量>存放表T更新前/后的值
-
FOR EACH ROW 定义行级触发器,而FOR EACH STATEMENT定义语句级触发器缺省时为语句级触发器
-
WHEN子句说明触发条件,缺省时无条件触发。<触发条件>是一个任意布尔表达式
-
<被触发的SQL语句>是触发动作体,具有如下形式:
BEGIN ATOMIC <可执行的SQL语句>; ... END