数据库 SQL 语句大全

一、数据库操作语句

1. 创建数据库

复制代码
-- 基本创建
CREATE DATABASE database_name;

-- 指定字符集和校对规则
CREATE DATABASE database_name 
CHARACTER SET utf8mb4 
COLLATE utf8mb4_unicode_ci;

-- 如果不存在则创建
CREATE DATABASE IF NOT EXISTS database_name;

2. 删除数据库

复制代码
DROP DATABASE database_name;
DROP DATABASE IF EXISTS database_name;

3. 选择/切换数据库

复制代码
USE database_name;

4. 查看数据库

复制代码
-- 查看所有数据库
SHOW DATABASES;

-- 查看数据库创建语句
SHOW CREATE DATABASE database_name;

-- 查看当前使用的数据库
SELECT DATABASE();

5. 修改数据库

复制代码
ALTER DATABASE database_name 
CHARACTER SET utf8mb4 
COLLATE utf8mb4_unicode_ci;

二、数据表操作语句

1. 创建表

复制代码
-- 基本创建
CREATE TABLE table_name (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    age INT DEFAULT 0,
    email VARCHAR(100) UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 带外键约束
CREATE TABLE orders (
    order_id INT PRIMARY KEY AUTO_INCREMENT,
    customer_id INT,
    amount DECIMAL(10, 2),
    FOREIGN KEY (customer_id) REFERENCES customers(id)
    ON DELETE CASCADE
    ON UPDATE CASCADE
);

-- 创建临时表
CREATE TEMPORARY TABLE temp_table (
    id INT,
    value VARCHAR(100)
);

-- 从查询结果创建表
CREATE TABLE new_table AS 
SELECT * FROM old_table WHERE condition;

-- 复制表结构
CREATE TABLE new_table LIKE old_table;

2. 删除表

复制代码
DROP TABLE table_name;
DROP TABLE IF EXISTS table_name;

-- 快速清空表
TRUNCATE TABLE table_name;

3. 修改表结构

复制代码
-- 添加列
ALTER TABLE table_name ADD column_name datatype;
ALTER TABLE table_name ADD column_name datatype AFTER existing_column;
ALTER TABLE table_name ADD column_name datatype FIRST;

-- 删除列
ALTER TABLE table_name DROP COLUMN column_name;

-- 修改列
ALTER TABLE table_name MODIFY COLUMN column_name new_datatype;
ALTER TABLE table_name CHANGE old_column_name new_column_name datatype;

-- 重命名表
ALTER TABLE old_table_name RENAME TO new_table_name;
RENAME TABLE old_table TO new_table;

-- 添加主键
ALTER TABLE table_name ADD PRIMARY KEY (column_name);

-- 删除主键
ALTER TABLE table_name DROP PRIMARY KEY;

-- 添加外键
ALTER TABLE table_name 
ADD CONSTRAINT fk_name 
FOREIGN KEY (column_name) 
REFERENCES other_table(other_column);

-- 删除外键
ALTER TABLE table_name DROP FOREIGN KEY fk_name;

-- 添加索引
ALTER TABLE table_name ADD INDEX index_name (column_name);
CREATE INDEX index_name ON table_name (column_name);

-- 添加唯一索引
ALTER TABLE table_name ADD UNIQUE (column_name);
CREATE UNIQUE INDEX index_name ON table_name (column_name);

-- 删除索引
ALTER TABLE table_name DROP INDEX index_name;
DROP INDEX index_name ON table_name;

4. 查看表信息

复制代码
-- 查看所有表
SHOW TABLES;
SHOW TABLES LIKE 'pattern%';

-- 查看表结构
DESCRIBE table_name;
DESC table_name;
SHOW COLUMNS FROM table_name;

-- 查看表创建语句
SHOW CREATE TABLE table_name;

-- 查看表状态
SHOW TABLE STATUS LIKE 'table_name';

三、数据操作语句(DML)

1. 插入数据

复制代码
-- 插入单行
INSERT INTO table_name (column1, column2) VALUES (value1, value2);

-- 插入多行
INSERT INTO table_name (column1, column2) 
VALUES 
    (value1, value2),
    (value3, value4),
    (value5, value6);

-- 插入所有列
INSERT INTO table_name VALUES (value1, value2, value3);

-- 从查询结果插入
INSERT INTO table_name (column1, column2)
SELECT column1, column2 FROM another_table WHERE condition;

-- 插入或替换
REPLACE INTO table_name (id, name) VALUES (1, 'John');

-- 插入或忽略
INSERT IGNORE INTO table_name (id, name) VALUES (1, 'John');

2. 更新数据

复制代码
-- 基本更新
UPDATE table_name 
SET column1 = value1, column2 = value2 
WHERE condition;

-- 使用子查询更新
UPDATE table_name 
SET column1 = (
    SELECT column2 FROM other_table WHERE condition
)
WHERE condition;

-- 批量更新
UPDATE table_name 
SET status = 'active' 
WHERE id IN (1, 2, 3, 4, 5);

-- 使用CASE更新
UPDATE table_name 
SET grade = CASE
    WHEN score >= 90 THEN 'A'
    WHEN score >= 80 THEN 'B'
    WHEN score >= 70 THEN 'C'
    ELSE 'D'
END;

-- 使用JOIN更新
UPDATE table1 
JOIN table2 ON table1.id = table2.table1_id
SET table1.column = table2.new_value
WHERE condition;

3. 删除数据

复制代码
-- 基本删除
DELETE FROM table_name WHERE condition;

-- 删除所有数据
DELETE FROM table_name;
TRUNCATE TABLE table_name; -- 更快,不能回滚

-- 使用子查询删除
DELETE FROM table_name 
WHERE column IN (
    SELECT column FROM other_table WHERE condition
);

-- 使用JOIN删除(MySQL)
DELETE t1 FROM table1 t1
JOIN table2 t2 ON t1.id = t2.table1_id
WHERE condition;

-- 使用LIMIT删除
DELETE FROM table_name WHERE condition LIMIT 1000;

四、数据查询语句(DQL)

1. 基础查询

复制代码
-- 查询所有列
SELECT * FROM table_name;

-- 查询特定列
SELECT column1, column2 FROM table_name;

-- 使用别名
SELECT column1 AS alias1, column2 AS alias2 FROM table_name;
SELECT column1 alias1 FROM table_name;

-- 去重查询
SELECT DISTINCT column_name FROM table_name;

-- 查询常量值
SELECT '固定值' AS constant, column_name FROM table_name;

-- 计算字段
SELECT column1, column2, column1 + column2 AS total FROM table_name;
SELECT column1, column2, column1 * column2 AS product FROM table_name;

-- 使用函数
SELECT COUNT(*) FROM table_name;
SELECT AVG(column_name) FROM table_name;
SELECT SUM(column_name) FROM table_name;
SELECT MAX(column_name) FROM table_name;
SELECT MIN(column_name) FROM table_name;

2. 条件查询

复制代码
-- WHERE子句
SELECT * FROM table_name WHERE condition;

-- 比较运算符
SELECT * FROM table_name WHERE column = value;
SELECT * FROM table_name WHERE column > value;
SELECT * FROM table_name WHERE column < value;
SELECT * FROM table_name WHERE column >= value;
SELECT * FROM table_name WHERE column <= value;
SELECT * FROM table_name WHERE column <> value; -- 不等于
SELECT * FROM table_name WHERE column != value;

-- 逻辑运算符
SELECT * FROM table_name WHERE condition1 AND condition2;
SELECT * FROM table_name WHERE condition1 OR condition2;
SELECT * FROM table_name WHERE NOT condition;

-- BETWEEN
SELECT * FROM table_name WHERE column BETWEEN value1 AND value2;

-- IN
SELECT * FROM table_name WHERE column IN (value1, value2, value3);

-- NOT IN
SELECT * FROM table_name WHERE column NOT IN (value1, value2, value3);

-- LIKE
SELECT * FROM table_name WHERE column LIKE 'pattern%';  -- 以pattern开头
SELECT * FROM table_name WHERE column LIKE '%pattern';  -- 以pattern结尾
SELECT * FROM table_name WHERE column LIKE '%pattern%'; -- 包含pattern
SELECT * FROM table_name WHERE column LIKE '_pattern';  -- pattern在第二个字符
SELECT * FROM table_name WHERE column NOT LIKE 'pattern%';

-- NULL值判断
SELECT * FROM table_name WHERE column IS NULL;
SELECT * FROM table_name WHERE column IS NOT NULL;

-- EXISTS
SELECT * FROM table_name 
WHERE EXISTS (SELECT 1 FROM other_table WHERE condition);

3. 排序查询

复制代码
-- 单字段排序
SELECT * FROM table_name ORDER BY column_name;
SELECT * FROM table_name ORDER BY column_name ASC;  -- 升序
SELECT * FROM table_name ORDER BY column_name DESC; -- 降序

-- 多字段排序
SELECT * FROM table_name 
ORDER BY column1 ASC, column2 DESC;

-- 使用字段位置排序
SELECT column1, column2 FROM table_name ORDER BY 1; -- 按第一列排序

-- 自定义排序
SELECT * FROM table_name 
ORDER BY FIELD(column_name, 'value3', 'value1', 'value2');

4. 分组查询

复制代码
-- 基本分组
SELECT column1, COUNT(*) 
FROM table_name 
GROUP BY column1;

-- 分组过滤
SELECT column1, COUNT(*) 
FROM table_name 
GROUP BY column1 
HAVING COUNT(*) > 1;

-- 多字段分组
SELECT column1, column2, AVG(column3)
FROM table_name
GROUP BY column1, column2;

-- 分组后排序
SELECT column1, COUNT(*) as count
FROM table_name
GROUP BY column1
ORDER BY count DESC;

-- 使用GROUP_CONCAT
SELECT department, GROUP_CONCAT(employee_name) as employees
FROM employees
GROUP BY department;

5. 分页查询

复制代码
-- MySQL分页
SELECT * FROM table_name LIMIT 10;           -- 前10条
SELECT * FROM table_name LIMIT 10 OFFSET 20; -- 跳过20条,取10条
SELECT * FROM table_name LIMIT 20, 10;       -- 同上

-- SQL Server分页
SELECT * FROM table_name 
ORDER BY id
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

-- Oracle分页
SELECT * FROM (
    SELECT t.*, ROWNUM rn 
    FROM table_name t 
    WHERE ROWNUM <= 30
) WHERE rn > 20;

-- PostgreSQL分页
SELECT * FROM table_name 
ORDER BY id 
LIMIT 10 OFFSET 20;

6. 连接查询

复制代码
-- 内连接(INNER JOIN)
SELECT * FROM table1 
INNER JOIN table2 ON table1.id = table2.table1_id;

-- 左连接(LEFT JOIN)
SELECT * FROM table1 
LEFT JOIN table2 ON table1.id = table2.table1_id;

-- 右连接(RIGHT JOIN)
SELECT * FROM table1 
RIGHT JOIN table2 ON table1.id = table2.table1_id;

-- 全外连接(FULL OUTER JOIN)
SELECT * FROM table1 
FULL OUTER JOIN table2 ON table1.id = table2.table1_id;

-- 交叉连接(CROSS JOIN)
SELECT * FROM table1 CROSS JOIN table2;

-- 自连接
SELECT e1.name AS employee, e2.name AS manager
FROM employees e1
LEFT JOIN employees e2 ON e1.manager_id = e2.id;

-- 多表连接
SELECT * FROM table1
JOIN table2 ON table1.id = table2.table1_id
JOIN table3 ON table2.id = table3.table2_id;

-- USING简化连接(当列名相同时)
SELECT * FROM table1 JOIN table2 USING (id);

7. 子查询

复制代码
-- WHERE子句中的子查询
SELECT * FROM table_name 
WHERE column IN (SELECT column FROM other_table WHERE condition);

SELECT * FROM table_name 
WHERE column = (SELECT MAX(column) FROM other_table);

-- FROM子句中的子查询
SELECT * FROM (
    SELECT column1, COUNT(*) as count 
    FROM table_name 
    GROUP BY column1
) AS subquery WHERE count > 1;

-- SELECT子句中的子查询
SELECT column1, 
    (SELECT COUNT(*) FROM other_table WHERE id = table_name.id) as count
FROM table_name;

-- EXISTS子查询
SELECT * FROM table_name 
WHERE EXISTS (SELECT 1 FROM other_table WHERE condition);

8. 联合查询

复制代码
-- UNION(去重)
SELECT column1 FROM table1
UNION
SELECT column1 FROM table2;

-- UNION ALL(不去重)
SELECT column1 FROM table1
UNION ALL
SELECT column1 FROM table2;

-- 多表联合
SELECT column1 FROM table1
UNION
SELECT column2 FROM table2
UNION
SELECT column3 FROM table3;

9. 窗口函数(高级查询)

复制代码
-- ROW_NUMBER
SELECT 
    id, 
    name, 
    salary,
    ROW_NUMBER() OVER (ORDER BY salary DESC) AS rank
FROM employees;

-- RANK 和 DENSE_RANK
SELECT 
    id, 
    name, 
    salary,
    RANK() OVER (ORDER BY salary DESC) AS rank,
    DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank
FROM employees;

-- 分区窗口函数
SELECT 
    department,
    name,
    salary,
    AVG(salary) OVER (PARTITION BY department) AS avg_salary
FROM employees;

-- 累计求和
SELECT 
    month,
    revenue,
    SUM(revenue) OVER (ORDER BY month) AS cumulative_revenue
FROM sales;

-- LAG 和 LEAD
SELECT 
    month,
    revenue,
    LAG(revenue) OVER (ORDER BY month) AS prev_month,
    LEAD(revenue) OVER (ORDER BY month) AS next_month
FROM sales;

五、事务控制语句

1. 事务基本操作

复制代码
-- 开始事务
START TRANSACTION;
BEGIN;
BEGIN WORK;

-- 提交事务
COMMIT;

-- 回滚事务
ROLLBACK;

-- 设置保存点
SAVEPOINT savepoint_name;

-- 回滚到保存点
ROLLBACK TO savepoint_name;

-- 释放保存点
RELEASE SAVEPOINT savepoint_name;

2. 事务特性设置

复制代码
-- 设置事务隔离级别
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

-- 设置事务为只读
SET TRANSACTION READ ONLY;

-- 设置事务为读写
SET TRANSACTION READ WRITE;

六、索引操作语句

1. 创建索引

复制代码
-- 创建普通索引
CREATE INDEX index_name ON table_name (column_name);

-- 创建唯一索引
CREATE UNIQUE INDEX index_name ON table_name (column_name);

-- 创建复合索引
CREATE INDEX index_name ON table_name (column1, column2, column3);

-- 创建全文索引
CREATE FULLTEXT INDEX index_name ON table_name (column_name);

-- 创建空间索引
CREATE SPATIAL INDEX index_name ON table_name (column_name);

-- 创建前缀索引
CREATE INDEX index_name ON table_name (column_name(10));

2. 查看索引

复制代码
SHOW INDEX FROM table_name;
SHOW INDEXES FROM table_name;
SHOW KEYS FROM table_name;

3. 删除索引

复制代码
DROP INDEX index_name ON table_name;
ALTER TABLE table_name DROP INDEX index_name;

七、视图操作语句

1. 创建视图

复制代码
-- 基本视图
CREATE VIEW view_name AS
SELECT column1, column2
FROM table_name
WHERE condition;

-- 可更新视图
CREATE VIEW updatable_view AS
SELECT id, name, department
FROM employees
WHERE active = 1;

-- 递归视图
CREATE RECURSIVE VIEW view_name (column_list) AS
SELECT ... -- 基础查询
UNION ALL
SELECT ... -- 递归查询

2. 修改视图

复制代码
ALTER VIEW view_name AS
SELECT new_columns
FROM new_tables
WHERE new_conditions;

3. 删除视图

复制代码
DROP VIEW view_name;
DROP VIEW IF EXISTS view_name;

4. 查看视图

复制代码
SHOW FULL TABLES WHERE Table_type = 'VIEW';
SHOW CREATE VIEW view_name;
DESCRIBE view_name;

八、存储过程和函数

1. 创建存储过程

复制代码
DELIMITER $$
CREATE PROCEDURE procedure_name(
    IN param1 INT,
    OUT param2 VARCHAR(100)
)
BEGIN
    -- 存储过程体
    SELECT column INTO param2 FROM table WHERE id = param1;
END $$
DELIMITER ;

2. 调用存储过程

复制代码
CALL procedure_name(1, @result);
SELECT @result;

3. 删除存储过程

复制代码
DROP PROCEDURE procedure_name;
DROP PROCEDURE IF EXISTS procedure_name;

4. 创建函数

复制代码
DELIMITER $$
CREATE FUNCTION function_name(param INT)
RETURNS VARCHAR(100)
DETERMINISTIC
BEGIN
    DECLARE result VARCHAR(100);
    -- 函数体
    RETURN result;
END $$
DELIMITER ;

5. 调用函数

复制代码
SELECT function_name(1);

九、触发器

1. 创建触发器

复制代码
-- BEFORE INSERT 触发器
CREATE TRIGGER trigger_name
BEFORE INSERT ON table_name
FOR EACH ROW
BEGIN
    SET NEW.created_at = NOW();
END;

-- AFTER DELETE 触发器
CREATE TRIGGER trigger_name
AFTER DELETE ON table_name
FOR EACH ROW
BEGIN
    INSERT INTO audit_table VALUES (OLD.id, 'DELETE', NOW());
END;

-- BEFORE UPDATE 触发器
CREATE TRIGGER trigger_name
BEFORE UPDATE ON table_name
FOR EACH ROW
BEGIN
    IF NEW.column <> OLD.column THEN
        SET NEW.updated_at = NOW();
    END IF;
END;

2. 删除触发器

复制代码
DROP TRIGGER trigger_name;
DROP TRIGGER IF EXISTS trigger_name;

3. 查看触发器

复制代码
SHOW TRIGGERS;
SHOW TRIGGERS LIKE 'pattern%';

十、权限管理语句

1. 用户管理

复制代码
-- 创建用户
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
CREATE USER 'username'@'%' IDENTIFIED BY 'password';

-- 修改用户密码
ALTER USER 'username'@'localhost' IDENTIFIED BY 'new_password';

-- 重命名用户
RENAME USER 'old_username'@'localhost' TO 'new_username'@'localhost';

-- 删除用户
DROP USER 'username'@'localhost';
DROP USER IF EXISTS 'username'@'localhost';

2. 权限管理

复制代码
-- 授予权限
GRANT SELECT, INSERT, UPDATE ON database.table TO 'username'@'localhost';
GRANT ALL PRIVILEGES ON database.* TO 'username'@'localhost';
GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;

-- 撤销权限
REVOKE SELECT ON database.table FROM 'username'@'localhost';
REVOKE ALL PRIVILEGES ON database.* FROM 'username'@'localhost';

-- 查看权限
SHOW GRANTS FOR 'username'@'localhost';

3. 刷新权限

复制代码
FLUSH PRIVILEGES;

十一、实用函数大全

1. 字符串函数

复制代码
-- 连接字符串
SELECT CONCAT('Hello', ' ', 'World'); -- Hello World
SELECT CONCAT_WS(', ', 'John', 'Doe', 'Smith'); -- John, Doe, Smith

-- 截取字符串
SELECT SUBSTRING('Hello World', 1, 5); -- Hello
SELECT LEFT('Hello World', 5); -- Hello
SELECT RIGHT('Hello World', 5); -- World

-- 字符串长度
SELECT LENGTH('Hello'); -- 5
SELECT CHAR_LENGTH('Hello'); -- 5

-- 大小写转换
SELECT UPPER('hello'); -- HELLO
SELECT LOWER('HELLO'); -- hello

-- 去除空格
SELECT TRIM('  Hello  '); -- Hello
SELECT LTRIM('  Hello'); -- Hello
SELECT RTRIM('Hello  '); -- Hello

-- 替换字符串
SELECT REPLACE('Hello World', 'World', 'SQL'); -- Hello SQL

-- 查找位置
SELECT LOCATE('World', 'Hello World'); -- 7
SELECT POSITION('World' IN 'Hello World'); -- 7

-- 填充字符串
SELECT LPAD('123', 5, '0'); -- 00123
SELECT RPAD('123', 5, '0'); -- 12300

-- 反转字符串
SELECT REVERSE('Hello'); -- olleH

-- 格式化
SELECT FORMAT(123456.789, 2); -- 123,456.79

2. 数值函数

复制代码
-- 基本运算
SELECT ABS(-10); -- 10
SELECT SIGN(-10); -- -1
SELECT CEIL(10.1); -- 11
SELECT FLOOR(10.9); -- 10
SELECT ROUND(10.567, 2); -- 10.57

-- 数学函数
SELECT SQRT(16); -- 4
SELECT POWER(2, 3); -- 8
SELECT EXP(1); -- 2.718281828459045
SELECT LOG(10); -- 2.302585092994046
SELECT LOG10(100); -- 2

-- 三角函数
SELECT SIN(RADIANS(30)); -- 0.5
SELECT COS(RADIANS(60)); -- 0.5
SELECT TAN(RADIANS(45)); -- 1

-- 随机数
SELECT RAND(); -- 0-1之间的随机数
SELECT RAND() * 100; -- 0-100之间的随机数

-- 取整
SELECT ROUND(10.5); -- 11
SELECT TRUNCATE(10.567, 2); -- 10.56

3. 日期时间函数

复制代码
-- 当前时间
SELECT NOW(); -- 2023-10-01 12:00:00
SELECT CURDATE(); -- 2023-10-01
SELECT CURTIME(); -- 12:00:00
SELECT SYSDATE(); -- 2023-10-01 12:00:00

-- 提取日期部分
SELECT YEAR('2023-10-01'); -- 2023
SELECT MONTH('2023-10-01'); -- 10
SELECT DAY('2023-10-01'); -- 1
SELECT HOUR('12:30:45'); -- 12
SELECT MINUTE('12:30:45'); -- 30
SELECT SECOND('12:30:45'); -- 45

-- 日期加减
SELECT DATE_ADD('2023-10-01', INTERVAL 1 DAY); -- 2023-10-02
SELECT DATE_SUB('2023-10-01', INTERVAL 1 MONTH); -- 2023-09-01

-- 日期差
SELECT DATEDIFF('2023-10-01', '2023-09-01'); -- 30
SELECT TIMESTAMPDIFF(DAY, '2023-09-01', '2023-10-01'); -- 30

-- 日期格式化
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d'); -- 2023-10-01
SELECT DATE_FORMAT(NOW(), '%H:%i:%s'); -- 12:00:00

-- 星期相关
SELECT DAYNAME('2023-10-01'); -- Sunday
SELECT DAYOFWEEK('2023-10-01'); -- 1
SELECT WEEK('2023-10-01'); -- 40

-- 时间戳转换
SELECT UNIX_TIMESTAMP(); -- 当前时间戳
SELECT FROM_UNIXTIME(1696147200); -- 2023-10-01 00:00:00

4. 条件函数

复制代码
-- IF函数
SELECT IF(1 > 0, 'True', 'False'); -- True

-- CASE表达式
SELECT 
    CASE 
        WHEN score >= 90 THEN 'A'
        WHEN score >= 80 THEN 'B'
        WHEN score >= 70 THEN 'C'
        ELSE 'D'
    END AS grade
FROM students;

-- COALESCE(返回第一个非NULL值)
SELECT COALESCE(NULL, NULL, 'default'); -- default

-- NULLIF(如果相等返回NULL)
SELECT NULLIF(10, 10); -- NULL

-- IFNULL(如果第一个为NULL,返回第二个)
SELECT IFNULL(NULL, 'default'); -- default

-- NVL(Oracle兼容)
SELECT NVL(column, 'default') FROM table;

5. 聚合函数

复制代码
-- 基本聚合
SELECT COUNT(*) FROM table; -- 行数
SELECT COUNT(DISTINCT column) FROM table; -- 去重计数
SELECT SUM(column) FROM table; -- 求和
SELECT AVG(column) FROM table; -- 平均值
SELECT MAX(column) FROM table; -- 最大值
SELECT MIN(column) FROM table; -- 最小值

-- 分组聚合
SELECT department, AVG(salary) 
FROM employees 
GROUP BY department;

-- 统计聚合
SELECT 
    COUNT(*) as total,
    AVG(salary) as avg_salary,
    MAX(salary) as max_salary,
    MIN(salary) as min_salary
FROM employees;

-- GROUP_CONCAT
SELECT department, GROUP_CONCAT(name ORDER BY name SEPARATOR ', ')
FROM employees
GROUP BY department;

十二、备份与恢复

1. 数据库备份

复制代码
# MySQL备份
mysqldump -u username -p database_name > backup.sql

# 备份所有数据库
mysqldump -u username -p --all-databases > all_backup.sql

# 备份特定表
mysqldump -u username -p database_name table1 table2 > tables_backup.sql

# 压缩备份
mysqldump -u username -p database_name | gzip > backup.sql.gz

2. 数据库恢复

复制代码
# 恢复数据库
mysql -u username -p database_name < backup.sql

# 恢复压缩备份
gunzip < backup.sql.gz | mysql -u username -p database_name

3. 导出查询结果

复制代码
-- 导出到文件
SELECT * INTO OUTFILE '/path/to/file.csv'
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM table_name;

-- 导出数据
EXPORT DATA 
OPTIONS(uri='gs://bucket/*.csv', format='CSV') 
AS SELECT * FROM table_name;

十三、性能优化语句

1. 查看执行计划

复制代码
EXPLAIN SELECT * FROM table_name WHERE condition;
EXPLAIN FORMAT=JSON SELECT * FROM table_name WHERE condition;
EXPLAIN ANALYZE SELECT * FROM table_name WHERE condition;

2. 查看表锁状态

复制代码
SHOW OPEN TABLES WHERE In_use > 0;
SHOW PROCESSLIST;
SHOW ENGINE INNODB STATUS;

3. 优化表

复制代码
ANALYZE TABLE table_name;
OPTIMIZE TABLE table_name;
CHECK TABLE table_name;
REPAIR TABLE table_name;

4. 索引使用情况

复制代码
SHOW INDEX FROM table_name;
SHOW INDEX_STATISTICS;

十四、系统变量和状态

1. 查看系统变量

复制代码
SHOW VARIABLES;
SHOW VARIABLES LIKE '%buffer%';
SELECT @@global.variable_name;
SELECT @@session.variable_name;

2. 修改系统变量

复制代码
SET GLOBAL variable_name = value;
SET SESSION variable_name = value;
SET variable_name = value;

3. 查看系统状态

复制代码
SHOW STATUS;
SHOW STATUS LIKE '%connections%';
SHOW GLOBAL STATUS;

十五、实用小技巧

1. 生成序列号

复制代码
-- 使用变量生成序列号
SET @row_number = 0;
SELECT (@row_number:=@row_number + 1) AS row_number, column
FROM table_name;

-- 使用窗口函数
SELECT ROW_NUMBER() OVER (ORDER BY id) AS row_number, *
FROM table_name;

2. 分页查询优化

复制代码
-- 使用索引覆盖
SELECT id, name FROM table_name 
WHERE id > 1000 
ORDER BY id 
LIMIT 10;

-- 延迟关联
SELECT * FROM table_name t
JOIN (SELECT id FROM table_name ORDER BY id LIMIT 10000, 10) AS tmp
ON t.id = tmp.id;

3. 快速复制表

复制代码
-- 复制表结构
CREATE TABLE new_table LIKE old_table;

-- 复制表结构和数据
CREATE TABLE new_table AS SELECT * FROM old_table;

-- 插入数据
INSERT INTO new_table SELECT * FROM old_table;

十六、常用正则表达式

复制代码
-- MySQL正则表达式
SELECT * FROM table_name WHERE column REGEXP '^pattern';
SELECT * FROM table_name WHERE column REGEXP 'pattern$';
SELECT * FROM table_name WHERE column REGEXP '[0-9]+';
SELECT * FROM table_name WHERE column REGEXP '[A-Za-z]+';

-- PostgreSQL正则表达式
SELECT * FROM table_name WHERE column ~ 'pattern';
SELECT * FROM table_name WHERE column ~* 'pattern'; -- 不区分大小写
SELECT * FROM table_name WHERE column !~ 'pattern'; -- 不匹配

十七、JSON操作(MySQL 5.7+)

复制代码
-- 创建JSON字段
CREATE TABLE products (
    id INT PRIMARY KEY,
    details JSON
);

-- 插入JSON数据
INSERT INTO products VALUES (1, '{"name": "Laptop", "price": 999.99}');

-- 查询JSON字段
SELECT details->>'$.name' AS name FROM products;
SELECT JSON_EXTRACT(details, '$.price') AS price FROM products;

-- 更新JSON字段
UPDATE products 
SET details = JSON_SET(details, '$.price', 899.99) 
WHERE id = 1;

-- JSON函数
SELECT JSON_ARRAY(1, 2, 3);
SELECT JSON_OBJECT('name', 'John', 'age', 30);
SELECT JSON_LENGTH('["a", "b", "c"]'); -- 3
SELECT JSON_TYPE('{"name": "John"}'); -- OBJECT

十八、空间数据(GIS)

复制代码
-- 创建空间表
CREATE TABLE locations (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    point POINT NOT NULL,
    SPATIAL INDEX(point)
);

-- 插入空间数据
INSERT INTO locations VALUES (1, 'Beijing', ST_GeomFromText('POINT(116.397 39.907)'));

-- 查询空间数据
SELECT * FROM locations 
WHERE ST_Distance(point, ST_GeomFromText('POINT(116.397 39.907)')) < 1000;

-- 空间函数
SELECT ST_AsText(point) FROM locations;
SELECT ST_X(point), ST_Y(point) FROM locations;
SELECT ST_Distance(point1, point2);
SELECT ST_Contains(polygon, point);

总结表格

|-----------|----------------------------------------|--------------|
| 分类 | 常用语句 | 用途 |
| 数据库操作 | CREATE DATABASE, DROP DATABASE, USE | 数据库的创建、删除、切换 |
| 表操作 | CREATE TABLE, ALTER TABLE, DROP TABLE | 表的创建、修改、删除 |
| 数据操作 | INSERT, UPDATE, DELETE, SELECT | 数据的增删改查 |
| 事务控制 | BEGIN, COMMIT, ROLLBACK, SAVEPOINT | 事务管理 |
| 索引 | CREATE INDEX, DROP INDEX, SHOW INDEX | 索引管理 |
| 视图 | CREATE VIEW, ALTER VIEW, DROP VIEW | 视图管理 |
| 存储过程 | CREATE PROCEDURE, CALL, DROP PROCEDURE | 存储过程管理 |
| 触发器 | CREATE TRIGGER, DROP TRIGGER | 触发器管理 |
| 权限管理 | GRANT, REVOKE, CREATE USER | 用户和权限管理 |

相关推荐
又是进步的一天2 小时前
zabbix部署安装
数据库·redis·zabbix
正在走向自律2 小时前
从Oracle到金仓KES:PL/SQL兼容性与高级JSON处理实战解析
数据库·sql·oracle·json·金仓数据库·电科金仓·兼容性挑战
cyhysr2 小时前
oracle的model子句让sql像excel一样灵活
数据库·sql·oracle
熊文豪2 小时前
电科金仓数据库如何支持Oracle风格的PL/SQL操作
数据库·电科金仓·kes
小尧嵌入式2 小时前
Linux的shell命令
linux·运维·服务器·数据库·c++·windows·算法
voltina2 小时前
事务操作流程
数据库
Hello.Reader2 小时前
Flink SQL 模式识别用 MATCH_RECOGNIZE 把 CEP 写成 SQL
sql·flink·知识图谱
antzou3 小时前
嵌入式数据库管理
数据库·办公软件·h2·效率工具
嫂子的姐夫3 小时前
py连接Redis
数据库·redis·爬虫·去重