数据库系统原理实验—SQL学习总结

总结

  • 一,CREATE(创建)
    • 1.创建模式
    • 2.创建表
    • 3.创建索引
    • 4.创建视图
    • 5.创建角色
  • 二,INSERT(插入)
    • 1.插入信息到表里
  • 三,ALTER(修改)
    • 1.修改表
  • 四,SELECT(查询)
    • 1.查询指定列
    • 2.查询经过计算的值
    • 3.使用列别名改变查询结果的列标题
    • 4.消除取值重复的行
    • 5.比较大小
    • 6.确定范围
    • 7.集合的查询
    • 8.模糊查询
    • 9.使用换码字符将通配符转义为普通字符
    • 10.涉及空值的查询
    • 11.多重条件查询
    • 12.ORDER BY子句
    • 13.聚集函数
    • 14.连接查询
      • ①.自身连接
      • ②.外连接
      • ③.多表查询
    • 15.嵌套查询
      • ①.不相关子查询
      • ②.相关子查询
    • 集合查询
    • 16.基于派生表的查询
  • 五,UPDATE
  • 六,DROP
    • 1.删除表
    • 2.删除索引
    • 3.删除视图
  • 七,DELETE
  • 八,GRANT
  • 九,REVOKE
  • 十,AUDIT(审计)
  • 总结

一,CREATE(创建)

1.创建模式

要先有个用户。
在没有说明模式名的情况下,默认和用户名相同

CREATE SCHEMA <模式名> AUTHORIZATION <用户名>;

2.创建表

CREATE TABLE <表名>(
<列名><数据类型>[列级完整性条件]
[,<列名><数据类型>[列级完整性条件]]
...
[<表级完整性约束条件>]);

3.创建索引

REATE [UNIQUE] [CLUSTER] INDEX<索引名>
ON <表名>(<列名>[<次序>[,<列名>[<次序>]]...);

4.创建视图

CREATE VIEW <视图名>[(<列名>[<列名>...)]]
AS<子查询>
[WITH CHECK OPTION];

5.创建角色

CREATE ROLE <角色名>

二,INSERT(插入)

1.插入信息到表里

INSERT
INTO <表名> [(<属性列1>[,<属性列2 >)]
VALUES (<常量1> [,<常量2>]);
  • 1.插入的表后没写顺序,则插入的信息必须和表中的书行一致。
  • 2.插入时注意表中不能为空和有外码约束的属性

三,ALTER(修改)

1.修改表

ALTER TABLE <表名>
[ ADD[COLUMN] <新列名> <数据类型> [ 完整性约束 ] ]
[ ADD <表级完整性约束>]
[ DROP [ COLUMN ] <列名> [CASCADE| RESTRICT] ]
[ DROP CONSTRAINT<完整性约束名>[ RESTRICT | CASCADE ] ]
[ALTER COLUMN <列名><数据类型> ] ;

ADD 子句用于增加新列、新的列级完整性约束条件和新的表级完整性约束条件
DROP COLUMN 子句用于删除表中的列

  • 如果指定了 CASCADE 短语,则自动删除引用了该列的其他对象
  • 如果指定了 RESTRICT短语,则如果该列被其他对象引用,关系数据库管理系统将拒绝删除该列

DROP CONSTRAINT 子句用于删除指定的完整性约束条件
ALTER COLUMN 子句用于修改原有的列定义,包括修改列名和数据类型

四,SELECT(查询)

SELECT [ALL|DISTINCT]
<目标列表达式> [别名] [ ,<目标列表达式> [别名]] …
FROM <表名或视图名> [别名]
[ ,<表名或视图名> [别名]] …
|()[AS]<别名>
[WHERE <条件表达式>]
[GROUP BY <列名1>[HAVING<条件表达式>]]
[ORDER BY <列名2> [ASC|DESC]];

1.查询指定列

SELECT <>或者*--*代表全部列
FROM <>;

2.查询经过计算的值

SELECT Sname,2021-Sage   --计算出生年份
FROM Student;

3.使用列别名改变查询结果的列标题

   SELECT Sname NAME,'Year of Birth:'  BIRTH,
   2021-Sage  BIRTHDAY,LOWER(Sdept)  DEPARTMENT
   FROM Student;

4.消除取值重复的行

 -- SELECT (ALL) Sno  FROM SC;没有指定DISTINCT关键词 ,则缺省ALL
SELECT DISTINCT Sno 
FROM SC

DISTINCT关键词,可以去掉表中重复的行

SELECT DISTINCT Sno
    FROM SC; 

5.比较大小

--查询所有年龄在20岁以下的血红色呢个姓名及其年龄。
SELECT Sname,Sage
FROM Student
WHERE Sage<20

6.确定范围

--查询年龄在20~23(包括20岁和23岁)之间的学生的姓名,系别和年龄
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23

7.集合的查询

SELECT Sname,Ssex
FROM Student
WHERE Sdept [NOT] IN ('CS','MA','IS')

8.模糊查询

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 时,一个汉字需要一个_

9.使用换码字符将通配符转义为普通字符

--查询DB_Design课程的课程号和学分。
SELECT Cno,Ccredit
FROM     Course
WHERE  Cname LIKE 'DB\_Design' ESCAPE '\ ' ;

10.涉及空值的查询

SELECT Sno,Cno
FROM sc
WHERE Grade IS NULL

11.多重条件查询

逻辑运算符:AND和 OR来连接多个查询条件
1.AND的优先级高于OR
2.可以用括号改变优先级

--查询计算机系年龄在20岁以下的学生姓名。
SELECT Sname
FROM Student
WHERE Sdept='CS' AND Sage<20

12.ORDER BY子句

ORDER BY可以按一个或多个属性列排序
升序:ASC;降序:DESC;缺省值为ASC

--查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。
SELECT Sno,Grade
FROM SC
WHERE Cno='3'
ORDER BY Grade DESC

13.聚集函数

◼ 统计元组个数 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子句是不能用聚集函数作为条件表达式的)

14.连接查询

--等值连接查询
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

15.嵌套查询

①.不相关子查询

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

16.基于派生表的查询

[例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

UPDATE <表名>
SET <列名>=<表达式>[,<列名>=<表达式>]…
[WHERE <条件>];

六,DROP

1.删除表

DROP TABLE <表名>[RESTRICT| CASCADE]

2.删除索引

DROP INDEX Stusname;

3.删除视图

DROP VIEW BT_S ; --注意级联删除
drop schema Wang cascade;--cascade删除模式的同时把该模式中所有的数据库对象全部删除

七,DELETE

DELETE
FROM     <表名>
[WHERE <条件>]

删除指定表中满足WHERE子句条件的元组

DELETE
FROM Student
WHERE Sno= '201215128 '; --在Student 表中删除属性Sno= 201215128 的元组

八,GRANT

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

REVOKE <权限>[,<权限>]... 
ON <对象类型> <对象名>[,<对象类型><对象名>]FROM <用户>[,<用户>]...[CASCADE | RESTRICT];
REVOKE SELECT --收回所有用户对表SC的查询权限
ON TABLE SC 
FROM PUBLIC;
REVOKE INSERT --把用户U5对SC表的INSERT权限收回
ON TABLE SC 
FROM U5 CASCADE

十,AUDIT(审计)

**对修改SC表结构或修改SC表数据的操作进行审计**
AUDIT ALTER,UPDATE  
ON  SC;

取消对SC表的一切审计

NOAUDIT  ALTER,UPDATE  
ON  SC;

总结

有很多的东西要记,练习的题也很多,多看看

你可能感兴趣的:(数据库作业,sql,数据库)