SQL字典式教程

本文最后更新于:6 个月前

SQL

SQLStructure Query Language)又称结构化设计语言。是一门数据库语言,其作用包括数据定义Statistic Define、数据操纵Maniplation、数据控制Control三个主要部分。其运行基于数据库管理系统(DBMS)对数据库的外模式进行操作控制,为外置的数据库用户或程序提供对数据库数据进行操作提供一种方式,并集成常用的操作和功能。

其语句结构包括一下方面:

  1. 数据定义
  2. 数据查询
  3. 数据操作
  4. 数据控制
  5. 指针控制
  6. 事务控制

此篇文章主要介绍SQL语句结构的前三种

数据定义Data Define Language

SQL的数据定义有特定的谓词CREATEDROPALTER

谓词CREATE

谓词CREATE用于创建数据类型 、表、模式。数据库等同时定义完整性约束。
使用方法:

  • 创建数据库
    -CREATR {DATABASE | SCHEMA} db_name [create_spcification[,create_specification]...]

    • [create_specification]: [DEFAULT] CHARACTER SET charset_name | [DEFAULT] COLLATE collation_name
  • 创建数据表

    • CREATE [sc_name] TABLE table_name [(create_definition, create_definition, ...)] [table_options] [select_statement]
    • [create_definition]包括数据列名称col_name,数据类型data type,数据完整性约束[[NOT] NULL],数据索引[INDEX],数据主键[PRIMARY KEY]
  • 创建模式

    • CREATE SCHEMA sc_name AUTHORIZATION <user_name [<CREATE DOMAIN 子句>|<CREATE TABLE 子句 >|<CREATE VIEW 子句>|...]
  • 创建索引

    • CREATE [UNIQUE] [CLUSTER] INDEX <index_name> ON <table_name> [<col_name> [<(ASC|DESC)>]],...]);
  • UNIQUE表示索引值唯一对应

    • CLUSTER表示要建立的索引为聚族索引,与表中记录顺序一致的索引组织

    关于[create_definition]的定义,其中包括三个部分

    [<列名> <数据类型> [列级完整性约束]],其中不同层级的[CREATE_DEFINITION]用半角逗号,分隔

    数据库的数据类型分为:

    1. 预定义数据类型: 即可在SQL中直接使用的数据类型(较为常用)
      1. INT整数类型, SMALLINT短整数类型
      2. REAL浮点数类型, DOUBLE PRECISION双精度浮点数类型, FLOAT(n)浮点数类型, 精度至少为n位数字
      3. NUMERIC(p,d)定点数类型,共有p位数字,其中小数点后d位
      4. CHAR(n)长度为n的字符串, VARCHAR(n)最大长度为n的字符串
      5. BIT(n)长度为n的二进制位串, BITVARYING(n)最大长度为n的二进制位串
      6. DATE日期类型: YYYY-MM-DD, 时间类型: HH:MM:SS, TIMESTAMP时间戳(DATETIME)
      7. BOOLEAN布尔型,有三个值TRUEFALSEUNKNOWN
    2. 构造数据类型: 由特性的保留字和预定义数据类型构造而成, 如REFROWARRAY
    3. 用户定义数据类型: 是一个对象类型,是由用户按照一定的规则用预定义数据类型组合定义的用户自用的数据类型
    4. 大对象类型: 可储存多达1Gbyts的串。称为LOB: BLIB二进制大对象,储存音频、图像、视频等。CLOB

谓词DROP

谓词DROP用于删除数据类型:

  • 删除模式
    • DROP SCHEMA sc_name (CASCADE | RESTRICT)
    • CASCADE 删除模式时, 将模式及其下属的表、视图索引等全部删除
    • RESTRICT 只删除空模式
  • 删除表
    • DROP col_name (CASCADE | RESTRICT) [DROP 完整性约束]
  • 删除索引
    • DROP INDEX [ON table_name] index_name

谓词MODIFY

谓词MODIFY用于修改数据类型:

  • 修改数据表的列:
    • MODIFY [TABLE table_name] col_name create_spcification

数据查询DATA Query Language

SQL的数据查询有特定的谓词SELECT也是SQL用的最多的谓词

简单查询

