SQL 语句使用超详细教程
以下是 MySQL 核心 SQL 语句的速查式教程,所有语句均可直接执行。
一、数据库操作
-- 创建数据库(指定字符集)
CREATE DATABASE IF NOT EXISTS my_database DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 查看所有数据库
SHOW DATABASES;
-- 选择数据库
USE my_database;
-- 查看当前数据库
SELECT DATABASE();
-- 删除数据库
DROP DATABASE IF EXISTS my_database;
二、数据表操作
2.1 创建表
-- 创建用户表(含主键、自增、默认值、时间戳)
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',
username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',
email VARCHAR(100) NOT NULL COMMENT '邮箱',
age TINYINT UNSIGNED DEFAULT 0 COMMENT '年龄',
status ENUM('active', 'inactive') DEFAULT 'active' COMMENT '状态',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
-- 创建订单表(含外键关联用户表)
CREATE TABLE IF NOT EXISTS orders (
order_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '订单ID',
user_id INT NOT NULL COMMENT '用户ID',
order_no VARCHAR(32) NOT NULL UNIQUE COMMENT '订单号',
amount DECIMAL(10,2) NOT NULL COMMENT '金额',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';
2.2 修改表结构
-- 查看所有表
SHOW TABLES;
-- 查看表结构
DESC users;
-- 查看建表语句
SHOW CREATE TABLE users;
-- 修改表名
ALTER TABLE users RENAME TO user_info;
-- 添加字段
ALTER TABLE users ADD COLUMN address VARCHAR(200) AFTER email;
-- 修改字段类型
ALTER TABLE users MODIFY COLUMN age INT UNSIGNED;
-- 修改字段名
ALTER TABLE users CHANGE COLUMN address user_address VARCHAR(200);
-- 删除字段
ALTER TABLE users DROP COLUMN user_address;
-- 删除表
DROP TABLE IF EXISTS orders;
三、数据增删改查
3.1 插入数据
-- 插入单条数据
INSERT INTO users (username, email, age, status) VALUES ('zhangsan', 'zhangsan@example.com', 25, 'active');
-- 批量插入
INSERT INTO users (username, email, age, status) VALUES
('lisi', 'lisi@example.com', 30, 'active'),
('wangwu', 'wangwu@example.com', 28, 'inactive');
-- 插入或更新(主键/唯一键冲突时更新)
INSERT INTO users (username, email, age) VALUES ('zhangsan', 'zhangsan_new@example.com', 26)
ON DUPLICATE KEY UPDATE email = VALUES(email), age = VALUES(age);
3.2 更新数据
-- 更新单条(务必加 WHERE)
UPDATE users SET age = 26, email = 'zhangsan_updated@example.com' WHERE id = 1;
-- 批量更新
UPDATE users SET status = 'inactive' WHERE age > 30;
3.3 删除数据
-- 删除单条(务必加 WHERE)
DELETE FROM users WHERE id = 3;
-- 批量删除
DELETE FROM users WHERE status = 'inactive';
-- 清空全表(保留结构,不可回滚)
TRUNCATE TABLE users;
四、数据查询(SELECT 详解)
4.1 基础查询
-- 查询所有字段
SELECT * FROM users;
-- 查询指定字段
SELECT id, username, email FROM users;
-- 字段别名
SELECT id AS '用户ID', username '用户名' FROM users;
-- 去重查询
SELECT DISTINCT status FROM users;
-- 限制条数
SELECT * FROM users LIMIT 10;
SELECT * FROM users LIMIT 10, 5; -- 从第11条开始取5条
4.2 条件查询
-- 比较运算符
SELECT * FROM users WHERE age = 25;
SELECT * FROM users WHERE age != 30;
-- 逻辑运算符
SELECT * FROM users WHERE age > 20 AND status = 'active';
SELECT * FROM users WHERE age < 22 OR age > 35;
-- 范围查询
SELECT * FROM users WHERE age BETWEEN 25 AND 35;
-- 枚举查询
SELECT * FROM users WHERE age IN (22, 25, 28);
-- 模糊查询(% 任意字符,_ 单个字符)
SELECT * FROM users WHERE username LIKE 'zhang%';
SELECT * FROM users WHERE email LIKE '%@example.com';
-- NULL 查询
SELECT * FROM users WHERE email IS NULL;
4.3 排序与分组
-- 排序(ASC 升序,DESC 降序)
SELECT * FROM users ORDER BY age ASC;
SELECT * FROM users ORDER BY created_at DESC;
-- 分组(配合聚合函数)
SELECT status, COUNT(*) AS '用户数量' FROM users GROUP BY status;
-- 分组后筛选
SELECT status, COUNT(*) AS '用户数量' FROM users GROUP BY status HAVING COUNT(*) > 1;
4.4 聚合函数
-- 计数
SELECT COUNT(*) FROM users;
SELECT COUNT(email) FROM users;
-- 求和
SELECT SUM(age) FROM users WHERE status = 'active';
-- 平均值
SELECT AVG(age) FROM users;
-- 最大值/最小值
SELECT MAX(age) FROM users;
SELECT MIN(age) FROM users;
4.5 关联查询
-- 内连接(只返回匹配记录)
SELECT u.username, o.order_no, o.amount FROM users u
INNER JOIN orders o ON u.id = o.user_id;
-- 左连接(返回左表所有,右表无匹配为 NULL)
SELECT u.username, o.order_no, o.amount FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
-- 右连接(返回右表所有,左表无匹配为 NULL)
SELECT u.username, o.order_no, o.amount FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;
4.6 子查询
-- 作为条件
SELECT * FROM users WHERE id IN (SELECT DISTINCT user_id FROM orders);
-- 作为临时表
SELECT u.username, temp.total_amount FROM users u
LEFT JOIN (
SELECT user_id, SUM(amount) AS total_amount FROM orders GROUP BY user_id
) temp ON u.id = temp.user_id;
五、索引操作
-- 查看索引
SHOW INDEX FROM users;
-- 创建普通索引
CREATE INDEX idx_username ON users(username);
-- 创建唯一索引
CREATE UNIQUE INDEX idx_email ON users(email);
-- 创建复合索引
CREATE INDEX idx_status_age ON users(status, age);
-- 删除索引
DROP INDEX idx_username ON users;
六、事务操作
-- 开启事务
START TRANSACTION;
-- 执行操作(示例:转账)
UPDATE account SET balance = balance - 100 WHERE id = 1;
UPDATE account SET balance = balance + 100 WHERE id = 2;
-- 提交事务
COMMIT;
-- 回滚事务(出错时执行)
ROLLBACK;
七、视图操作
-- 创建视图
CREATE VIEW user_order_view AS
SELECT u.id, u.username, o.order_no, o.amount FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
-- 查询视图
SELECT * FROM user_order_view WHERE amount > 100;
-- 删除视图
DROP VIEW IF EXISTS user_order_view;
八、用户与权限
-- 查看所有用户
SELECT user, host FROM mysql.user;
-- 创建用户
CREATE USER 'test_user'@'%' IDENTIFIED BY '123456';
-- 授权(授予 my_database 所有权限)
GRANT ALL PRIVILEGES ON my_database.* TO 'test_user'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
