常用经典 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语句,您将能够高效、准确地进行数据库管理和数据操作,确保数据操作的完整性和安全性。

相关推荐
雨中飘荡的记忆1 小时前
Spring Test详解
java·后端·spring
神奇小汤圆1 小时前
MQ生产者确认机制捕获到消息投递失败后如何重试?
后端
不思念一个荒废的名字1 小时前
【黑马JavaWeb+AI知识梳理】Web后端开发01 - 准备工作、部门管理、日志技术、多表关系、员工管理
后端
用户68545375977691 小时前
别再裸奔写Python了!类型注解+mypy让你代码健壮如钢铁侠
后端
用户68545375977691 小时前
为什么大厂都在升级Python 3.12?看完我连夜重构了代码
后端
Frank_zhou1 小时前
039_Netty网络编程服务端入门程序开发
后端
三姓码农张员外1 小时前
1、Elasticsearch快照迁移
后端
sin602 小时前
学习笔记:异常,泛型,集合(代码示例,企业面试题,企业实际应用场景)
后端
小安同学iter2 小时前
天机学堂day05
java·开发语言·spring boot·分布式·后端·spring cloud·微服务