如果存在异议请各位在评论区进行交流,谢谢。
关键字(供查阅型)
关键字 | 描述 |
---|---|
ASC | 升序 |
DESC | 降序 |
UNIQUE | 唯一索引 |
CLUSTER | 聚簇索引 |
DISTINCT | 去重 |
ALL | 所有 |
WHERE | 用于筛选由 FROM 指定的数据对象 |
HAVING | 用于筛选 GROUP BY 以后分组的数据进行过滤 |
RESTRICT | 确保只有不存在相关视图和完整性约束的表才能删除 |
CASCADE | 任何相关视图和完整性约束一并被删除 |
数据类型
数据类型 | 描述 |
---|---|
Char(n) | 长度为n的定长字符串 |
VarChar(n) | 长度为n的变长字符串 |
INT | 长整数 |
SMALLINT | 短整数 |
NUMERIC(p,d) | 定点数,由p位小数组成,小数后面有d位数字 |
REAL | 取决于机器精度的浮点数 |
Double Precision | 取决于机器精度的双浮点数 |
FLOAT(n) | 浮点数,精度至少为n位数字 |
DATE | 日期,包含年、月、日,格式为 YYYY-MM—DD |
TIME | 时间,包含时、分、秒,格式为 HH:MM:SS |
基本表的创建
CREATE TABLE <表名>
(<列名><数据类型>[<列级完整性约束条件>]
......
);
举例
CREATE TABLE Student
(Sno CHAR(5) UNIQUE NOT NULL,
Sname CHAR(18) UNIQUE,
Ssex CHAR(2),
Sage INT,
Sdept CHAR(15));
基本表的修改
ALTER TABLE <表名>(
[ADD <新列名><数据类型>[<完整性约束>]]
[DROP <完整性约束名>]
[ALTER COLUMN <列名><数据结构>]);
ADD 添加新列,新列的类型和新的完整性约束条件
向 Student 这个表单中添加手机号这一列
ALTER TABLE Student ADD Sphone CHAR(10);
ALTER 修改原有的列定义
将年龄的的数据类型改为短整数
ALTER TABLE Student ALTER Sage SMALLINT;
DROP 删除指定的完整性约束或列
删除学生姓名必须去唯一值的约束
ALTER TABLE Student DROP UNIQUE(Sname);
删除基本表
DROP TABLE <表单>
删除学生表 Student
DROP TABLE Student;
建立索引
CREATE [UNIQUE] [CLUSTER]
INDEX <索引名>
ON <表名>(<列名>[<次序>],<列名>[<次序>]...);
创建聚簇索引,按照 Sname 值的升序存放。
CREATE CLUSTER INDEX Ssname ON Student(Sname);
创建唯一索引,按照 Sno 值的降序存放。
CREATE UNIQUE INDEX SCno ON SC(Sno DESC,Cno);
删除索引
DROP INDEX <索引名>
删除名为 Ssname 的索引
DROP INDEX Ssname;
数据查询
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]...
FROM <表明或视图名>[,<表名或视图名>]...
[WHERE <条件表达式>]
[GROUP BY <分组列>[HAVING<条件表达式>]]
[ORDER BY <排序列>[ASC|DESC][, ....]];
单表查询
SELECT <目标列表达式>
FROM <表名>;
查询选修课的情况
SELECT *
FROM SC;
选择表中的若干分组
选择专业,需要选择学生表中的专业,然后去重。
SELECT DISTINCT Sdept FROM Student;
查询条件 | 谓词 |
---|---|
比较 | =、>、<、>=、<=、!=、<>、!>、!<; NOT+以上所有条件 |
确定范围 | BETWEEN AND、AND、NOT BETWEEN AND |
确定集合 | IN、NOT IN |
字符匹配 | LIKE、NOT LIKE |
空值 | IS NULL、IS NOT NULL |
多重条件 | AND、OR、NOT |
比较
查询考试成绩有不及格的学生的学号及课程号
SELECT Sno,Cno
FROM SC
WHERE Grade < 60
确定范围
查询年龄不在 18 ~ 20 岁之间的学生的学号、姓名、系别和年龄。
SELECT Sno,Sname,Sdept,Sage
FROM Student
WHERE Sage NOT BETWEEN 18 AND 20;
确定集合
查询 “网络工程系”、“信息工程系” 和 “计算机系” 的学生的姓名和年龄
SELECT Sname,Sage
FROM Student
WHERE Sdept IN('网络工程系','计算机系','软件工程系');
字符匹配
查询所有姓王的学生的学号、姓名和年龄。
SELECT Sno,Sname,Sage
FROM Student
WHERE Sname LIKE '王%'
空值
查询缺少成绩学生的学号和相应的课程号。
SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL;
多重条件
查询 “网络工程系” 年龄大于 18 岁的学生的学号
SELECT Sno
FROM Student
WHERE Sdept = '网络工程系' AND Sage > 18;
LIKE
[NOT] LIKE '<匹配串>' [ESCAPE'<换码字符>']
通配符 ‘%’ 和 ‘_’
例如有下列子串
abc
aaa
a
bc
ab
... LIKE 'a%'
可以匹配第 1、2、3、5 个字符串
... LIKE 'a_'
可以匹配第 5 个字符串
匹配含有 _ 的字符串时,需要在 _ 之前加入 \
排序操作
查询 “计算机系” 学生的学号及其年龄,并且查询结果按年龄的降序排列。
SELECT Sno,Sage
FROM Student
WHERE Sdept = '计算机系'
ORDER BY Sage DESC;
聚集函数
函数名 | 格式 | 功能 |
---|---|---|
AVG | AVG([DISTINCT|ALL]<列名>) | 求一列的平均值 |
COUNT | COUNT([DISTINCT|ALL]<列名>) | 统计个数 |
MAX | MAX([DISTINCT|ALL]<列名>) | 求一列的最大值 |
MIN | MIN([DISTINCT|ALL]<列名>) | 求一列的最小值 |
SUM | SUM([DISTINCT|ALL]<列名>) | 求一列值的总数 |
求选修课程号是 01 课程的学生的平均成绩。
SELECT AVG(Grade) 课程 01 平均成绩
FROM SC
WHERE cno = '01';
分组查询
查询各系的学生数量。
SELECT Sdept COUNT(*) 学生数
FROM Student
GROUP BY Sdept;
查询选修课程超过三门并且成绩都在 75 分以上的学生的学号。
SELECT Sno
FROM SC
WHERE Grade >= 75
GROUP BY Sno HAVING COUNT(*) > 3
多表查询
等值与非等值连接查询
查询选修了 01 号课程且成绩在 75 分以上的学生的姓名及成绩
SELECT Sname,Grade
FROM Student,SC
WHERE Student.Sno = SC.Sno AND Cno = '01' AND Grade > 75
自身连接查询
查询不同课程成绩相同的学生、课程号和成绩
SELECT a.Sno,a.Cno,b.Cno,a.Grade
FROM SC a,SC b
WHERE a.Grade = b.Grade AND a.Sno = b.Sno AND a.Cno != b.Cno
外连接
<表名> LEFT|RIGHT [OUT] JOIN <表名> ON <连接条件>
查询选修了的课程情况及已经开设的所有选修课的课程名
SELECT SC.*,Cname
FROM SC
RIGHT JOIN Course ON SC.Cno = Course.Cno
集合查询
<SELECT 语句> UNION[ALL]|INTERSECT|EXCEPT <SELECT 语句>
集合操作符
-
并操作 UNION
查询性别是 “男” 的学生及年龄小于 22 岁的学生
SELECT * FROM Student WHERE Ssex = '男' UNION SELECT * FROM Student WHERE Sage < 22;
-
交操作 INTERSECT
查询性别是 “男” 并且年龄小于 22 岁的学生
SELECT * FROM Student WHERE Ssex = '男' INTERSECT SELECT * FROM Student WHERE Sage < 22;
-
差操作 EXCEPT
-
查询性别是 “男” 但年龄不小于 22 岁的学生
SELECT * FROM Student WHERE Ssex = '男' EXCEPT SELECT * FROM Student WHERE Sage < 22;
嵌套查询
使用 IN 谓词的子查询
查询选修了 01 号课程的学生的信息
SELECT *
FROM Student
WHERE Sno IN
(SELECT Sno
FROM SC
WHERE Cno = '01');
使有比较运算符的子查询
带有 ANY 或 ALL 谓词的子查询
带有 EXISTS 谓词的子查询
查询选修了 02 号课程的学生姓名
SELECT Sname
FROM Student
WHERE EXISTS
(SELECT *
FROM SC
WHERE Student.Sno = SC.Cno AND Cno = '02')
数据更新
数据插入
INSERT INTO <表名>[(<属性列1>[,<属性列2>]...)]
VALUES ((<常量1>)[,<常量2>]...);
将一个学生信息插入 Student 表中。
INSERT INTO Student
VALUES('09005','王丽','女',19,'计算机');
或
INSERT INTO Student(Ssno,Sname,Ssex,Sage,Sdept)
VALUES('09005','王丽','女',19,'计算机');
插入子查询结果
INSERT INTO <表名>(<属性列1>[,<属性列2>...])子查询;
数据删除
DELETE FROM <表名> [WHERE <条件>];
删除姓名为 “张坤” 的学生记录
DELETE FROM Student
WHERE Sname='张坤'
数据的修改
UPDATE <表名> SET <列名>=<表达式>[,<列名>=<表达式>]...[WHERE <条件>];
将所有学生的成绩增加 10 分
UPDATE SC
SET Grade = Grade + 10;
SQL 数据控制
GRANT
GRANT <权限>[,<权限>]...
ON <对象类型><对象名>[,<对象类型><对象名>]...
TO <用户>[,<用户>]...
[WITH GRANT OPTION];
把修改学号和查询选修课表 SC 的权限授于 U3,并允许 U3将其获得的权限授于其他用户。
GRANT UPDATE(Sno),SELECT
ON TABLE SC
TO U3
WITH GRANT OPTION;
REVOKE
REVOKE <权限>[,<权限>]...
ON <对象类型><对象名>[,<对象类型><对象名>]...
FROM <用户>[,<用户>]...
[CASCADE|RESTRICT];
将用户 U3 获取的权限收回
REVOKE UPDATE(Sno),SELECT
ON TABLE SC
FROM U3
CASCADE;
视图
创建视图
CREATE VIEW <视图名>[(<列名>[,<列名>]...)]
AS
<子查询>
[WITH CHECK OPTION];
建立 “计算机” 系学生的视图
CREATE VIEW W_Student
AS
SELECT *
FROM Student
WHERE Sdept '计算机';
视图的查询
与基本表的查询一致。
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]...
FROM <表明或视图名>[,<表名或视图名>]...
[WHERE <条件表达式>]
[GROUP BY <分组列>[HAVING<条件表达式>]]
[ORDER BY <排序列>[ASC|DESC][, ....]];
视图的更新
与基本表的更新一致。
视图的删除
DROP TABLE <视图名>;