常用经典 SQL 语句大全完整版–详解+实例

SQL 语言分类

SQL(Structured Query Language)是用于管理关系型数据库的标准语言。它主要分为以下几类:

  • DDL (Data Definition Language) - 数据定义语言

    用于定义数据库结构,包括创建、修改和删除数据库对象(如数据库、表、索引、视图等)。

    • 常用语句:CREATEALTERDROPDECLARE
  • DML (Data Manipulation Language) - 数据操纵语言

    用于管理数据库中的数据,包括查询、插入、更新和删除数据。

    • 常用语句:SELECTINSERTUPDATEDELETE
  • DCL (Data Control Language) - 数据控制语言

    用于管理数据库用户的访问权限,以及控制事务的提交与回滚。

    • 常用语句:GRANTREVOKECOMMITROLLBACK

1. 数据库管理

1.1 创建和删除数据库

  • 创建数据库

    定义一个新的数据库。

    sql 复制代码
    CREATE DATABASE database_name;
    
    AI写代码sql
    1

    示例 :创建一个名为 CompanyDB 的数据库。

    sql 复制代码
    CREATE DATABASE CompanyDB;
    
    AI写代码sql
    1
  • 删除数据库

    永久移除一个数据库及其所有内容。请谨慎操作,此操作不可逆。

    sql 复制代码
    DROP DATABASE dbname;
    
    AI写代码sql
    1

    示例 :删除名为 OldCompanyDB 的数据库。

    sql 复制代码
    DROP DATABASE OldCompanyDB;
    
    AI写代码sql
    1

1.2 数据库备份与恢复 (以 SQL Server 为例)

数据库备份是保证数据安全的重要环节。

  • 创建备份设备

    在SQL Server中,首先需要指定备份文件的存储位置和名称。

    sql 复制代码
    USE master;
    -- 'disk' 指定备份类型为磁盘文件
    -- 'testBack' 是备份设备名
    -- 'c:\mssql7backup\MyNwind_1.dat' 是备份文件的完整路径和文件名
    EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat';
    
    AI写代码sql
    12345
  • 执行备份

    使用 BACKUP DATABASE 命令将数据库备份到指定的设备。

    sql 复制代码
    -- 'pubs' 是要备份的数据库名
    BACKUP DATABASE pubs TO testBack;
    
    AI写代码sql
    12

    注意BACKUP DATABASE 语句支持更多选项,如 WITH DIFFERENTIAL (差异备份), WITH COMPRESSION (压缩备份) 等。


2. 表操作 (DDL)

2.1 创建新表

定义表的结构,包括列名、数据类型、约束等。

sql 复制代码
CREATE TABLE tabname (
    col1 type1 [CONSTRAINT constraint_name] PRIMARY KEY [AUTO_INCREMENT/IDENTITY(seed, increment)], -- 主键,可自增长
    col2 type2 [NOT NULL] [UNIQUE], -- 非空,唯一
    col3 type3 [DEFAULT default_value], -- 默认值
    col4 type4,
    ...
);

AI写代码sql
1234567

示例 :创建一个名为 Employees 的表。

sql 复制代码
CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY AUTO_INCREMENT, -- 员工ID,主键,自增长
    FirstName VARCHAR(50) NOT NULL,          -- 名,非空
    LastName VARCHAR(50) NOT NULL,           -- 姓,非空
    Email VARCHAR(100) UNIQUE,               -- 邮箱,唯一
    HireDate DATE DEFAULT GETDATE(),         -- 入职日期,默认为当前日期
    Salary DECIMAL(10, 2)                    -- 工资
);

AI写代码sql
12345678
  • 说明

    • INT, VARCHAR, DATE, DECIMAL 是常见的数据类型。
    • PRIMARY KEY 指定主键,用于唯一标识行。AUTO_INCREMENT (MySQL) 或 IDENTITY (SQL Server) 可实现自增长。
    • NOT NULL 约束确保列必须有值。
    • UNIQUE 约束确保列中的所有值都是唯一的。
    • DEFAULT 指定列的默认值。

2.2 根据现有表创建表

