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中极其重要,防止意外修改或删除所有数据!