Files
mengyanote/mengyanote-backend/data/mengyanote/数据库/MySQL/MySQL基础语法总结.md

4.3 KiB
Raw Blame History

一、数据库操作

-- 创建数据库
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 来连表