有两种方式:复制表结构(不含数据)或复制表结构及数据。

  • 复制表结构 (不含数据)

    此方法仅复制表的定义。

    sql 复制代码
    -- SQL Server 语法
    SELECT * INTO new_table FROM old_table WHERE 1 = 0; -- 1=0 确保不复制任何数据
    
    -- MySQL/PostgreSQL 语法
    CREATE TABLE new_table LIKE old_table;
    
    AI写代码sql
    12345
  • 复制表结构和数据

    将查询结果插入到新表中。

    sql 复制代码
    CREATE TABLE tab_new AS SELECT col1, col2, ... FROM tab_old WHERE condition;
    
    AI写代码sql
    1

    示例 :复制 Employees 表的结构和部分数据到 EmployeeBackup 表。

    sql 复制代码
    CREATE TABLE EmployeeBackup AS
    SELECT EmployeeID, FirstName, LastName, Salary
    FROM Employees
    WHERE HireDate < '2023-01-01';
    
    AI写代码sql
    1234

2.3 删除表

永久删除一个表及其所有数据。

sql 复制代码
DROP TABLE tabname;

AI写代码sql
1

示例 :删除 EmployeeBackup 表。

sql 复制代码
DROP TABLE EmployeeBackup;

AI写代码sql
1

2.4 修改表结构 (ALTER TABLE)

  • 增加列

    向现有表中添加新列。

    sql 复制代码
    ALTER TABLE tabname ADD column_name type [CONSTRAINT constraint_name] [DEFAULT default_value];
    
    AI写代码sql
    1

    示例 :为 Employees 表添加 Department 列。

    sql 复制代码
    ALTER TABLE Employees ADD Department VARCHAR(50);
    
    AI写代码sql
    1
  • 删除列

    从表中移除一列。

    sql 复制代码
    ALTER TABLE tabname DROP COLUMN column_name; -- 标准SQL
    -- 或 SQL Server: ALTER TABLE tabname DROP column_name;
    
    AI写代码sql
    12

    示例 :移除 Employees 表的 Email 列。

    sql 复制代码
    ALTER TABLE Employees DROP COLUMN Email;
    
    AI写代码sql
    1
  • 修改列属性

    更改列的数据类型、约束等。具体语法因数据库系统而异。
    示例 (MySQL) :修改 Employees 表的 Department 列为 VARCHAR(100)

    sql 复制代码
    ALTER TABLE Employees MODIFY COLUMN Department VARCHAR(100);
    
    AI写代码sql
    1

    示例 (SQL Server) :修改 Employees 表的 Department 列为 VARCHAR(100)

    sql 复制代码
    ALTER TABLE Employees ALTER COLUMN Department VARCHAR(100);
    
    AI写代码sql
    1
  • 添加和删除主键

    为表添加或移除主键约束。

    sql 复制代码
    -- 添加主键
    ALTER TABLE tabname ADD CONSTRAINT pk_tabname PRIMARY KEY (col1, col2); -- 允许复合主键
    
    -- 删除主键 (SQL Server/Oracle)
    ALTER TABLE tabname DROP CONSTRAINT pk_tabname;
    -- 删除主键 (MySQL)
    ALTER TABLE tabname DROP PRIMARY KEY;
    
    AI写代码sql
    1234567

    示例 :为 Orders 表添加主键。

    sql 复制代码
    ALTER TABLE Orders ADD CONSTRAINT pk_Orders PRIMARY KEY (OrderID);
    
    AI写代码sql
    1

2.5 创建和删除索引

索引可以显著提高 SELECT 查询的速度,但会增加 INSERT, UPDATE, DELETE 操作的开销。

  • 创建索引

    为表的一列或多列创建索引。UNIQUE 关键字表示该索引列的值必须唯一。

    sql 复制代码
    CREATE [UNIQUE] INDEX idxname ON tabname (col1 [ASC|DESC], col2 [ASC|DESC], ...);
    
    AI写代码sql
    1

    示例 :为 Employees 表的 LastName 列创建索引。

    sql 复制代码
    CREATE INDEX idx_lastname ON Employees (LastName);
    
    AI写代码sql
    1

    示例 :为 Employees 表的 FirstNameLastName 创建复合唯一索引。

    sql 复制代码
    CREATE UNIQUE INDEX idx_fullname ON Employees (FirstName, LastName);
    
    AI写代码sql
    1
  • 删除索引

    移除已有的索引。

    sql 复制代码
    DROP INDEX idxname ON tabname; -- 标准SQL (有些数据库系统不支持ON tabname)
    -- 或 SQL Server: DROP INDEX idxname FROM tabname;
    -- 或 MySQL: DROP INDEX idxname ON tabname;
    
    AI写代码sql
    123

    示例 :删除 Employees 表的 idx_lastname 索引。

    sql 复制代码
    DROP INDEX idx_lastname ON Employees;
    
    AI写代码sql
    1

