结构化查询语言
结构化查询语言
1. SQL数据定义
SQL基本数据类型
- 数值型
- INT:整数,取值范围取决于DBMS实现
- SMALLINT
- BIGINT
- FLOAT(n):浮点数,精度至少为n位数字
- 布尔型
- BOOLEAN
- 字符串型
- CHAR(n):定长字符串,长度为n
- VARCHAR(n):变长字符串,最大长度为n
- 二进制串型
- BINARY(n):定长二进制串,长度为n个字节
- VARBINARY(n):
- 日期时间型
- DATE:日期,格式YYYY-MM-DD
- TIME:时间,格式HH:MM:SS
- 时间区间型
创建关系模式
- 语句:
1 2 3 4 5 6 7
CREATE TABLE Student( Sno CHAR(6), Sname VARCHAR(10), Ssex CHAR, Sage INT, Sdept VARCHAR(20) );
- 声明主键
1 2 3 4 5 6 7 8
CREATE TABLE Student( Sno CHAR(6), Sname VARCHAR(10), Ssex CHAR, Sage INT, Sdept VARCHAR(20), PRIMARY KEY (Sno) );
- 声明外键(一个关系可以有多个外键)
1 2 3 4 5 6 7
CREATE TABLE SC( Sno CHAR(6) Cno CHAR(4) Grade INT, PRIMARY KEY (Sno, Cno), FOREIGN KEY (Sno) REFERENCES Student(Sno) );
- 声明用户定义完整性约束
- 非空:
NOT NULL
- 不重复:
UNIQUE
- 定义缺省值:
DEFAULT 缺省值
- 属性必须满足表达式给出的条件:
CHECK (表达式)
1 2 3 4 5 6 7 8
CREATE TABLE Student( Sno CHAR(6), Sname VARCHAR(10) NOT NULL, Ssex CHAR NOT NULL CHECK (Ssex IN ('M', 'F')), Sage INT DEFAULT 0 CHECK (Sage >= 0), Sdept VARCHAR(20), PRIMARY KEY (Sno) );
- 非空:
删除关系
- 语句:DROP TABLE 关系名1, 关系名2, …, 关系名n
1
DROP TABLE 关系名1, 关系名2, ..., 关系名n
修改关系模式
1
ALTER TABLE
- 修改关系名
1
ALTER TABLE Student RENAME TO XUESHENG;
- 增加、修改、删除属性
1 2
ALTER TABLE Student ADD Mno CHAR(6); ALTER TABLE Student DROP Mno;
- 增加、删除约束
1 2 3
ALTER TABLE Student ADD CONSTRAINT fk_mon FOREIGN KEY (Mno) REFERENCES Student(Sno);
1
ALTER TABLE Student DROP CONSTRAINT fk_mno
定义视图
创建视图
1
2
3
4
create view CS_Student_on_DB as
select sno, sname, grade
from student natural join sc
where sdept = 'cs' and cno = '3006';
修改视图
1
2
3
4
alter view CS_Student_on_DB as
select sno, sname, ssex, grade
from student natural join sc
where sdept = 'cs' and cno = '3006';
删除视图
1
drop view CS_Student_on_DB;
查询视图
1
select * from CS_Student_on_DB;
视图的作用
- 一个关系数据库只有一个概念模式,但可以有多个外模式
2. SQL数据更新
插入数据
- 直接插入元组
1
INSERT INTO Student VALUES ('MA-002', 'Cindy', 'F', 19, 'Math');
1
INSERT INTO Student (Sno, Sname, Sage, Ssex) VALUES ('MA-002', 'Cindy', 19, 'F');
修改数据
- 基于本关系的数据修改
1
UPDATE student SET sage = 20 where sno = 'MA-002';
删除数据
1
DELETE FROM student where sno = 'MA-002';
3. SQL数据查询
单关系查询
投影查询
1
select [distinct] 属性名列表(或表示式列表) from 关系名;
1
select * from Student;
1
select Sname, (2023 - Sage) as bd from Student;
选择查询
1
select [distinct] 表达式列表 from 关系名 where 选择条件;
- 选择条件
- 表达式比较
- 不等于:
!=
或者<>
- 不等于:
- 范围比较
- 语法:
表达式1 [NOT] between 表达式2 and 表达式3
- 语法:
- 集合元素判断
- 语法:
表达式1 [not] in (表达式2, ..., 表达式n)
- 语法:
- 字符串匹配
- 语法:
字符串表达式 [not] like 模式
- 通配符
_
:匹配单个字符 - 通配符
%
:匹配任意长度的字符串 - 转移字符
\
- 也可以使用正则表达式
- 语法:
- 空值判断
- 语法:
属性名 is [not] null
1
select Sno, Sname from Student where Sname like 'E___';
1
select Sno, Sname from Student where Sname regexp '^[EF].*';
1
select Sno from sc where Grade is null;
- 语法:
- 表达式比较
集合操作
- 求并:
查询语句1 union [all] 查询语句2
- 求交:
查询语句1 intersect 查询语句2
- 求差:
查询语句1 minus/except 查询语句2
排序
order by 属性名1[asc|desc], ..., 属性名n[asc|desc]
限制数量
limit 结果数量 [offset 偏移量]
聚集查询
- 聚集函数:
count
、max
、min
、sum
、avg
1
select 聚集函数([distinct] 表达式) from ... where...;
- 聚集函数不能出现在where子句中
分组查询
1
select cno, count(*), avg(grade) from sc group by cno;
- 筛选条件
having
1
select sno, avg(grade) from sc where grade >= 80 group by sno having count(*) >= 2;
连接查询
笛卡尔积
1
select ... from 关系名1, ..., 关系名n;
1
select ... from 关系名1 cross join 关系名2
内连接
1
select ... from 关系名1 [inner] join 关系名2 on 连接条件
- 当内连接是等值连接,且连接属性同名时,使用
using
1
select student.sno, sname, cno, grade from student join sc using(sno);
自然连接
1
select ... from 关系名1 natural join 关系名2
外连接
- 左外连接:
关系名1 left [outer] join 关系名2 on 连接条件
- 右外连接:
关系名1 right [outer] join 关系名2 on 连接条件
- 全外连接:
关系名1 full [outer] join 关系名2 on 连接条件
- 自然外连接:
关系名1 natural left|right [outer] join 关系名2 on 连接条件
嵌套查询
- 查询块:一个
select-from-where
语句为一个查询块 - 内层查询块称为子查询
- 先执行子查询,后执行父查询
- 类型
- 不相关子查询:子查询不依赖于外层查询
- 相关子查询:子查询依赖于外层查询
- 写法
表达式 [not] in (子查询)
表达式 比较运算符 [all|any|some] (子查询)
all
:当表达式的值与子查询结果中任意的值都满足比较条件时,返回真;否则,返回假any
或some
:当表达式的值与子查询结果中某个值满足比较条件时,返回真;否则,返回假[not] exists (子查询)
- 判断子查询结果是否为空
from (子查询)
- 将子查询的结果当作关系放在外层查询的from子句中使用,称为派生表
with 临时关系(属性列表) as (子查询)
- with子句定义的临时关系只在包含with子句的查询中有效
1 2 3
with t as (select sno, count(*) as cnt from sc group by sno) select sno, cnt from t where cnt >= 2;
This post is licensed under CC BY 4.0 by the author.