关系数据库标准SQL语言
1.SQL 概述
-
发展历程与标准化:1974 年由 Boyce 和 Chamberlin 提出,在 IBM 的 System R 上首次实现。1986 年被 ANSI 批准为美国标准,ISO 随后跟进。相关标准有 SQL-86、SQL-89、SQL-92、SQL-99、SQL-2003 等,不断增加新特性。目前大部分 DBMS 产品支持 SQL,但存在方言差异。
-
特点
- 综合统一:集数据定义(DDL)、操纵(DML)和控制(DCL)语言功能于一体,如使用
CREATE
定义表结构(DDL) ,INSERT
插入数据(DML) ,GRANT
赋予用户权限(DCL)。 - 高度非过程化:用户只需提出 “做什么”,无需关注 “怎么做”。例如查询学生表中所有学生信息,用户只需使用
SELECT * FROM Student;
,无需关心数据如何存储、如何获取。 - 面向集合操作:操作对象和结果都是集合。比如对整个学生表进行查询操作,返回的是满足条件的学生集合。
- 两种使用方式:自含式可独立交互使用,嵌入式可嵌入高级语言程序中。例如在 MySQL 命令行中可直接使用自含式 SQL 语句查询数据;在 Java 程序中,可将 SQL 语句嵌入代码中进行数据库操作。
- 语言简捷:易学易用,核心动词少。像数据查询用
SELECT
,数据插入用INSERT
等。
- 综合统一:集数据定义(DDL)、操纵(DML)和控制(DCL)语言功能于一体,如使用
-
功能与体系结构
-
功能动词:数据查询(
SELECT
)、定义(CREATE
、DROP
(删除)、ALTER
(改变))、操纵(INSERT
、UPDATE
、DELETE
)、控制(GRANT
(授予)、REVOKE
(撤回))。例如用CREATE TABLE
创建表,SELECT
查询数据。 -
体系结构:支持关系数据库的三级模式结构,外模式包含视图,模式包含基本表,内模式对应存储文件。以学生课程数据库为例,学生表、课程表是基本表,存于模式中;根据基本表创建的学生成绩视图存于外模式;而数据实际存储在存储文件中,对应内模式。
-
2.数据定义
3.模式操作
-
定义模式:使用
CREATE SCHEMA
语句,指定模式名和用户名,模式定义了命名空间。例如CREATE SCHEMA 'S-T' AUTHORIZATION WANG;
,创建了名为S-T
的模式,授权给用户WANG
。 -
删除模式:
DROP SCHEMA
语句,可选择级联(CASCADE
)或限制(RESTRICT
)删除方式。如DROP SCHEMA ZHANG CASCADE;
,级联删除ZHANG
模式及其包含的所有数据库对象。
4.基本表操作
(1) 定义基本表:
CREATE TABLE
语句,指定列名、数据类型、缺省值和完整性约束,如非空(NOT NULL
)、唯一性(UNIQUE
)、主键(PRIMARY KEY
)、外键(FOREIGN KEY
)、检查(CHECK
)约束。
列名:
在创建表时,列名用于标识表中的每一列,起到命名的作用。它需要遵循数据库的命名规则,一般由字母、数字和下划线组成,并且不能是数据库的保留关键字。
数据类型:
数据类型规定了列能够存储的数据的种类。不同的数据库系统支持的数据类型会有所不同,不过常见的数据类型有以下几种:
- 数值类型:像
INT
(整数)、FLOAT
(浮点数)、DECIMAL
(定点数)等。 - 字符串类型:例如
VARCHAR
(可变长度字符串)、CHAR
(固定长度字符串)、TEXT
(长文本)等。 - 日期和时间类型:如
DATE
(日期)、TIME
(时间)、DATETIME
(日期和时间)等。 - 布尔类型:例如
BOOLEAN
(布尔值,通常是TRUE
或FALSE
)。
缺省值:
缺省值是在插入数据时,如果没有为该列提供具体值,数据库会自动使用的默认值。可以通过 DEFAULT
关键字来指定。
(2)完整性约束:
完整性约束用于保证数据库中数据的准确性和一致性,常见的约束如下:
非空约束(NOT NULL
)
此约束要求列的值不能为 NULL
。在插入或更新数据时,如果该列没有值,数据库会报错。
唯一性约束(UNIQUE
)
该约束确保列中的值在整个表中是唯一的,即没有重复值。可以有多个 NULL
值,但除 NULL
外,每个值只能出现一次。
主键约束(PRIMARY KEY
)
主键是用来唯一标识表中每一行的列或列组合。主键列的值不能为 NULL
,并且必须是唯一的。一个表只能有一个主键。
外键约束(FOREIGN KEY
)
外键用于建立表与表之间的关联关系。外键列的值必须与另一个表(父表)中主键列的值相匹配,以此保证数据的引用完整性。
检查约束(CHECK
)
检查约束用于对列的值进行条件检查,只有满足指定条件的值才能被插入或更新到列中。
示例代码
下面是一个使用 CREATE TABLE
语句创建表的示例,其中包含了上述提到的各种约束:
CREATE TABLE STUDENT
(
SNO CHAR(20) PRIMARY KEY,
SNAME CHAR(20) NOT NULL,
SAGE INT CHECK(SAGE >=18 AND SAGE <= 28)DEFAULT 18,
SSEX CHAR(10),
SCLASS CHAR(10)
);
CREATE TABLE COURSE
(
CNO CHAR(20)PRIMARY KEY,
CNAME CHAR(40)UNIQUE,
CHOUR INT,
CTEACHER CHAR(20);
)
CREATE TABLE SC
(
SNO CHAR(20),
CNO CHAR(20),
PRIMARY KEY(SNO,CNO),
GRADE INT,
FOREIGN KEY(SNO) REFERENCES STUDENT(SNO),
FOREIGN KEY(CNO) REFERENCES COURSE(CNO)
)
(3)验证完整性约束:
1. 主键约束(primary key)
--验证主键约束--
INSERT INTO STUDENT(SNO,SNAME,SAGE,SSEX,SCLASS)
VALUES
('0905010101','王辰',20,'男','计算机091'),
('0905010101', '赵萌萌', 19, '女', '计算机091');
2.外键约束(foreign key)
--验证外键约束--
INSERT INTO SC(SNO, CNO, GRADE)
VALUES
('0905010108', '050601', 75);
3. 非空约束(not null)
--验证非空约束--
INSERT INTO STUDENT(SNO,SNAME,SAGE,SSEX,SCLASS)
VALUES
('2305010319',NULL,20,'男','计算机233');
4.唯一键约束
--验证唯一性约束--
insert into COURSE(CNO, CNAME, CHOUR, CTEACHER)
values
('050604', '数据库原理', 48, '姚老师'),
('050605', '数据库原理', 32, '张老师');
5.检查约束
--验证检查约束--
INSERT INTO STUDENT(SNO,SNAME,SAGE,SSEX,SCLASS)
VALUES
('2305010319','李哈哈',17,'男','计算机233');
- 修改基本表:
ALTER TABLE
语句,可增加列、修改列定义、删除列和完整性约束。例如:
-- 向Student表增加“入学时间(S_entrance)”列
ALTER TABLE Student ADD S_entrance DATE;
--删除列--
ALTER TABLE STUDENT DROP COLUMN S_ENTRANCE;
-- 将Student表Sage的数据类型改为INT
ALTER TABLE Student ALTER COLUMN Sage INT;
ALTER TABLE STUDENT ADD CONSTRAINT UQ_STUDENT_SNAME UNIQUE (SNAME);
ALTER TABLE STUDENT DROP CONSTRAINT UQ_STUDENT_SNAME;
ALTER TABLE STUDENT ADD DEFAULT '男' FOR SSEX
-
删除基本表:
DROP TABLE
语句,删除表及相关数据和视图,需谨慎操作。如DROP TABLE Student;
,删除Student
表及其所有数据和相关视图。DROP TABLE STUDENT
5.索引
- 定义:是一种数据结构,用于加快数据的检索速度。它类似于一本书的目录,通过记录表中的值以及各值的存储位置,帮助数据库程序快速找到表中的数据,而不必扫描整个表。
- 作用:能显著提升数据查询性能,减少查询时的磁盘 I/O 操作。例如在一个有大量记录的
Students
表中,若要查找特定学号的学生信息,有索引时可快速定位,无索引则可能需全表扫描。 - 分类:
- 按存储结构:
- 聚簇索引:决定表中数据的物理存储顺序,表中数据按索引列的值排序存放,一个表只能有一个聚集索引 。如在学生表中以学号列创建聚集索引,数据会按学号顺序物理存储 。
- 非聚集索引:不改变表中数据的物理存储顺序,数据与索引分开存储,通过索引指向的地址与表中的数据相关联,一个表可以有多个非聚集索引 。
- 按数据唯一性:
- 唯一索引:确保索引列中的值唯一,不允许出现重复值,可用于加速对唯一值的查询,也可作为主键约束 。
- 非唯一索引:索引列中的值可以重复。
- 按键列个数:
- 单列索引:基于单个列创建的索引。
- 多列索引:基于多个列组合创建的索引 。
- 按存储结构:
- 利弊:
- 优点:加快数据查询速度,减少查询响应时间;辅助实现表与表之间的参照完整性等 。
- 缺点:创建和维护索引会占用额外的存储空间;对表进行增、删、改操作时,数据库需要同时更新索引,会增加操作开销,降低这些操作的执行效率 。
- 索引操作
- 建立索引:
CREATE INDEX
语句,可创建唯一(UNIQUE
)、聚簇(CLUSTER
)索引,指定索引列和排序次序。例如:
- 建立索引:
-- 为Student表按学号升序建唯一索引
CREATE UNIQUE INDEX Stusno ON Student(Sno);
-- 为Student表的Sname列建立聚簇索引
CREATE CLUSTER INDEX Stusname ON Student(Sname);
- 删除索引:
DROP INDEX
语句,不同数据库系统语法略有差异。如在 SQL Server 中,DROP INDEX Stusname ON Student;
删除Student
表上的Stusname
索引。