SQL语法

SQL编程语言的语法是由ISO/IEC 9075标准中的ISO/IEC SC 32委员会所定义和维护的。尽管存在标准，不过SQL代码仍然无法在不进行修改的前提下在不同的数据库系统中直接移植。
语言元素.
SQL语言分成了几种要素，包括：
运算符.
有人也提议实现其他运算子，例如（寻找那些不比任何其他记录“糟糕”的记录）。
条件（CASE）表达式.
SQL在SQL-92标准中引入了codice_1语句。通常情况下所称的“搜索CASE语句”例子如下：
CASE WHEN n &gt; 0 
 THEN '正'
 WHEN n &lt; 0 
 THEN '负'
 ELSE '零'
END
SQL按照codice_2条件在源代码中出现的顺序进行判断。如果源代码中没有指定codice_3表达式，SQL默认为codice_4。SQL标准中还有一种“简单CASE语句”，类似C语言的switch：
CASE n WHEN 1 
 THEN 'one' 
 WHEN 2
 THEN 'two' 
 ELSE 'I cannot count that high'
END
该语法是隐式相等条件。通常情况下，遇到与空值比较的情况会发出警告。
对于Oracle数据库的SQL语法，还可以用codice_5函数简化：
SELECT DECODE(n, 1, 'one', 
 2, 'two',
 'i cannot count that high')
FROM some_table;
最后一个值是可选的，若无指定，默认为codice_6。另外，与“简单CASE”不同的是，Oracle的codice_5会认为两个codice_6之间相等。
查询.
SQL中最常见的操作是查询，它是通过陈述性codice_9语句执行的。codice_9从一个或多个表或表达式中检索数据。标准的codice_9不会对数据库有持久影响。codice_9的一些非标准的实现可以有持久影响，如一些数据库中有codice_13语法。
查询允许用户描述所需的数据，将、以及执行用以产生它选取的结果的物理操作交给数据库管理系统（DBMS）负责。
查询包含一系列含有最终结果的字段, 紧跟codice_9关键词。星号（"codice_15"）也可以用来指定查询应当返回查询表所有字段。codice_9是最复杂的SQL语句，可选的关键词和子句包括：
下面是一个返回昂贵的书籍列表的codice_9查询的例子。查询会从 "Book" 表中检索所有 "price" 的值大于 100.00 的行。结果按 "title" 升序排列。"选择列表"中的星号（*）表明"Book"表中所有字段都包含在结果集中。
SELECT *
 FROM Book
 WHERE price &gt; 100.00
 ORDER BY title;
下面的例子演示了通过返回与每本书相关联的书籍和作者来多表查询、分组和聚集。
SELECT Book.title AS Title,
 count(*) AS Authors
 FROM Book
 JOIN Book_author
 ON Book.isbn = Book_author.isbn
 GROUP BY Book.title;
输出可能类似于下面的例子：
 Title Authors
 SQL Examples and Guide 4
 The Joy of SQL 1
 An Introduction to SQL 2
 Pitfalls of SQL 1
在"isbn"是两个表中唯一通用的列名，且名为"title"的列仅存在于"Books"表中的前提下，上述查询可以用以下形式重写：
SELECT title,
 count(*) AS Authors
 FROM Book 
 NATURAL JOIN Book_author
 GROUP BY title;
然而，许多厂商或者不支持这种方法，或者需要某些列命名约定来实现自然联接。
SQL包含有用于计算存储值的值的运算符和函数。SQL允许在"选择列表"中使用表达式来投影数据，如下例所示，它返回成本超过100.00的书籍列表，另外一列"sales_tax"包含以"price"的6％计算的销售税数据。
SELECT isbn,
 title,
 price,
 price * 0.06 AS sales_tax
 FROM Book
 WHERE price &gt; 100.00
 ORDER BY title;
子查询.
查询可以嵌套，以便一个查询的结果可以通过关系运算符或聚合函数在另一个查询中使用。嵌套查询也称为"子查询"。虽然连接和其他表操作在许多情况下提供了计算上优越（即更快）的替代方案，但是子查询的使用引入了在执行中会很有用或很必要的等级。在下例中，聚合函数codice_31接收子查询的结果作为输入：
SELECT isbn,
 title,
 price
 FROM Book
 WHERE price &lt; (SELECT AVG(price) FROM Book)
 ORDER BY title;
子查询可以使用外部查询的值，在这种情况下，它被称为。
自1999年以来，SQL标准允许称为的命名子查询（在IBM DB2版本2中实现之后命名和设计; Oracle把它叫做）。CTE还可以通过自身引用来递归；允许树或图遍历，以及更一般的不动点计算。
派生表.
"派生表"是在FROM子句中引用SQL子查询的用法。基本上，派生表是可以从中选择或连接到的子查询。派生表功能允许用户将子查询引用为表。派生表也称为"内联视图"或"子选择"。
在下例中，SQL语句涉及从初始“Book”表到派生表“sales”的连接。此派生表使用ISBN捕获关联的图书销售信息以加入“Book”表。因此，派生表提供的结果集包含附加列（销售的商品数量和销售图书的公司）：
SELECT b.isbn, b.title, b.price, sales.items_sold, sales.company_nm
FROM Book b
 JOIN (SELECT SUM(Items_Sold) Items_Sold, Company_Nm, ISBN
 FROM Book_Sales
 GROUP BY Company_Nm, ISBN) sales
 ON sales.isbn = b.isbn
