数据库系统概论第五版_第三章:关系数据库标准语言SQL

关系数据库标准语言SQL

概述

SQL特点:综合统一(可以完成数据库生命周期中的全部活动),高度非过程化,面向集合的操纵方式,以同一种语法结构提供多种使用方式,语言简洁……

三级模式结构:外模式(基本表,视图),内模式(存储文件的逻辑结构)

本章的重点为各种语句的掌握(背诵)。


数据定义

CREATE SCHEMA <模式名> AUTHORIZATION <用户名>
DROP SCHEMA <模式名> <CASCADE | RESTRICT>

  • 一个DBMS中可以有多个数据库,一个数据库中可以有多个模式
  • 数据库管理员权限

CREATE TABLE <表名> (<列名><数据类型>[完整性约束]……)

  • PRIMARY KEY (Sno, Cno)
  • FOREIGN KEY (Sno) REFERENCES Student(Sno)
  • CHAR(n),、VARCHAR(n), INT、SMALLINT、BIGINT,FLOAT(n),DATE、TIME……

SHOW SEARCH_PATH

  • 确认表所属的模式

ALTER TABLE <>
ADD [COLUMN] <列名><数据类型>[完整性约束]
DROP [COLUMN] <列名> [ CASCASE | RESTRICT ]
ADD <表级完整性约束>
DROP CONSTRAINT <完整性约束> [ RESTRICT | CASCADE]
ALTER COLUMN <列名><数据类型> (修改列的数据类型)

  • 用于 对表结构的修改,不是修改其数据
  • 例:ALTER TABLE Student ADD UNIQUE ( Cname )

DROP TABLE <表名> [ RESTRICT | CASCADE]


CREATE INDEX <索引名> ON <表名>(<列名>[<次序>])

  • 例:CREATE UNIQUE INDEX SCno ON SC(Sno ASC, Cno DESC)

ALTER INDEX <旧索引名> RENAME TO <新索引名>
DROP INDEX <索引名>

数据查询

  1. SELECT DISTINCT Sno, Sname FROM Student(消除重复元组)
  2. SELECT * FROM Student STU1 (自定义表名)
  3. SELECT Sname, 2014 - Sage BIRTHDAT FROM STUDENT (函数与自定义列别名的应用)

  1. WHERE Sdept = ‘CS’

  2. WHERE Sage < 20

  3. WHERE Sage (NOT) BETWEEN 下限 AND 上限

  4. WHERE Sdept (NOT) IN (‘CS’, ‘MA’)

  5. WHERE Sno (NOT) LIKE ‘U2019%’ (%:任意长度字符串 _:单个字符串)

  6. WHERE Cname LIKE ‘DB_Design’ ESCAPE ‘\’ (转义字符的使用)

  7. WHERE Grade IS (NOT) NULL

  8. WHERE a AND/OR b

  9. (连接查询) WERE Student.Sno = SC.Sno


  1. ORDER BY 列1,列2,…… DESC|默认升序 (先按列1排序,列1中值相同的为一组再按列2排序,以此类推)

聚集函数,用于select语句

  1. COUNT ( * ) 不会跳过空值!
  2. COUNT | SUM | AVG | MAX | MIN ( [DISTINCT | ALL] 列名)

  1. GROUP BY:细化聚集函数的作用对象!!!聚集函数作用于每一组
  2. HAVING:选择组的条件,只有满足条件的组才会被选出来

连接查询

  1. FROM Student LEFT OUTER JOIN SC ON (Student.Sno = SC.Sno)

嵌套查询
将一个查询块(SELECT-FROM-WHERE)嵌入在另一个查询块的WHERE或HAVING的条件中。
例:

  1. WHERE Sno IN*
    (SELECT Sno FROM SC WJERE Cno=‘2’)

注:ORDER BY 只能对最终的查询结果进行排序

子查询的查询条件不依赖与父查询:不相关子查询
子查询的查询条件依赖与父查询:相关子查询->相关嵌套查询语句

  1. SELECT Sno, Cno
    FROM SC x
    WHERE Grade > (
    SELECT AVG(Grade)
    FROM SC y
    WHERE y.Sno = x.Sno )

带有ANY,SOME,ALL的子查询:> | < | >= | <= | = | != + ANY | ALL

  1. SELECT Sname
    FROM Student
    WHERE Sage < ANY (
    SELECT Sage
    FROM Student
    WHERE Sdept = ‘CS’ )
    AND Sdept <> ‘CS’;

