要先有个用户。
在没有说明模式名的情况下,默认和用户名相同
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>;
CREATE TABLE <表名>(
<列名><数据类型>[列级完整性条件]
[,<列名><数据类型>[列级完整性条件]]
...
[<表级完整性约束条件>]);
REATE [UNIQUE] [CLUSTER] INDEX<索引名>
ON <表名>(<列名>[<次序>[,<列名>[<次序>]]...);
CREATE VIEW <视图名>[(<列名>[<列名>...)]]
AS<子查询>
[WITH CHECK OPTION];
CREATE ROLE <角色名>;
INSERT
INTO <表名> [(<属性列1>[,<属性列2 >…)]
VALUES (<常量1> [,<常量2>]… );
ALTER TABLE <表名>
[ ADD[COLUMN] <新列名> <数据类型> [ 完整性约束 ] ]
[ ADD <表级完整性约束>]
[ DROP [ COLUMN ] <列名> [CASCADE| RESTRICT] ]
[ DROP CONSTRAINT<完整性约束名>[ RESTRICT | CASCADE ] ]
[ALTER COLUMN <列名><数据类型> ] ;
ADD 子句用于增加新列、新的列级完整性约束条件和新的表级完整性约束条件
DROP COLUMN 子句用于删除表中的列
DROP CONSTRAINT 子句用于删除指定的完整性约束条件
ALTER COLUMN 子句用于修改原有的列定义,包括修改列名和数据类型
SELECT [ALL|DISTINCT]
<目标列表达式> [别名] [ ,<目标列表达式> [别名]] …
FROM <表名或视图名> [别名]
[ ,<表名或视图名> [别名]] …
|(
SELECT <列>或者*--*代表全部列
FROM <表>;
SELECT Sname,2021-Sage --计算出生年份
FROM Student;
SELECT Sname NAME,'Year of Birth:' BIRTH,
2021-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT
FROM Student;
-- SELECT (ALL) Sno FROM SC;没有指定DISTINCT关键词 ,则缺省ALL
SELECT DISTINCT Sno
FROM SC
DISTINCT关键词,可以去掉表中重复的行
SELECT DISTINCT Sno
FROM SC;
--查询所有年龄在20岁以下的血红色呢个姓名及其年龄。
SELECT Sname,Sage
FROM Student
WHERE Sage<20
--查询年龄在20~23(包括20岁和23岁)之间的学生的姓名,系别和年龄
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23
SELECT Sname,Ssex
FROM Student
WHERE Sdept [NOT] IN ('CS','MA','IS')
1.% (百分号) 代表任意长度(长度可以为0)的字符串
2._ (下横线) 代表任意单个字符。
--where [NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <换码字符>’]
-- 匹配串为含通配符的字符串的模糊查询 姓刘的同学
SELECT Sname, Sno, Ssex
FROM Student
WHERE Sname LIKE '刘%';
--查询名字中第2个字为"阳"字的学生的姓名和学号。
SELECT Sname,Sno
FROM Student
WHERE Sname LIKE '_ _阳%';
--数据库字符集为ASCII时,一个汉字需要两个_
--数据库字符集为 GBK 时,一个汉字需要一个_
--查询DB_Design课程的课程号和学分。
SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE 'DB\_Design' ESCAPE '\ ' ;
SELECT Sno,Cno
FROM sc
WHERE Grade IS NULL
逻辑运算符:AND和 OR来连接多个查询条件
1.AND的优先级高于OR
2.可以用括号改变优先级
--查询计算机系年龄在20岁以下的学生姓名。
SELECT Sname
FROM Student
WHERE Sdept='CS' AND Sage<20
ORDER BY可以按一个或多个属性列排序
升序:ASC;降序:DESC;缺省值为ASC
--查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。
SELECT Sno,Grade
FROM SC
WHERE Cno='3'
ORDER BY Grade DESC
◼ 统计元组个数 COUNT(*)
◼ 统计一列中值的个数 COUNT([DISTINCT|ALL] <列名>)
◼ 计算一列值的总和 SUM([DISTINCT|ALL] <列名>)
◼ 计算一列值的平均值 AVG([DISTINCT|ALL] <列名>)
◼ 求一列中的最大值和最小值
MAX([DISTINCT|ALL] <列名>)
MIN([DISTINCT|ALL] <列名>)
--查询每个选修课程的学生平均分
SELECT AVG(Grade)
FROM SC
GROUP BY Cno
--查询选修了2门以上课程的学生学号
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*)>=2--要用having(WHERE子句是不能用聚集函数作为条件表达式的)
--等值连接查询
SELECT Student.*,SC.*
FROM Student,SC
WHERE Student.Sno=SC.Sno
--自然连接
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Sdept,Cno,Grade
FROM Student,SC
WHERE Student.Sno=SC.Sno
--可以和and一起用,一条语句同时完成选择和连接查询
SELECT Student.Sno,Sname
FROM Student,SC
WHERE Student.Sno=SC.Sno
AND SC.Cno='2'
AND SC.Grade>50
SELECT FIRST.*,SECOND.*
FROM Course FIRST,Course SECOND
WHERE FIRST.Cpno = SECOND.Cno
左连接列出左边关系的所有元组
SELECT Student.Sno,Sname,Ssex,Sage,Cno,Grade
FROM Student LEFT OUTER JOIN SC ON (Student.Sno=SC.Sno)
[例3.54]查询每个学生的学号、姓名、选修的课程名及成绩
SELECT Student.Sno,Sname,Cname,Grade
FROM Student,Course,SC
WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno
SELECT Sno,Sname
FROM Student
WHERE Sno IN
(
SELECT Sno
FROM SC
WHERE CNO IN
(
SELECT Cno
FROM Course
WHERE CNAME='信息系统'
)
)
带有比较运算符的子查询
[例 3.57 ]找出每个学生超过他选修课程平均成绩的课程号。
SELECT Sno,Cno
FROM SC x
WHERE Grade>=(SELECT AVG(Grade)
FROM SC y
WHERE y.Sno=x.Sno
)
使用ANY或ALL谓词时必须同时使用比较运算
语义为:
ANY 大于子查询结果中的某个值
ALL 大于子查询结果中的所有值
< ANY 小于子查询结果中的某个值
< ALL 小于子查询结果中的所有值
= ANY 大于等于子查询结果中的某个值
= ALL 大于等于子查询结果中的所有值
[例 3.58] 查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄
SELECT Sname,Sage
FROM Student
WHERE Sage<ANY(
SElECT Sage
FROM Student
WHERE Sdept='CS'
)
AND Sdept <> 'CS'
EXISTS谓词
1.存在量词 ∃
2.带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。
⚫ 若内层查询结果非空,则外层的WHERE子句返回真值
⚫ 若内层查询结果为空,则外层的WHERE子句返回假值
3.由EXISTS引出的子查询,其目标列表达式通常都用 *
再看看这里:
https://blog.csdn.net/m0_49868511/article/details/115613589?spm=1001.2014.3001.5502
集合操作的种类
①并-UNION
②交-INTERSECT
③差-EXCEPT
[例 3.64] 查询计算机科学系的学生及年龄不大于19岁的学生。(此题也可以用or解决)并
SELECT *
FROM Student
WHERE Sdept= 'CS'
UNION
SELECT *
FROM Student
WHERE Sage <=19;
[例3.66] 查询计算机科学系的学生与年龄不大于19岁的学生的交集。(此题也可用AND解决)交
SELECT *
FROM Student
WHERE Sdept='CS'
INTERSECT
SELECT *
FROM Student
WHERE Sage<=19
[例 3.68] 查询计算机科学系的学生与年龄不大于19岁的学生的差集。(实际上是查询计算机科学系中年龄大于19岁的学生)差
SELECT *
FROM Student
WHERE Sdept='CS'
EXCEPT
SELECT *
FROM Student
WHERE Sage<=19
[例3.57]找出每个学生超过他自己选修课程平均成绩的课程号
SELECT Sno,Cno
FROM SC,( SELECT Sno,Avg(Grade)
FROM SC
GROUP BY Sno)
AS Avg_sc(avg_sno,avg_grade)--派生表
WHERE SC.Sno=Avg_sc.avg_sno
AND SC.Grade>=Avg_sc.avg_grade
如果子查询中没有聚集函数,
派生表可以不指定属性列,
子查询SELECT子句后面的列名为其缺省属性。
UPDATE <表名>
SET <列名>=<表达式>[,<列名>=<表达式>]…
[WHERE <条件>];
DROP TABLE <表名>[RESTRICT| CASCADE]
DROP INDEX Stusname;
DROP VIEW BT_S ; --注意级联删除
drop schema Wang cascade;--cascade删除模式的同时把该模式中所有的数据库对象全部删除
DELETE
FROM <表名>
[WHERE <条件>]
删除指定表中满足WHERE子句条件的元组
DELETE
FROM Student
WHERE Sno= '201215128 '; --在Student 表中删除属性Sno= 201215128 的元组
GRANT<权限>[<权限>]
ON<对象类型><对象名>[<对象类型><对象名>]
TO<用户>[<用户>]
[WITH GRANT OPTION];
[WITH GRANT OPTION] 获得某种权限的用户还可以把这种权限授予其他用户
GRANT SELECT --把查询Student表权限授给用户U1
ON Student --ON TABLE Student会报错应该是SQL和T-SQL的差别
TO U1
GRANT ALL PRIVILIGES --把对Student表和Course表的全部权限授予用户U2和U3
ON TABLE Student,Course
TO U2,U3;
REVOKE <权限>[,<权限>]...
ON <对象类型> <对象名>[,<对象类型><对象名>]…
FROM <用户>[,<用户>]...[CASCADE | RESTRICT];
REVOKE SELECT --收回所有用户对表SC的查询权限
ON TABLE SC
FROM PUBLIC;
REVOKE INSERT --把用户U5对SC表的INSERT权限收回
ON TABLE SC
FROM U5 CASCADE
**对修改SC表结构或修改SC表数据的操作进行审计**
AUDIT ALTER,UPDATE
ON SC;
取消对SC表的一切审计
NOAUDIT ALTER,UPDATE
ON SC;
有很多的东西要记,练习的题也很多,多看看