最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

常用經(jīng)典SQL語句大全完整版(附詳細講解+實例)

 更新時間:2026年04月19日 11:23:00   作者:weixin_pk138132  
這篇文章主要介紹了常用經(jīng)典SQL語句大全的相關資料,文中通過代碼詳細講解了SQL中最核心、使用最頻繁的語句,用于從數(shù)據(jù)表中查詢所需數(shù)據(jù),支持簡單查詢、條件查詢、排序、分頁等多種場景,需要的朋友可以參考下

SQL 語言分類

SQL(Structured Query Language)是用于管理關系型數(shù)據(jù)庫的標準語言。它主要分為以下幾類:

  • DDL (Data Definition Language) - 數(shù)據(jù)定義語言
    用于定義數(shù)據(jù)庫結(jié)構(gòu),包括創(chuàng)建、修改和刪除數(shù)據(jù)庫對象(如數(shù)據(jù)庫、表、索引、視圖等)。

    • 常用語句:CREATE,ALTER,DROP,DECLARE
  • DML (Data Manipulation Language) - 數(shù)據(jù)操縱語言
    用于管理數(shù)據(jù)庫中的數(shù)據(jù),包括查詢、插入、更新和刪除數(shù)據(jù)。

    • 常用語句:SELECT,INSERT,UPDATEDELETE
  • DCL (Data Control Language) - 數(shù)據(jù)控制語言
    用于管理數(shù)據(jù)庫用戶的訪問權(quán)限,以及控制事務的提交與回滾。

    • 常用語句:GRANT,REVOKE,COMMIT,ROLLBACK

1. 數(shù)據(jù)庫管理

1.1 創(chuàng)建和刪除數(shù)據(jù)庫

  • 創(chuàng)建數(shù)據(jù)庫
    定義一個新的數(shù)據(jù)庫。

    CREATE DATABASE database_name;

    示例:創(chuàng)建一個名為 CompanyDB 的數(shù)據(jù)庫。

    CREATE DATABASE CompanyDB;
  • 刪除數(shù)據(jù)庫
    永久移除一個數(shù)據(jù)庫及其所有內(nèi)容。請謹慎操作,此操作不可逆。

    DROP DATABASE dbname;

    示例:刪除名為 OldCompanyDB 的數(shù)據(jù)庫。

    DROP DATABASE OldCompanyDB;

1.2 數(shù)據(jù)庫備份與恢復 (以 SQL Server 為例)

數(shù)據(jù)庫備份是保證數(shù)據(jù)安全的重要環(huán)節(jié)。

  • 創(chuàng)建備份設備
    在SQL Server中,首先需要指定備份文件的存儲位置和名稱。

    USE master;
    -- 'disk' 指定備份類型為磁盤文件
    -- 'testBack' 是備份設備名
    -- 'c:\mssql7backup\MyNwind_1.dat' 是備份文件的完整路徑和文件名
    EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat';
  • 執(zhí)行備份
    使用 BACKUP DATABASE 命令將數(shù)據(jù)庫備份到指定的設備。

    -- 'pubs' 是要備份的數(shù)據(jù)庫名
    BACKUP DATABASE pubs TO testBack;

    注意BACKUP DATABASE 語句支持更多選項,如 WITH DIFFERENTIAL (差異備份), WITH COMPRESSION (壓縮備份) 等。

2. 表操作 (DDL)

2.1 創(chuàng)建新表

定義表的結(jié)構(gòu),包括列名、數(shù)據(jù)類型、約束等。

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,
    ...
);

示例:創(chuàng)建一個名為 Employees 的表。

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)                    -- 工資
);
  • 說明
    • INT, VARCHAR, DATE, DECIMAL 是常見的數(shù)據(jù)類型。
    • PRIMARY KEY 指定主鍵,用于唯一標識行。AUTO_INCREMENT (MySQL) 或 IDENTITY (SQL Server) 可實現(xiàn)自增長。
    • NOT NULL 約束確保列必須有值。
    • UNIQUE 約束確保列中的所有值都是唯一的。
    • DEFAULT 指定列的默認值。