带有EXISTS谓词的子查询:只产生逻辑值true | false

  1. SELECT Sname FROM Student
    WHERE (NOT) EXISTS
    (SELECT * FROM SC WHERE Sno=Student.Sno AND Cno=‘1’)
    解释:从Student中依次取元组,与子查询中的表进行匹配,若二者Sno相等且选了课程1,则返回真值,输出对应的学生的名字,否则返回false。

  2. SELECT Sname FROM STUDENT //遍历学生学号
    WHERE NOT EXISTS
    (SELECT * FROM COURSE //遍历课程号
    WHERE NOT EXISTS
    (SELECT * FROM SC
    WHERE SC.Sno=Student.Sno AND Cno=Course.Cno));

  3. SELECT DISTINCT Sno FROM SC SCX
    WHERE NOT EXISTS
    (SELECT * FROM SCY
    WHERE SCY.Sno=U201911743’
    AND NOT EXISTS
    (SELECT * FROM SCZ WHERE SCZ.Sno=SCX.Sno AND SCZ.Cno=SCY.Cno));

说实话没太明白

子查询不仅可以出现在WHERE中,还可以用于FROM中,这时子查询生成临时的派生表成为主查询的查询对象。

  1. 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;

  2. SELECT Sname FROM Student,
    (SELECT Sno FROM SC WHERE Sno=‘1’) AS SC1
    WHERE Student.Sno=SC1.Sno;


集合查询:SELECT语句的查询结果是一个集合,所以可以进行集合操作。

  1. SELECT-FROM-WHERE UNION并集 | INTERSECT交集 | EXCEPT差集 SELECT-FROM-WHERE

数据的添加、更改与删除

插入数据

  1. INSERT INTO Student (Sno,Sname,Ssxe,Sdept,Sgae)
    VALUES (‘201215128’,‘陈东’,‘男’,‘IS’,18);

INTO后要指明在哪个表的那些列中插入数据。对于没有数据的列,可以不写,也可以明确的给出空值NULL。

插入子查询的结果:

  1. INSERT INTO Dept_age(Sdept,Avg_age)
    SELECT Sdept,AVG(Sgae)
    FROM Student
    GROUP BY Sdept;

修改数据

  1. UPDATE Student
    SET Sage=22
    WHERE Sno=‘201911743’
  2. UPDATE Student
    SET Sage=Sage + 1;

修改数据也可以带上子查询:

  1. UPDATE SC SET GRADE=0
    WHERE Sno IN
    (SELECT Sno FROM Student WHERE Sdept=‘CS’);

删除数据(也可以带子查询

  1. DELETE FORM SC //删除所有数据
  2. DELETE FROM SC WHERE SNO IN
    (SELECT Sno FROM Student WHERE Sdept=‘CS’);

空值的处理

  1. INSERT INTO … VALUES (… , … , …, NULL);
  2. UPDATE SC SET Sdept=NULL;
  3. … WHERE Sname IS NULL;
  4. NOT NULL, UNIQUE 限制属性不能取空值

空值的运算:算术运算为空值,比较运算为UNKNOWN
逻辑运算:unknown的取反还是unknown,AND运算取权力最小的(权力TRUE>UNKNOWN>FALSE),OR运算取权力最大的。

视图

视图是一个虚表,数据库只存放其定义,其数据存放在基本表从中。只有对视图进行查询时,才按照视图的定义从基本表中将数据查出。

建立
CREATE VIEW <视图名> [(<列名1>[,<列名2>]…)]
AS <子查询>
[WITH CHECK OPTION]

  • 列名只能全部省略全部指定。当子查询中SELECT中存在聚合函数或表达式、多表链接时有同名字段时,必须指派。
  • WITH CHECK OPTION:对视图进行操作时,数据需要满足子查询中的where条件
  • 视图可以建立在基本表或视图上

删除:DROP VIEW <视图名> [CASCADE]

查询:对视图的查询与对表的查询一样。

更新:INSERT,DELETE,UPDATE -> 最终会对表中的数据进行更新!!(WITH CHECK POINT会检查更新的数据是否满足视图定义)。更新语句与对基本表的更新一致。

  • 有时,视图是不可更新的,比如视图中存放的是平均成绩时,系统无法修改各科的成绩,所以无法更改。更为严格的规则是:
    • 视图来自两个及以上的表时不可以更新
    • 数据来自于聚集函数时不可更新
    • 视图定义有DISTINCT短语、GROUP BY子句时不可更新
    • 视图定义时使用的嵌套查询,且内外能查询访问了相同的表,则不可更新

视图的作用(maybe简答题):

  • 简化用户操作:使用户将注意力集中在他关心的数据上,使数据看起来结构简单、清晰,简化用户的查询操作。
  • 使不同种类的用户以多种角度看待同一数据
  • 对重构数据库提供了一定的数据逻辑独立性:用户的外模式保持不变
  • 对机密数据提供安全保护:对不同的用户提供不同的视图
  • 清晰的表达查询

Guess you like

Origin blog.csdn.net/Ella486900/article/details/121893581