数据库(二) SQL语言
本文最后更新于:2023年2月28日 下午
1. SQL概述
语言组成
结构化查询语言 (Structured Query Language, SQL) 大小写不敏感,有以下部分:
-
数据定义语言 (Data Definition Language, DDL)
创建、修改或删除数据库对象 (表、视图、模式、触发器、域、存储过程)
TABLE, VIEW, SCHEMA, INDEX, TRIGGER, DOMAIN, PROCEDURE
CREATE, ALTER, DROP
-
数据查询语言 (Data Query Language, DQL)
SELECT
-
数据操纵语言 (Data Manipulation Language, DML)
INSERT, DELETE, UPDATE
-
数据控制语言 (Data Control Language, DCL)
GRANT, DENY, REVOKE
-
其他语言要素 (additional language elements)
事务控制
COMMIT, ROLLBACK, SET TRANSACTION
程序化SQL
DECLAREEXPLAINLAN, OPEN, FETCH, CLOSE, PREPARE, EXECUTE, DESCRIBE
语句结构
一条SQL语句由多个子句构成 ,每个子句由一个关键字开始
2. 数据类型
字符型数据
数值型数据
日期型数据
3. DDL
数据库
1 |
|
表
结构
创建与约束
1 |
|
-
主键约束
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16/* 列级约束,作用于一列 */
CREATE TABLE Course
(
Cno number(4) PRIMARY KEY,
);
CREATE TABLE Course
(
Cno number(4) CONSTRAINT <pk_name> PRIMARY KEY,
);
/* 表级约束,可作用于多列 */
CREATE TABLE Course
(
Cno number(4),
Class number(1),
CONSTRAINT <pk_name> PRIMARY KEY (Cno,Class)
); -
外键约束
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18/* 自参照,外码约束指向本关系 */
/* 课程表Course,由课程号Cno、课程名Cname、先行课程号Ccpno、学分Ccredit四个属性组成 */
CREATE TABLE Course
(
Cno number(4) PRIMARY KEY,
Cname char(20),
Cpno number (4) CONSTRAINT <fk_name> REFERENCES Course(Cno),
Ccredit number(4)
);
/* 表级约束 */
CREATE TABLE SC
(
Sno number(12),
Cno number(4),
Grade number(3),
CONSTRAINT pk_SC PRIMARY KEY (Sno,Cno),
CONSTRAINT fk_c FOREIGN KEY (Cno) REFERENCES Course(Cno)
); -
非空约束
1
2/* 只有列级约束 */
Cname char(20) NOT NULL,缺省约束
1
2/* 只有列级约束 */
Ssex char(2) DEFAULT ('男'), -
唯一约束
1
2
3
4/* 列级约束 */
Cname char(20) Constraint <u_name> UNIQUE,
/* 表级约束 */
CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName), -
检查性约束
1
2
3
4/* 列级约束 */
Grade number(3) CONSTRAINT <chk_name> check(Grade>=0 AND Grade<=100),
/* 表级约束 */
CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
修改、增删与重命名
1 |
|
1 |
|
索引
索引是为了提高数据库检索效率,避免逐行遍历,可快速定位数据,以存储空间为代价的数据结构。
索引的结构
-
簇索引 (clustered index)
簇索引具有与表的数据结合的结构,其叶节点中存储的是实际的数据,对表的某一字段建立簇索引将对表数据重新排列储存,因此表中只能有一个簇索引。
-
非簇索引 (nonclustered index)
非簇索引具有与表的数据分离的结构,其叶节点中存储的是行定位器(指向数据行的指针)。
1 |
|
视图
视图是结构和数据建立在对表的查询基础上的虚表。可以限制用户访问数据、简化操作。
1 |
|
4. DQL
基本语句
语句结构
执行步骤
graph LR;
FROM --创建并连接表---> WHERE --条件筛选---> 1[GROUP BY] --分组---> HAVING --条件筛选---> SELET --选择字段---> 2[ORDER BY] --排序---> DBMS;
2 --排序--> 嵌入式SQL
SELECT子句
作用:选取字段
1 |
|
1 |
|
连接符
别名
考虑到语句的执行步骤,SELECT
定义的别名不能在 WHERE/GROUP BY/HAVING
中使用,能在 ORDER BY
中使用。
FROM子句
作用:创建并连接表
1 |
|
ORDER BY子句
作用:排序
1 |
|
1 |
|
WHERE子句
作用:条件筛选
运算符:
NOT
BETWEEN AND
IN
IS NULL
AND/OR
LIKE
单值条件
范围条件
1 |
|
NULL值
1 |
|
组合条件
1 |
|
模糊查询
根据关键词搜索相关信息,通过通配符 (%/_/[]/*
) 实现,只能作用于字符型数据 (CHAR/VARCHAR/TEXT
) 。
-
%
表示匹配位置的通配符
-
开头匹配
1
WHERE cname LIKE '计算机%' /* 匹配以'计算机'开头的课程名 */
-
结尾匹配
1
WHERE cname LIKE '%基础' /* 匹配以'基础'结尾的课程名 */
-
开头/结尾同时匹配
1
WHERE cname LIKE '计算机%基础' /* 匹配以'计算机'开头,以'基础'结尾的课程名 */
-
-
_
匹配任意字符的占位符
1
2
3WHERE cname LIKE '_____' /* 匹配5个字的课程名 */
WHERE cname LIKE '计算机__' /* 匹配以'计算机'开头,5个字的课程名 */
WHERE cname LIKE '%软件__' /* 匹配倒数第3、4个字为'软件'的课程名 */ -
[]
指定一系列字符
-
^
不含指定字符
1
WHERE cname LIKE '[^计生]%' /* 匹配不以'计'或'生'开头的课程名 */
-
ESCAPE
转义关键字1
2WHERE <col> LIKE '%M%' ESCAPE 'M' /* 定义'M'为转义符,其后的第一个字符'%'转义为实际值。匹配以'%'结尾的字符串 */
WHERE <col> LIKE 'ab&_%' ESCAPE '&' /* 定义'&'为转义符,其后的第一个字符'_'转义为实际值。匹配以'ab_'开头的字符串 */
聚合分析
聚合函数
多表查询
graph LR;
0[SQL_join] --- 1.1[内连接Inner_join] --- 2.1[条件连接Non-Equal_join];
1.1 --- 2.2[等值连接Equal_join];
0 --- 1.2[自连接Self_join];
0 --- 1.3[交叉连接/笛卡尔积Cross_join];
0 --- 1.4[外连接Outer_join] --- 2.3[左外连接];
1.4 --- 2.4[右外连接]
1.4 --- 2.5[全外连接]
语句结构
1 |
|
内连接
内连接返回与连接条件匹配的数据行。
1 |
|
外连接
外连接返回与连接条件匹配的及其它指定数据行。
1 |
|
自连接
1 |
|
交叉连接
笛卡尔积.
1 |
|
多表连接
1 |
|
子查询
指结果用作另一个查询的参数的查询
单值子查询
多行子查询
相关子查询
5. DML
参考资料
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!