2.2 根據(jù)現(xiàn)有表創(chuàng)建表

有兩種方式:復制表結(jié)構(gòu)(不含數(shù)據(jù))或復制表結(jié)構(gòu)及數(shù)據(jù)。

  • 復制表結(jié)構(gòu) (不含數(shù)據(jù))
    此方法僅復制表的定義。

    -- SQL Server 語法
    SELECT * INTO new_table FROM old_table WHERE 1 = 0; -- 1=0 確保不復制任何數(shù)據(jù)
    -- MySQL/PostgreSQL 語法
    CREATE TABLE new_table LIKE old_table;
  • 復制表結(jié)構(gòu)和數(shù)據(jù)
    將查詢結(jié)果插入到新表中。

    CREATE TABLE tab_new AS SELECT col1, col2, ... FROM tab_old WHERE condition;

    示例:復制 Employees 表的結(jié)構(gòu)和部分數(shù)據(jù)到 EmployeeBackup 表。

    CREATE TABLE EmployeeBackup AS
    SELECT EmployeeID, FirstName, LastName, Salary
    FROM Employees
    WHERE HireDate < '2023-01-01';

2.3 刪除表

永久刪除一個表及其所有數(shù)據(jù)。

DROP TABLE tabname;

示例:刪除 EmployeeBackup 表。

DROP TABLE EmployeeBackup;

2.4 修改表結(jié)構(gòu) (ALTER TABLE)

  • 增加列
    向現(xiàn)有表中添加新列。

    ALTER TABLE tabname ADD column_name type [CONSTRAINT constraint_name] [DEFAULT default_value];

    示例:為 Employees 表添加 Department 列。

    ALTER TABLE Employees ADD Department VARCHAR(50);
  • 刪除列
    從表中移除一列。

    ALTER TABLE tabname DROP COLUMN column_name; -- 標準SQL
    -- 或 SQL Server: ALTER TABLE tabname DROP column_name;

    示例:移除 Employees 表的 Email 列。

    ALTER TABLE Employees DROP COLUMN Email;
  • 修改列屬性
    更改列的數(shù)據(jù)類型、約束等。具體語法因數(shù)據(jù)庫系統(tǒng)而異。
    示例 (MySQL):修改 Employees 表的 Department 列為 VARCHAR(100)。

    ALTER TABLE Employees MODIFY COLUMN Department VARCHAR(100);

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

    ALTER TABLE Employees ALTER COLUMN Department VARCHAR(100);
  • 添加和刪除主鍵
    為表添加或移除主鍵約束。

    -- 添加主鍵
    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;

    示例:為 Orders 表添加主鍵。

    ALTER TABLE Orders ADD CONSTRAINT pk_Orders PRIMARY KEY (OrderID);

2.5 創(chuàng)建和刪除索引

索引可以顯著提高 SELECT 查詢的速度,但會增加 INSERT, UPDATE, DELETE 操作的開銷。

  • 創(chuàng)建索引
    為表的一列或多列創(chuàng)建索引。UNIQUE 關鍵字表示該索引列的值必須唯一。

    CREATE [UNIQUE] INDEX idxname ON tabname (col1 [ASC|DESC], col2 [ASC|DESC], ...);

    示例:為 Employees 表的 LastName 列創(chuàng)建索引。

    CREATE INDEX idx_lastname ON Employees (LastName);

    示例:為 Employees 表的 FirstNameLastName 創(chuàng)建復合唯一索引。

    CREATE UNIQUE INDEX idx_fullname ON Employees (FirstName, LastName);
  • 刪除索引
    移除已有的索引。

    DROP INDEX idxname ON tabname; -- 標準SQL (有些數(shù)據(jù)庫系統(tǒng)不支持ON tabname)
    -- 或 SQL Server: DROP INDEX idxname FROM tabname;
    -- 或 MySQL: DROP INDEX idxname ON tabname;

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

    DROP INDEX idx_lastname ON Employees;

