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
|
-查询年龄不在20~23岁之间的学生姓名、系别和年龄。
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));
|