简单查询仅涉及数据库中的一个表,也称为单表查询

  • 查询表中的若干列(投影)
    • SELECT col_name1[, col_name2]... FROM table_name //投影部分列
    • SELECT * FROM table_name //投影所有列
  • 查询若干元组
    • SELECT {[col_names]} FROM table_name WHERE {Expression}
    • SELECT {[col_names]} FROM table_name WHERE [col_name] BETWEEN [left_limit] AND [right_linit]
    • SELECT {[col_names]} FROM table_name WHERE [col_name] [NOT] LIKE [Expression]
      • [Expression]中使用’’包裹条件
      • %匹配任意长的字符串
      • _匹配单个任意字符
    • SELECT {[col_names]} FROM table_name WHERE [col_name] IN ('MA', 'CS', 'EE');
  • 排序查询结果
    • SELECT * FROM table_name ORGER BY {[col_names]} DESC;数组中的第一列优先级最高
  • 使用聚集函数
    • COUNT ([DISTINCT | ALL] *) 统计元组个数
    • COUNT ([DISTINCT | ALL] col_name) 统计一列元组个数
    • SUM ([DISTINCT | ALL] col_name) 对数值列求和
    • AVG ([DISTINCT | ALL] col_name) 对数值求平均
    • MAX ([DISTINCT | ALL] col_name) 求最大值
    • MIN ([DISTINCT | ALL] col_name)求最小值
    • SELECT COUNT(*) FROM table_name 查询元组数量
  • 对查询结果分组
    • SELECT {[col_names]} FROM table_name GROUP BY {[col_names]} [HAVING Expression]

连接查询

查询通过多个表取得数据,称为连接查询

  • 等值连接和非等值连接
    • SELECT table_name1 {[col_names]} FROM table_name2 WHERE table1.att1 = table2.att2当两个表有相同的某列的值时,将其连接起来
  • 符合条件链接
    • SELECT {[col_names]} FROM table_name WHERE [Express] [AND] [table1.att1 = table2.att2]
  • 自身连接
    • `SELECT {[col_names]} FROM table_name AS [alias1], table_name AS [alias2] WHERE alias1.att1 > alias2.att2 AND [Expression]
  • 多表连接
    • SELECT {[col_names]} FROM table_name FROM {[table_names]} WHERE {[Expression]}

嵌套查询

  • 带有谓词IN的子查询
    • `SELECT {[col_names]} FROM table_name WHERE [clo_name] IN (SELECT [col_NAme] FROM table_name WHERE [Epression])
  • 带有ANY(SOME)或ALL谓词的子查询
    • SELECT {[col_names]} FROM table_name WHERE [col_name] < ANY(select_array)
    • SELECT {[col_names]} FROM table_name WHERE [col_name] < ALL(select_array)
  • 带有`[NOT] EXISTS谓词的子查询
    • SELECT {[col_names]} FROM table_name WHERE EXISTS(select_array)

集合查询

  • (UNION)
    • SELECT {[col_names]} FROM table_name WHERE [Expression1] UNION SELECT {[col_names]} FROM table_name WHERE [Expression2]
  • (Intersect)
    • SELECT {[col_names]} FROM table_name WHERE [Expression1] INTERSECT SELECT {[col_names]} FROM table_name WHERE [Expression2]
  • (EXCEPT)
    • SELECT {[col_names]} FROM table_name WHERE [Expression1] EXCEPT SELECT {[col_names]} FROM table_name WHERE [Expression1]

连接表

连接表允许用户在一个`SELECT`语句的`FROM`子句中指定连接操作,这种连接操作所得到的表称为连接表。
  • ` [NATURAL]
    • Connect_Type includes JOIN, OUTER, JOIN, NATURAL JOIN and CROSS JOIN
    • Connect_Condition includes ON, USING({col_names})
    • SELECT {col_names} FROM (<table_name1> JOIN {col_names} ON <table_name2.col_names> [Judge_condition]) Where {Judge_condition}

数据修改

数据插入

SQL的插入操作通过INSERT语句实现,该语句将数据插入到一个表中.其一般格式有两种:

  1. 插入一行
    1. INSERT INFO table_name [{col_names}] VALUES({col_values})
  2. 使用查询插入多行
    1. INSERT INTO table_name[{col_names}] {child_query}

数据删除

SQL的数据删除由DELETE实现

DELETE FROM table_name [WHERE {expressions}]

更新数据

SQL数据更新操作由UPDATE语句实现

UPDATE table_name SET {col_names=col_values} WHERE {expressions}

更新操作一次只能更新一个表,若更新多个表,需要执行多个更新语句