是关于MySQL数据库常用SQL语句的详细说明,涵盖数据定义、操作和控制功能,并附示例与注意事项:
数据定义语言(DDL)
主要用于创建或修改数据库结构,包括库/表/索引等对象的管理。
功能 | 语法示例 | 说明 |
---|---|---|
创建数据库 | CREATE DATABASE db_name; |
若不存在则新建指定名称的数据库;可添加字符集参数如DEFAULT CHARSET utf8mb4 。 |
删除数据库 | DROP DATABASE db_name; |
直接移除整个数据库及其所有内容,需谨慎操作。 |
使用数据库 | USE db_name; |
切换当前连接上下文至目标数据库,后续操作默认作用于该库。 |
创建数据表 | CREATE TABLE tbl_name (col1 type constraints, col2 type...); |
定义字段名、数据类型及约束条件(如NOT NULL、AUTO_INCREMENT)。CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL); |
修改表结构 | ALTER TABLE tbl_name ADD COLUMN new_col type; 或CHANGE COLUMN old_col new_col type; |
支持增减字段、调整类型或属性,适用于迭代开发中的模式变更。 |
删除数据表 | DROP TABLE tbl_name; |
彻底删除指定表及其关联的数据和索引。 |
查看表结构 | DESCRIBE tbl_name; / SHOW COLUMNS FROM tbl_name; |
快速获取字段信息,包括数据类型、是否允许NULL值及键类型。 |
数据操纵语言(DML)
用于对表中的数据进行增删改查操作。
插入记录
- 单条插入:
INSERT INTO table_name (col1, col2) VALUES (val1, val2);
示例:INSERT INTO employees (employee_id, first_name, hire_date) VALUES (1001, 'John', '2025-09-08');
- 批量导入:通过逗号分隔多组值实现高效批量加载,如:
INSERT INTO products (code, price) VALUES (‘A001’, 99.99), (‘B002’, 199.99);
- 默认值处理:省略某些列时自动填充预设的DEFAULT值(需提前在建表时设置)。
更新数据
使用UPDATE
配合SET
子句修改现有记录:UPDATE orders SET status = 'shipped' WHERE order_id = 12345;
⚠️注意:始终建议添加WHERE
条件避免全表误更新;若需测试影响范围,可先执行不带WHERE
的查询验证匹配行数。
删除记录
- 精确删除:
DELETE FROM customers WHERE last_login < '2024-01-01';
- 清空全表:慎用无过滤条件的
DELETE FROM table_name;
(可用TRUNCATE TABLE
替代以提升性能)。
查询数据
核心为SELECT
语句,灵活组合以下要素实现复杂检索:
SELECT column1 AS alias1, func(column2) AS metric_name -投影与计算列 FROM joined_tables -多表连接 WHERE filter_conditions -行级过滤 GROUP BY grouping_columns HAVING aggregate_thresholds -分组聚合后二次筛选 ORDER BY sorting_criteria LIMIT offset, count; -排序与分页控制
典型场景示例:统计各部门平均工资并按降序排列前5名:
SELECT dept_id, AVG(salary) as avg_wage FROM employee_records GROUP BY dept_id HAVING avg_wage > 5000 ORDER BY avg_wage DESC LIMIT 5;
事务控制与索引优化
事务完整性保障
显式开启事务确保原子性操作:
START TRANSACTION; -开始事务 -执行多个相关联的DML操作 COMMIT; -提交更改 -若出错则回滚:ROLLBACK;
关键特性:当中间某步失败时,整个事务内的所有修改都会被撤销,保证数据一致性。
索引策略设计
合理创建索引可显著加速查询性能:
- 单列索引:
CREATE INDEX idx_user_email ON users(email);
- 复合索引:针对高频联合查询建立多字段组合索引,如
CREATE INDEX idx_order_date_status ON orders(create_time, status);
- 唯一约束型索引:既保证数据唯一性又优化查找效率,例如用户手机号的唯一校验。
高级技巧扩展
视图封装复杂逻辑
将常用但复杂的多表关联查询封装为虚拟表:
CREATE VIEW active_customers AS SELECT u.id, u.name, o.total_amount FROM users u JOIN (SELECT user_id, SUM(amount) as total_amount FROM transactions GROUP BY user_id) o ON u.id = o.user_id WHERE u.last_activity > NOW() INTERVAL 30 DAY;
后续可直接像普通表一样访问该视图,简化业务层代码。
存储过程自动化流程
定义可重用的程序化逻辑块:
DELIMITER // CREATE PROCEDURE calculate_bonus(IN empId INT, OUT bonusAmt DECIMAL(10,2)) BEGIN DECLARE baseSalary DECIMAL(10,2); SELECT salary INTO baseSalary FROM employees WHERE id = empId; SET bonusAmt = baseSalary 0.15; -根据薪资计算奖金系数 END // DELIMITER ;
调用方式:CALL calculate_bonus(1001, @result); SELECT @result;
相关问答FAQs
Q1: 如何安全地备份一个即将删除的表结构和数据?
A: 可采用两步法:①使用CREATE TABLE backup_table LIKE original_table;
复制结构;②执行INSERT INTO backup_table SELECT FROM original_table;
迁移全部数据,此方法比单纯导出SQL更高效且保留注释等信息。
Q2: 为什么有时相同的SQL在不同环境中执行结果不一致?
A: 主要受三大因素影响:①字符集差异导致字符串比较异常;②SQL Mode设置不同(如是否启用ONLY_FULL_GROUP_BY);③时区配置影响时间类型字段的处理,建议统一配置SET NAMES utf8mb4;
并在连接参数中指定明确的时
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/130867.html