一、基础语法规则
- 关键字不区分大小写(建议大写,提高可读性)
sql
SELECT * FROM users; -- 正确 select * from users; -- 也正确 - 语句以分号(;)结尾
sql
CREATE TABLE students (id INT); -- 结尾需加分号 - 注释
- 单行注释:
-- 这是单行注释或# 这是单行注释(MySQL 支持) - 多行注释:
/* 这是多行注释 */
- 单行注释:
二、数据定义语言(DDL)
用于创建、修改、删除数据库对象(数据库、表、索引等)。
1. 数据库操作
- 创建数据库
sql
CREATE DATABASE IF NOT EXISTS mydb DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci; - 删除数据库
sql
DROP DATABASE IF EXISTS mydb; - 切换数据库
sql
USE mydb;
2. 表操作
-
创建表
sql
CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, age TINYINT, email VARCHAR(100) UNIQUE, create_time DATETIME DEFAULT CURRENT_TIMESTAMP );- 常用数据类型:
- 数值:
INT、BIGINT、FLOAT、DECIMAL(精准计算) - 字符串:
VARCHAR(可变长)、CHAR(定长)、TEXT(长文本) - 日期时间:
DATETIME(含时区)、TIMESTAMP(自动更新) - 枚举 / 集合:
ENUM('男','女')、SET('阅读','运动')
- 数值:
- 常用数据类型:
-
修改表结构
- 添加字段:
sql
ALTER TABLE users ADD COLUMN phone VARCHAR(20) AFTER age; -- AFTER 指定位置 - 修改字段:
sql
ALTER TABLE users MODIFY COLUMN phone VARCHAR(30) NOT NULL; -- 修改类型/约束 ALTER TABLE users CHANGE COLUMN phone tel VARCHAR(30); -- 修改字段名 - 删除字段:
sql
ALTER TABLE users DROP COLUMN tel; - 重命名表:
sql
RENAME TABLE users TO user_info;
- 添加字段:
-
删除表
sql
DROP TABLE IF EXISTS user_info;
3. 索引操作
- 创建索引
sql
CREATE INDEX idx_name ON users(name); -- 普通索引 CREATE UNIQUE INDEX idx_email ON users(email); -- 唯一索引 CREATE FULLTEXT INDEX idx_content ON articles(content); -- 全文索引(用于文本搜索) - 删除索引
sql
DROP INDEX idx_name ON users;
三、数据操作语言(DML)
用于操作表中的数据(增、删、改)。
1. 插入数据
- 单条插入
sql
INSERT INTO users (name, age, email) VALUES ('Alice', 25, 'alice@example.com'); INSERT INTO users VALUES (NULL, 'Bob', 30, 'bob@example.com'); -- 按字段顺序插入,NULL 用于自增字段 - 批量插入
sql
INSERT INTO users (name, age, email) VALUES ('Charlie', 35, 'charlie@example.com'), ('David', 40, 'david@example.com');
2. 更新数据
- 条件更新
sql
UPDATE users SET age = age + 1 WHERE name = 'Alice'; UPDATE users SET email = 'new_alice@example.com' WHERE id = 1; - 全表更新(谨慎使用!)
sql
UPDATE users SET age = 0; -- 无 WHERE 条件会更新所有行
3. 删除数据
- 条件删除
sql
DELETE FROM users WHERE age < 18; - 清空表(比 DELETE 更快,不可回滚)
sql
TRUNCATE TABLE users;
四、数据查询语言(DQL)
核心语法,用于从表中检索数据。
1. SELECT 基本语法
sql
SELECT [DISTINCT] 字段1, 字段2, ... -- DISTINCT 去重
FROM 表名
[WHERE 条件]
[GROUP BY 分组字段 [HAVING 分组后条件]]
[ORDER BY 排序字段 [ASC/DESC]]
[LIMIT 起始行, 行数]; -- 分页,起始行从 0 开始
2. 条件查询(WHERE)
- 比较运算符:
=,<,>,<=,>=,<>(不等于)sql
SELECT * FROM users WHERE age > 30 AND email IS NOT NULL; - 范围查询:
BETWEEN...AND、IN(值列表)、NOT INsql
SELECT * FROM orders WHERE price BETWEEN 100 AND 200; SELECT * FROM users WHERE name IN ('Alice', 'Bob'); - 模糊查询:
LIKE(%匹配任意字符,_匹配单个字符)sql
SELECT * FROM users WHERE email LIKE '%@example.com'; -- 以 @example.com 结尾 SELECT * FROM products WHERE name LIKE '手机_'; -- 名称以“手机”开头,且总长度为3个字 - 空值判断:
IS NULL、IS NOT NULLsql
SELECT * FROM users WHERE phone IS NULL;
3. 分组与聚合(GROUP BY + 聚合函数)
- 常用聚合函数:
COUNT(*):统计行数SUM(字段):求和AVG(字段):平均值MAX(字段)/MIN(字段):最大值 / 最小值
- 示例:
sql
-- 按年龄分组,统计每组人数,且只显示人数>1的组 SELECT age, COUNT(*) AS total FROM users GROUP BY age HAVING total > 1;
4. 排序与分页(ORDER BY + LIMIT)
sql
-- 按年龄降序排列,取前5条数据
SELECT * FROM users
ORDER BY age DESC
LIMIT 0, 5; -- 等价于 LIMIT 5
5. 多表查询
- 内连接(INNER JOIN):返回两表匹配的行
sql
SELECT u.name, o.order_date FROM users u INNER JOIN orders o ON u.id = o.user_id; - 左连接(LEFT JOIN):返回左表所有行,右表匹配不到的行用 NULL 填充
sql
SELECT u.name, o.order_id FROM users u LEFT JOIN orders o ON u.id = o.user_id; - 右连接(RIGHT JOIN):与左连接相反,返回右表所有行
sql
SELECT u.name, o.order_id FROM users u RIGHT JOIN orders o ON u.id = o.user_id; - 子查询:嵌套在查询中的查询
sql
-- 查询购买过商品的用户 SELECT * FROM users WHERE id IN (SELECT DISTINCT user_id FROM orders);
6. 联合查询(UNION)
合并多个 SELECT 结果(去重),字段数和类型需一致。
sql
SELECT name, age FROM users WHERE age > 30
UNION
SELECT name, age FROM users WHERE email LIKE '%@example.com';
五、数据控制语言(DCL)
用于管理用户权限。
1. 用户管理
- 创建用户(指定主机访问权限,如
'user'@'localhost')sql
CREATE USER IF NOT EXISTS 'admin'@'localhost' IDENTIFIED BY 'password123'; - 修改密码
sql
ALTER USER 'admin'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_password'; - 删除用户
sql
DROP USER IF EXISTS 'admin'@'localhost';
2. 权限管理
- 授予权限(权限包括
SELECT,INSERT,UPDATE,DELETE,ALL PRIVILEGES等)sql
GRANT SELECT, INSERT ON mydb.* TO 'user'@'localhost'; -- 授予对 mydb 库所有表的查询和插入权限 GRANT ALL PRIVILEGES ON mydb.* TO 'admin'@'localhost'; -- 授予所有权限 - 回收权限
sql
REVOKE UPDATE ON mydb.users FROM 'user'@'localhost'; -- 回收对 mydb.users 表的更新权限 - 查看权限
sql
SHOW GRANTS FOR 'user'@'localhost';
六、事务控制(Transaction)
用于保证数据的一致性(适用于 Innodb 引擎)。
sql
START TRANSACTION; -- 开始事务
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT; -- 提交事务(所有操作生效)
-- 或 ROLLBACK; -- 回滚事务(撤销所有操作)
七、常用函数
1. 字符串函数
CONCAT(str1, str2):拼接字符串sql
SELECT CONCAT('Hello, ', name) AS greeting FROM users;SUBSTRING(str, start, length):截取子字符串sql
SELECT SUBSTRING(email, 1, INSTR(email, '@')-1) AS username FROM users; -- 提取邮箱前缀TRIM()/LTRIM()/RTRIM():去除首尾 / 左 / 右空格sql
SELECT TRIM(' abc ') AS result; -- 输出 'abc'
2. 日期函数
NOW():获取当前日期时间sql
SELECT NOW(); -- 输出类似 '2023-10-01 12:34:56'DATE_FORMAT(date, format):格式化日期sql
SELECT DATE_FORMAT(create_time, '%Y-%m-%d') AS date FROM orders; -- 格式化为年月日DATEDIFF(date1, date2):计算天数差sql
SELECT DATEDIFF(NOW(), order_date) AS days_since_order FROM orders;
3. 数值函数
ROUND(num, decimals):四舍五入sql
SELECT ROUND(price, 2) AS formatted_price FROM products;ABS(num):绝对值sql
SELECT ABS(-10) AS result; -- 输出 10
八、存储过程与函数
用于封装复杂逻辑,提高复用性。
1. 存储过程(无返回值)
sql
DELIMITER $$ -- 修改分隔符(避免与分号冲突)
CREATE PROCEDURE GetUserByAge(IN min_age INT, OUT total INT)
BEGIN
SELECT * FROM users WHERE age >= min_age;
SELECT COUNT(*) INTO total FROM users WHERE age >= min_age;
END$$
DELIMITER ; -- 恢复默认分隔符
-- 调用存储过程
CALL GetUserByAge(30, @total);
SELECT @total; -- 查看输出参数
2. 自定义函数(有返回值)
sql
DELIMITER $$
CREATE FUNCTION CalculateTax(amount DECIMAL(10,2)) RETURNS DECIMAL(10,2)
BEGIN
RETURN amount * 0.06; -- 假设税率6%
END$$
DELIMITER ;
-- 使用函数
SELECT order_id, amount, CalculateTax(amount) AS tax FROM orders;
九、其他常用操作
- 查看表结构
sql
DESC users; -- 等价于 SHOW COLUMNS FROM users; - 查看数据库 / 表列表
sql
SHOW DATABASES; -- 查看所有数据库 SHOW TABLES; -- 查看当前数据库中的表 - 备份与恢复
- 命令行备份:
bash
mysqldump -u root -p mydb > mydb_backup.sql -- 备份数据库 mysql -u root -p mydb < mydb_backup.sql -- 恢复数据库
- 命令行备份:
注意事项
- 字符集问题:建议使用
utf8mb4字符集(支持 emoji 等特殊字符)。 - 索引优化:避免在低选择性字段(如性别)创建索引,定期分析慢查询(
EXPLAIN SELECT ...)。 - 权限最小化原则:为用户分配最小必要权限,避免安全风险。
1258

被折叠的 条评论
为什么被折叠?