3. 视图操作 (DDL/DML)

视图(View)是一个虚拟表,它基于一个 SQL 查询语句的结果集。视图不存储实际数据,但可以像表一样被查询。

3.1 创建视图

sql 复制代码
CREATE VIEW viewname AS
SELECT column1, column2, ...
FROM tablename
WHERE condition;

AI写代码sql
1234

示例:创建一个视图,显示所有部门为 'Sales' 的员工姓名和入职日期。

sql 复制代码
CREATE VIEW SalesEmployees AS
SELECT FirstName, LastName, HireDate
FROM Employees
WHERE Department = 'Sales';

AI写代码sql
1234

3.2 删除视图

sql 复制代码
DROP VIEW viewname;

AI写代码sql
1

示例 :删除 SalesEmployees 视图。

sql 复制代码
DROP VIEW SalesEmployees;

AI写代码sql
1

4. 基本数据操作 (DML)

4.1 选择数据 (SELECT)

查询数据库中的数据。

  • 选择所有列

    使用 * 选择表中的所有列。

    sql 复制代码
    SELECT * FROM table1;
    
    AI写代码sql
    1
  • 选择特定列

    指定需要显示的列名。

    sql 复制代码
    SELECT column1, column2, ... FROM table1;
    
    AI写代码sql
    1
  • 带条件查询 (WHERE)

    使用 WHERE 子句过滤满足特定条件的记录。

    sql 复制代码
    SELECT * FROM table1 WHERE condition;
    
    AI写代码sql
    1

    条件操作符=, != / <>, >, <, >=, <=, BETWEEN, LIKE, IN, IS NULL, IS NOT NULL
    逻辑操作符AND, OR, NOT

    示例 :查询 Employees 表中工资高于 50000 的员工。

    sql 复制代码
    SELECT EmployeeID, FirstName, LastName, Salary
    FROM Employees
    WHERE Salary > 50000;
    
    AI写代码sql
    123

    示例 :查询 Employees 表中姓氏为 'Smith' 且入职日期在 2022 年后的员工。

    sql 复制代码
    SELECT FirstName, LastName, HireDate
    FROM Employees
    WHERE LastName = 'Smith' AND HireDate > '2022-01-01';
    
    AI写代码sql
    123
  • 排序 (ORDER BY)

    对查询结果进行升序 (ASC) 或降序 (DESC) 排序。

    sql 复制代码
    SELECT column1, column2 FROM table1 ORDER BY column1 [ASC|DESC], column2 [ASC|DESC];
    
    AI写代码sql
    1

    示例:按工资降序排列所有员工信息。

    sql 复制代码
    SELECT * FROM Employees ORDER BY Salary DESC;
    
    AI写代码sql
    1
  • 分组 (GROUP BY) 与聚合函数

    将数据按某一列或多列分组,并对每组数据进行聚合计算。
    常用聚合函数

    • COUNT(*) / COUNT(column): 计数
    • SUM(column): 求和
    • AVG(column): 求平均值
    • MAX(column): 求最大值
    • MIN(column): 求最小值
    sql 复制代码
    SELECT column1, COUNT(*) AS total_count, SUM(column2) AS total_sum
    FROM table1
    WHERE condition
    GROUP BY column1
    HAVING COUNT(*) > 10 -- 对分组后的结果进行过滤
    ORDER BY column1;
    
    AI写代码sql
    123456

    示例:计算每个部门的员工人数和平均工资。

    sql 复制代码
    SELECT Department, COUNT(*) AS EmployeeCount, AVG(Salary) AS AverageSalary
    FROM Employees
    GROUP BY Department;
    
    AI写代码sql
    123

4.2 插入数据 (INSERT)

