『database-2』SQL

关系数据库标准语言 SQL

一、有关SQL

  • SQL的特点:

    • 综合统一:结合了 DDL、DML、DCL 三种关系数据库语言的功能
    • 高度非过程化、易学易用
    • 面向集合的操纵方式

    9个动词实现SQL核心功能

  • 基本表与导出表:

    • 基本表:实际存在的表,真正存储在物理文件中
    • 导出表:从基本表导出的表,是一个虚表,其真实数据不存在数据库中,只是在数据字典中存储其定义
      注意:视图(View)经过定义(Create View)就可以像基本表那样操作
  • 关系数据库的三级模式结构:SQL的关系数据库同样支持三级模式结构

    三级模式结构

    注意:存储文件的逻辑结构组成了内模式;存储文件的物理存储结构对用户隐藏


二、SQL数据查询功能

  • SQL查询语句块:SELECT-FROM-WHERE,其中:

    • SELECT:选取目标列,表示目标检索项
    • FROM:指明基本表或视图,可以由一个或多个表组成
    • WHERE:选取符合检索条件的元组
  • SQL投影查询:SELECT A1, ..., An FROM S ...,表示从关系S中抽取A1列、A2列
    SELECT DISTINCT A FROM S ... 表示从关系S中抽取A列后,去除重复行

  • SQL选取检索:通过WHERE子句引出查询条件;检索条件由属性名、常量、比较与布尔运算符(AND等)组成

  • SQL排序检索:在查询语句块最后ORDER BY A1, ..., An (ASC or DESC),将各行按指定列排序
    注意:若不指定升序或降序,默认按升序排列;可以按照单列或多列(多关键字)排序

  • SQL连接操作:查询涉及两个以上表的信息,将多个由连接属性相关联的表按照一定条件连接起来

    1. SELECT:指出最终选取的所有列名(可来自多个表,必要时使用关系名修饰)
    2. FROM:指出需要进行连接的各关系名称
    3. WHERE:指出元组连接谓词(表1.属性A \(\theta\) 表2.属性B) + 连接后的选取条件
  • 自连接操作:给一张表复制为两个非同名表,对其进行连接操作

  • 外连接操作:在连接谓词的某一端加一个星号*,表明为所在端的表增加一空行
    该空行可以与另一表中不满足连接条件(即被舍弃)的元组连接,从而可将悬浮元组输出


  • SQL子查询嵌套检索:查询间可以嵌套(结构化查询的体现)

    • 子查询的分类:普通子查询 + 相关子查询

      • 普通自查询:子查询的查询条件不依赖于父查询
      • 相关子查询:子查询的查询条件依赖于父查询

      注意:不相关子查询可以先直接求出子查询的返回值,再求解父查询;相关子查询中父子要交替进行

    • 查询语句块:在父查询的WHERE后用括号包裹新的S-F-W查询块

    • 子查询的返回值:可以返回一个单值、也可以返回一组值

      • 返回单值:可在 WHERE 中直接使用比较运算符
      • 返回集合:需使用 IN、ANY 等关键字
    • 嵌套 IN 谓词:满足筛选条件的属性值存在于子查询的返回值集合中,如 IN (child)

    • 嵌套比较运算符:若能够确认子查询仅返回单值,则父查询的 WHERE 中可以使用比较运算符

    • 嵌套 ANY(ALL)的子查询:子查询返回多值时使用 比较运算符 + ANY(ALL),如:
      “> ANY(child)” 表示大于子查询child 返回的某个值
      \(\le\) ALL(child)” 表示小于等于子查询child 返回的全部值
      “ = ANY(child)” 表示等于子查询child 返回的某个值
      注意:=ANY 等价于 IN 谓词;!= ALL 等价于 NOT IN 谓词

    • 嵌套 EXISTS 的子查询:EXISTS(child) = true \(\Leftrightarrow\) child 查询结果非空;EXISTS 不返回查询数据

      • EXISTS表示全称:p总是满足 \(\Rightarrow\) 不存在p不满足的情况

        全称常用于表示“全选”

      • EXISTS表示蕴含:若p满足则q满足 \(\Rightarrow\) 不存在p满足但q不满足的情况

        蕴含常用于表示“条件全选”


  • 并、差、交检索

    • 并集:SELECT ... UNION SELECT ...
    • 交集:SELECT ... INTERSECT SELECT ...
    • 差集:SELECT ... MINUS SELECT ...
  • 库函数检索:聚集函数

    • COUNT(A):求出属性值为A的行数;COUNT(*):求出行数
    • SUM(A):对数值列A求总和
    • AVG(A):对数值列A求平均值
    • MAX(A):在列A中找出最大值;MIN(A):在列A中找出最小值

    注意:库函数检索只能在 SELECT 或 HAVING 子句中出现

  • 分组检索:GROUP BY 若干列名 [HAVING 条件表达式]

    • GROUP BY 若干列名:表示分组依据;同组元组聚在一起,同一组内的列值不可完全相同
    • HAVING 条件:将不满足条件的组筛除(可选项)

    注意:分组后SELECT中的聚集函数为每个组都计算一个结果,不分组则直接按整列计算
    注意编写顺序:WHERE(先选出符合条件的行)\(\rightarrow\) GROUP BY(确定分组列)\(\rightarrow\) HAVING(最后筛选组)

  • 算术表达式的检索:SELECT子句中可包含由属性列 + 常量 + 库函数 + 算术运算符构成的算术表达式

  • 部分匹配查询:列名 LIKE / NOT LIKE 字符串常量(模糊查询)

    • 列名:必须为字符串型
    • 字符串常量:可包含 %(匹配任意多个字符)和 _ (匹配任意单个字符)
  • 基于派生表的查询:SELECT ... FROM (child) AS child_table(A1, ..., An),即需要给派生表指定一个别名
    注意:若子查询中未使用聚集函数,就不必为派生表指定列名,其列名默认为子查询SELECT的列名


