1. SQL语言分类与MySQL基础操作
作为一名数据库工程师,我经常需要向新人解释SQL语言的分类体系。SQL(Structured Query Language)是关系型数据库的标准查询语言,根据功能不同可分为四大类:
- DDL(Data Definition Language):数据定义语言,用于创建、修改和删除数据库对象
- DML(Data Manipulation Language):数据操作语言,用于增删改数据记录
- DQL(Data Query Language):数据查询语言,专门用于数据查询
- DCL(Data Control Language):数据控制语言,用于权限管理
实际工作中,90%的数据库操作都集中在这四类语句上。掌握它们的区别和使用场景,是数据库开发的入门基础。
2. DDL操作详解
2.1 数据库操作实战
创建数据库时,我强烈建议始终使用IF NOT EXISTS和指定字符集:
sql复制CREATE DATABASE IF NOT EXISTS shop
DEFAULT CHARSET utf8mb4
COLLATE utf8mb4_general_ci;
这里有几个经验点:
- utf8mb4字符集支持完整的Unicode(包括emoji)
- 显式指定排序规则避免后期乱码问题
- IF NOT EXISTS避免重复创建报错
查看数据库时,我常用以下组合命令:
sql复制SHOW DATABASES; -- 查看所有库
SELECT DATABASE(); -- 查看当前使用的库
SHOW CREATE DATABASE shop; -- 查看建库语句
2.2 表操作最佳实践
创建用户表的标准写法:
sql复制CREATE TABLE `user` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`username` varchar(50) NOT NULL COMMENT '用户名',
`phone` varchar(20) COMMENT '手机号',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
几个关键注意点:
- 字段名使用反引号包裹避免关键字冲突
- 主键建议使用自增bigint类型
- 重要字段设置NOT NULL约束
- 为查询字段添加索引(如username)
- 显式指定存储引擎(通常InnoDB)
修改表结构时,ALTER TABLE是最常用的DDL语句:
sql复制-- 添加年龄字段
ALTER TABLE `user` ADD COLUMN `age` tinyint UNSIGNED COMMENT '年龄';
-- 修改字段类型(注意数据兼容性)
ALTER TABLE `user` MODIFY COLUMN `phone` varchar(15);
-- 删除字段(谨慎操作!)
ALTER TABLE `user` DROP COLUMN `age`;
3. MySQL数据类型深度解析
3.1 数值类型选型指南
整型选择建议:
- TINYINT:状态值(0-255)
- SMALLINT:中等范围数值
- INT:常规主键/外键
- BIGINT:大型系统主键
浮点型注意事项:
sql复制-- DECIMAL精确计算示例(财务系统必用)
CREATE TABLE account (
id INT,
balance DECIMAL(10,2) -- 共10位,小数占2位
);
-- 错误示例:使用FLOAT会导致精度丢失
INSERT INTO account VALUES(1, 1234567.89);
SELECT * FROM account; -- 可能显示1234567.88
3.2 字符串类型实战对比
CHAR与VARCHAR的经典选择困境:
sql复制-- CHAR适合定长数据(如身份证号)
`id_card` CHAR(18)
-- VARCHAR适合变长数据(如地址)
`address` VARCHAR(200)
文本类型的选用原则:
- TEXT:普通长文本(文章内容)
- LONGTEXT:超大文本(如电子书)
- BLOB系列:二进制数据(如图片)
3.3 日期类型应用场景
各日期类型的典型用法:
sql复制-- 生日(不需要时间部分)
`birthday` DATE
-- 创建时间(自动记录)
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP
-- 更新时间(自动更新)
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
-- 时间戳(注意2038年问题)
`login_time` TIMESTAMP
4. DML操作全解析
4.1 INSERT语句高级用法
批量插入的优化写法:
sql复制-- 传统写法(效率低)
INSERT INTO user VALUES(1,'张三');
INSERT INTO user VALUES(2,'李四');
-- 优化写法(推荐)
INSERT INTO user VALUES
(1,'张三'),
(2,'李四'),
(3,'王五');
INSERT IGNORE的妙用:
sql复制-- 忽略重复键错误
INSERT IGNORE INTO user VALUES(1,'张三');
4.2 UPDATE更新策略
安全更新模式:
sql复制-- 先查询再更新(防止误操作)
UPDATE user SET phone='13800138000' WHERE id=1 AND username='张三';
-- 使用LIMIT限制影响行数
UPDATE user SET status=0 WHERE age>60 LIMIT 10;
4.3 DELETE删除规范
推荐使用逻辑删除:
sql复制-- 物理删除(不可逆)
DELETE FROM user WHERE id=1;
-- 逻辑删除(推荐)
ALTER TABLE user ADD is_deleted tinyint DEFAULT 0;
UPDATE user SET is_deleted=1 WHERE id=1;
5. DQL查询全攻略
5.1 基础查询优化技巧
字段选择原则:
sql复制-- 避免SELECT *(查询不需要的字段浪费资源)
SELECT id, username FROM user;
-- 使用别名提高可读性
SELECT
u.id AS userId,
u.username AS name
FROM user u;
5.2 条件查询进阶
NULL值处理技巧:
sql复制-- 错误写法(不会返回NULL记录)
SELECT * FROM user WHERE phone=NULL;
-- 正确写法
SELECT * FROM user WHERE phone IS NULL;
日期范围查询:
sql复制-- 查询今天注册的用户
SELECT * FROM user
WHERE create_time >= CURDATE()
AND create_time < DATE_ADD(CURDATE(), INTERVAL 1 DAY);
5.3 聚合函数实战
统计分析的常见场景:
sql复制-- 各年龄段用户数统计
SELECT
FLOOR(age/10)*10 AS age_group,
COUNT(*) AS user_count
FROM user
GROUP BY age_group
HAVING user_count > 5;
5.4 分组查询陷阱
分组查询的常见错误:
sql复制-- 错误示例(select包含非分组字段)
SELECT department, name, AVG(salary)
FROM employee
GROUP BY department;
-- 正确写法
SELECT department, AVG(salary)
FROM employee
GROUP BY department;
5.5 分页查询优化
大数据量分页方案:
sql复制-- 传统分页(数据量大时性能差)
SELECT * FROM user LIMIT 1000000, 10;
-- 优化方案(使用索引覆盖)
SELECT * FROM user WHERE id > 1000000 LIMIT 10;
6. DCL权限管理
6.1 用户管理规范
创建生产环境用户的最佳实践:
sql复制-- 开发人员账号(只读权限)
CREATE USER 'dev_user'@'192.168.1.%'
IDENTIFIED BY 'StrongPassword123!';
-- 应用程序账号(限制权限)
CREATE USER 'app_user'@'10.0.0.%'
IDENTIFIED BY 'AppPassword456!';
6.2 权限控制策略
最小权限原则实施:
sql复制-- 只授予必要权限
GRANT SELECT, INSERT, UPDATE
ON shop.order
TO 'app_user'@'10.0.0.%';
-- 定期回收无用权限
REVOKE DELETE ON shop.* FROM 'old_user'@'%';
权限查看技巧:
sql复制-- 查看自己的权限
SHOW GRANTS;
-- 查看其他用户权限
SHOW GRANTS FOR 'dev_user'@'192.168.1.%';
7. 实际工作中的应用经验
7.1 SQL编写规范
- 关键字全部大写(SELECT, INSERT等)
- 表名、字段名使用反引号包裹
- 缩进对齐多行SQL
- 重要操作添加事务控制
sql复制BEGIN;
UPDATE account SET balance=balance-100 WHERE user_id=1;
UPDATE account SET balance=balance+100 WHERE user_id=2;
COMMIT;
7.2 性能优化要点
- 查询必须使用索引
- 避免全表扫描(WHERE条件优化)
- 限制返回数据量(LIMIT分页)
- 大表操作避开业务高峰
7.3 常见错误排查
- 字符集不一致导致的乱码
- 事务未提交造成的数据不可见
- 隐式类型转换导致的索引失效
- NULL值处理不当引发的逻辑错误
掌握这些SQL核心知识后,配合EXPLAIN分析执行计划,就能解决大部分数据库操作问题。在实际项目中,我建议将常用SQL整理成脚本库,并配合版本管理工具进行维护,这对团队协作和知识传承都大有裨益。