SQL 语法

如果存在异议请各位在评论区进行交流,谢谢。

关键字(供查阅型)

关键字描述
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; 
聚集函数
函数名格式功能
AVGAVG([DISTINCT|ALL]<列名>)求一列的平均值
COUNTCOUNT([DISTINCT|ALL]<列名>)统计个数
MAXMAX([DISTINCT|ALL]<列名>)求一列的最大值
MINMIN([DISTINCT|ALL]<列名>)求一列的最小值
SUMSUM([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 <视图名>;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值