3. 視圖操作 (DDL/DML)

視圖(View)是一個虛擬表,它基于一個 SQL 查詢語句的結(jié)果集。視圖不存儲實際數(shù)據(jù),但可以像表一樣被查詢。

3.1 創(chuàng)建視圖

CREATE VIEW viewname AS
SELECT column1, column2, ...
FROM tablename
WHERE condition;

示例:創(chuàng)建一個視圖,顯示所有部門為 ‘Sales’ 的員工姓名和入職日期。

CREATE VIEW SalesEmployees AS
SELECT FirstName, LastName, HireDate
FROM Employees
WHERE Department = 'Sales';

3.2 刪除視圖

DROP VIEW viewname;

示例:刪除 SalesEmployees 視圖。

DROP VIEW SalesEmployees;

4. 基本數(shù)據(jù)操作 (DML)

4.1 選擇數(shù)據(jù) (SELECT)

查詢數(shù)據(jù)庫中的數(shù)據(jù)。

  • 選擇所有列
    使用 * 選擇表中的所有列。

    SELECT * FROM table1;
  • 選擇特定列
    指定需要顯示的列名。

    SELECT column1, column2, ... FROM table1;
  • 帶條件查詢 (WHERE)
    使用 WHERE 子句過濾滿足特定條件的記錄。

    SELECT * FROM table1 WHERE condition;

    條件操作符=, != / <>, >, <, >=, <=, BETWEEN, LIKE, IN, IS NULL, IS NOT NULL。
    邏輯操作符AND, OR, NOT。

    示例:查詢 Employees 表中工資高于 50000 的員工。

    SELECT EmployeeID, FirstName, LastName, Salary
    FROM Employees
    WHERE Salary > 50000;

    示例:查詢 Employees 表中姓氏為 ‘Smith’ 且入職日期在 2022 年后的員工。

    SELECT FirstName, LastName, HireDate
    FROM Employees
    WHERE LastName = 'Smith' AND HireDate > '2022-01-01';
  • 排序 (ORDER BY)
    對查詢結(jié)果進行升序 (ASC) 或降序 (DESC) 排序。

    SELECT column1, column2 FROM table1 ORDER BY column1 [ASC|DESC], column2 [ASC|DESC];

    示例:按工資降序排列所有員工信息。

    SELECT * FROM Employees ORDER BY Salary DESC;
  • 分組 (GROUP BY) 與聚合函數(shù)
    將數(shù)據(jù)按某一列或多列分組,并對每組數(shù)據(jù)進行聚合計算。
    常用聚合函數(shù)

    • COUNT(*) / COUNT(column): 計數(shù)
    • SUM(column): 求和
    • AVG(column): 求平均值
    • MAX(column): 求最大值
    • MIN(column): 求最小值
    SELECT column1, COUNT(*) AS total_count, SUM(column2) AS total_sum
    FROM table1
    WHERE condition
    GROUP BY column1
    HAVING COUNT(*) > 10 -- 對分組后的結(jié)果進行過濾
    ORDER BY column1;

    示例:計算每個部門的員工人數(shù)和平均工資。

    SELECT Department, COUNT(*) AS EmployeeCount, AVG(Salary) AS AverageSalary
    FROM Employees
    GROUP BY Department;

4.2 插入數(shù)據(jù) (INSERT)

向表中添加新記錄。

  • 插入所有列的值
    值的順序必須與表中列的順序一致。

    INSERT INTO table1 VALUES (value1, value2, ...);
  • 插入指定列的值
    指定列名,可以不按順序,或只插入部分列。

    INSERT INTO table1 (field1, field2, field3) VALUES (value1, value2, value3);
  • 插入查詢結(jié)果
    將另一個 SELECT 語句的結(jié)果插入到表中。

    INSERT INTO table1 (field1, field2)
    SELECT column1, column2 FROM another_table WHERE condition;

