SQL通用语法详解

发布于:2025-07-08 ⋅ 阅读:(15) ⋅ 点赞:(0)

SQL(Structured Query Language)语句的通用语法遵循一些核心结构和规则,尽管具体的实现(如MySQL、PostgreSQL、SQL Server、Oracle)可能在数据类型、函数名称或某些高级特性上有所不同。以下是SQL语句的通用语法概述:

核心组成部分:

  1. 语句类型 (Statement Type):

    • 每个SQL操作都以一个关键字开头,表明要执行的操作类型。最常见的包括:
      • SELECT: 查询数据
      • INSERT: 插入新数据
      • UPDATE: 修改现有数据
      • DELETE: 删除数据
      • CREATE: 创建数据库对象(如表、视图、索引)
      • ALTER: 修改数据库对象结构
      • DROP: 删除数据库对象
      • TRUNCATE: 快速删除表中所有数据
      • GRANT / REVOKE: 管理权限
      • BEGIN / COMMIT / ROLLBACK: 事务控制
  2. 子句 (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) 指定要插入数据的表。
  3. 表达式 (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 ...)
  4. 标识符 (Identifiers):

    • 用于命名数据库对象(表、列、视图、索引等),如 customers, order_id
    • 如果标识符包含空格、特殊字符或是保留字,通常需要用引号括起来(具体引号类型因数据库而异:MySQL用反引号`,SQL Server用方括号[],标准SQL和PostgreSQL用双引号"")。例如:`order date`, [order date], "order date"
  5. 注释 (Comments):

    • 用于解释代码,不会被执行。有两种主要方式:
      • 单行注释: -- 这是一个单行注释# 这也是单行注释(MySQL特有)
      • 多行注释: /* 这是一个 多行注释 */

通用语法规则:

  1. 不区分大小写(通常): 关键字(SELECT, FROM, WHERE)、函数名和大多数标识符在SQL中通常不区分大小写SELECT等同于selectSeLeCt但是

    • 字符串字面量是区分大小写的:'Apple' 不等于 'apple'
    • 数据库在存储标识符时可能有默认的大小写敏感性(取决于数据库配置和操作系统)。
    • 最佳实践: 为了可读性和一致性,习惯上将关键字大写标识符使用小写或蛇形命名法snake_case),例如:SELECT customer_name FROM orders WHERE total_amount > 100;
  2. 空格和换行: SQL解释器会忽略语句中多余的空格、制表符和换行符。这些主要用于格式化代码以提高可读性。

  3. 分号结尾(通常): 在大多数数据库系统和客户端工具中,分号;用于分隔多个SQL语句,表示一个语句的结束。尤其是在命令行客户端或脚本中,分号通常是必需的。在图形界面工具或某些编程接口中,有时可以省略。

主要语句结构示例:

  1. 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;
  2. 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');
  3. 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;
  4. DELETE (删除行):

    DELETE FROM table_name
    [WHERE condition];
    -- 非常重要:如果不加WHERE子句,会删除表中的所有行!(考虑使用TRUNCATE TABLE更快地删除所有行)
    
    • 示例: DELETE FROM orders WHERE order_date < '2023-01-01';
  5. 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));

总结关键点:

  • 以关键字开头 (SELECT, INSERT, UPDATE, DELETE, CREATE, etc.)
  • 使用子句 (FROM, WHERE, GROUP BY, HAVING, ORDER BY, JOIN, SET, VALUES, INTO) 来指定细节。
  • 在子句中使用表达式(列、值、运算符、函数)进行计算和条件判断。
  • 正确引用包含特殊字符或保留字的标识符
  • 合理使用注释解释代码。
  • 注意大小写惯例(关键字大写,标识符小写蛇形)。
  • 通常用分号;结束语句(尤其在多语句环境)。
  • WHERE子句在UPDATEDELETE中极其重要,防止意外修改或删除所有数据!