1. SQL简介
2. 基本的数据定义
2.1 创建基本表
CREATE TABLE <表名>
<列名><数据类型>[<默认值>|<标识列设置>][<该列的完整性约束>]
`完整性约束:
①NOT NULL :该列值不能为空
②NULL :该列值可以为空
③UNIQUE :该列值不能有相同者
2.2 表结构的修改
ALTER TABLE <表名>
ADD <列名><数据类型>[列的完整性约束] 为表添加一个新列
ADD <表级完整性约束> 为表添加一个表级完整性约束
ALTER COLUMN<列名><新的数据类型> 修改表中原有列的数据类型
DROP COLUNM <列名> 删除表中原有的一个列
DROP CONSTRAINT<表级完整性约束> 删除原有的表级完整性约束
2.3 删除基本表
DROP TABLE <表名1>[,<表名2>];
2.4 创建索引
CREATE [UNIQUE][CLUSTERED][NONCLUSTERED] INDEX <索引名>
ON <表名|视图名>(<列名清单>)
<列名清单> 中,每个列名后面都要指定 ASC(升序)、DESC(降序),不指定默认升序
2.5 删除索引
DROP INDEX <索引名1>[,<索引名2>];
3. 基本的数据操纵
3.1 表中增加元组
INSERT INTO <表名>[(<属性名清单>)]
VALUES(<常量清单>);
<常量清单>中,字符串常量和日期型常量要用单引号(英文符号)括起来
3.2 修改表中数据的基本方法
UPDATE <表名>
SET <列名>=<表达式>,[,<列名>=<表达式>]
[WHERE<条件>];
3.3 删除记录
DELETE FROM <表名>
[WHERE<条件>];
3.4 更新操作与数据库的一致性
4. 数据查询
4.1 无条件单关系查询
SELECT [DISTINCT / ALL] < 目标列表达式 [[AS] 别名] 清单 >
FROM <关系名>
DISTINCT : 每组重复元组只输出一条元组
默认ALL
4.1.1 查询关系中的所有信息
SELECT *
FROM <关系名>;
4.1.2 指定要查询的列
SELECT Title
FROM Employee;
4.1.3 取消结果集中的重复行
SELECT DITINCT Title
FROM Employee;
ps: DISTINCT 关键字必须放在列名前
4.1.4 查询经过计算的列
SELECT Ename , 2024-Age AS [Year of Birth] , Title
FROM Employee;
4.1.5 查询汇总数据
函数 | 功能 |
COUNT(DISTINCT / ALL]*) | 统计结果中元组个数 |
COUNT(DISTINCT / ALL]<列名>) | 统计结果中某列值的个数 |
MAX(<列名>) | 给出一列上的最大值 |
MIN(<列名>) | 给出一列上的最小值 |
SUM(DISTINCT / ALL]<列名>) | 给出一列上值的总和 |
AVG(DISTINCT / ALL]<列名>) | 给出一列上值的平均值 |
4.2 带条件单关系查询
SELECT [DISTINCT / ALL] < 目标列表达式 [[AS] 别名] 清单 >
FROM <关系名>
WHERE <查询条件表达式>
4.2.1 使用比较运算符
= 、 < 、 >、<=、>=、<>
4.2.2 使用特殊运算符
运算符号 | 含义 |
IN、NOT IN | 检查属性值是否属于一组值之一 |
BETWEEN...AND..、 NOT BETWEEN...AND... | 检查属性值是否属于某个范围 |
IS NULL、IS NOT NULL | 检查属性值是否为空 |
LIKE 、NOT LIKE | 字符串匹配 |
通配符:%表示任意长度的字符串(长度可以为0
_表示任意单个字符
4.2.3 多条件单关系查询
NOT 、 AND 、 OR
4.3 分组查询
SELECT [DISTINCT / ALL] <目标列表达式 [别名] 清单 >
FROM <关系名>
[WHERE<查询条件表达式>]
GROUP BY <列名清单>[HAVING<条件表达式>];
根据GRUOP BY 中的列名清单 的值进行分组
SELECT语句中有 集函数 COUNT、SUM等
HAVING语句条件作用于结果组
4.4 排序查询结果
SELECT [DISTINCT / ALL] <目标列表达式 [别名] 清单 >
FROM <关系名>
[WHERE<查询条件表达式>]
[GROPUP BY <列名清单>[HAVING<条件表达式>]]
ORDER BY < 列名[ASC / DESC ]清单>;
ORDER BY 语句只作用于最终查询结果
4.5 多关系连接查询
4.5.1 交叉连接
SELECT [DISTINCT / ALL] <目标列表达式 [别名] 清单>
FROM <关系名[别名] 清单>
例如
SELECT e.Ename , e.Title , e.Dno , d.Dno , d.Name
FROM Employee e , Department d;
4.5.2 内部连接
SELECT [DISTINCT / ALL] <目标列表达式 [别名] 清单>
FROM <关系名[别名] 清单>
WHERE <连接条件表达式>
SELECT e.Ename , e.Title , e.Dno , d.Dno , d.Name
FROM Employee e INNER JOIN Department d
ON e.Dno = d.Dno;
例如
SELECT e.Ename , e.Title , e.Dno , d.Dno , d.Name
FROM Employee e , Department d
WHERE e.Dno = d.Dno;
上面的语句先将Employee表和Department表做交叉连接,检索出的行数是Employee表的行数乘以Deprtment表的行数,然后WHERE语句将Employee表的Dno列与Department表的Dno列进行匹配,相等的行检索出来予以返回。
ps:连接的属性名不一定要相同,但是数据类型要兼容
4.5.3 外部连接
1.左外连接:除了返回两表中满足连接条件的元组以外,还返回左侧表中不匹配的元组,右侧表中的空值则以空值(NULL)表示
2.右外连接
3.全外连接
LEFT JOIN、 RIGHT JOIN、 FULL JOIN
4.5.4 自身连接
使用关系的别名
例如,Eno(职工号)、Ename(职工姓名)、Emgr(负责人)
SELECT emp1.Eno ,emp2.Emgr
FROM Employee emp1,Employee emp2
WHERE emp1.Emgr = emp2.Eno
自身连接,找到间接负责人
4.6 嵌套查询
1.使用IN进行子查询
IN、NOT IN
2.使用比较运算符的嵌套查询
可以和ANY、ALL一起使用
3.使用BETWEEN的嵌套查询
4.相关子查询
例如
SELECT Ename
FROM Employee emp1
WHERE Age >
(SELECT AVG(Age)
FROM Employee emp2
WHERE emp2.Dno = emp1.Dno);
在相关子查询中,可以使用EXISTS ,测试子查询是否存在返回值
查询参加了项目的职工号、姓名
SELECT Eno,Ename
FROM Employee e
WHERE EXISTS
(SELECT *
FEOM Item_Emp
WHERE Eno = e.Eno);
子查询只返回逻辑值
4.7 多个SELECT语句的集合操作
集合操作:UNION(并操作、INTERSECT(交操作、EXCEPT(差操作
例如
SELECT *
FROM Item_Emp
WHERE Ino = '201801'
UNION
SELECT *
FROM Item_Emp
WHERE Ino = '202001'
查询项目号为‘201801’和‘202001’项目的职工参与信息
ps:参加UNION的记录结果集必须有相同的列数
5. 含有子查询的数据更新
5.1 INSERT 与子查询的结合
INSERT INTO Employee_01
SELECT *
FROM Employee
WHERE Dno = '01'
5.2 UPDATE 与子查询的结合
UPDATE Salary
SET Rest = Rest + 200
WHERE Eno IN
(SELECT Eno
FROM Item_Emp
WHERE Ino = '201802');
使参加‘201802’项目的职工,工资表中津贴的值都增加200
5.3 DELETE 与子查询的结合
DELETE FROM Item_Emp
WHERE Eno =
(SELECT Eno
FROM Employee
WHERE Ename = '丁过’);
删除项目参加人中包含‘丁过’的所有元组
6. 视图
视图是从一个或多个关系(基本表或者已有的视图)导出的关系
视图是虚表,视图不建立索引
6.1 定义视图
CREATE VIEW <视图名>[<列名清单>]
AS <子查询>
[WITH CHECK OPTION]
[WITH CHECK OPTION]:之后对视图进行插入、修改、删除操作,会加上子查询中的条件,如果条件判断成立,则进行插入、修改和删除的操作
6.2 删除试图
DROP VIEW <视图名>
6.3 视图的查询
6.4 视图的更新
不是所有的视图都是可以更新的