示例:插入一條新員工記錄。

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

示例:將現(xiàn)有員工的部門信息復制到新員工表中。

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

4.3 刪除數(shù)據(jù) (DELETE)

移除表中的記錄。

DELETE FROM table1 WHERE condition;
  • 重要:如果 WHERE 子句被省略,將刪除表中的所有記錄。

示例:刪除 Employees 表中工資低于 40000 的所有員工。

DELETE FROM Employees
WHERE Salary < 40000;

示例:刪除所有部門為 ‘Temporary’ 的員工。

DELETE FROM Employees
WHERE Department = 'Temporary';

4.4 更新數(shù)據(jù) (UPDATE)

修改表中現(xiàn)有記錄的字段值。

UPDATE table1 SET field1 = value1, field2 = value2, ... WHERE condition;
  • 重要:如果 WHERE 子句被省略,將更新表中所有記錄。

示例:將員工ID為 101 的員工的工資提高 10%。

UPDATE Employees
SET Salary = Salary * 1.10
WHERE EmployeeID = 101;

示例:將所有部門為 ‘IT’ 的員工的部門改為 ‘Technology’。

UPDATE Employees
SET Department = 'Technology'
WHERE Department = 'IT';

5. 高級查詢與連接

5.1 集合運算符

用于合并多個 SELECT 語句的結(jié)果集。

  • UNION:合并結(jié)果集,并自動去除重復的行。
  • UNION ALL:合并結(jié)果集,保留所有行(包括重復行)。
  • EXCEPT (或 MINUS in Oracle):返回第一個 SELECT 語句的結(jié)果集,但不包含第二個 SELECT 語句結(jié)果集中的行。
  • INTERSECT:返回兩個 SELECT 語句結(jié)果集中都存在的行。

要求:參與集合運算的 SELECT 語句必須具有相同數(shù)量的列,且對應列的數(shù)據(jù)類型兼容。

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

SELECT FirstName, LastName FROM Employees WHERE Gender = 'Male'
UNION
SELECT FirstName, LastName FROM Employees WHERE Gender = 'Female';

5.2 連接 (JOIN)

將來自兩個或多個表的記錄組合起來,基于它們之間的關聯(lián)列。

  • INNER JOIN (內(nèi)連接)
    返回兩個表中連接列的值匹配的行。這是默認的連接類型(如果只寫 JOIN)。

    SELECT t1.col1, t2.col2
    FROM table1 t1
    INNER JOIN table2 t2 ON t1.common_column = t2.common_column;
  • LEFT JOIN (左外連接)
    返回左表(table1)的所有行,以及右表(table2)中匹配的行。如果右表中沒有匹配項,則右表列顯示為 NULL。

    SELECT t1.col1, t2.col2
    FROM table1 t1
    LEFT JOIN table2 t2 ON t1.common_column = t2.common_column;
  • RIGHT JOIN (右外連接)
    返回右表(table2)的所有行,以及左表(table1)中匹配的行。如果左表中沒有匹配項,則左表列顯示為 NULL。

    SELECT t1.col1, t2.col2
    FROM table1 t1
    RIGHT JOIN table2 t2 ON t1.common_column = t2.common_column;
  • FULL OUTER JOIN (全外連接)
    返回左表和右表中所有不匹配的行,以及匹配的行。如果某側(cè)沒有匹配,則該側(cè)列顯示為 NULL。

    SELECT t1.col1, t2.col2
    FROM table1 t1
    FULL OUTER JOIN table2 t2 ON t1.common_column = t2.common_column;

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

示例:查詢所有員工及其所在的部門名稱。假設 Employees 表有 DepartmentID 列,Departments 表有 DepartmentIDDepartmentName 列。

SELECT
    e.FirstName,
    e.LastName,
    d.DepartmentName
FROM Employees e
LEFT JOIN Departments d ON e.DepartmentID = d.DepartmentID;

示例:查詢沒有分配部門的員工。

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

