SQL(Structured Query Language)语句的通用语法遵循一些核心结构和规则,尽管具体的实现(如MySQL、PostgreSQL、SQL Server、Oracle)可能在数据类型、函数名称或某些高级特性上有所不同。以下是SQL语句的通用语法概述:
核心组成部分:
语句类型 (Statement Type):
- 每个SQL操作都以一个关键字开头,表明要执行的操作类型。最常见的包括:
SELECT
: 查询数据INSERT
: 插入新数据UPDATE
: 修改现有数据DELETE
: 删除数据CREATE
: 创建数据库对象(如表、视图、索引)ALTER
: 修改数据库对象结构DROP
: 删除数据库对象TRUNCATE
: 快速删除表中所有数据GRANT
/REVOKE
: 管理权限BEGIN
/COMMIT
/ROLLBACK
: 事务控制
- 每个SQL操作都以一个关键字开头,表明要执行的操作类型。最常见的包括:
子句 (Clauses):
- 子句提供语句的细节和条件。它们通常跟在主关键字后面,由特定的关键字引入。常见的子句包括:
FROM
: 指定要查询/操作的表(或多个表)。WHERE
: 指定过滤记录的条件(行级过滤)。GROUP BY
: 将结果集按一列或多列分组(通常与聚合函数一起使用)。HAVING
: 对GROUP BY
产生的分组结果进行过滤(分组级过滤)。ORDER BY
: 对结果集进行排序(升序ASC
或降序DESC
)。LIMIT
/FETCH FIRST
/TOP
: (具体语法因数据库而异) 限制返回的记录数。OFFSET
: (常与LIMIT
一起用) 跳过开头的若干行。JOIN
(INNER JOIN
,LEFT JOIN
,RIGHT JOIN
,FULL JOIN
): 指定如何从多个表中组合数据。ON
: 指定JOIN
操作的条件。USING
: 当连接键同名时简化JOIN
条件。SET
: (用于UPDATE
) 指定要更新的列及其新值。VALUES
: (用于INSERT
) 指定要插入的新行的值。INTO
: (用于INSERT
) 指定要插入数据的表。
- 子句提供语句的细节和条件。它们通常跟在主关键字后面,由特定的关键字引入。常见的子句包括:
表达式 (Expressions):
- 出现在子句中,用于计算值。可以是:
- 列名:
customer_id
,product_name
- 字面量:
'John Doe'
(字符串),100
(数字),TRUE
(布尔值),NULL
- 运算符:
- 算术:
+
,-
,*
,/
,%
- 比较:
=
,<>
或!=
,>
,<
,>=
,<=
,BETWEEN
,LIKE
,IN
,IS NULL
,IS NOT NULL
- 逻辑:
AND
,OR
,NOT
- 算术:
- 函数:
COUNT(*)
,SUM(price)
,UPPER(name)
,DATE_ADD(order_date, INTERVAL 1 DAY)
,CONCAT(first_name, ' ', last_name)
- 子查询 (Subqueries): 嵌套在另一个SQL查询中的查询
SELECT ... WHERE column IN (SELECT ...)
- 列名:
- 出现在子句中,用于计算值。可以是:
标识符 (Identifiers):
- 用于命名数据库对象(表、列、视图、索引等),如
customers
,order_id
。 - 如果标识符包含空格、特殊字符或是保留字,通常需要用引号括起来(具体引号类型因数据库而异:MySQL用反引号
`
,SQL Server用方括号[]
,标准SQL和PostgreSQL用双引号""
)。例如:`order date`
,[order date]
,"order date"
。
- 用于命名数据库对象(表、列、视图、索引等),如
注释 (Comments):
- 用于解释代码,不会被执行。有两种主要方式:
- 单行注释:
-- 这是一个单行注释
或# 这也是单行注释(MySQL特有)
- 多行注释:
/* 这是一个 多行注释 */
- 单行注释:
- 用于解释代码,不会被执行。有两种主要方式:
通用语法规则:
不区分大小写(通常): 关键字(
SELECT
,FROM
,WHERE
)、函数名和大多数标识符在SQL中通常不区分大小写。SELECT
等同于select
或SeLeCt
。但是:- 字符串字面量是区分大小写的:
'Apple'
不等于'apple'
。 - 数据库在存储标识符时可能有默认的大小写敏感性(取决于数据库配置和操作系统)。
- 最佳实践: 为了可读性和一致性,习惯上将关键字大写,标识符使用小写或蛇形命名法(
snake_case
),例如:SELECT customer_name FROM orders WHERE total_amount > 100;
- 字符串字面量是区分大小写的:
空格和换行: SQL解释器会忽略语句中多余的空格、制表符和换行符。这些主要用于格式化代码以提高可读性。
分号结尾(通常): 在大多数数据库系统和客户端工具中,分号
;
用于分隔多个SQL语句,表示一个语句的结束。尤其是在命令行客户端或脚本中,分号通常是必需的。在图形界面工具或某些编程接口中,有时可以省略。
主要语句结构示例:
SELECT
(查询数据):SELECT [DISTINCT] column1 [, column2, ... | * | expression [AS alias]] FROM table_name [AS alias] [JOIN other_table ON join_condition] [WHERE condition] [GROUP BY grouping_column [, ...]] [HAVING group_condition] [ORDER BY sort_column [ASC | DESC] [, ...]] [LIMIT number] [OFFSET number]; -- LIMIT/OFFSET 语法因数据库而异
- 示例:
SELECT product_id, product_name, unit_price * units_in_stock AS stock_value FROM products WHERE category_id = 5 ORDER BY stock_value DESC LIMIT 10;
- 示例:
INSERT
(插入新行):INSERT INTO table_name (column1 [, column2, ...]) VALUES (value1 [, value2, ...]); -- 或者插入查询结果 INSERT INTO table_name (column1 [, column2, ...]) SELECT ... FROM ...;
- 示例:
INSERT INTO customers (first_name, last_name, email) VALUES ('Alice', 'Smith', 'alice@example.com');
- 示例:
UPDATE
(修改现有行):UPDATE table_name SET column1 = new_value1 [, column2 = new_value2, ...] [WHERE condition]; -- 非常重要:如果不加WHERE子句,会更新表中的所有行!
- 示例:
UPDATE products SET unit_price = unit_price * 1.1 WHERE discontinued = FALSE;
- 示例:
DELETE
(删除行):DELETE FROM table_name [WHERE condition]; -- 非常重要:如果不加WHERE子句,会删除表中的所有行!(考虑使用TRUNCATE TABLE更快地删除所有行)
- 示例:
DELETE FROM orders WHERE order_date < '2023-01-01';
- 示例:
CREATE TABLE
(创建表):CREATE TABLE table_name ( column1 datatype [constraints], column2 datatype [constraints], ... [table_constraints] );
- 常用约束 (Constraints):
PRIMARY KEY
: 主键(唯一标识每行)。FOREIGN KEY
: 外键(引用另一表的主键)。NOT NULL
: 该列不允许NULL值。UNIQUE
: 该列(或列组合)的值必须唯一。CHECK
: 定义列值必须满足的条件。DEFAULT
: 为列指定默认值。
- 示例:
CREATE TABLE employees (emp_id INT PRIMARY KEY, name VARCHAR(100) NOT NULL, dept_id INT, hire_date DATE, FOREIGN KEY (dept_id) REFERENCES departments(dept_id));
- 常用约束 (Constraints):
总结关键点:
- 以关键字开头 (
SELECT
,INSERT
,UPDATE
,DELETE
,CREATE
, etc.) - 使用子句 (
FROM
,WHERE
,GROUP BY
,HAVING
,ORDER BY
,JOIN
,SET
,VALUES
,INTO
) 来指定细节。 - 在子句中使用表达式(列、值、运算符、函数)进行计算和条件判断。
- 正确引用包含特殊字符或保留字的标识符。
- 合理使用注释解释代码。
- 注意大小写惯例(关键字大写,标识符小写蛇形)。
- 通常用分号
;
结束语句(尤其在多语句环境)。 WHERE
子句在UPDATE
和DELETE
中极其重要,防止意外修改或删除所有数据!