向表中添加新记录。

  • 插入所有列的值

    值的顺序必须与表中列的顺序一致。

    sql 复制代码
    INSERT INTO table1 VALUES (value1, value2, ...);
    
    AI写代码sql
    1
  • 插入指定列的值

    指定列名,可以不按顺序,或只插入部分列。

    sql 复制代码
    INSERT INTO table1 (field1, field2, field3) VALUES (value1, value2, value3);
    
    AI写代码sql
    1
  • 插入查询结果

    将另一个 SELECT 语句的结果插入到表中。

    sql 复制代码
    INSERT INTO table1 (field1, field2)
    SELECT column1, column2 FROM another_table WHERE condition;
    
    AI写代码sql
    12

示例:插入一条新员工记录。

sql 复制代码
INSERT INTO Employees (FirstName, LastName, Email, HireDate, Salary, Department)
VALUES ('Alice', 'Wonderland', 'alice@example.com', '2023-10-01', 60000.00, 'Marketing');

AI写代码sql
12

示例:将现有员工的部门信息复制到新员工表中。

sql 复制代码
INSERT INTO EmployeeBackup (EmployeeID, FirstName, LastName, Salary)
SELECT EmployeeID, FirstName, LastName, Salary
FROM Employees
WHERE Department = 'Sales' AND Salary > 70000;

AI写代码sql
1234

4.3 删除数据 (DELETE)

移除表中的记录。

sql 复制代码
DELETE FROM table1 WHERE condition;

AI写代码sql
1
  • 重要 :如果 WHERE 子句被省略,将删除表中的所有记录。

示例 :删除 Employees 表中工资低于 40000 的所有员工。

sql 复制代码
DELETE FROM Employees
WHERE Salary < 40000;

AI写代码sql
12

示例:删除所有部门为 'Temporary' 的员工。

sql 复制代码
DELETE FROM Employees
WHERE Department = 'Temporary';

AI写代码sql
12

4.4 更新数据 (UPDATE)

修改表中现有记录的字段值。

sql 复制代码
UPDATE table1 SET field1 = value1, field2 = value2, ... WHERE condition;

AI写代码sql
1
  • 重要 :如果 WHERE 子句被省略,将更新表中所有记录。

示例:将员工ID为 101 的员工的工资提高 10%。

ini 复制代码
UPDATE Employees
SET Salary = Salary * 1.10
WHERE EmployeeID = 101;

AI写代码sql
123

示例:将所有部门为 'IT' 的员工的部门改为 'Technology'。

ini 复制代码
UPDATE Employees
SET Department = 'Technology'
WHERE Department = 'IT';

AI写代码sql
123

5. 高级查询与连接

5.1 集合运算符

用于合并多个 SELECT 语句的结果集。

  • UNION:合并结果集,并自动去除重复的行。
  • UNION ALL:合并结果集,保留所有行(包括重复行)。
  • EXCEPT (或 MINUS in Oracle):返回第一个 SELECT 语句的结果集,但不包含第二个 SELECT 语句结果集中的行。
  • INTERSECT :返回两个 SELECT 语句结果集中都存在的行。

要求 :参与集合运算的 SELECT 语句必须具有相同数量的列,且对应列的数据类型兼容。

示例:获取所有男性员工的姓名和所有女性员工的姓名(合并且去重)。

sql 复制代码
SELECT FirstName, LastName FROM Employees WHERE Gender = 'Male'
UNION
SELECT FirstName, LastName FROM Employees WHERE Gender = 'Female';

AI写代码sql
123

5.2 连接 (JOIN)