5.3 統(tǒng)計與聚合查詢

如前文 GROUP BY 部分所述,聚合函數(shù)用于對一組行進行計算。

  • 總數(shù)

    SELECT COUNT(*) AS total_records FROM your_table;

    示例:統(tǒng)計 Employees 表的總記錄數(shù)。

    SELECT COUNT(*) AS TotalEmployees FROM Employees;
  • 求和

    SELECT SUM(numeric_column) AS total_sum FROM your_table;

    示例:計算 Employees 表的總工資。

    SELECT SUM(Salary) AS TotalPayroll FROM Employees;
  • 平均值

    SELECT AVG(numeric_column) AS average_value FROM your_table;

    示例:計算 Employees 表的平均工資。

    SELECT AVG(Salary) AS AverageSalary FROM Employees;
  • 最大值

    SELECT MAX(column) AS max_value FROM your_table;

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

    SELECT MAX(Salary) AS HighestSalary FROM Employees;
  • 最小值

    SELECT MIN(column) AS min_value FROM your_table;

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

    SELECT MIN(Salary) AS LowestSalary FROM Employees;

6. 子查詢與表復制

6.1 子查詢 (Subquery)

子查詢是在 WHERE, FROM, SELECT 子句中嵌套的查詢語句,用于返回數(shù)據(jù)供外部查詢使用。

  • 在 WHERE 子句中使用子查詢
    通常與 IN, NOT IN, =, !=, >, <, ANY, ALL 等操作符結(jié)合使用。

    -- 查找工資高于平均工資的員工
    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');
  • 在 FROM 子句中使用子查詢 (派生表)
    子查詢的結(jié)果集可以作為一個臨時表(派生表)被外部查詢使用。

    SELECT *
    FROM (SELECT EmployeeID, FirstName, LastName FROM Employees WHERE Salary > 50000) AS HighSalaryEmployees;
  • 在 SELECT 子句中使用子查詢 (標量子查詢)
    子查詢返回單個值,用于為外部查詢的每一行提供一個計算值。

    SELECT
        e.FirstName,
        e.LastName,
        e.Salary,
        (SELECT AVG(Salary) FROM Employees) AS GlobalAverageSalary -- 顯示全局平均工資
    FROM Employees e;

6.2 復制表結(jié)構(gòu)與數(shù)據(jù)

  • 復制表結(jié)構(gòu) (不含數(shù)據(jù))
    創(chuàng)建與源表結(jié)構(gòu)相同但為空的新表。

    -- SQL Server 語法
    SELECT * INTO new_table FROM old_table WHERE 1=0;
    -- MySQL/PostgreSQL 語法
    CREATE TABLE new_table LIKE old_table;
  • 復制數(shù)據(jù) (插入)
    將源表中選定的數(shù)據(jù)插入到目標表中(目標表需已存在或與源表結(jié)構(gòu)一致)。

    INSERT INTO b (col1, col2, col3)
    SELECT d, e, f FROM a WHERE condition;

    示例:將2023年入職的員工數(shù)據(jù)復制到 EmployeeArchive 表。

    INSERT INTO EmployeeArchive (EmployeeID, FirstName, LastName, HireDate)
    SELECT EmployeeID, FirstName, LastName, HireDate
    FROM Employees
    WHERE YEAR(HireDate) = 2023;

7. 隨機數(shù)據(jù)處理與重復數(shù)據(jù)處理

7.1 隨機選擇記錄

從表中隨機抽取一定數(shù)量的記錄。不同數(shù)據(jù)庫系統(tǒng)語法略有差異。

  • SQL Server
    使用 ORDER BY NEWID()

    SELECT TOP 10 * FROM tablename ORDER BY NEWID();
  • MySQL
    使用 ORDER BY RAND()。

    SELECT * FROM tablename ORDER BY RAND() LIMIT 10;
  • PostgreSQL
    使用 ORDER BY RANDOM()。

    SELECT * FROM tablename ORDER BY RANDOM() LIMIT 10;

