跳至内容

信息技术导论/SQL

来自维基教科书,开放世界中的开放书籍

结构化查询语言 (SQL) 是一种编程语言,设计用于管理关系数据库管理系统中存储的数据。SQL 分为六种语言元素

  • 子句 - 它们是语句和查询的组成部分。
  • 表达式 - 它们生成标量值或包含数据列和行的表的表。
  • 谓词 - 它们指定条件,用于限制语句和查询的影响,或更改程序流程。
  • 查询 - 根据给定条件检索数据。
  • 语句 - 它们控制事务、程序流程、连接、会话或诊断。
  • 无关紧要的空白 - 这通常在 SQL 语句和查询中被忽略。

SQL 最初基于关系代数和元组关系演算,由数据定义语言、数据操纵语言和数据控制语言组成。

SQL 在 1986 年成为美国国家标准协会 (ANSI) 的公认标准,并在 1987 年成为国际标准化组织 (ISO) 的公认标准。虽然它已被接受为标准,但它已被修订以包含更多功能。即使存在标准,大多数代码在没有调整的情况下也不能完全在不同的数据库系统之间移植。

主要 SQL 语句

[编辑 | 编辑源代码]

运算符

[编辑 | 编辑源代码]
运算符 描述 示例
= 等于 Author = 'Alcott'
<> 不等于(许多 DBMS 除了 <> 外还接受 != Dept <> 'Sales'
> 大于 Hire Date > '2012-01-31'
< 小于 Bonus < 50000.00
>= 大于或等于 Dependents >= 2
<= 小于或等于 Rate <= 0.05
BETWEEN 介于一个包含的范围之间 Cost BETWEEN 100.00 AND 500.00
LIKE 匹配字符模式 First_Name LIKE 'Will%'
IN 等于多个可能值中的一个 DeptCode IN (101, 103, 209)
ISIS NOT 与空值(缺失数据)比较 Address IS NOT NULL
IS NOT DISTINCT FROM 等于值或两者都为空值(缺失数据) Debt IS NOT DISTINCT FROM - Receivables
AS 用于在查看结果时更改字段名称 SELECT employee AS 'department1'

有时建议和/或实施了其他运算符,例如天际线运算符(用于查找那些不“比其他任何运算符差”的记录)。

SQL 有 case/when/then/else/end 表达式,在 SQL-92 中引入。它最通用的形式,在 SQL 标准中称为“搜索情况”,就像其他编程语言中的条件(编程)else if 一样

CASE WHEN n > 0
          THEN 'positive'
     WHEN n < 0
          THEN 'negative'
     ELSE 'zero'
END

SQL 按它们在源代码中出现的顺序测试 WHEN 条件。如果源代码没有指定 ELSE 表达式,SQL 默认为 ELSE NULL。一种简化的语法 - 在 SQL 标准中称为“简单情况” - 类似于 switch 语句

CASE n WHEN 1
            THEN 'one'
       WHEN 2
            THEN 'two'
       ELSE 'I cannot count that high'
END

此语法使用隐式相等比较,SQL CASE|通常对与 NULL 进行比较有注意事项。

对于 Oracle-SQL 方言,后者可以缩短为等效的 DECODE 结构

SELECT DECODE(n, 1, 'one',
                 2, 'two',
                    'i cannot count that high')
FROM   some_table;

最后一个值是默认值;如果没有指定,它也默认为 NULL。但是,与标准的“简单情况”不同,Oracle 的 DECODE 将两个 NULL 视为相等。[1]

数据定义语言 (DDL)

[编辑 | 编辑源代码]

定义数据库中不同对象结构的语句。它的作用可以在数据库中创建、更改或删除数据库对象。DDL 的命令有

•CREATE - 为数据库创建对象,例如索引或表

•ALTER - 重塑数据库中已存在对象的结构,例如向表添加行

•DROP - 删除数据库中的对象

•RENAME - 用于重命名数据库中的对象

•TRUNCATE - 删除表中的所有数据,而不删除表本身

数据操纵语言 (DML)

[编辑 | 编辑源代码]

允许数据库用户操纵数据和数据库的语句。数据库用户可以以多种方式操纵数据。DML 的命令有

•SELECT - 从表中检索数据

•INSERT - 向现有表添加行

•UPDATE - 更新一组现有的表行

•DELETE - 从表中删除现有的行


数据操纵语言 (DML) 是 SQL 的子集,用于添加、更新和删除数据

  • Insert (SQL)|INSERT 向现有表添加行(正式称为元组),例如
INSERT INTO example
 (field1, field2, field3)
 VALUES
 ('test', 'N', NULL);
  • Update (SQL)|UPDATE 修改一组现有的表行,例如
UPDATE example
 SET field1 = 'updated value'
 WHERE field2 = 'N';
  • Delete (SQL)|DELETE 从表中删除现有的行,例如
DELETE FROM example
 WHERE field2 = 'N';
  • Merge (SQL)|MERGE 用于合并多个表的 data。它结合了 INSERTUPDATE 元素。它在 SQL:2003 标准中定义;在此之前,一些数据库通过不同的语法提供类似的功能,有时称为“upsert”。
 MERGE INTO table_name USING table_reference ON (condition)
 WHEN MATCHED THEN
 UPDATE SET column1 = value1 [, column2 = value2 ...]
 WHEN NOT MATCHED THEN
 INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...])