将来自两个或多个表的记录组合起来,基于它们之间的关联列。

  • INNER JOIN (内连接)

    返回两个表中连接列的值匹配的行。这是默认的连接类型(如果只写 JOIN)。

    sql 复制代码
    SELECT t1.col1, t2.col2
    FROM table1 t1
    INNER JOIN table2 t2 ON t1.common_column = t2.common_column;
    
    AI写代码sql
    123
  • LEFT JOIN (左外连接)

    返回左表(table1)的所有行,以及右表(table2)中匹配的行。如果右表中没有匹配项,则右表列显示为 NULL

    sql 复制代码
    SELECT t1.col1, t2.col2
    FROM table1 t1
    LEFT JOIN table2 t2 ON t1.common_column = t2.common_column;
    
    AI写代码sql
    123
  • RIGHT JOIN (右外连接)

    返回右表(table2)的所有行,以及左表(table1)中匹配的行。如果左表中没有匹配项,则左表列显示为 NULL

    sql 复制代码
    SELECT t1.col1, t2.col2
    FROM table1 t1
    RIGHT JOIN table2 t2 ON t1.common_column = t2.common_column;
    
    AI写代码sql
    123
  • FULL OUTER JOIN (全外连接)

    返回左表和右表中所有不匹配的行,以及匹配的行。如果某侧没有匹配,则该侧列显示为 NULL

    sql 复制代码
    SELECT t1.col1, t2.col2
    FROM table1 t1
    FULL OUTER JOIN table2 t2 ON t1.common_column = t2.common_column;
    
    AI写代码sql
    123

    注意FULL OUTER JOIN 在 MySQL 中不受支持,可使用 LEFT JOINRIGHT JOINUNION 来模拟。

示例 :查询所有员工及其所在的部门名称。假设 Employees 表有 DepartmentID 列,Departments 表有 DepartmentIDDepartmentName 列。

sql 复制代码
SELECT
    e.FirstName,
    e.LastName,
    d.DepartmentName
FROM Employees e
LEFT JOIN Departments d ON e.DepartmentID = d.DepartmentID;

AI写代码sql
123456

示例:查询没有分配部门的员工。

sql 复制代码
SELECT e.FirstName, e.LastName
FROM Employees e
LEFT JOIN Departments d ON e.DepartmentID = d.DepartmentID
WHERE d.DepartmentID IS NULL; -- 或者 WHERE d.DepartmentName IS NULL

AI写代码sql
1234

5.3 统计与聚合查询

如前文 GROUP BY 部分所述,聚合函数用于对一组行进行计算。

  • 总数

    sql 复制代码
    SELECT COUNT(*) AS total_records FROM your_table;
    
    AI写代码sql
    1

    示例 :统计 Employees 表的总记录数。

    sql 复制代码
    SELECT COUNT(*) AS TotalEmployees FROM Employees;
    
    AI写代码sql
    1
  • 求和

    sql 复制代码
    SELECT SUM(numeric_column) AS total_sum FROM your_table;
    
    AI写代码sql
    1

    示例 :计算 Employees 表的总工资。

    sql 复制代码
    SELECT SUM(Salary) AS TotalPayroll FROM Employees;
    
    AI写代码sql
    1
  • 平均值

    sql 复制代码
    SELECT AVG(numeric_column) AS average_value FROM your_table;
    
    AI写代码sql
    1

    示例 :计算 Employees 表的平均工资。

    sql 复制代码
    SELECT AVG(Salary) AS AverageSalary FROM Employees;
    
    AI写代码sql
    1
  • 最大值

    sql 复制代码
    SELECT MAX(column) AS max_value FROM your_table;
    
    AI写代码sql
    1

    示例 :查找 Employees 表中最高工资。

    sql 复制代码
    SELECT MAX(Salary) AS HighestSalary FROM Employees;
    
    AI写代码sql
    1
  • 最小值

    sql 复制代码
    SELECT MIN(column) AS min_value FROM your_table;
    
    AI写代码sql
    1

    示例 :查找 Employees 表中最低工资。

    sql 复制代码
    SELECT MIN(Salary) AS LowestSalary FROM Employees;
    
    AI写代码sql
    1

6. 子查询与表复制

6.1 子查询 (Subquery)

子查询是在 WHERE, FROM, SELECT 子句中嵌套的查询语句,用于返回数据供外部查询使用。

  • WHERE 子句中使用子查询

    通常与 IN, NOT IN, =, !=, >, <, ANY, ALL 等操作符结合使用。

    sql 复制代码
    -- 查找工资高于平均工资的员工
    SELECT FirstName, LastName, Salary
    FROM Employees
    WHERE Salary > (SELECT AVG(Salary) FROM Employees);
    
    -- 查找在'Sales'部门工作的员工(假设DepartmentID是Sales的ID)
    SELECT FirstName, LastName
    FROM Employees
    WHERE DepartmentID IN (SELECT DepartmentID FROM Departments WHERE DepartmentName = 'Sales');
    
    AI写代码sql
    123456789
  • FROM 子句中使用子查询 (派生表)

    子查询的结果集可以作为一个临时表(派生表)被外部查询使用。

    sql 复制代码
    SELECT *
    FROM (SELECT EmployeeID, FirstName, LastName FROM Employees WHERE Salary > 50000) AS HighSalaryEmployees;
    
    AI写代码sql
    12
  • SELECT 子句中使用子查询 (标量子查询)

    子查询返回单个值,用于为外部查询的每一行提供一个计算值。

    sql 复制代码
    SELECT
        e.FirstName,
        e.LastName,
        e.Salary,
        (SELECT AVG(Salary) FROM Employees) AS GlobalAverageSalary -- 显示全局平均工资
    FROM Employees e;
    
    AI写代码sql
    123456