7.2 刪除重復記錄

識別并保留每組重復記錄中的一條(通常是ID最大或最小的),刪除其余的。

  • 通用方法 (使用ROW_NUMBER或MAX/MIN ID)
    假設 id 是自增主鍵,col1, col2 是用于判斷重復的列。

    -- 方法一:使用 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, ...);

    示例:刪除 Products 表中 ProductNameCategory 重復的記錄,保留 ProductID 最大的那條。

    DELETE FROM Products
    WHERE ProductID NOT IN (
        SELECT MAX(ProductID)
        FROM Products
        GROUP BY ProductName, Category
    );

8. 數(shù)據(jù)庫和表信息查詢

用于查看數(shù)據(jù)庫的元數(shù)據(jù)(關于數(shù)據(jù)的數(shù)據(jù))。

  • 列出數(shù)據(jù)庫中的所有用戶表
    不同數(shù)據(jù)庫系統(tǒng)語法不同。

    -- SQL Server
    SELECT name FROM sysobjects WHERE type = 'U'; -- U 代表用戶表
    -- MySQL
    SHOW TABLES;
    -- PostgreSQL
    SELECT tablename FROM pg_tables WHERE schemaname = 'public'; -- 'public' 是默認模式
  • 列出指定表的列信息
    查看表的列名、數(shù)據(jù)類型、是否可空等。

    -- 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';

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

    DESCRIBE Employees;

9. 事務管理 (DCL)

事務是一組數(shù)據(jù)庫操作的邏輯單元。事務要么全部成功執(zhí)行,要么全部不執(zhí)行,以保證數(shù)據(jù)的一致性和完整性。

9.1 事務控制語句

  • BEGIN TRANSACTION / START TRANSACTION
    標記事務的開始。

    BEGIN TRANSACTION;
    -- 或 START TRANSACTION;
  • ROLLBACK
    回滾事務,撤銷自 BEGIN TRANSACTION 以來的所有修改。

    ROLLBACK;
  • COMMIT
    提交事務,將所有修改永久保存到數(shù)據(jù)庫。

    COMMIT;

9.2 事務管理示例

一個典型的轉(zhuǎn)賬場景:從賬戶A扣款,給賬戶B加款。

BEGIN TRANSACTION;
-- 1. 從賬戶 A 扣除 100 元
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- 2. 檢查扣款操作是否成功 (SQL Server 的 @@ERROR, 其他數(shù)據(jù)庫可能有類似機制或異常處理)
IF @@ERROR <> 0
BEGIN
    -- 如果發(fā)生錯誤,回滾事務
    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
        -- 如果發(fā)生錯誤,回滾事務
        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

說明

  • BEGIN TRANSACTION; 開啟一個事務。
  • UPDATE 語句執(zhí)行實際的數(shù)據(jù)修改。
  • IF @@ERROR <> 0 (SQL Server 語法) 用于檢測上一條SQL語句是否執(zhí)行出錯。在其他數(shù)據(jù)庫中,您可能需要使用 TRY...CATCH 塊或檢查事務的狀態(tài)。
  • ROLLBACK; 用于撤銷所有未提交的更改。
  • COMMIT; 用于使所有更改永久生效。

通過掌握這些SQL語句,您將能夠高效、準確地進行數(shù)據(jù)庫管理和數(shù)據(jù)操作,確保數(shù)據(jù)操作的完整性和安全性。

總結(jié)

