(1)SQL数据库的体系结构,SQL的组成。
(2)SQL的数据定义:SQL模式、基本表和索引的创建和撤销(CREATE、DROP、ALTER)
(3)SQL的数据查询;SELECT语句的句法,SELECT语句的三种形式及各种限定,基本表的联接操作,SQL3中的递归查询。
(4)SQL的数据更新:插入、删除和修改语句。
(5)视图的创建和撤消,对视图更新操作的限制。 为了使通过视图插入新行时,元组满足视图的定义条件, 在定义视图时必须加上WITH CHECK OPTION子句
视图是一张虚表,视图中的数据并不实际存储,定义保存在数据字典中,为了使通过视图插入新行时,元组满足视图的定义条件,定义视图时要加上WITH CHECK OPTION子句。
视图不能再建表,但可以再建视图,可以建立在一个或多个基本表或视图上
CREATE VIEW <视图名>[(<列名>[,<列名>[....]])]
AS <子查询>
[WITH CHECK OPTION](防止修改视图以外的点)
更新视图要转换为对基本表的更新,类似视图的消解,并不是所有视图都是可更新的,但一般行列子集视图是可更新的。
创建表:
例3.9将年龄的数据类型由字符型改为整数。
ALTER TABLE Student ALTER COLUMN Sage INT;
删除基本表:
DROP TABLE <表名> [RESTRICT|CASCADE];
前者表示表的删除是有限制条件的,不能被其他表的约束所引用,不能有视图,不能有触发器
后者表示表的删除没有限制条件,在删除基本表的同时,相关的依赖对象一起被删除。
数据查询
字符匹配
[NOT] LIKE '<匹配串>' [ESCAPE'<换码字符>']
外连接
SELECT Student.Sno, Sname, Ssex, Sage,Sdept,Cno,Grade
FROM Student LEFT OUTER JOIN SC ON (Student.Sno = SC.Sno);
/USING(Sno) //使用using删除重复值
左外连接列出左边所有元组
在嵌套查询中,子查询的SELECT语句不能使用ORDER BY子句
数据更新:
插入
INTO <表名> [(<属性列1>[,<属性列2>]....)]
VALUES(<常量1>[,<常量>]....);
修改
UPDATE <表名>
SET <列名>=<表达式>[,<列名> = .....]....
[WHERE<条件>];
习题:
(2)选修了2门以上课程的学生学号。
SELECT Sno
FROM SC
GROUP BY Sno HAVING COUNT(*)>2
(3)查询没有选修C2号课程的学生的姓名。
SELECT Sname
FROM Student
WHERE Sno NOT IN (
SELECT Sno
FROM SC
WHERE Cno = 'C2'
)
(4)求选修了C4号课程的学生的平均年龄
SELECT Sname, AVG(Sage)
FROM SC
WHERE Cno = 'C4'
(5)将计算机科学系学生的所有成绩置零。
UPDATE SC
SET Grade = 0
WHERE Sno IN(
SELECT Sno
FROM Studnet
WHERE Sdept = 'CS'
)
(6)查询其他系中比计算机科学系(CS)所有学生年龄都小的学生姓名及年龄
SELECT Sname, Sage
FROM Student
WHERE Sage < ALL(SELECT Sage FROM Studnet WHERE Sdept = 'CS')
AND Sdept <> 'CS'
7)查询年龄在18到22之间的学生的姓名,年龄,所在系。
SELECT Sname, Sage, Sdept
FROM Student
WHERE Sage BETWEEN 18 AND 22
8)查询所有姓“李”的学生的成绩。
SELECT Grade
FROM SC, Studnet
WHERE Student.Sno = SC.Sno
AND Sname LIKE '李%';
9)查询选修了5门以上课程的学生学号。
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*) > 5
10)查询选修了“数据库原理”这门课的学生的姓名。
SLECT Sname
FROM Studnet, SC, Course
WHERE Studnet.Sno = SC.Sno AND SC.Cno = Course.Cno and Cname = '数据库原理'
11)插入一条记录(99001,李明,男,22,经管系)到学生表中。
INSERT
INTO Student(Sno, Sname, Ssex , Sage, Sdept)
VALUES('99001','李明', '男', 22,'经管系')
12)将学生“95001”的学号改成“99089”。
UPDATE Student
SET Sno = '99089'
WHERE Sno = '95001'
13)设有三个关系:S(S#,SNAME,AGE,SEX) SC(S#,C#,GRADE)C(C#,CNAME,TEACHER)
试用关系代数表达式表示下列查询语句。
SELECT C#,CNAME
FROM C
WHERE TEACHER=‘LIU’
SELECT S#,SNAME
FROM S
WHERE (AGE>23) AND (SEX=‘M’)
SELECT SNAME
FROM S
WHERE SEX=‘F’ AND S# IN (
SELECT S#
FROM SC
WHERE C# IN (
SELECT C#
FROM C
WHERE TEACHER=‘LIU’
)
)
关系代数表达式有误,应当是C,不是CS
SELECT C#
FROM C
WHERE C# NOT IN (
SELECT C#
FROM SC
WHERE S# IN (
SELECT S#
FROM S
WHERE SNAME='WANG'
)
)
SELECT S#
FROM SC
HAVING COUNT(C#)>=2
1)查询年龄小于20岁的学生学号和姓名。
ΠSno,Sname(σSage<20(S))
2)查询选修了5号课程的学生学号和姓名。
ΠSno,Sname(σCno=’5’(S∞C))
3)查询没有选修5号课程的学生学号。
ΠSno(S)-ΠSno(σCno=’5’(S∞C))
4)查询至少选修了5号课程和6号课程的学生学号。
ΠSno,Cno(SC)÷ΠCno(σCno=’5’or Cno=’6’(C))
例题:
(1)建立一张教师工资表teacher,它由编号BH,姓名XM,部门BM,基本工资JBGZ,补贴BT,工会费GHF,公积金GJJ,实发工资SFGZ组成,主码为编号BH。
Create table teacher (
BH char(9) primary key,
XM char(20),
BM char(20),
JBGZ int,
BT int,
GHF int,
GJJ int,
SFGZ int
)
(2)向上述教师工资表增加一个“误餐费(WCF)”列,类型为整型。
alter table teacher add WCF int
(3)建立上述教师工资表teacher的视图,视图包括姓名、基本工资、实发工资,名称为BMV,条件是部门是“经管系”。
Create view BMV(XM, JBGZ, SFGZ)
As Select XM, JBGZ, SFGZ
From teacher
Where BM=’ 经管系’
(4)删除基本表教师工资表teacher。
drop table teacher