6.2 复制表结构与数据

  • 复制表结构 (不含数据)

    创建与源表结构相同但为空的新表。

    sql 复制代码
    -- SQL Server 语法
    SELECT * INTO new_table FROM old_table WHERE 1=0;
    
    -- MySQL/PostgreSQL 语法
    CREATE TABLE new_table LIKE old_table;
    
    AI写代码sql
    12345
  • 复制数据 (插入)

    将源表中选定的数据插入到目标表中(目标表需已存在或与源表结构一致)。

    sql 复制代码
    INSERT INTO b (col1, col2, col3)
    SELECT d, e, f FROM a WHERE condition;
    
    AI写代码sql
    12

    示例 :将2023年入职的员工数据复制到 EmployeeArchive 表。

    sql 复制代码
    INSERT INTO EmployeeArchive (EmployeeID, FirstName, LastName, HireDate)
    SELECT EmployeeID, FirstName, LastName, HireDate
    FROM Employees
    WHERE YEAR(HireDate) = 2023;
    
    AI写代码sql
    1234

7. 随机数据处理与重复数据处理

7.1 随机选择记录

从表中随机抽取一定数量的记录。不同数据库系统语法略有差异。

  • SQL Server

    使用 ORDER BY NEWID()

    scss 复制代码
    SELECT TOP 10 * FROM tablename ORDER BY NEWID();
    
    AI写代码sql
    1
  • MySQL

    使用 ORDER BY RAND()

    sql 复制代码
    SELECT * FROM tablename ORDER BY RAND() LIMIT 10;
    
    AI写代码sql
    1
  • PostgreSQL

    使用 ORDER BY RANDOM()

    sql 复制代码
    SELECT * FROM tablename ORDER BY RANDOM() LIMIT 10;
    
    AI写代码sql
    1

7.2 删除重复记录

识别并保留每组重复记录中的一条(通常是ID最大或最小的),删除其余的。

  • 通用方法 (使用ROW_NUMBER或MAX/MIN ID)

    假设 id 是自增主键,col1, col2 是用于判断重复的列。

    sql 复制代码
    -- 方法一:使用 ROW_NUMBER() (SQL Server, PostgreSQL, Oracle)
    WITH CTE AS (
        SELECT
            id,
            col1,
            col2,
            ROW_NUMBER() OVER(PARTITION BY col1, col2 ORDER BY id DESC) as rn
        FROM tablename
    )
    DELETE FROM tablename
    WHERE id IN (SELECT id FROM CTE WHERE rn > 1);
    
    -- 方法二:使用 MAX/MIN ID (兼容性更广)
    -- 删除除最大ID之外的所有重复记录
    DELETE FROM tablename
    WHERE id NOT IN (SELECT MAX(id) FROM tablename GROUP BY col1, col2, ...);
    
    AI写代码sql
    12345678910111213141516

    示例 :删除 Products 表中 ProductNameCategory 重复的记录,保留 ProductID 最大的那条。

    sql 复制代码
    DELETE FROM Products
    WHERE ProductID NOT IN (
        SELECT MAX(ProductID)
        FROM Products
        GROUP BY ProductName, Category
    );
    
    AI写代码sql
    123456

8. 数据库和表信息查询

