没有找到匹配的命令
基础 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 在不同数据库中语法不同。