空值与三值逻辑.
SQL中引入了空值的概念，用来处理关系模型中缺少信息的情况。codice_6一词表示空白值，是SQL中的保留词。如果Null进行比较，例如在WHERE子句中使用“=”判断相等，那么会返回未知值，而SELECT语句只会返回WHERE子句条件为真（TRUE）的结果，不会返回条件为假（FALSE）或未知的结果。
“真”、“假”以及与空值直接比较时所得到的“未知”共同组成了SQL的three-valued logic。SQL所用的真值表与Kleene和Lukasiewicz三值逻辑的共同部分对应 (它们对内涵的定义不同，然而SQL没有定义这样的操作)。
然而，由于在直接比较之外的处理，在SQL中对Null的语义解释存在争议。如上表所示，SQL中的两个NULL之间的直接等式比较（例如codice_33）返回真值“未知”。这符合Null不具有值（并不是任何数据域的成员）的解释，而是缺失信息的占位符或“标记”。但是，在codice_34和codice_35操作符的SQL规范中，两个空值不相等的原则在实际上标识了null。 因此，与涉及NULL的显式比较（例如上述codice_20子句中的那些）的操作不同，SQL中的这些集合运算可能产生表示不确定信息的结果。在Codd的1979年提案中（该提案基本被SQL92采纳），这种语义上的不一致被合理化了，他认为在集合操作中删除重复的操作发生在 "比检索操作求值中的相等验证更低的细节层次上"。 然而，计算机科学教授Ron van der Meyden认为“SQL标准的不一致意味着不可能将任何直观的逻辑语义归结为SQL中的null处理。”
另外，由于直接与空值比较会返回未知，因此SQL又提供了两个用于测试空值的语句：codice_37和codice_38，前者用于判断是否为空，后者相反。 SQL不明确支持全称量化，必须将其定义为否定存在量化。 还有“&lt;行值表达式&gt; IS DISTINCT FROM &lt;行值表达式&gt;”插入比较运算符，除非两个操作数相等或两者都为NULL，否则返回TRUE。同样，codice_39定义为“NOT (&lt;行值表达式&gt; IS DISTINCT FROM &lt;行值表达式&gt;)”。还引入了codice_40类型变量，根据标准也可以是未知值。实践中一些数据库系统（例如PostgreSQL）会把 implement the BOOLEAN Unknown as a BOOLEAN NULL.
数据操作.
资料操纵语言（DML）是SQL用于添加、更新和删除数据的子集：
INSERT INTO example
 (field1, field2, field3)
 VALUES
 ('test', 'N', NULL);
UPDATE example
 SET field1 = 'updated value'
 WHERE field2 = 'N';
DELETE FROM example
 WHERE field2 = 'N';
 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 ...])
事务控制.
如果数据库系统支持事务，那么可用以下语句：
CREATE TABLE tbl_1(id int);
 INSERT INTO tbl_1(id) VALUES(1);
 INSERT INTO tbl_1(id) VALUES(2);
COMMIT;
 UPDATE tbl_1 SET id=200 WHERE id=1;
SAVEPOINT id_1upd;
 UPDATE tbl_1 SET id=1000 WHERE id=2;
ROLLBACK to id_1upd;
 SELECT id from tbl_1;
codice_52和codice_53会中止当前事务并释放锁。在没有codice_47或类似语句的情况下，SQL的语义与实现有关的。
下面例子展示了把一个账户的金额转移到另一个账户上面的过程。只要表示减少和增加的两个UPDATE语句中有一个失败，整个事务就会回退，更改也不会保存到数据库中。
START TRANSACTION;
 UPDATE Account SET amount=amount-200 WHERE account_number=1234;
 UPDATE Account SET amount=amount+200 WHERE account_number=2345;
IF ERRORS=0 COMMIT;
IF ERRORS&lt;&gt;0 ROLLBACK;
数据定义.
资料定义语言（DDL）管理表和索引结构。DDL的最基本是codice_60、codice_61、codice_62、codice_63和codice_64语句：
CREATE TABLE example(
 column1 INTEGER,
 column2 VARCHAR(50),
 column3 DATE NOT NULL,
 PRIMARY KEY (column1, column2)
ALTER TABLE example ADD column4 NUMBER(3) NOT NULL;
TRUNCATE TABLE example;
DROP TABLE example;
数据类型.
一张表中的每个字段都要定义该字段的类型。ANSI SQL包括下列数据类型：
Bit类型.
Bit是一种存储0或1的整数类型，一个Bit值需要一个字节。
数值.
定点数类型包含两个要素：长度、精度。长度表示数字的最大个数，包括小数点左面和右面的数字。精度是非负整数，精度为零意味着数值只能是整数。以123.45为例，它的长度为5，精度为2。
SQL提供了除去小数部分、只保留整数部分的函数，叫做codice_88（Informix、DB2、PostgreSQL、Oracle和MySQL）或codice_89（Informix、SQLite、Sybase、Oracle、PostgreSQL和Microsoft SQL Server）
日期与时间.
SQL提供了多个在日期时间类型和字符串类型之间互相转换的函数，例如codice_103、codice_104、codice_105等。可以通过codice_106函数来获取数据库服务器的时间。
数据控制.
资料控制语言 (Data Control Language, DCL) 授权的用户访问和操作的数据。
它的两个主要的语句是：
例如:
GRANT SELECT, UPDATE
 ON example
 TO some_user, another_user;
REVOKE SELECT, UPDATE
 ON example
 FROM some_user, another_user;