三、SQL数据定义功能

  • 定义基本表:其基本格式为如下

    定义表的格式

    注意:新建立的表是空表,表的定义及有关约束存放在数据字典中

    • SQL92的数据类型:

      部分基本数据类型

    • 完整性约束:

  • 删除基本表:DROP TABLE <表名> [RESTRICT | CASCADE]

    • RESTRICT:表示删除表有限制条件,默认RESTRICT有效
    • CASCADE:表示删除表没有限制条件
  • 修改基本表:其基本格式如下

    修改表的格式


  • 定义索引:索引可以建立在一列多列上,其基本格式如下

    • UNIQUE:表明该索引的每个索引值仅对应唯一的数据记录
    • CLUSTER:表明要建立的索引是聚簇索引
    • 次序:可以选择为该列上的索引值设置排列次序,默认为ASC

    注意:索引是加快查询速度的有效手段,属于内模式的范畴,无需用户干预

  • 修改索引ALTER INDEX <旧索引名> RENAME TO <新索引名>

  • 删除索引:DROP INDEX <索引名>
    注意:数据的增删改会导致维护索引的开销,可以考虑删除不必要的索引


  • 定义视图:视图是一个虚表,其数据存于原先的基本表中,随基本表改变而变化

    • 子查询:任意的 SELECT 语句
    • WITH CHECK OPTION:子查询中的谓词条件表达式

    注意:视图的各列名可以省略(或全部指定),默认为 SELECT 子句的各属性字段
    不能省略的情况:目标列使用了聚集函数;多表连接中将各表同名列作为目标列;需要换列名称

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

  • 查询视图:使用与基本表查询相同的方式(SELECT-FROM-WHERE)对视图进行查询

    • 视图消解:从数据字典中取出视图定义,将视图子查询用户查询结合,转化为等价的对基本表的查询

    • 视图的作用:视图是数据库的“窗户”,可以观察用户感兴趣的数据及变化

      1. 为同一数据赋予多种观察角度
      2. 提供一定的逻辑独立性
      3. 对数据提供安全保护

四、SQL数据更新功能

  • 插入数据:可分为插入元组或插入子查询结果

    • 插入元组:INSERT INTO <表名> (若干属性列) VALUES (若干元组)
    • 插入子查询结果:INSERT INTO <表名> (若干属性列)<SELECT 子查询>
  • 修改数据:UPDATE <表名> SET (若干 <列名> = <表达式>) [WHERE <条件>],表示修改符合条件的行的属性值
    注意:修改元组使用UPDATE,而修改整个表的特性使用ALTER

  • 删除数据:DELETE FROM <表名> [WHERE <条件>],即删除符合条件的行


五、SQL数据控制功能

  • 授权与回收权限:安全控制
    • 授权:GRANT <权限> [ON <对象类型> <对象名>] TO <用户>
    • 回收权限:REVOKE <权限> [ON <对象类型> <对象名>] FROM <用户>

六、空值运算

  • 空值(NULL)的含义:不知道(如漏填)、数据缺失(如缺席)、不便填写(如隐私信息)

  • 判断空值:WHERE 中使用条件语句 IS NULL 或 IS NOT NULL

  • 空值的计算:空值 ArithmaticOp 任意值 = 空值、空值 CompareOp 任意值 = Unknown

  • 空值的逻辑运算:T AND U = U、F OR U = U、NOT U = U

    注意:含 NOT NULL、UNIQUE 约束主码属性都不能取 NULL


七、嵌入式SQL

  • SQL的实际应用:内嵌在高级语言(如C语言)中,将SQL的特性程序设计语言的特性相结合

  • 内嵌SQL:将SQL预编译为高级语言源码,再按诸语言方式进行编译

    • 区分SQL与宿主语言:在SQL语句前增加前缀EXEC SQL
    • SQL与宿主语言通信:SQL通信区负责向宿主语言传递执行状态;宿主语言设置主变量与SQL交换数据
    • SQL与宿主语言的协调:通过游标缓存SQL的执行结果
  • ODBC与JDBC:基于X/Open和ISO/IEC的SQL调用级接口规范

    • 功能:建立与数据库的连接;发送SQL语句;处理结果

      注意:JDBC在设计思想上沿袭了ODBC

    JDBC四大组件


『database-2』SQL
http://larry0454.github.io/2023/09/26/database/SQL/
Author
WangLe
Posted on
September 26, 2023
Licensed under