4.3 KiB
4.3 KiB
一、数据库操作
-- 创建数据库
CREATE DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 查看数据库
SHOW DATABASES;
-- 选择数据库
USE db_name;
-- 删除数据库
DROP DATABASE db_name;
二、表操作
-- 创建表
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
age INT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 查看表结构
DESC users;
SHOW CREATE TABLE users;
-- 修改表
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
ALTER TABLE users MODIFY COLUMN age TINYINT;
ALTER TABLE users DROP COLUMN phone;
ALTER TABLE users RENAME TO new_users;
-- 删除表
DROP TABLE users;
TRUNCATE TABLE users; -- 清空数据,保留结构
三、数据操作 (CRUD)
INSERT
INSERT INTO users (name, email, age) VALUES ('张三', 'zhangsan@mail.com', 25);
INSERT INTO users (name, email) VALUES ('李四', 'lisi@mail.com'), ('王五', 'wangwu@mail.com');
SELECT
-- 基本查询
SELECT * FROM users;
SELECT name, email FROM users;
-- 条件过滤
SELECT * FROM users WHERE age > 18;
SELECT * FROM users WHERE name LIKE '张%';
SELECT * FROM users WHERE age BETWEEN 18 AND 30;
SELECT * FROM users WHERE id IN (1, 2, 3);
-- 排序
SELECT * FROM users ORDER BY age DESC, name ASC;
-- 分页
SELECT * FROM users LIMIT 10 OFFSET 0; -- 或 LIMIT 0, 10
-- 聚合
SELECT COUNT(*), AVG(age), MAX(age), MIN(age), SUM(age) FROM users;
SELECT age, COUNT(*) FROM users GROUP BY age HAVING COUNT(*) > 1;
-- 去重
SELECT DISTINCT age FROM users;
UPDATE
UPDATE users SET age = 26 WHERE name = '张三';
UPDATE users SET age = age + 1; -- 所有人年龄+1
DELETE
DELETE FROM users WHERE id = 1;
DELETE FROM users; -- 清空表(逐行删除,可回滚)
四、常用约束
| 约束 | 作用 |
|---|---|
PRIMARY KEY |
主键,唯一标识 |
FOREIGN KEY |
外键,关联其他表 |
UNIQUE |
唯一约束 |
NOT NULL |
非空 |
DEFAULT |
默认值 |
CHECK |
检查约束(MySQL 8.0+ 才生效) |
AUTO_INCREMENT |
自增 |
五、JOIN 连表查询
-- INNER JOIN (交集)
SELECT u.name, o.order_no
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
-- LEFT JOIN (左表全部 + 右表匹配)
SELECT u.name, o.order_no
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
-- RIGHT JOIN (右表全部 + 左表匹配)
SELECT u.name, o.order_no
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;
六、索引
-- 创建索引
CREATE INDEX idx_name ON users(name);
CREATE UNIQUE INDEX idx_email ON users(email);
CREATE INDEX idx_name_age ON users(name, age); -- 复合索引
-- 删除索引
DROP INDEX idx_name ON users;
-- 查看索引
SHOW INDEX FROM users;
七、事务
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT; -- 提交
ROLLBACK; -- 回滚
ACID 特性:原子性、一致性、隔离性、持久性。
八、常用函数
-- 字符串
CONCAT('a', 'b'); LENGTH('abc'); UPPER('abc');
SUBSTRING('hello', 1, 2); TRIM(' a ');
-- 时间日期
NOW(); CURDATE(); CURTIME();
DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s');
DATEDIFF('2025-01-01', '2024-01-01');
-- 条件
IF(age >= 18, '成年', '未成年');
CASE WHEN age < 18 THEN '少年' WHEN age < 60 THEN '中年' ELSE '老年' END;
-- 数学
ROUND(1.234, 2); CEIL(1.2); FLOOR(1.9); ABS(-5);
九、子查询
-- WHERE 子查询
SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 100);
-- 标量子查询
SELECT name, (SELECT AVG(age) FROM users) AS avg_age FROM users;
-- EXISTS 子查询
SELECT * FROM users u WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);
十、常用数据类型
| 类型 | 说明 |
|---|---|
INT / TINYINT |
整数 |
BIGINT |
大整数 |
DECIMAL(10,2) |
精确小数(金额用这个) |
VARCHAR(n) |
变长字符串 |
TEXT |
长文本 |
DATE / DATETIME / TIMESTAMP |
日期时间 |
JSON |
JSON 类型(MySQL 5.7+) |
BLOB |
二进制数据 |
快速记忆口诀:INSERT 增,DELETE 删,UPDATE 改,SELECT 查,再加个 JOIN 来连表