十分想念順店雜可。。。
以下是 MySQL 中常用的基本 SQL 語句大全,按功能分類整理,包含語法和示例,方便參考使用:
一、數據庫操作(DDL)
用于創建、刪除、切換數據庫。
創建數據庫
-- 基本語法 CREATE DATABASE [IF NOT EXISTS] 數據庫名 [CHARACTER SET 字符集] [COLLATE 排序規則];-- 示例:創建名為testdb的數據庫,指定utf8mb4字符集 CREATE DATABASE IF NOT EXISTS testdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
刪除數據庫
-- 基本語法 DROP DATABASE [IF EXISTS] 數據庫名;-- 示例:刪除testdb數據庫(謹慎操作!) DROP DATABASE IF EXISTS testdb;
切換 / 使用數據庫
USE 數據庫名;-- 示例:使用testdb數據庫 USE testdb;
查看所有數據庫
SHOW DATABASES;
二、表操作(DDL)
用于創建、修改、刪除表結構。
創建表
-- 基本語法 CREATE TABLE [IF NOT EXISTS] 表名 (列名1 數據類型 [約束],列名2 數據類型 [約束],...[表級約束] ) [ENGINE=存儲引擎] [CHARACTER SET 字符集];-- 示例:創建user表 CREATE TABLE IF NOT EXISTS user (id INT PRIMARY KEY AUTO_INCREMENT, -- 主鍵,自增name VARCHAR(50) NOT NULL, -- 非空age INT DEFAULT 0, -- 默認值phone VARCHAR(20) UNIQUE, -- 唯一約束create_time DATETIME ) ENGINE=InnoDB CHARACTER SET utf8mb4;
查看表結構
-- 方法1 DESCRIBE 表名; -- 簡寫 DESC 表名;-- 方法2(更詳細) SHOW COLUMNS FROM 表名;
修改表結構(ALTER TABLE)
-- 添加列 ALTER TABLE 表名 ADD 列名 數據類型 [約束]; -- 示例:給user表添加email列 ALTER TABLE user ADD email VARCHAR(100) UNIQUE;-- 修改列類型/約束 ALTER TABLE 表名 MODIFY 列名 新數據類型 [新約束]; -- 示例:修改age列為INT,允許NULL ALTER TABLE user MODIFY age INT NULL;-- 重命名列 ALTER TABLE 表名 CHANGE 舊列名 新列名 數據類型 [約束]; -- 示例:將phone列重命名為mobile ALTER TABLE user CHANGE phone mobile VARCHAR(20) UNIQUE;-- 刪除列 ALTER TABLE 表名 DROP 列名; -- 示例:刪除email列 ALTER TABLE user DROP email;-- 重命名表 ALTER TABLE 舊表名 RENAME TO 新表名;
刪除表
-- 基本語法 DROP TABLE [IF EXISTS] 表名;-- 示例:刪除user表 DROP TABLE IF EXISTS user;
查看當前數據庫所有表
SHOW TABLES;
三、數據操作(DML)
用于插入、更新、刪除表中的數據。
插入數據(INSERT)
-- 插入完整行(按表結構順序) INSERT INTO 表名 VALUES (值1, 值2, ...);-- 插入指定列(推薦,更靈活) INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...);-- 批量插入 INSERT INTO 表名 (列1, 列2) VALUES (值1, 值2), (值3, 值4), ...;-- 示例:插入用戶數據 INSERT INTO user (name, age, mobile, create_time) VALUES ('張三', 25, '13800138000', '2023-01-01 10:00:00');-- 批量插入 INSERT INTO user (name, age) VALUES ('李四', 30), ('王五', 28);
更新數據(UPDATE)
-- 基本語法(務必加WHERE,否則更新全表!) UPDATE 表名 SET 列1=值1, 列2=值2, ... [WHERE 條件];-- 示例:更新張三的年齡為26 UPDATE user SET age=26 WHERE name='張三';-- 多條件更新 UPDATE user SET mobile='13900139000' WHERE name='李四' AND age=30;
刪除數據(DELETE)
-- 基本語法(務必加WHERE,否則刪除全表數據!) DELETE FROM 表名 [WHERE 條件];-- 示例:刪除年齡大于50的用戶 DELETE FROM user WHERE age > 50;-- 清空表(速度更快,自增ID會重置) TRUNCATE TABLE 表名; -- 等價于刪除表再重建,無法回滾
四、數據查詢(DQL)
用于從表中查詢數據,核心是SELECT
語句。
基礎查詢
-- 查詢所有列(不推薦,效率低) SELECT * FROM 表名;-- 查詢指定列 SELECT 列1, 列2, ... FROM 表名;-- 示例:查詢user表的name和age列 SELECT name, age FROM user;
帶條件查詢(WHERE)
SELECT 列名 FROM 表名 WHERE 條件;-- 條件運算符:=、!=、>、<、>=、<=、BETWEEN...AND、IN、LIKE、IS NULL等 -- 示例1:查詢年齡=25的用戶 SELECT * FROM user WHERE age = 25;-- 示例2:查詢年齡在20-30之間的用戶 SELECT * FROM user WHERE age BETWEEN 20 AND 30;-- 示例3:查詢姓名包含"張"的用戶(%匹配任意字符,_匹配單個字符) SELECT * FROM user WHERE name LIKE '%張%';-- 示例4:查詢手機號為空的用戶 SELECT * FROM user WHERE mobile IS NULL;-- 多條件:AND(且)、OR(或)、NOT(非) SELECT * FROM user WHERE age > 25 AND name LIKE '李%';
排序(ORDER BY)
SELECT 列名 FROM 表名 [WHERE 條件] ORDER BY 列1 [ASC|DESC], 列2 [ASC|DESC]; -- ASC:升序(默認),DESC:降序-- 示例:按年齡降序排列,年齡相同則按創建時間升序 SELECT * FROM user ORDER BY age DESC, create_time ASC;
分頁(LIMIT)
SELECT 列名 FROM 表名 [WHERE 條件] LIMIT 起始位置, 條數; -- 起始位置從0開始(可省略,默認0)-- 示例1:查詢前10條數據 SELECT * FROM user LIMIT 10;-- 示例2:查詢第11-20條數據(起始位置10,取10條) SELECT * FROM user LIMIT 10, 10;
去重(DISTINCT)
SELECT DISTINCT 列名 FROM 表名;-- 示例:查詢所有不重復的年齡 SELECT DISTINCT age FROM user;
聚合函數
常用聚合函數:COUNT()
(計數)、SUM()
(求和)、AVG()
(平均值)、MAX()
(最大值)、MIN()
(最小值)。-- 示例1:統計用戶總數 SELECT COUNT(*) AS total_users FROM user; -- *包含NULL,COUNT(列名)不包含NULL-- 示例2:計算平均年齡 SELECT AVG(age) AS avg_age FROM user;-- 示例3:查詢最大年齡和最小年齡 SELECT MAX(age) AS max_age, MIN(age) AS min_age FROM user;
分組查詢(GROUP BY + HAVING)
GROUP BY
:按列分組,常與聚合函數搭配。HAVING
:篩選分組后的結果(類似 WHERE,但用于分組)。
-- 示例1:按年齡分組,統計每個年齡的用戶數 SELECT age, COUNT(*) AS count FROM user GROUP BY age;-- 示例2:篩選用戶數>=2的年齡組 SELECT age, COUNT(*) AS count FROM user GROUP BY age HAVING count >= 2;
多表連接查詢
假設有user
表(id, name)和order
表(id, user_id, amount),通過user_id
關聯。-- 內連接(INNER JOIN):只返回兩表匹配的行 SELECT u.name, o.amount FROM user u INNER JOIN `order` o ON u.id = o.user_id;-- 左連接(LEFT JOIN):返回左表所有行,右表無匹配則為NULL SELECT u.name, o.amount FROM user u LEFT JOIN `order` o ON u.id = o.user_id;-- 右連接(RIGHT JOIN):返回右表所有行,左表無匹配則為NULL SELECT u.name, o.amount FROM user u RIGHT JOIN `order` o ON u.id = o.user_id;
子查詢
嵌套在其他查詢中的查詢,可作為條件、結果集或臨時表。-- 示例1:子查詢作為條件(查詢有訂單的用戶) SELECT * FROM user WHERE id IN (SELECT DISTINCT user_id FROM `order`);-- 示例2:子查詢作為臨時表(查詢每個用戶的最新訂單) SELECT u.name, o.amount FROM user u JOIN (SELECT user_id, MAX(id) AS max_order_id FROM `order` GROUP BY user_id ) tmp ON u.id = tmp.user_id JOIN `order` o ON tmp.max_order_id = o.id;
五、索引操作(DDL)
-- 創建普通索引
CREATE INDEX 索引名 ON 表名(列名);
-- 示例:給user表的name列創建索引
CREATE INDEX idx_user_name ON user(name);-- 創建復合索引
CREATE INDEX 索引名 ON 表名(列1, 列2, ...);
-- 示例:創建(name, age)復合索引
CREATE INDEX idx_user_name_age ON user(name, age);-- 創建唯一索引
CREATE UNIQUE INDEX 索引名 ON 表名(列名);-- 刪除索引
DROP INDEX 索引名 ON 表名;-- 查看表中所有索引
SHOW INDEX FROM 表名;
六、用戶與權限(DCL)
-- 創建用戶
CREATE USER '用戶名'@'主機名' IDENTIFIED BY '密碼';
-- 示例:允許localhost登錄的user1,密碼123456
CREATE USER 'user1'@'localhost' IDENTIFIED BY '123456';-- 授予權限(ALL:所有權限,SELECT:查詢權限等)
GRANT 權限列表 ON 數據庫名.表名 TO '用戶名'@'主機名';
-- 示例:授予user1對testdb所有表的查詢和插入權限
GRANT SELECT, INSERT ON testdb.* TO 'user1'@'localhost';-- 撤銷權限
REVOKE 權限列表 ON 數據庫名.表名 FROM '用戶名'@'主機名';-- 刪除用戶
DROP USER '用戶名'@'主機名';-- 查看用戶權限
SHOW GRANTS FOR '用戶名'@'主機名';
七、事務控制
-- 開始事務
START TRANSACTION;
-- 或 BEGIN;-- 提交事務(永久生效)
COMMIT;-- 回滾事務(撤銷操作)
ROLLBACK;-- 設置事務隔離級別(READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE)
SET TRANSACTION ISOLATION LEVEL 隔離級別;
常用輔助語句
- 查看當前數據庫:
SELECT DATABASE();
- 查看 MySQL 版本:
SELECT VERSION();
- 查看當前用戶:
SELECT USER();
- 清空查詢緩存(MySQL 8.0 前):
RESET QUERY CACHE;
以上涵蓋了 MySQL 日常開發中最常用的 SQL 語句,實際使用時需根據具體場景靈活組合,復雜查詢建議用EXPLAIN
分析執行計劃以優化性能。