没有找到匹配的命令
基础 SQL
数据库操作
CREATE DATABASE - 创建数据库
CREATE DATABASE database_name;
-- 指定字符集(MySQL)
CREATE DATABASE db_name
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
创建一个新的数据库。建议指定字符集为 utf8mb4 以支持完整的 Unicode 字符。
DROP DATABASE - 删除数据库
DROP DATABASE database_name;
-- 安全删除(如果存在)
DROP DATABASE IF EXISTS db_name;
永久删除数据库及其所有表和数据。此操作不可逆,请谨慎使用。
USE - 切换数据库
USE database_name;
选择要操作的数据库,之后的SQL语句将在该数据库上执行。
SHOW DATABASES - 查看所有数据库
SHOW DATABASES;
-- 模糊匹配
SHOW DATABASES LIKE 'test%';
列出服务器上所有数据库。LIKE 子句可用于模糊搜索。
表操作
CREATE TABLE - 创建表
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
age INT DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- 创建表时指定外键
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
amount DECIMAL(10,2),
FOREIGN KEY (user_id) REFERENCES users(id)
);
定义表名、列名、数据类型和约束。常用约束:PRIMARY KEY、NOT NULL、UNIQUE、DEFAULT、FOREIGN KEY、CHECK。
DROP TABLE - 删除表
DROP TABLE table_name;
-- 安全删除
DROP TABLE IF EXISTS table_name;
删除表及其所有数据。不可逆操作,请谨慎使用。
ALTER TABLE - 修改表结构
-- 添加列
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
-- 修改列类型
ALTER TABLE users MODIFY COLUMN name VARCHAR(100);
-- 删除列
ALTER TABLE users DROP COLUMN phone;
-- 重命名列(MySQL 8.0+)
ALTER TABLE users RENAME COLUMN name TO username;
-- 重命名表
ALTER TABLE users RENAME TO customers;
ALTER TABLE 用于添加、修改或删除列,以及重命名表。
SHOW TABLES - 查看所有表
SHOW TABLES;
-- 模糊匹配
SHOW TABLES LIKE 'user%';
列出当前数据库中的所有表。
DESC / DESCRIBE - 查看表结构
DESC users;
-- 或
DESCRIBE users;
-- 或
SHOW COLUMNS FROM users;
显示表中所有列的名称、类型、是否允许NULL、键信息、默认值等。
INSERT - 插入数据
INSERT INTO - 插入数据
-- 指定列插入
INSERT INTO users (name, email, age)
VALUES ('张三', 'zhangsan@example.com', 25);
-- 省略列名(需插入所有列)
INSERT INTO users
VALUES (NULL, '李四', 'lisi@example.com', 30, NOW());
向表中插入一行或多行数据。建议始终指定列名,避免因表结构变更导致错误。
批量插入 - 一次插入多行
INSERT INTO users (name, email, age) VALUES
('王五', 'wangwu@example.com', 28),
('赵六', 'zhaoliu@example.com', 32),
('孙七', 'sunqi@example.com', 22);
批量插入比逐行插入效率更高,减少与数据库的交互次数。
UPDATE - 更新数据
UPDATE - 更新数据
UPDATE users
SET name = '张三丰'
WHERE id = 1;
更新表中满足条件的行。务必加 WHERE 子句,否则会更新所有行!
多列更新 - 同时更新多个字段
UPDATE users
SET name = '张三丰', age = 35, email = 'zsf@example.com'
WHERE id = 1;
SET 子句中用逗号分隔多个列的赋值。
条件更新 - 基于条件的更新
-- 更新满足条件的行
UPDATE users SET status = 'active' WHERE age > 18;
-- 基于另一个表的值更新
UPDATE orders o
SET status = 'shipped'
WHERE EXISTS (
SELECT 1 FROM shipments s WHERE s.order_id = o.id
);
WHERE 子句决定哪些行会被更新。不加 WHERE 会更新全部行。
DELETE - 删除数据
DELETE - 删除数据
-- 删除指定行
DELETE FROM users WHERE id = 1;
-- 删除满足条件的行
DELETE FROM users WHERE age < 18;
-- 基于子查询删除
DELETE FROM orders
WHERE user_id IN (SELECT id FROM users WHERE status = 'banned');
DELETE 逐行删除并记录日志,可回滚。务必加 WHERE 子句!
TRUNCATE - 清空表
TRUNCATE TABLE users;
快速删除表中所有数据并重置自增ID。比 DELETE 更快,但不记录日志,不可回滚。
SELECT - 基础查询
SELECT - 基本查询
-- 查询所有列
SELECT * FROM users;
-- 查询指定列
SELECT name, email, age FROM users;
-- 使用别名
SELECT name AS 姓名, age AS 年龄 FROM users;
-- 计算列
SELECT name, age * 2 AS double_age FROM users;
SELECT 用于从表中查询数据。避免使用 SELECT *,只查询需要的列以提高性能。
DISTINCT - 去重查询
-- 单列去重
SELECT DISTINCT city FROM users;
-- 多列去重(组合唯一)
SELECT DISTINCT city, province FROM users;
DISTINCT 消除结果中的重复行。多列时,所有指定列的组合唯一才算去重。
WHERE - 条件过滤
SELECT * FROM users WHERE age > 18;
SELECT * FROM users
WHERE age >= 18 AND age <= 30
AND city = '北京';
WHERE 子句用于过滤满足条件的行。支持 =, >, <, >=, <=, <>, !=, AND, OR, NOT 等运算符。
ORDER BY - 排序
-- 升序(默认)
SELECT * FROM users ORDER BY age ASC;
-- 降序
SELECT * FROM users ORDER BY age DESC;
-- 多列排序
SELECT * FROM users ORDER BY city ASC, age DESC;
ASC 升序(默认),DESC 降序。可对多列排序,优先级按书写顺序。
LIMIT - 分页 / 限制行数
-- 取前5条
SELECT * FROM users LIMIT 5;
-- 分页查询(MySQL)
SELECT * FROM users LIMIT 10 OFFSET 20;
-- 等价于
SELECT * FROM users LIMIT 20, 10;
-- SQL Server
SELECT * FROM users ORDER BY id OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
LIMIT 限制返回的行数。OFFSET 指定跳过的行数,常用于分页。
聚合函数
COUNT / SUM / AVG - 计数 / 求和 / 平均
-- 统计行数
SELECT COUNT(*) FROM users;
SELECT COUNT(email) FROM users; -- 不统计NULL
-- 求和
SELECT SUM(amount) FROM orders;
-- 平均值
SELECT AVG(age) FROM users;
COUNT(*) 统计所有行,COUNT(列) 统计该列非NULL的行数。
MAX / MIN - 最大值 / 最小值
SELECT MAX(age) AS max_age FROM users;
SELECT MIN(price) AS min_price FROM products;
返回指定列的最大值和最小值。可用于数值、日期、字符串类型。
GROUP BY - 分组
-- 按城市分组统计人数
SELECT city, COUNT(*) AS count
FROM users
GROUP BY city;
-- 多列分组
SELECT city, status, COUNT(*) AS count
FROM users
GROUP BY city, status;
GROUP BY 将结果按指定列分组,通常与聚合函数配合使用。SELECT 中非聚合列必须出现在 GROUP BY 中。
HAVING - 分组后过滤
-- 查询人数超过5人的城市
SELECT city, COUNT(*) AS count
FROM users
GROUP BY city
HAVING COUNT(*) > 5;
HAVING 用于过滤 GROUP BY 后的结果。WHERE 在分组前过滤行,HAVING 在分组后过滤组。
多表查询
INNER JOIN - 内连接
SELECT u.name, o.amount, o.order_date
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
-- 简写
SELECT u.name, o.amount
FROM users u
JOIN orders o ON u.id = o.user_id;
只返回两表中匹配的行。INNER 可省略,直接写 JOIN 即可。
LEFT JOIN - 左连接
SELECT u.name, o.amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
-- 左连接并过滤右表为NULL的行(找无订单用户)
SELECT u.name
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.id IS NULL;
返回左表所有行,右表无匹配时填充NULL。常用于查找"缺失关联"的数据。
RIGHT JOIN - 右连接
SELECT u.name, o.amount
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;
返回右表所有行,左表无匹配时填充NULL。MySQL 不支持 FULL JOIN,可用 UNION 模拟。
FULL JOIN - 全连接
-- PostgreSQL / SQL Server
SELECT u.name, o.amount
FROM users u
FULL OUTER JOIN orders o ON u.id = o.user_id;
-- MySQL 模拟全连接
SELECT u.name, o.amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
UNION
SELECT u.name, o.amount
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;
返回两表所有行,无匹配时填充NULL。MySQL 不直接支持,需用 UNION 模拟。
UNION - 合并结果集
-- UNION 去重
SELECT name FROM customers
UNION
SELECT name FROM suppliers;
-- UNION ALL 保留重复
SELECT name FROM customers
UNION ALL
SELECT name FROM suppliers;
UNION 合并多个查询结果并去重,UNION ALL 不去重(性能更好)。各查询列数和类型须一致。
子查询
IN 子查询
-- 查询有订单的用户
SELECT * FROM users
WHERE id IN (SELECT DISTINCT user_id FROM orders);
-- NOT IN
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM orders);
IN 子查询用于判断某值是否在子查询结果集中。注意子查询结果含 NULL 时 NOT IN 可能失效。
EXISTS 子查询
-- 查询有订单的用户
SELECT * FROM users u
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);
-- NOT EXISTS
SELECT * FROM users u
WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);
EXISTS 只关心子查询是否返回行,不关心具体值。通常比 IN 性能更好,尤其适合关联子查询。
ANY / ALL 子查询
-- ANY: 满足子查询中任意一个值即可
SELECT * FROM products
WHERE price > ANY (SELECT price FROM promotions);
-- ALL: 必须满足子查询中所有值
SELECT * FROM products
WHERE price > ALL (SELECT price FROM promotions);
-- SOME 与 ANY 等价
SELECT * FROM products
WHERE price > SOME (SELECT price FROM promotions);
ANY 等价于 SOME,表示满足任一条件即可。ALL 表示必须满足所有条件。
条件运算
AND / OR / NOT - 逻辑运算符
-- AND: 所有条件都满足
SELECT * FROM users WHERE age > 18 AND city = '北京';
-- OR: 满足任一条件
SELECT * FROM users WHERE city = '北京' OR city = '上海';
-- NOT: 取反
SELECT * FROM users WHERE NOT city = '北京';
-- 组合使用(注意括号优先级)
SELECT * FROM users
WHERE (city = '北京' OR city = '上海') AND age > 18;
AND 优先级高于 OR,复杂条件建议使用括号明确优先级。
IN - 列表匹配
SELECT * FROM users
WHERE city IN ('北京', '上海', '广州');
SELECT * FROM users
WHERE city NOT IN ('北京', '上海');
IN 等价于多个 OR 的简写形式,用于判断值是否在指定列表中。
BETWEEN - 范围查询
-- 包含边界值
SELECT * FROM users WHERE age BETWEEN 18 AND 30;
-- 日期范围
SELECT * FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31';
-- NOT BETWEEN
SELECT * FROM users WHERE age NOT BETWEEN 18 AND 30;
BETWEEN 包含两端边界值,等价于 age >= 18 AND age <= 30。
LIKE - 模糊匹配
-- 以"张"开头
SELECT * FROM users WHERE name LIKE '张%';
-- 包含"明"
SELECT * FROM users WHERE name LIKE '%明%';
-- 第二个字是"明"
SELECT * FROM users WHERE name LIKE '_明%';
-- NOT LIKE
SELECT * FROM users WHERE name NOT LIKE 'test%';
% 匹配任意多个字符,_ 匹配单个字符。注意 LIKE 只对字符串类型有效。
IS NULL / IS NOT NULL - 空值判断
-- 查询空值
SELECT * FROM users WHERE email IS NULL;
-- 查询非空值
SELECT * FROM users WHERE email IS NOT NULL;
-- 注意:不能用 = NULL 或 != NULL
-- 错误写法:WHERE email = NULL
-- 正确写法:WHERE email IS NULL
NULL 表示未知值,不能用 = 或 != 判断,必须使用 IS NULL / IS NOT NULL。
通配符
% - 百分号通配符
-- 匹配以"张"开头的字符串
LIKE '张%'
-- 匹配以"有限公司"结尾
LIKE '%有限公司'
-- 匹配包含"科技"的字符串
LIKE '%科技%'
% 匹配零个或多个任意字符。是最常用的通配符。
_ - 下划线通配符
-- 匹配恰好3个字符的字符串
LIKE '___'
-- 匹配第二个字符为"a"的字符串
LIKE '_a%'
-- 匹配以"a"开头且恰好4个字符
LIKE 'a___'
_ 匹配恰好一个任意字符。在需要精确控制长度时使用。
[] / [^] - 字符集通配符(SQL Server)
-- 匹配以 a-f 开头
LIKE '[a-f]%'
-- 匹配以元音字母开头
LIKE '[aeiou]%'
-- 匹配不以数字开头
LIKE '[^0-9]%'
-- 匹配包含数字的字符串
LIKE '%[0-9]%'
[] 匹配字符集中的任意一个字符,[^] 匹配不在字符集中的字符。仅 SQL Server 支持。
高级 SQL
索引
CREATE INDEX - 创建索引
-- 普通索引
CREATE INDEX idx_email ON users(email);
-- 唯一索引
CREATE UNIQUE INDEX idx_email ON users(email);
-- 复合索引
CREATE INDEX idx_city_age ON users(city, age);
-- MySQL 语法
ALTER TABLE users ADD INDEX idx_email (email);
ALTER TABLE users ADD UNIQUE INDEX idx_email (email);
索引加速查询但占用存储空间,且会降低写入速度。应在频繁查询的列上创建索引。
DROP INDEX - 删除索引
-- MySQL
DROP INDEX idx_email ON users;
ALTER TABLE users DROP INDEX idx_email;
-- PostgreSQL
DROP INDEX idx_email;
-- SQL Server
DROP INDEX idx_email ON users;
删除不再需要的索引以释放空间和提升写入性能。
查看索引
-- MySQL
SHOW INDEX FROM users;
-- PostgreSQL
SELECT indexname, indexdef
FROM pg_indexes
WHERE tablename = 'users';
-- SQL Server
EXEC sp_helpindex 'users';
查看表上的所有索引信息,包括索引名、列名、类型等。
视图
CREATE VIEW - 创建视图
-- 基本视图
CREATE VIEW user_orders AS
SELECT u.name, u.email, o.amount, o.order_date
FROM users u
JOIN orders o ON u.id = o.user_id;
-- 带条件的视图
CREATE VIEW vip_users AS
SELECT * FROM users
WHERE total_amount > 10000
WITH CHECK OPTION;
视图是虚拟表,基于查询结果。WITH CHECK OPTION 确保通过视图修改的数据仍满足视图条件。
ALTER VIEW - 修改视图
-- MySQL
CREATE OR REPLACE VIEW user_orders AS
SELECT u.name, o.amount
FROM users u
JOIN orders o ON u.id = o.user_id;
-- SQL Server
ALTER VIEW user_orders AS
SELECT u.name, o.amount
FROM users u
JOIN orders o ON u.id = o.user_id;
修改已有视图的定义。MySQL 使用 CREATE OR REPLACE VIEW。
DROP VIEW - 删除视图
DROP VIEW user_orders;
-- 安全删除
DROP VIEW IF EXISTS user_orders;
删除视图定义,不影响底层表的数据。
存储过程
CREATE PROCEDURE - 创建存储过程
DELIMITER //
CREATE PROCEDURE get_user_orders(IN p_user_id INT)
BEGIN
SELECT u.name, o.amount, o.order_date
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.id = p_user_id
ORDER BY o.order_date DESC;
END //
DELIMITER ;
-- 带输出参数
DELIMITER //
CREATE PROCEDURE get_user_count(
IN p_city VARCHAR(50),
OUT p_count INT
)
BEGIN
SELECT COUNT(*) INTO p_count
FROM users WHERE city = p_city;
END //
DELIMITER ;
存储过程是一组预编译的SQL语句,可接受参数。IN 输入参数,OUT 输出参数,INOUT 双向参数。
CALL - 调用存储过程
-- 调用无输出参数的存储过程
CALL get_user_orders(1);
-- 调用带输出参数的存储过程
CALL get_user_count('北京', @count);
SELECT @count;
使用 CALL 调用存储过程。输出参数需要用用户变量接收。
DROP PROCEDURE - 删除存储过程
DROP PROCEDURE get_user_orders;
-- 安全删除
DROP PROCEDURE IF EXISTS get_user_orders;
删除存储过程定义。
事务
BEGIN / COMMIT - 开始和提交事务
-- MySQL
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
-- PostgreSQL / SQL Server
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
事务保证一组操作要么全部成功,要么全部失败。COMMIT 提交事务使更改永久生效。
ROLLBACK - 回滚事务
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- 出现错误,回滚所有操作
ROLLBACK;
ROLLBACK 撤销事务中所有未提交的更改,恢复到事务开始前的状态。
SAVEPOINT - 保存点
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
SAVEPOINT sp1;
UPDATE accounts SET balance = balance + 50 WHERE id = 2;
-- 回滚到保存点,只撤销第二条
ROLLBACK TO SAVEPOINT sp1;
COMMIT;
SAVEPOINT 在事务中设置回滚点,可以部分回滚而不撤销整个事务。
用户权限
CREATE USER - 创建用户
-- MySQL
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password123';
CREATE USER 'newuser'@'%' IDENTIFIED BY 'password123';
-- PostgreSQL
CREATE USER newuser WITH PASSWORD 'password123';
-- SQL Server
CREATE LOGIN newuser WITH PASSWORD = 'password123';
CREATE USER newuser FOR LOGIN newuser;
创建数据库用户。MySQL 需指定主机(localhost 本地,% 任意主机)。
GRANT - 授权
-- MySQL: 授予所有权限
GRANT ALL PRIVILEGES ON database_name.* TO 'user'@'localhost';
-- MySQL: 授予特定权限
GRANT SELECT, INSERT, UPDATE ON database_name.* TO 'user'@'localhost';
-- 刷新权限(MySQL)
FLUSH PRIVILEGES;
-- PostgreSQL
GRANT SELECT, INSERT ON TABLE users TO newuser;
GRANT ALL PRIVILEGES ON DATABASE mydb TO newuser;
GRANT 为用户分配权限。常用权限:SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALL。
REVOKE - 撤销权限
-- MySQL
REVOKE ALL PRIVILEGES ON database_name.* FROM 'user'@'localhost';
REVOKE SELECT, INSERT ON database_name.* FROM 'user'@'localhost';
-- PostgreSQL
REVOKE SELECT, INSERT ON TABLE users FROM newuser;
撤销用户的部分或全部权限。
窗口函数
ROW_NUMBER - 行号
-- 按薪资降序编号
SELECT name, department, salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS rank_num
FROM employees;
-- 按部门内薪资排名
SELECT name, department, salary,
ROW_NUMBER() OVER (
PARTITION BY department
ORDER BY salary DESC
) AS dept_rank
FROM employees;
ROW_NUMBER 为每行分配唯一的序号。PARTITION BY 分组,ORDER BY 排序。即使值相同,序号也不同。
RANK / DENSE_RANK - 排名
SELECT name, department, salary,
RANK() OVER (ORDER BY salary DESC) AS rnk,
DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rnk
FROM employees;
/*
salary=10000: RANK=1, DENSE_RANK=1
salary=10000: RANK=1, DENSE_RANK=1
salary=9000: RANK=3, DENSE_RANK=2 (RANK跳号, DENSE_RANK不跳)
salary=8000: RANK=4, DENSE_RANK=3
*/
RANK 相同值同排名,后续排名跳号。DENSE_RANK 相同值同排名,后续排名不跳号。
LEAD / LAG - 前后行取值
-- LEAD: 取后面第N行的值
SELECT name, salary,
LEAD(salary, 1) OVER (ORDER BY salary DESC) AS next_salary,
LEAD(salary, 2) OVER (ORDER BY salary DESC) AS next2_salary
FROM employees;
-- LAG: 取前面第N行的值
SELECT order_date, amount,
LAG(amount, 1) OVER (ORDER BY order_date) AS prev_amount,
amount - LAG(amount, 1) OVER (ORDER BY order_date) AS diff
FROM orders;
LEAD 向后取值,LAG 向前取值。常用于计算环比、同比、与前后行对比。
CTE
WITH AS - 公共表表达式 (CTE)
-- 基本 CTE
WITH high_value_orders AS (
SELECT user_id, SUM(amount) AS total
FROM orders
GROUP BY user_id
HAVING SUM(amount) > 1000
)
SELECT u.name, h.total
FROM users u
JOIN high_value_orders h ON u.id = h.user_id;
-- 递归 CTE(查询组织架构树)
WITH RECURSIVE org_tree AS (
SELECT id, name, manager_id, 1 AS level
FROM employees WHERE manager_id IS NULL
UNION ALL
SELECT e.id, e.name, e.manager_id, o.level + 1
FROM employees e
JOIN org_tree o ON e.manager_id = o.id
)
SELECT * FROM org_tree ORDER BY level;
CTE 提高复杂查询的可读性,可递归处理树形/层级数据。MySQL 8.0+、PostgreSQL、SQL Server 支持。
常用函数
字符串函数
-- 拼接
CONCAT('Hello', ' ', 'World') -- 'Hello World'
-- 长度
LENGTH('Hello') -- 5
CHAR_LENGTH('你好') -- 2
-- 截取
SUBSTRING('Hello World', 1, 5) -- 'Hello'
LEFT('Hello', 3) -- 'Hel'
RIGHT('Hello', 3) -- 'llo'
-- 查找
INSTR('Hello World', 'World') -- 7
LOCATE('World', 'Hello World') -- 7
-- 替换
REPLACE('Hello World', 'World', 'SQL') -- 'Hello SQL'
-- 大小写
UPPER('hello') -- 'HELLO'
LOWER('HELLO') -- 'hello'
-- 去空格
TRIM(' hello ') -- 'hello'
LTRIM(' hello') -- 'hello'
RTRIM('hello ') -- 'hello'
-- 填充
LPAD('5', 3, '0') -- '005'
RPAD('5', 3, '0') -- '500'
常用字符串处理函数。不同数据库函数名可能略有差异。
日期函数
-- 当前日期时间
NOW() -- 2024-01-15 10:30:00
CURRENT_TIMESTAMP() -- 同上
-- 当前日期 / 时间
CURDATE() -- 2024-01-15
CURTIME() -- 10:30:00
-- 日期差
DATEDIFF('2024-12-31', '2024-01-01') -- 365
-- 日期加减
DATE_ADD('2024-01-01', INTERVAL 30 DAY) -- 2024-01-31
DATE_SUB('2024-01-31', INTERVAL 1 MONTH) -- 2023-12-31
-- 提取部分
YEAR('2024-01-15') -- 2024
MONTH('2024-01-15') -- 1
DAY('2024-01-15') -- 15
DAYOFWEEK('2024-01-15')
-- 格式化
DATE_FORMAT(NOW(), '%Y-%m-%d') -- 2024-01-15
DATE_FORMAT(NOW(), '%Y年%m月%d日')
日期函数用于处理日期时间数据。不同数据库语法有差异,如 PostgreSQL 使用 CURRENT_DATE。
数学函数
ABS(-5) -- 5 (绝对值)
CEIL(4.3) -- 5 (向上取整)
FLOOR(4.7) -- 4 (向下取整)
ROUND(4.567, 2) -- 4.57 (四舍五入)
ROUND(4.567) -- 5 (四舍五入到整数)
TRUNCATE(4.567, 2) -- 4.56 (截断)
MOD(10, 3) -- 1 (取余)
SQRT(16) -- 4 (平方根)
POWER(2, 3) -- 8 (幂运算)
RAND() -- 0~1随机数
常用数学函数,各数据库基本通用。
CAST / CONVERT - 类型转换
-- CAST (通用)
CAST('123' AS INT) -- 123
CAST('2024-01-15' AS DATE) -- 日期
CAST(123.456 AS DECIMAL(10,2)) -- 123.46
CAST(price AS VARCHAR(50))
-- CONVERT (SQL Server)
CONVERT(INT, '123')
CONVERT(VARCHAR(20), GETDATE(), 120)
-- MySQL 特有
CONVERT('123', UNSIGNED INTEGER)
CAST 是 SQL 标准语法,推荐使用。CONVERT 在不同数据库中语法不同。