用于查看数据库的元数据(关于数据的数据)。

  • 列出数据库中的所有用户表

    不同数据库系统语法不同。

    sql 复制代码
    -- SQL Server
    SELECT name FROM sysobjects WHERE type = 'U'; -- U 代表用户表
    
    -- MySQL
    SHOW TABLES;
    
    -- PostgreSQL
    SELECT tablename FROM pg_tables WHERE schemaname = 'public'; -- 'public' 是默认模式
    
    AI写代码sql
    12345678
  • 列出指定表的列信息

    查看表的列名、数据类型、是否可空等。

    sql 复制代码
    -- SQL Server
    SELECT name FROM syscolumns WHERE id = OBJECT_ID('TableName');
    
    -- MySQL
    SHOW COLUMNS FROM TableName;
    -- 或
    DESCRIBE TableName;
    
    -- PostgreSQL
    SELECT column_name, data_type, is_nullable
    FROM information_schema.columns
    WHERE table_name = 'TableName';
    
    AI写代码sql
    123456789101112

    示例 :查看 Employees 表的列信息 (MySQL 语法)。

    sql 复制代码
    DESCRIBE Employees;
    
    AI写代码sql
    1

9. 事务管理 (DCL)

事务是一组数据库操作的逻辑单元。事务要么全部成功执行,要么全部不执行,以保证数据的一致性和完整性。

9.1 事务控制语句

  • BEGIN TRANSACTION / START TRANSACTION

    标记事务的开始。

    sql 复制代码
    BEGIN TRANSACTION;
    -- 或 START TRANSACTION;
    
    AI写代码sql
    12
  • ROLLBACK

    回滚事务,撤销自 BEGIN TRANSACTION 以来的所有修改。

    sql 复制代码
    ROLLBACK;
    
    AI写代码sql
    1
  • COMMIT

    提交事务,将所有修改永久保存到数据库。

    sql 复制代码
    COMMIT;
    
    AI写代码sql
    1

9.2 事务管理示例

一个典型的转账场景:从账户A扣款,给账户B加款。

sql 复制代码
BEGIN TRANSACTION;

-- 1. 从账户 A 扣除 100 元
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;

-- 2. 检查扣款操作是否成功 (SQL Server 的 @@ERROR, 其他数据库可能有类似机制或异常处理)
IF @@ERROR <> 0
BEGIN
    -- 如果发生错误,回滚事务
    ROLLBACK TRANSACTION;
    PRINT 'Error: Failed to debit account 1. Transaction rolled back.';
END
ELSE
BEGIN
    -- 3. 给账户 B 增加 100 元
    UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;

    -- 4. 检查加款操作是否成功
    IF @@ERROR <> 0
    BEGIN
        -- 如果发生错误,回滚事务
        ROLLBACK TRANSACTION;
        PRINT 'Error: Failed to credit account 2. Transaction rolled back.';
    END
    ELSE
    BEGIN
        -- 5. 如果所有操作都成功,提交事务
        COMMIT TRANSACTION;
        PRINT 'Transaction completed successfully. Balances updated.';
    END
END

AI写代码sql
12345678910111213141516171819202122232425262728293031

说明

  • BEGIN TRANSACTION; 开启一个事务。
  • UPDATE 语句执行实际的数据修改。
  • IF @@ERROR <> 0 (SQL Server 语法) 用于检测上一条SQL语句是否执行出错。在其他数据库中,您可能需要使用 TRY...CATCH 块或检查事务的状态。
  • ROLLBACK; 用于撤销所有未提交的更改。
  • COMMIT; 用于使所有更改永久生效。

通过掌握这些SQL语句,您将能够高效、准确地进行数据库管理和数据操作,确保数据操作的完整性和安全性。

相关推荐
用户8356290780512 分钟前
使用 Python 设置 Excel 页眉和页脚
后端·python
步行cgn5 分钟前
IoC 控制反转:从概念到 Spring 的实现
后端
爱勇宝20 分钟前
没有 Fn 键关触控板?我做了一个双击即用的 Windows 小工具
前端·后端·程序员
沙湖遇雨1 小时前
8.ByteBuf 的数据模型、生命周期和内存分配
后端
by组态1 小时前
Ricon组态系统API参考手册
前端·后端·物联网
再吃一根胡萝卜1 小时前
Agent 如何选择与生成 SQL —— Text2SQL 全链路详解
后端
苍何1 小时前
把操作流程直接录成 Skill,豆包太夯了!
后端
Go_error2 小时前
在 Go 服务层中如何优雅地管理事务?
后端·go