💡
原则上没有不要的东西, 否则不完备
横贯很多章节
特征, 性质
数据定义SDD语法, 含义, 利用当前语法定义表
数据查询: 单表, 连接(嵌套可以通过连接完成, 不做要求, 不推荐但是可以写, 不会全扣光)
集合, 创建视图, 更新, 修改, 删除(重点)
空值: 有所了解, 不会特意考察, 但是空值不能乱来

概念

结构化查询语言,是关系数据库的标准语言

特征

  • 综合统一
    • 集数据定义语言(DDL),数据操纵语言(DML),数据控制语言(DCL)功能于一体。
    • 可以独立完成数据库生命周期中的全部活动
    • 数据库投入运行后可根据需要随时逐步修改模式, 不影响数据库运行
    • 数据操作符统一
  • 高度非过程化
    • 只需要提出做什么, 存储路径选择和SQL操作过程由系统自动完成
  • 面向集合的操作方式
    • 操作对象, 查找结果都是元组的集合
  • 以同一种语法结构提供两种使用方法
    • 是独立语言, 能独立用于联机交互
    • 也是嵌入式语言, 能嵌入到高级语言程序中使用
  • 简洁易用
    • 9个核心动词:
      • 数据定义: CREATE, DROP, ALTER
      • 数据查询: SELECT
      • 数据操作: INSERT, UPDATE, DELETE
      • 数据控制: GRANT, REVOKE

与数据库模式的关系

 
notion image
  • SQL基本表: 本身独立存在的表, 一个基本表对应一个关系, 对应数据库的模式
  • SQL存储文件: 存储文件的逻辑结构构成数据库的内模式, 物理结构对用户屏蔽. 一个存储文件可以对应多个基本表(例如多个基本表有相同属性列则可以统一存储)
  • SQL视图: 从一个或几个基本表中导出的虚表, 数据库中只存放视图的定义而不存放视图的数据, 对应数据库的外模式

SQL数据定义语言(DDL)

