欢迎光临本地信息咨询网
详情描述
MySQL 常用语句与函数大全及举例

一、数据定义语句 (DDL)

1. 数据库操作

-- 创建数据库
CREATE DATABASE testdb;
CREATE DATABASE IF NOT EXISTS testdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 查看所有数据库
SHOW DATABASES;

-- 选择数据库
USE testdb;

-- 删除数据库
DROP DATABASE testdb;
DROP DATABASE IF EXISTS testdb;

-- 修改数据库字符集
ALTER DATABASE testdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

2. 表操作

-- 创建表
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL,
    age INT CHECK (age >= 0),
    salary DECIMAL(10,2),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    is_active BOOLEAN DEFAULT TRUE
);

-- 创建带索引的表
CREATE TABLE orders (
    order_id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    amount DECIMAL(10,2),
    order_date DATE,
    INDEX idx_user_id (user_id),
    INDEX idx_order_date (order_date),
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

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

-- 查看创建表的SQL
SHOW CREATE TABLE users;

-- 修改表
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
ALTER TABLE users MODIFY COLUMN email VARCHAR(150);
ALTER TABLE users CHANGE COLUMN phone mobile VARCHAR(15);
ALTER TABLE users DROP COLUMN mobile;
ALTER TABLE users ADD INDEX idx_email (email);

-- 重命名表
RENAME TABLE users TO customers;
ALTER TABLE customers RENAME TO users;

-- 删除表
DROP TABLE users;
DROP TABLE IF EXISTS users;

-- 清空表数据
TRUNCATE TABLE users;

二、数据操作语句 (DML)

1. 插入数据

-- 插入单条记录
INSERT INTO users (username, email, age, salary) 
VALUES ('john', 'john@example.com', 25, 5000.00);

-- 插入多条记录
INSERT INTO users (username, email, age, salary) VALUES
('alice', 'alice@example.com', 30, 6000.00),
('bob', 'bob@example.com', 28, 5500.00),
('charlie', 'charlie@example.com', 35, 7000.00);

-- 插入查询结果
INSERT INTO user_backup (username, email, age)
SELECT username, email, age FROM users WHERE age > 25;

-- 替换数据(存在则替换)
REPLACE INTO users (id, username, email) 
VALUES (1, 'john', 'john_new@example.com');

2. 更新数据

-- 更新所有记录
UPDATE users SET is_active = TRUE;

-- 条件更新
UPDATE users SET salary = salary * 1.1 WHERE age > 30;

-- 更新多个字段
UPDATE users 
SET email = 'new_email@example.com', 
    age = age + 1 
WHERE username = 'john';

-- 使用子查询更新
UPDATE users u
SET salary = (
    SELECT AVG(salary) FROM users WHERE age = u.age
)
WHERE salary < 5000;

3. 删除数据

-- 删除所有记录
DELETE FROM users;

-- 条件删除
DELETE FROM users WHERE age > 60;

-- 删除重复记录(保留id最小的)
DELETE u1 FROM users u1
INNER JOIN users u2 
WHERE u1.id > u2.id 
AND u1.email = u2.email;

三、数据查询语句 (DQL)

1. 基本查询

-- 查询所有列
SELECT * FROM users;

-- 查询特定列
SELECT username, email, age FROM users;

-- 使用别名
SELECT 
    username AS '用户名',
    email AS '邮箱',
    salary * 12 AS '年薪'
FROM users;

-- 去重
SELECT DISTINCT age FROM users;

-- 限制结果
SELECT * FROM users LIMIT 10;
SELECT * FROM users LIMIT 5, 10;  -- 跳过5条,取10条

-- 排序
SELECT * FROM users ORDER BY age DESC;
SELECT * FROM users ORDER BY salary DESC, age ASC;

-- 条件查询
SELECT * FROM users WHERE age >= 18 AND salary > 5000;
SELECT * FROM users WHERE age BETWEEN 20 AND 30;
SELECT * FROM users WHERE username LIKE 'j%';
SELECT * FROM users WHERE email LIKE '%@gmail.com';
SELECT * FROM users WHERE age IN (20, 25, 30);
SELECT * FROM users WHERE email IS NOT NULL;

2. 分组和聚合

-- 基本聚合函数
SELECT 
    COUNT(*) AS '总人数',
    AVG(salary) AS '平均工资',
    MAX(salary) AS '最高工资',
    MIN(salary) AS '最低工资',
    SUM(salary) AS '工资总额'
FROM users;

-- 分组统计
SELECT 
    age,
    COUNT(*) AS '人数',
    AVG(salary) AS '平均工资'
FROM users
GROUP BY age
HAVING COUNT(*) > 5  -- HAVING用于分组后筛选
ORDER BY age;

-- 分组后筛选
SELECT 
    age,
    AVG(salary) AS avg_salary
FROM users
WHERE is_active = TRUE
GROUP BY age
HAVING avg_salary > 5000
ORDER BY age DESC;

3. 连接查询

-- 内连接
SELECT 
    u.username,
    o.order_id,
    o.amount,
    o.order_date
FROM users u
INNER JOIN orders o ON u.id = o.user_id;

-- 左连接
SELECT 
    u.username,
    o.order_id,
    o.amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;

-- 右连接
SELECT 
    u.username,
    o.order_id,
    o.amount
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;

-- 全外连接(MySQL模拟)
SELECT u.username, o.order_id
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
UNION
SELECT u.username, o.order_id
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;

-- 自连接
SELECT 
    e1.username AS '员工',
    e2.username AS '上级'
FROM employees e1
LEFT JOIN employees e2 ON e1.manager_id = e2.id;

4. 子查询

-- WHERE子句中的子查询
SELECT * FROM users 
WHERE salary > (SELECT AVG(salary) FROM users);

-- IN子查询
SELECT * FROM users 
WHERE id IN (SELECT user_id FROM orders WHERE amount > 1000);

-- EXISTS子查询
SELECT * FROM users u
WHERE EXISTS (
    SELECT 1 FROM orders o 
    WHERE o.user_id = u.id AND o.amount > 500
);

-- FROM子句中的子查询(派生表)
SELECT 
    age_group,
    COUNT(*) as user_count
FROM (
    SELECT 
        CASE 
            WHEN age < 20 THEN '青少年'
            WHEN age BETWEEN 20 AND 30 THEN '青年'
            WHEN age BETWEEN 31 AND 50 THEN '中年'
            ELSE '老年'
        END AS age_group
    FROM users
) AS temp
GROUP BY age_group;

5. 集合操作

-- UNION(去重)
SELECT username FROM users WHERE age < 30
UNION
SELECT username FROM users WHERE salary > 5000;

-- UNION ALL(不去重)
SELECT username FROM users WHERE age < 30
UNION ALL
SELECT username FROM users WHERE salary > 5000;

-- INTERSECT(MySQL 8.0+)
SELECT username FROM users WHERE age < 30
INTERSECT
SELECT username FROM users WHERE salary > 5000;

-- EXCEPT(MySQL 8.0+)
SELECT username FROM users WHERE age < 30
EXCEPT
SELECT username FROM users WHERE salary > 5000;

6. 分页查询

-- 传统分页
SELECT * FROM users 
ORDER BY id 
LIMIT 20 OFFSET 40;  -- 第三页,每页20条

-- MySQL 8.0+窗口函数分页
WITH ranked_users AS (
    SELECT 
        *,
        ROW_NUMBER() OVER (ORDER BY salary DESC) AS rn
    FROM users
)
SELECT * FROM ranked_users 
WHERE rn BETWEEN 41 AND 60;

四、常用函数

1. 字符串函数

-- 连接字符串
SELECT CONCAT('Hello', ' ', 'World');  -- 'Hello World'
SELECT CONCAT_WS('-', '2023', '01', '01');  -- '2023-01-01'

-- 字符串长度
SELECT LENGTH('Hello');  -- 5(字节数)
SELECT CHAR_LENGTH('你好');  -- 2(字符数)

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

-- 修剪字符串
SELECT TRIM('  hello  ');  -- 'hello'
SELECT LTRIM('  hello');  -- 'hello'
SELECT RTRIM('hello  ');  -- 'hello'

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

-- 替换
SELECT REPLACE('Hello World', 'World', 'MySQL');  -- 'Hello MySQL'

-- 查找位置
SELECT INSTR('Hello World', 'World');  -- 7
SELECT LOCATE('or', 'Hello World');  -- 8

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

-- 其他
SELECT REVERSE('Hello');  -- 'olleH'
SELECT REPEAT('Ha', 3);  -- 'HaHaHa'
SELECT SPACE(5);  -- '     '

2. 数值函数

-- 基本运算
SELECT ABS(-10);  -- 10
SELECT CEIL(3.14);  -- 4
SELECT FLOOR(3.14);  -- 3
SELECT ROUND(3.14159, 2);  -- 3.14

-- 数学函数
SELECT POWER(2, 3);  -- 8
SELECT SQRT(16);  -- 4
SELECT MOD(10, 3);  -- 1
SELECT RAND();  -- 随机数 0-1
SELECT RAND() * 100;  -- 0-100随机数

-- 符号函数
SELECT SIGN(-10);  -- -1
SELECT SIGN(0);  -- 0
SELECT SIGN(10);  -- 1

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

-- 指数对数
SELECT EXP(1);  -- e ≈ 2.718
SELECT LN(2.718);  -- ≈1
SELECT LOG(10, 100);  -- 2
SELECT LOG10(100);  -- 2

3. 日期时间函数

-- 当前日期时间
SELECT NOW();  -- 2023-01-01 12:00:00
SELECT CURDATE();  -- 2023-01-01
SELECT CURTIME();  -- 12:00:00
SELECT SYSDATE();  -- 系统日期时间

-- 日期提取
SELECT YEAR('2023-01-15');  -- 2023
SELECT MONTH('2023-01-15');  -- 1
SELECT DAY('2023-01-15');  -- 15
SELECT DAYNAME('2023-01-15');  -- 'Sunday'
SELECT DAYOFWEEK('2023-01-15');  -- 1(周日)
SELECT WEEK('2023-01-15');  -- 第几周
SELECT QUARTER('2023-01-15');  -- 1

-- 时间提取
SELECT HOUR('12:30:45');  -- 12
SELECT MINUTE('12:30:45');  -- 30
SELECT SECOND('12:30:45');  -- 45

-- 日期计算
SELECT DATE_ADD('2023-01-01', INTERVAL 7 DAY);  -- 2023-01-08
SELECT DATE_SUB('2023-01-01', INTERVAL 1 MONTH);  -- 2022-12-01
SELECT DATEDIFF('2023-01-15', '2023-01-01');  -- 14
SELECT TIMESTAMPDIFF(DAY, '2023-01-01', '2023-01-15');  -- 14

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

-- UNIX时间戳
SELECT UNIX_TIMESTAMP();  -- 当前时间戳
SELECT FROM_UNIXTIME(1672531200);  -- 2023-01-01 00:00:00

4. 条件函数

-- IF函数
SELECT 
    username,
    salary,
    IF(salary > 5000, '高薪', '普通') AS salary_level
FROM users;

-- CASE WHEN
SELECT 
    username,
    age,
    CASE 
        WHEN age < 18 THEN '未成年'
        WHEN age BETWEEN 18 AND 35 THEN '青年'
        WHEN age BETWEEN 36 AND 60 THEN '中年'
        ELSE '老年'
    END AS age_group
FROM users;

-- IFNULL/NULL处理
SELECT 
    username,
    IFNULL(email, '未填写') AS email,
    COALESCE(email, phone, '无联系方式') AS contact
FROM users;

-- NULLIF
SELECT NULLIF(10, 10);  -- NULL
SELECT NULLIF(10, 20);  -- 10

5. 聚合函数

-- 基本聚合
SELECT 
    COUNT(*) AS total_users,
    COUNT(DISTINCT age) AS distinct_ages,
    AVG(salary) AS avg_salary,
    MAX(salary) AS max_salary,
    MIN(salary) AS min_salary,
    SUM(salary) AS total_salary,
    GROUP_CONCAT(username SEPARATOR ', ') AS user_list
FROM users
GROUP BY age;

-- 统计函数
SELECT 
    STD(salary) AS salary_stddev,
    VARIANCE(salary) AS salary_variance
FROM users;

6. 窗口函数(MySQL 8.0+)

-- 排名函数
SELECT 
    username,
    salary,
    ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num,
    RANK() OVER (ORDER BY salary DESC) AS rank_num,
    DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank,
    NTILE(4) OVER (ORDER BY salary DESC) AS quartile
FROM users;

-- 聚合窗口函数
SELECT 
    username,
    salary,
    AVG(salary) OVER () AS overall_avg,
    AVG(salary) OVER (PARTITION BY age) AS age_group_avg,
    SUM(salary) OVER (ORDER BY salary) AS running_total
FROM users;

-- 位移函数
SELECT 
    username,
    salary,
    LAG(salary) OVER (ORDER BY salary) AS prev_salary,
    LEAD(salary) OVER (ORDER BY salary) AS next_salary,
    FIRST_VALUE(salary) OVER (ORDER BY salary) AS first_salary,
    LAST_VALUE(salary) OVER (ORDER BY salary) AS last_salary
FROM users;

五、事务控制语句

-- 开始事务
START TRANSACTION;
-- 或
BEGIN;

-- 提交事务
COMMIT;

-- 回滚事务
ROLLBACK;

-- 设置保存点
SAVEPOINT savepoint_name;

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

-- 示例
START TRANSACTION;
INSERT INTO users (username, email) VALUES ('test1', 'test1@example.com');
SAVEPOINT sp1;
INSERT INTO users (username, email) VALUES ('test2', 'test2@example.com');
ROLLBACK TO sp1;  -- 回滚第二个插入
COMMIT;  -- 提交第一个插入

六、权限管理语句

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

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

-- 授予权限
GRANT SELECT, INSERT ON database.table TO 'username'@'localhost';
GRANT ALL PRIVILEGES ON database.* TO 'username'@'localhost';
GRANT CREATE USER, GRANT OPTION ON *.* TO 'admin'@'localhost';

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

-- 撤销权限
REVOKE INSERT ON database.table FROM 'username'@'localhost';

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

七、实用技巧示例

1. 分页查询优化

-- 常规分页(大数据量可能慢)
SELECT * FROM users ORDER BY id LIMIT 1000000, 20;

-- 优化分页(使用索引)
SELECT * FROM users 
WHERE id > 1000000 
ORDER BY id 
LIMIT 20;

-- 或使用子查询
SELECT * FROM users 
WHERE id >= (
    SELECT id FROM users ORDER BY id LIMIT 1000000, 1
)
LIMIT 20;

2. 递归查询(MySQL 8.0+)

-- 递归查询组织结构
WITH RECURSIVE org_tree AS (
    -- 锚点成员
    SELECT id, name, parent_id, 1 AS level
    FROM organization
    WHERE parent_id IS NULL

    UNION ALL

    -- 递归成员
    SELECT o.id, o.name, o.parent_id, ot.level + 1
    FROM organization o
    INNER JOIN org_tree ot ON o.parent_id = ot.id
)
SELECT * FROM org_tree ORDER BY level, id;

3. 数据备份与恢复

-- 备份表结构
CREATE TABLE users_backup LIKE users;

-- 备份数据
INSERT INTO users_backup SELECT * FROM users;

-- 快速复制表(包含数据)
CREATE TABLE users_copy AS SELECT * FROM users;

-- 复制表结构(不包含数据)
CREATE TABLE users_structure LIKE users;

4. 性能分析

-- 查看执行计划
EXPLAIN SELECT * FROM users WHERE age > 25;

-- 详细执行计划(MySQL 8.0+)
EXPLAIN ANALYZE SELECT * FROM users WHERE age > 25;

-- 查看索引信息
SHOW INDEX FROM users;

-- 分析表
ANALYZE TABLE users;

-- 优化表
OPTIMIZE TABLE users;

八、JSON函数(MySQL 5.7+)

-- 创建JSON数据
CREATE TABLE products (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    attributes JSON
);

INSERT INTO products VALUES 
(1, 'Laptop', '{"brand": "Dell", "ram": "16GB", "storage": "512GB SSD"}');

-- 查询JSON
SELECT 
    id,
    name,
    attributes->'$.brand' AS brand,
    JSON_EXTRACT(attributes, '$.ram') AS ram
FROM products;

-- 修改JSON
UPDATE products 
SET attributes = JSON_SET(attributes, '$.ram', '32GB')
WHERE id = 1;

-- 检查JSON
SELECT JSON_VALID('{"name": "John"}');  -- 1
SELECT JSON_TYPE(attributes->'$.brand') FROM products;

-- 聚合JSON数组
SELECT 
    JSON_ARRAYAGG(username) AS all_users
FROM users;

这个大全涵盖了MySQL日常开发中最常用的语句和函数。根据具体需求选择合适的语句和函数,可以提高开发效率并优化数据库性能。

相关帖子
在数字时代,衡量一段友谊深度的标准,是否从交心变成了互动数据?
在数字时代,衡量一段友谊深度的标准,是否从交心变成了互动数据?
申领失业保险金是否会影响未来找工作,新单位会知道记录吗?
申领失业保险金是否会影响未来找工作,新单位会知道记录吗?
在社区中发现家传的老家谱或旧书,应该如何进行基础的除尘和保存处理?
在社区中发现家传的老家谱或旧书,应该如何进行基础的除尘和保存处理?
年中离职时,尚未休完的带薪年休假应该如何准确计算与处理?
年中离职时,尚未休完的带薪年休假应该如何准确计算与处理?
未来共享充电行业,在电池技术与充电管理上有哪些趋势?
未来共享充电行业,在电池技术与充电管理上有哪些趋势?
自由职业者或灵活就业人员,是否可以为自己设立交通通讯补贴以降低税负?
自由职业者或灵活就业人员,是否可以为自己设立交通通讯补贴以降低税负?
2026年,社会舆论和年轻人对彩礼“限高”政策的普遍看法是什么?
2026年,社会舆论和年轻人对彩礼“限高”政策的普遍看法是什么?
计算经济补偿金时,工资基数是指应发工资还是实发工资?
计算经济补偿金时,工资基数是指应发工资还是实发工资?
到2026年,社保“第六险”的评估标准是否更加统一和规范了?
到2026年,社保“第六险”的评估标准是否更加统一和规范了?
贷款期间房产信息变更,讲解信息修改及二次抵押备案调整流程
贷款期间房产信息变更,讲解信息修改及二次抵押备案调整流程
从千兆宽带降级到百兆,运营商要求缴纳高额设备调测费是否合理?
从千兆宽带降级到百兆,运营商要求缴纳高额设备调测费是否合理?
2026年新的食品标识规定,是否让预制菜配料表更透明易懂?
2026年新的食品标识规定,是否让预制菜配料表更透明易懂?
智能汽车记录的行车轨迹信息是否属于个人隐私信息范畴
智能汽车记录的行车轨迹信息是否属于个人隐私信息范畴
如何区分是为了实际需求购物,还是为了短暂的情绪抚慰而进行消费?
如何区分是为了实际需求购物,还是为了短暂的情绪抚慰而进行消费?
2026年,企业的加班审批制度如果过于严格,是否会催生更多隐形加班?
2026年,企业的加班审批制度如果过于严格,是否会催生更多隐形加班?
企业内部非正式的社交活动,如何可能加深某些群体的“隐性”排斥感?
企业内部非正式的社交活动,如何可能加深某些群体的“隐性”排斥感?
对于有过敏性鼻炎的人,在特定季节应如何护理以减少鼻子出血风险?
对于有过敏性鼻炎的人,在特定季节应如何护理以减少鼻子出血风险?
小满节气“苦菜秀”的说法从何而来,这种植物背后有哪些有趣的故事与文化?
小满节气“苦菜秀”的说法从何而来,这种植物背后有哪些有趣的故事与文化?
对维修基金的使用情况有疑问,业主可以通过哪些合法途径进行监督?
对维修基金的使用情况有疑问,业主可以通过哪些合法途径进行监督?
2026年国际原油市场价格波动,主要受全球哪些非政治性供需因素影响?
2026年国际原油市场价格波动,主要受全球哪些非政治性供需因素影响?