数据库原理复习整理

1
CREATE SCHEMA TEST AUTHORIZATION ZHANG;
1
DROP SCHEMA <模式名> <CASCADE | RESTRICT>;
1
2
DROP TABLE  <  > <CASCADE | RESTRICT>;     ---缺省是RESTRICT
                       级联      限制
1
2
3
4
5
6
7
CREATE TABLE SC(
        Sno CHAR(5), 
        Cno CHAR(3), 
        Grade int,
       PRIMARY KEY (Sno,Cno),
       FOREIGN KEY (Sno) REFERENCES S(Sno),       --- FOREIGN KEY <列名>REFERENCES <被参照表名>(<列名>)
       FOREIGN KEY (Cno) REFERENCES C(Cno));
1
2
3
4
ALTER TABLE <表名>
    [ ADD <新列名> <数据类型> [ 完整性约束 ] ]
    [ DROP <完整性约束名>]
  [ ALTER COLUMN <列名>  <数据类型> ] ;
1
2
3
4
5
ALTER TABLE Student ADD Scome DATE ;
ALTER TABLE Student Drop Scome ;
ALTER TABLE Student ALTER COLUMN Sage SMALLINT ;
ALTER TABLE Student ADD UNIQUE(Sname) ;
ALTER TABLE Student DROP UNIQUE(Sname) ;
1
2
SC表按学号升序和课程号降序建唯一索引
CREATE UNIQUE INDEX SCno ON SC(Sno,Cno DESC);
1
2
Student表的Sname列上建立一个聚簇索引,而且Student表中的记录将按照Sname值的升序存放
CREATE CLUSTER INDEX Stusname ON Student(Sname);
1
DROP INDEX Stusname; ---SQL标准中没有定义对索引的修改功能,而采用删除后重新定义索引的方式实现
1
2
SELECT DISTINCT Sno FROM SC; ---DISTINCT取消重复行,作用范围是所有目标列
投影(π)运算的定义中直接去掉了结果中的重复元组,SQL中必须明确指定DISTINCT,否则默认ALL
1
2
3
4
-查询年龄不在2023岁之间的学生姓名、系别和年龄。
SELECT Sname,Sdept,Sage FROM Student WHERE Sage NOT BETWEEN 20  AND 23;
-查询不是信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。
SELECT Sname,Ssex FROM Student WHERE Sdept NOT IN ('IS','MA','CS');
1
2
3
4
5
6
7
8
%:任意长度(可以为0)的字符串    _:任意单个字符
-查询姓名中第二个字为“阳”字的学生姓名和学号。
SELECT Sname,Sno FROM Student WHERE Sname LIKE '__阳%';
-查询以"DB_"开头,倒数第3个字符为i的课程的详细情况
SELECT * FROM Course WHERE Cname LIKE 'DB\_%i__' ESCAPE '\';
-查询所有有成绩的学生学号和课程号
SELECT Sno,Cno FROM SC WHERE Grade IS NOT NULL;
!!!   [NOT] BETWEEN  AND   [NOT] IN将不会利用索引提高查询效率,应改为多重条件查询
1
2
-所在系的系名升序排列,年龄降序排列
SELECT * FROM Student ORDER BY Sdept,Sage DESC;
1
2
集函数:
COUNT ([DISTINCT|ALL] <列名>) SUM AVG MAX MIN   ---DISTINCT以避免重复
1
2
查询有3门以上课程是90分以上的学生的学号及(90分以上的)课程数。
SELECT Sno, COUNT(*) FROM SC WHERE Grade>90 GROUP BY Sno HAVING COUNT(*)>3;

WHERE->GROUP BY->HAVING->SELECT

1
2
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM Student LEFT OUTER JOIN SC 
ON Student.Sno = SC.Sno;    USING(Sno);

子查询的限制--不能使用ORDER BY子句

1
2
3
-查询其他系中比信息系某些学生年龄小的学生姓名和年龄。
SELECT Sname,Sage FROM Student WHERE Sage < ANY (SELECT Sage FROM Student WHERE Sdept= 'IS') AND Sdept <> 'IS';
SELECT Sname,Sage FROM Student WHERE Sage < (SELECT MAX(Sage) FROM Student WHERE Sdept= 'IS') AND Sdept <> 'IS';
1
2
3
4
输出这样的学生,不存在某门课程,在他的选课记录里没有选这门课
SELECT Sname FROM Student WHERE 
NOT EXISTS (SELECT * FROM Course WHERE 
NOT EXISTS (SELECT * FROM SC WHERE Sno = Student.Sno AND Cno = Course.Cno));
updatedupdated2020-05-252020-05-25