一个DBMS中可以建立多个数据库, 一个数据库中可以建立多个模式, 一个模式下通常包括多个表, 视图和索引等数据库对象.
SQL的数据定义功能(定义结构和类型): 模式定义, 表定义, 视图和索引定义
notion image
  • 定义模式: 实际上定义了一个命名空间, 空间内可以定义该模式下的数据库对象(基本表, 视图, 索引等)
    • 删除模式: 限制(类比rmdir)或级联(类比rm -rf)
      • 定义基本表:
        • 修改基本表:
          • 删除基本表:
            • 建立索引:
              • 修改索引:
                • 删除索引:

                  单表查询

                  查 询 条 件
                  谓    词
                  比较
                  =, >, <, >=, <=, !=, <>, !>, !<NOT+上述比较运算符
                  确定范围
                  BETWEEN ... AND ..., NOT BETWEEN ... AND ...
                  确定集合
                  IN, NOT IN
                  字符匹配
                  LIKE, NOT LIKE 通配符: %(任意长度字符串), _(任意单个字符)
                  空值
                  IS NULL, IS NOT NULL 不能用=代替IS!
                  多重条件(逻辑运算)
                  AND, OR, NOT
                  聚集函数
                  功能
                  COUNT()
                  统计元组个数 / 列中值的个数
                  SUM()
                  计算一列值总和(类型必须为数值)
                  AVG()
                  计算一列平均值
                  MAX()
                  计算一列中的最大值
                  MIN()
                  计算一列中的最小值

                  多表查询(连接)

                  连接查询: 同时涉及两个以上的表的查询
                  连接条件: 用于连接两个表的条件(筛选笛卡尔积的结果)
                  连接字段: 连接条件中涉及的列名称. 连接条件中各连接字段类型必须可比, 名字不用相同.
                  当使用自连接时, 需要给两个自己取不同的别名来区分列的来源.
                  在WHERE子句中加上更多复合条件, 就可以在连接的同时进行选择.
                  普通连接只输出满足连接条件的元组, 而外连接会将主体表中不满足连接条件的元素一并输出. 左连接中左表为主体表, 其中元组会在结果中全部列出, 右外连接同理.
                  左连接示例:
                  Student.Sno
                  Sname
                  Ssex
                  Sage
                  Sdept
                  Cno
                  Grade
                  201215121
                  李勇
                  20
                  CS
                  1
                  92
                  201215121
                  李勇
                  20
                  CS
                  2
                  85
                  201215121
                  李勇
                  20
                  CS
                  3
                  88
                  201215122
                  刘晨
                  19
                  CS
                  2
                  90
                  201215122
                  刘晨
                  19
                  CS
                  3
                  80
                  201215123
                  王敏
                  18
                  MA
                  NULL
                  NULL
                  201215125
                  张立
                  19
                  IS
                  NULL
                  NULL
                  也可以有不止两个表互相连接, 一般使用统一的左连接/右连接以免混乱(总是保留左边/右边表中的行).

                  集合查询

                  集合操作: 对多个查询结果取并(UNION), 交(INTERSECT), 差(EXCEPT).
                  参加集合操作的各查询结果的列数必须相同, 对应项的数据类型也必须相同(即属性列的个数和域相同)
                  • 并操作

                    SQL数据操纵语言(DML)

                    • 插入(INSERT-INTO)
                      • 修改(UPDATE-SET)
                        • 删除(DELETE-FROM)

                          空值

                          “不存在/不知道/无意义”
                          可能出现的情况:
                          1. 属性应该有一个值, 但是现在还不知道
                          1. 属性不应该有值
                          1. 出于某种原因暂时不便于填写(如共轭父子)
                          产生空值:
                          判断空值: IS NULL / IS NOT NULL
                          限制: 有NOT NULL / UNIQUE / PRIMARY KEY限制的属性不能取空值
                          空值和其他所有值的算数/比较运算结果均为空值.
                          空值将传统的二值逻辑(TRUE, FALSE)扩展成了三值逻辑(TRUE, FALSE, UNKNOWN). 逻辑运算中除短路求值外结果均为UNKNOWN. UNKNOWNWHEREHAVING子句的判断条件中不会被判定为真.

                          视图

                          💡
                          “滤镜”

                          特点

                          • 虚表, 从一个或几个基本表或视图导出
                          • 只存放定义, 不存放数据
                          • 与数据同步变化

                          操作

                          • 创建
                            • 若一个视图由单个基本表导出, 并只是去掉了基本表中的某些行或列但保留了码, 则称这类视图为行列子集视图.
                              可以在子查询中使用连接, 以建立基于多个基本表的视图.
                              视图可以当做基本表成分进行查询, 所以也可以基于视图创建新的视图.
                              也可以在子查询中使用分组来建立视图
                              修改基表的结构后, 基表与视图的映射关系就会被破坏, 导致视图不能正常工作
                          • 删除
                            • 查询
                              • 用户视角: 查询视图与查询基本表别无二致
                                系统视角: 视图消解法, 先进行有效性检查, 再转换为等价的对基本表的查询并执行.
                                当视图定义的子查询中含有分组时使用视图消解法可能会产生错误(将聚集函数放在WHERE子句中)
                            • 更新
                              • 与基本表一致, 会使用视图消解法转换为对基本表的操作
                                行列子集视图一定可以更新, 但是有一些视图是不可更新的, 因为对它们的更新不能唯一有意义地转换为对相应基本表的更新(如尝试更新聚集函数的计算结果则会失败).
                                基于一个不允许更新的视图定义的视图同样不允许更新.

                            意义

                            当视图中的数据不是直接来自基本表时, 定义视图能够简化用户的操作(多张表连接, 复杂嵌套查询, 导出属性)
                            视图就是挥发性的查询结果的持久性保存!
                            视图机制能使不同用户用他们需要的不同方式看待同一数据, 能够适应数据库共享的需要.
                            视图还为重构数据库提供了一定程度的逻辑独立性(如把一张基本表拆成两个表, 可以把它们连接成一个视图来保持外模式不变)
                            视图机制能对机密数据提供安全保护(对不同用户定义不同视图, 使每个用户只能看到他有权看到的数据)
                            适当利用视图可以进行查询的阶段性封装, 可以更清晰地表达查询
                             
                            Loading...