第三章 关系数据库标准语言
3.1SQL概论
3.2数据定义
3.2.1定义数据库
Create database <数据库名>;数据库名>
3.2.2定义基本表
Create table <表名>
( <列名> <数据类型> [<列级完整性约束>],
[,<列名> <数据类型> [<列级完整性约束>] ],
···
[,<表级完整性约束条件>])
3.2.3数据类型
3.2.4修改基本表
alter Table <表名>
[add <新列名> <数据类型> [完整性约束]]
[drop <完整性约束名字>]
[alter column <列名> <数据类型>];
3.2.5删除基本表
drop table < 表名> [restrainct | cascade];//此处在我的电脑上删除失败,无论是哪种删除方式。 |
restrict表示该表删除是有条件的,欲删除的基本表不能被其他表的约束所引用(比如CHECK,foreign key),不能有视图,不能有存储过程或函数等。如存在这些依赖,则此表不能被删除。
cascade表示该表的删除没有限制,在删除的时候,相关的依赖对象一起被删除。
3.2.5索引的建立与删除
Create [unique] [cluster] index <索引名> on <表名> (<列名>[<次序>][,<列名>[<次序>] ]...)
次序 ASC升序 DESC降序
CLUSTER表示聚簇索引
DROP INDEX <索引名> on tablename;
3.3数据查询
语句格式
select [all | distinct] [表名.]{*|列名}
from 表名 [表别名],...
[where 条件表达式|子查询]
[group by 列名1、列名2、...
[having 分组限制条件] ]
[{union|intersect|except} select...from...]
[order by 列名|列序号[ASC|DESC],...];
3.3.1单表查询
3.3.1.1选择表中的列
select [distinct|all] 列名1 [自定义名字1]、列名2 [自定义名字2]...
from 表名
3.3.1.2选择表中的行
/*满足一定的条件
比较运算符号 < > <= >= = and so on
确定范围 between ... and ...
确定集合 In not in
符号匹配 like not like %表示任意长度的任意字符 _表示单个任意字符 用法 where <列名> like '匹配串' ps:可以了解正则表达式去选择
空值:is null, is not null
多重条件 and or not and的优先级别高于or 可以用()来改变优先级别
*/
//比较运算符
SELECT Sname, Sage
FROM S
WHERE Sdept=’CS’ AND Sage<19;
//确定范围
SELECT Sname, Sage
FROM S
WHERE Sage BETWEEN 18 AND 22;
//确定集合
SELECT Sdept DEPT, Sname NAME
FROM S
WHERE Sdept IN (‘IS’, ‘CS’, ‘MA’);
//字符匹配
Select Cno,Cname
From C
Where Cname LIKE '匹配串';
//涉及空值的查询
SELECT Sno, Cno
FROM SC
WHERE Grade IS NULL;
3.3.1.3聚集函数
count([distinct|all] *|列名)
sum([distinct|all] *|列名)
avg([distinct|all] *|列名)
max([distinct|all] *|列名)
min([distinct|all] *|列名)
**注意**:组函数可用于SELECT子句中的目标列表中,或在HAVING子句的分组表达式中用作条件。
//在select中时候
Select COUNT(DISTINCT (*))
From S;
//在having中的时候
SELECT Sno, AVG(ALL Grade)
FROM SC
WHERE Sno IN
(SELECT Sno
FROM S
WHERE Ssex=‘男’)
GROUP BY Sno
HAVING AVG(ALL GRADE)>80;
3.3.1.4 group by
将查询结果集按某一列或多列的值分组,值相等的为一组,一个分组以一个元组的形式出现。
SELECT Sno, AVG(ALL Grade)
FROM SC
GROUP BY Sno
HAVING COUNT(Cno)>5 AND MIN(Grade)>=60;
having和where的区别:
- having在分组之后进行筛选
- where在分组之前进行筛选
- having后面可以使用聚集函数
- where之后不能使用聚集函数
3.3.1.5排序
order by <列表> [ASC|DESC] [,<列表1> [ASC|DESC]...]列表1>列表>
3.3.2连接查询
3.3.2.1多表连接
链接条件:
[表名1.] 列名1 比较运算符 [表名2.]列名
3.3.2.2单表连接
用表别名把一个表定义为两个不同的表进行连接。
SELECT FIRST.Cno,SECOND.Cpno
FROM C FIRST, C SECOND
WHERE FIRST.Cpno = SECOND.Cno
3.3.2.3外链接(左外连、右外连接和全外连接)
左外连接:两个表进行时,返回左边表中的所有元组和右边表中与之相匹配 的列值,没有相匹配的用空值代替。
select 表名1.列名1,表名2.列名2...
From 表名1 left (outer)join 表名2
on 表名1.列名m = 表名2.列名n
右外连接:两个表进行时,返回右边表中的所有元组和左边表中与之相匹配的列值,没有相匹配的用空值代替。
select 表名1.列名1, 表名2.列名2. ····
from 表名1 right (outer) join 表名2
on 表名1.列名m=表名2.列名n
全外连接:两个表进行时,返回两表中的所有元组中相匹配的列值,没有相匹配的用空值代替。
select 表名1.列名1, 表名2.列名2
from 表名1 full (outer) join 表名2
on 表名1.列名m = 表名2.列名n
3.3.3 嵌套查询
where内部插入一个 select语句允许多层嵌套
3.3.3.1返回单个值的子查询(注意使用等号)
//其实这个地方使用=和使用in其实没有差别,因为很多时候我们并不知道会返回一个数。
select Sname,Sage
from S
where Sdept =(
select Sdept
from S
where Sname = '刘晨'
)
3.3.3.2返回一组值的自查询(注意使用 in/ not in)
select *
from S
where Sno in
(
select Sno
from SC
where cno = '6' and Grade > 90
);
3.3.3.3 多重自查询
3.3.3.4带有EXISTS的相关自查询
//此处实在不知道如何展开,将一下机理,然后用一些课堂上讲过的例子展开吧
exists执行机理or过程:先在外层查询中取from的表的第一个元组,用该元组的相关属性值(在where子句中给定)在内层select中查询,如果存在满足条件的就返回’True’否则返回’False’,返回’True’之后则此元组送入结果的表中。然后再取下一个元组,这样把所有外层from中的元组遍历完为止。
例子的话本人实在是懒,我就举课堂测试的几个题目哈。(Forgive me!)
就举第三个题目啦!
·S(sno,sname,age,sex,sdept)
·C(cno,cname,cdept,tname)
·SC(sno,cno,grade)
检索全部学生都选修的课程号、课程名
解析:没有这样的学生,这样的课他/她没有选。
select cno, cname
from C
where not exists
(
select *
from S
where not exists
(
select *
from SC
where S.cno = SC.sno and C.cno =SC.cno
)
)
3.3.4集合查询
并:<查询块>union<查询块>查询块>查询块>
交:<查询块>intersect<查询块>查询块>查询块>
差:<查询块>expect<查询块>查询块>查询块>
只能有一个order by
3.4数据更新
3.4.1插入数据
插入一个已知道的全部列值
insert into S
value('990021','陈冬','男',18,'CS')
//DBMS在执行插入语句时会检测所插入元组是否会破坏以定义的完整性规则,也就是说如果各个数据放置的位置不对的话,则数据插入会存在问题。
插入一已知元组的部分列值
insert into SC(sno,Cno)
value('990021','1')
插入自查询的结果
格式:insert into <表名> [(列名1,·····)] (自查询);表名>
insert into S_G(Sno,AVG_G)
(
select Sno, AVG(ALL GRADE)
FROM SC
WHERE SNO IN
(
SELECT Sno
from S
where Sgend = '男'
)
group by Sno
having AVG(all GRADE) > 80
);//后面就是一个标准的查询语句呢!!
3.4.2修改数据
格式一:
update 表名 [别名] set 列名 = 表达式,···
[where 条件]
eg:
//将学生95001的年龄改为22岁
update S
set Sage = 22
where Sno = '95001';
格式二:
update 表名 [别名] set(列名,···) = (自查询)
[where 条件];
eg:
update S
set Sage = Sage + 1
此处还有几个相对复杂一点的例子见课件。
DBMS在执行修改语句时会检查所修改的元组是否破坏了已定义的完整性规则
3.4.3删除数据
格式:delete from 表名 [where 条件]
注意:
- 只能对整个元组操作,不能只删除某些属性上的值
- DBMS在执行删除语句时会检查所删除的元组是否破坏表上以定义的完整性规则
3.5视图
3.5.1视图的概念
视图是一个虚拟的表,数据库中只存放视图的定义,视图对应的数据仍存放在原来的表中,对视图的查询与基本表一样。