1. MySQL基础概述
MySQL作为最流行的开源关系型数据库管理系统之一,自1995年诞生以来已成为Web应用开发的核心基础设施。它采用客户端-服务器架构,使用标准SQL语言进行数据管理,具有高性能、高可靠性和易用性等特点。在最新的8.0版本中,MySQL引入了窗口函数、CTE(公共表表达式)、JSON支持等现代数据库特性,同时保持了与旧版本的兼容性。
关系型数据库的核心特征在于数据以表格形式组织,表与表之间通过主外键关系建立连接。MySQL使用存储引擎机制来处理不同场景下的数据存储需求,其中InnoDB作为默认引擎,支持ACID事务、行级锁定和外键约束,而MyISAM则更适合读密集型场景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. SQL语言分类解析
2.1 DDL(数据定义语言)
DDL用于定义和管理数据库对象的结构,主要包含以下核心指令:
- CREATE:创建数据库对象
sql复制CREATE TABLE employees (
emp_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
hire_date DATE,
salary DECIMAL(10,2) DEFAULT 0,
INDEX idx_name (name)
) ENGINE=InnoDB;
注意:VARCHAR长度应根据实际业务需求设置,过大会浪费存储空间
- ALTER:修改对象结构
sql复制ALTER TABLE employees
ADD COLUMN department VARCHAR(50) AFTER name,
MODIFY COLUMN salary DECIMAL(12,2),
ADD INDEX idx_dept (department);
- DROP:删除数据库对象
sql复制DROP TABLE IF EXISTS temp_employees;
- TRUNCATE:清空表数据
sql复制TRUNCATE TABLE audit_log;
2.2 DML(数据操作语言)
DML用于操作表中的数据记录,主要包括:
- INSERT:插入数据
sql复制INSERT INTO employees (name, department, hire_date, salary)
VALUES ('张三', '研发部', '2020-05-15', 15000),
('李四', '市场部', '2019-11-03', 12000);
- UPDATE:更新数据
sql复制UPDATE employees
SET salary = salary * 1.1
WHERE department = '研发部' AND hire_date < '2021-01-01';
- DELETE:删除数据
sql复制DELETE FROM employees
WHERE emp_id = 100 AND department = '行政部';
- SELECT:查询数据
sql复制SELECT e.name, e.salary, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id
WHERE e.hire_date BETWEEN '2020-01-01' AND '2020-12-31'
ORDER BY e.salary DESC
LIMIT 10;
3. 核心操作实战演示
3.1 数据库创建与管理
创建业务数据库时应考虑字符集和排序规则:
sql复制CREATE DATABASE ecommerce
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
查看数据库属性:
sql复制SHOW CREATE DATABASE ecommerce;
3.2 表设计最佳实践
设计产品表示例:
sql复制CREATE TABLE products (
product_id INT UNSIGNED AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
description TEXT,
price DECIMAL(10,2) UNSIGNED NOT NULL,
stock INT UNSIGNED DEFAULT 0,
category_id INT UNSIGNED,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (product_id),
FOREIGN KEY (category_id) REFERENCES categories(category_id),
INDEX idx_price (price),
INDEX idx_category (category_id)
) ENGINE=InnoDB;
3.3 数据操作技巧
批量插入优化:
sql复制INSERT INTO products (name, price, category_id)
SELECT CONCAT('商品', n), ROUND(RAND()*100, 2), FLOOR(1 + RAND()*10)
FROM (
SELECT 1 AS n UNION SELECT 2 UNION SELECT 3 UNION
SELECT 4 UNION SELECT 5 UNION SELECT 6
) AS numbers;
4. 常见问题解决方案
4.1 字符集乱码问题
确保连接、客户端和服务器字符集一致:
sql复制SHOW VARIABLES LIKE 'character_set%';
SET NAMES utf8mb4;
4.2 性能优化建议
- 为常用查询条件添加索引
- 避免使用SELECT *
- 合理使用EXPLAIN分析查询
- 注意JOIN操作的性能影响
4.3 事务处理示例
银行转账事务实现:
sql复制START TRANSACTION;
UPDATE accounts
SET balance = balance - 1000
WHERE account_id = 'A123' AND balance >= 1000;
UPDATE accounts
SET balance = balance + 1000
WHERE account_id = 'B456';
COMMIT;
5. 高级特性入门
5.1 视图创建与管理
sql复制CREATE VIEW high_value_customers AS
SELECT customer_id, name, SUM(amount) AS total_spent
FROM orders
JOIN customers USING (customer_id)
GROUP BY customer_id
HAVING total_spent > 10000;
5.2 存储过程示例
sql复制DELIMITER //
CREATE PROCEDURE update_salary(IN dept_id INT, IN increase_percent DECIMAL(5,2))
BEGIN
UPDATE employees
SET salary = salary * (1 + increase_percent/100)
WHERE department_id = dept_id;
END //
DELIMITER ;
5.3 触发器应用
sql复制CREATE TRIGGER before_employee_update
BEFORE UPDATE ON employees
FOR EACH ROW
BEGIN
IF NEW.salary < OLD.salary THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '薪资不能降低';
END IF;
END;
