结构化查询语言SQL是关系数据库的标准语言,也是一个通用的、功能极强的关系数据库语言。其功能不仅仅是查询,而是包括数据库模式创建、数据库数据的插入与修改、数据库安全性定义与控制等一系列功能
关系数据库系统支持三级模式结构,其模式、外模式和内模式的基本对象由模式、表、视图和索引等。因此SQL的数据定义功能包括模式定义、表定义、视图和索引的定义。
操作对象之间的关系
一个关系数据库管理系统的实例中可以建立多个数据库,一个数据库中可以建立多个模式,一个模式下通常包括多个表、视图、索引等数据对象
模式的定义
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>
还可以进一步创建基本表、视图,定义授权
CREATE SCHEMA <模式名> AUTHORIZATION <用户名> [<表定义子句>|<视图定义子句>|<授权定义子句>]
删除模式
DROP SCHEMA <模式名> [CASCADE|RESTRICT] //级联删除|限制删除
基本表的定义
CREATE TABLE <表名>(
<列名><数据类型>[列级完整性约束条件]
[,<列名><数据类型>[列级完整性约束条件]]
...
[,<表级完整性约束条件>]
)
数据类型
ALTER TABLE <表名>
[ADD [COLUMN] <新列名> <数据类型> [完整性约束]] //添加新的列
[ADD <表级完整性约束>] //添加新的约束
[DROP CONSTRAINT <完整性约束名> [RESTRICT|CASCADE]] //删除完整性约束
[ALTER COLUMN <列名><数据类型>] //修改列名和数据类型
删除基本表
DROP TABLE <表名> [RESTRICT|CASCADE]
建立索引
CREATE [UNIQUE|CLUSTER] index //唯一索引/聚簇索引
ON <表名>(<列名>[DESC|ASC][,<列名>DESC|ASC]]...) //降序|升序
修改索引
ALTER INDEX <旧索引名> RENAME TO <新索引名>
删除索引
DROP INDEX <索引名>
数据查询是数据库的核心操作。SQL提供了SELECT语句进行数据查询,该语句具有灵活的使用方式和丰富的功能。其一般格式为:
SELECT [ALL|DISTINCT] <目标列表达式> [,<目标列表达式>]
FROM <表名或视图名> [,<表名或视图名>...]|(<SELECT语句>)[AS]<别名>
[WHERE <条件表达式>]
[GROUP BY <列名1> [HAVING <条件表达式>]]
[ORDER BY <列名> [ASC|DESC]]
选择表中的若干列
SELECT <列名>[,<列名>]... FROM <表名>
SELECT * FROM <表名>
SELECT <算术表达式|字符串变量|函数> FROM <表名>
SELECT <列名> <别名>[,<列名> <别名>]... FROM <表名> //列名和别名之间注意有空格
选择表中的若干元组
SELECT DISTINCT <列名> [,<列名>]... FROM <表名>
SELECT <目标列表达式> [,<目标列表达式>] FROM <表名> WHERE<条件表达式>
常用的查询条件
SELECT Sno,Sname FROM student WHERE Sage<20
查询年龄在18~20岁之间的学生学号和姓名
SELECT Sno,Sname FROM student WHERE BETWEEN 18 AND 20
查询属于CS、MA和IS系的学生学号和姓名
SELECT Sno,Sname FROM student WHERE Sdept IN ('CS','MA','IS')
查询所有姓刘的学生姓名、学号和性别
SELECT Sno,Sname,Ssex FROM student where LIKE '刘%'
查询姓“欧阳”且全名为三个汉字的学生姓名和学号
SELECT Sno,Sname FROM student where LIKE '欧阳_'
查询DB_Design课程号和学分
SELECT Cno,Ccredit FROM Course WHERE LIKE 'DB/_Design' ESCAPE '/'
//使用转义字符"/"添加在"_"之前转为普通"_"字符
查询没有成绩的学生学号和对应的课程号
SELECT Sno,Cno FROM SC WHERE Grade IS NULL
查询属于计算机系且年龄大于20的学生学号和姓名
SELECT Sno,Cno FROM student WHERE Sdept = 'IS' AND Sage>20
聚集函数
查询学生总数
SELECT COUNT(*) FROM student
查询选修了课程的总人数
SELECT COUNT(DISTINCT Sno) FROM SC
查询1号选修课的平均成绩
SELECT AVG(Grade) FROM SC WHERE Cno='1'
查询1号选修课的最高成绩
SELECT MAX(Grade) FROM SC WHERE Cno='1'
查询1号选修课的最低成绩
SELECT MIN(Grade) FROM SC WHERE Cno='1'
查询学生20181210的选修课程的总学分
SELECT SUM(Ccredit) FROM SC WHERE Sno='20181210' group by cno
ORDER BY子句
查询年龄不满20岁的学生学号和姓名,按年龄进行升序排序
SELECT Sno,Sname FROM student WHERE Sage<20 ORDER BY Sage ASC
GROUP BY子句
GROUP BY子句用来对数据进行分组查询
SELECT sno FROM SC group by sno having avg(Grade)>60
如果在查询条件中使用聚合函数,那么就在group by子句后使用having代替where使用
平均成绩大于60的学生学号
SELECT sno FROM SC group by sno having avg(Grade)>60
连接查询分为自然连接、外连接,而外连接又分为左外连接和右外连接,在之前的关系代数中我们知道了这几个的含义,这里不在进行说明
自然连接,这里使用student表和sc表相同的sno字段进行等号连接
select sno grade from student sc where student.sno=sc.sno and sno='20181210'
外连接
select sno grade from student join sc on (student.sno=sc.sno)
左外连接
select sno grade from student left join sc on (student.sno=sc.sno)
右外连接
select sno grade from student right join sc on (student.sno=sc.sno)
嵌套查询就是在一个查询语句中嵌套一个或多个子查询语句
select sno sname from student where sno in (select sno from sc where grade > 90)
select语句的查询结果是元组的集合,所以多个select语句的结果可进行集合操作,主要包括并操作、交操作和差操作
SELECT <列名>[,<列名>]... FROM <表名> [union|intersect|except] SELECT <列名>[,<列名>]... FROM <表名>
数据更新操作分别是插入操作、修改操作和删除操作,向表中添加若干行数据、修改表中的数据和删除表中若干行数据
insert into <表名>(<列名>[,<列名>]... )values(<<对应列要添加的数据>[,<对应列要添加的数据>]... >),
(<<对应列要添加的数据>[,<对应列要添加的数据>]... >)... //这里可以用于插入多行数据
update <表名> set <列名>=<表达式>[,<列名>=<表达式>]...[where <条件>]
delete from <表名> [where <条件>]
所谓空值就是“不知道”或“不存在”或“无意义”的值,SQL语言中允许某些元组的某些属性在一定情况下取空值。一般有一下情况:
因此,空值是一个很特殊的值,含有不确定性,对关系运算带来特殊的问题,需要做特殊的处理
举个例子,在学生表插入数据时,因为目前还不知道张三的年龄,在这里暂时设置为空值
insert into student value("1","张三",null)
空值的主要使用 is null 和 is not null进行判断
select sno sname from student where age is not null
空值与另一个值(包括另一个空值) 的算术运算的结果为空值,空值与另一个值(包括另一个空值)的比较结果为 unknown。有了unknown 后,传统的逻辑运算中二值(true,false)逻辑成了三值逻辑
视图是从一个或几个基本表(或视图)导出的表,它的特点有:
create view <视图名> [(<列名> [,<列名>]...)]
as <子查询>
[with check option]
drop view <视图名> [cascade]
select <列名>[,<列名>]... from <视图名> [where 条件表达式 ]
视图的更新实际上是对基本表的更新,而单独的对基本表进行更新是无法转换成对基本表的更新,每个数据库管理系统对视图是否可以进行更新的规定各不相同
insert into <视图名>(<列名>[,<列名>...]) values (<<对应列要添加的数据>[,<对应列要添加的数据>]... >)
update <视图名> set <列名>=<表达式>[,<列名>=<表达式>]...[where <条件>]
delete from <视图名> [where <条件>]
王珊,萨师煊.数据库系统概论(第五版)[M].北京:高等教育出版社,2014:75-132.