事务控制语言 (TCL)

[编辑 | 编辑源代码]

管理对数据库所做更改的语句。数据库用户可以接受、撤消或标记他们在数据库中的更改。TCL 的命令有

•COMMIT - 使数据更改永久有效

•ROLLBACK - 丢弃在上次 COMMIT 或 ROLLBACK 语句之前进行的任何数据更改

•SAVEPOINT - 在当前位置保存数据库

数据控制语句 (DCS)

[编辑 | 编辑源代码]

用于创建特权的语句,该特权允许用户访问和操纵数据库中的数据。数据库管理员可以配置安全措施来控制对数据库中数据库对象的访问。DCS 的命令有

•GRANT - 授权用户对对象执行操作

•REVOKE - 撤销授权

定义数据库

[编辑 | 编辑源代码]

要使用 Access SQL 在 Access 中构建一个新表,您必须命名表,命名字段并定义字段将包含的数据类型。必须使用 CREATE TABLE 语句在 SQL 中定义表。

添加数据

[编辑 | 编辑源代码]

向关系中添加数据有两种不同的方法。一种方法是逐条添加数据,另一种方法是一次添加大量数据,两种情况都在开头使用 INSERT INTO 语句。要添加一条记录,必须使用字段列表来定义要放置数据的字段,然后必须在值列表中提供数据本身。要一次将多条记录添加到表中,必须使用 INSERT INTO 语句以及 SELECT 语句。

查看数据

[编辑 | 编辑源代码]

要使用 SQL 查看表中的数据,可以使用 SELECT 语句从数据库表中检索数据,结果通常以由任意数量的列组成的行集形式返回,然后必须使用 FROM 语句指定要从中选择的表。要查看表中的所有列标题而没有任何实际数据行,请使用 SHOW 语句。其他语句,如 SUM、COUNT、AVG、MAX、MIN 和 ORDER BY,可用于按不同顺序对数据进行排序,获取数据的平均值和/或统计表中特定项目的数量。

修改数据

[编辑 | 编辑源代码]

使用 SQL 修改表中的数据有多种方法。一种方法是 ALTER TABLE 语句,它允许您添加、删除或修改表中的列。另一个语句是 UPDATE 语句,它允许您更新表中的记录。这些语句允许用户将数据输入表中,以及更改表中的当前数据。您也可以使用 INSERT 语句将新数据放入表中。

删除数据

[编辑 | 编辑源代码]

要删除数据表中已存在的数据,必须使用 DELETE 语句。DELETE 语句不会删除表本身,它只会删除表结构当前保存的数据。

SQL 注入攻击

[编辑 | 编辑源代码]

SQL 注入是一种将恶意攻击插入 SQL 语句的行为,攻击者可以通过这种方式获得对 Web 服务器的控制权。它可以为攻击者提供个人信息,并使其能够未经授权地访问其他敏感资料。它还可以被用来获取身份验证和授权机制的访问权限,并收集给定数据库中的所有信息。它还可以用来降低数据库的完整性。

  1. 无效的 <ref> 标签;未为名为 DECODE 的引用提供文本
华夏公益教科书