到此這篇關于常用經(jīng)典SQL語句大全完整版的文章就介紹到這了,更多相關SQL語句常用大全內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MySQL對相同字段創(chuàng)建不同索引解析

    MySQL對相同字段創(chuàng)建不同索引解析

    這篇文章主要為大家介紹了MySQL?對相同字段創(chuàng)建不同索引解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • windows?64位下mysql8.0.25安裝配置教程(最詳細!)

    windows?64位下mysql8.0.25安裝配置教程(最詳細!)

    之前一直在用 5.7 版本,竟然一下子跳到 8.0了,下面這篇文章主要給大家介紹了關于在windows?64位下mysql8.0.25安裝配置教程,文章通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-03-03
  • MySQL表字段批量修改SQL的實戰(zhàn)技巧

    MySQL表字段批量修改SQL的實戰(zhàn)技巧

    文章介紹了如何使用MySQL的ALTER TABLE語句進行批量修改字段,包括業(yè)務變更、字段優(yōu)化和數(shù)據(jù)遷移等場景,通過查詢INFORMATION_SCHEMA,可以生成相應的SQL語句,文章還提供了具體的SQL示例和實踐總結(jié),并附上了下載MySQL的鏈接和官方文檔,需要的朋友可以參考下
    2026-01-01
  • mysql高級語句的查詢語句使用及說明

    mysql高級語句的查詢語句使用及說明

    文章主要講解了SQL中排序語法、區(qū)間判斷、分組查詢、偏移量limit、別名as、表復制、通配符like、子查詢、existsexists、視圖、連接查詢等知識點及其用法和示例,對SQL查詢和操作進行了詳細說明
    2026-05-05
  • MySql采用GROUP_CONCAT合并多條數(shù)據(jù)顯示的方法

    MySql采用GROUP_CONCAT合并多條數(shù)據(jù)顯示的方法

    這篇文章主要介紹了MySql采用GROUP_CONCAT合并多條數(shù)據(jù)顯示的方法,是MySQL數(shù)據(jù)庫程序設計中常見的實用技巧,需要的朋友可以參考下
    2014-10-10
  • MySQL數(shù)據(jù)庫減少磁盤I/O的深入拆解

    MySQL數(shù)據(jù)庫減少磁盤I/O的深入拆解

    為了減少磁盤I/O操作,MySQL使用了一些技術(shù)來提高性能,這篇文章主要介紹了MySQL數(shù)據(jù)庫減少磁盤I/O的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2026-04-04
  • Mysql數(shù)據(jù)庫的一些命令

    Mysql數(shù)據(jù)庫的一些命令

    如果你習慣用 windows 的數(shù)據(jù)庫,也就是在 圖形界面上操作數(shù)據(jù)庫的話,那么當你在命令上 操作 mysql 將會感到陌生,其實只要你掌握了一些基本命令,還有經(jīng)常使用,熟練起來了, 將會相當方便,而且很快速
    2013-11-11
  • mysql中向表中某字段追加字符串的方法

    mysql中向表中某字段追加字符串的方法

    mysql中向表中某字段追加字符串的方法...
    2007-03-03
  • 一文徹底搞懂MySQL?TimeStamp時區(qū)問題

    一文徹底搞懂MySQL?TimeStamp時區(qū)問題

    MySQL的timestamp類型默認使用的是服務器的時區(qū)來存儲時間值,這意味著如果服務器的時區(qū)發(fā)生了變化,那么存儲的timestamp值也會發(fā)生變化,下面這篇文章主要給大家介紹了關于如何通過一文徹底搞懂MySQL?TimeStamp時區(qū)問題的相關資料,需要的朋友可以參考下
    2024-01-01
  • mysql使用force index的問題解決

    mysql使用force index的問題解決

    FORCE INDEX是MySQL中的一個查詢提示,本文主要介紹了mysql使用force index的問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-07-07

最新評論

瓦房店市| 拉孜县| 绍兴市| 齐齐哈尔市| 元氏县| 会宁县| 台湾省| 封开县| 乐平市| 吉隆县| 满洲里市| 重庆市| 万年县| 周至县| 南溪县| 通化市| 遂昌县| 增城市| 宁强县| 准格尔旗| 洞口县| 循化| 临邑县| 佛教| 宁都县| 冷水江市| 子洲县| 乃东县| 康马县| 南涧| 威远县| 犍为县| 高密市| 鄱阳县| 永定县| 桦川县| 包头市| 隆化县| 鄯善县| 锡林浩特市| 高州市|