MySQL表操作:数据新增与查询详解
一、数据新增(Create)操作详解
1.1 INSERT 基础语法
数据插入是数据库操作的基础,MySQL 提供了标准的 INSERT 语句实现数据写入。基本语法结构如下:
INSERT INTO table_name (column1, column2,...)
VALUES (value1, value2,...);
字段列表注意事项:
- 字段顺序不需要与表结构完全一致
- 可以省略自增主键字段
- 允许只插入部分字段(非空字段必须包含)
- 字段名严格区分大小写(建议全小写)
值列表规范:
- 值顺序必须与字段列表严格对应
- 字符串类型必须使用单引号包裹
- 日期类型推荐使用标准格式'YYYY-MM-DD'
- NULL值需要显式声明
1.2 完整字段插入示例
当需要插入所有字段数据时,可以省略字段列表:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
department VARCHAR(20) DEFAULT 'General',
salary DECIMAL(10,2),
hire_date DATE
);
-- 完整字段插入
INSERT INTO employees
VALUES (DEFAULT, '张三', '技术部', 15000.00, '2023-01-15');
自增主键处理技巧:
- 使用 DEFAULT 关键字自动生成
- 显式设置 NULL 值(需确保字段允许自增)
- 完全省略字段和对应的值
1.3 批量插入优化方案
MySQL 支持单次插入多行数据,显著提升写入效率:
INSERT INTO employees (name, department, salary, hire_date)
VALUES
('李四', '市场部', 12000.50, '2023-02-01'),
('王五', '财务部', 13500.00, '2023-03-15'),
('赵六', DEFAULT, 11000.00, CURDATE());
批量插入优势:
- 减少网络传输开销
- 降低SQL解析次数
- 事务提交次数优化
- 整体执行时间缩短
1.4 特殊插入方式
1.4.1 插入查询结果
将SELECT查询结果直接插入到目标表:
INSERT INTO employee_archive
SELECT * FROM employees
WHERE hire_date < '2020-01-01';
1.4.2 替代插入语法
使用SET子句进行插入:
INSERT INTO employees
SET name = '陈七',
department = '人事部',
salary = 12500.00,
hire_date = '2023-04-01';
1.5 插入冲突处理
处理主键或唯一索引冲突:
-- 忽略冲突
INSERT IGNORE INTO employees (...) VALUES (...);
-- 更新冲突记录
INSERT INTO employees (...)
VALUES (...)
ON DUPLICATE KEY UPDATE
salary = VALUES(salary),
update_time = NOW();
冲突处理策略对比:
方式 | 特点 | 适用场景 |
---|---|---|
INSERT IGNORE | 静默跳过冲突记录 | 批量插入容忍部分失败 |
ON DUPLICATE UPDATE | 更新已有记录 | 需要维护最新数据 |
REPLACE INTO | 先删除旧记录再插入新数据 | 需要完全替换记录 |
二、数据查询(Retrieve)全面解析
2.1 基础查询结构
SELECT 语句基本格式:
SELECT [DISTINCT] column1, column2...
FROM table_name
[WHERE condition]
[ORDER BY column [ASC|DESC]]
[LIMIT count];
2.2 字段选择方案
2.2.1 全字段查询
SELECT * FROM employees;
2.2.2 指定字段查询
SELECT name, department, hire_date FROM employees;
2.2.3 字段别名设置
SELECT
name AS 姓名,
salary * 12 AS 年薪,
DATEDIFF(NOW(), hire_date) AS 在职天数
FROM employees;
2.3 条件查询(WHERE)
2.3.1 比较运算符
-- 数值比较
SELECT * FROM employees WHERE salary > 10000;
-- 日期范围
SELECT * FROM employees
WHERE hire_date BETWEEN '2023-01-01' AND '2023-06-30';
-- 空值判断
SELECT * FROM employees WHERE department IS NULL;
2.3.2 逻辑运算符组合
SELECT * FROM employees
WHERE (department = '技术部' OR salary > 13000)
AND hire_date >= '2023-01-01';
2.3.3 模糊查询
-- % 表示任意多个字符
SELECT * FROM employees WHERE name LIKE '张%';
-- _ 表示单个字符
SELECT * FROM employees WHERE name LIKE '_三';
-- 转义特殊字符
SELECT * FROM employees WHERE name LIKE '100\%';
2.4 结果排序(ORDER BY)
2.4.1 单字段排序
SELECT * FROM employees
ORDER BY hire_date DESC;
2.4.2 多字段排序
SELECT * FROM employees
ORDER BY department ASC, salary DESC;
2.4.3 自定义排序
SELECT * FROM employees
ORDER BY
CASE department
WHEN '技术部' THEN 1
WHEN '市场部' THEN 2
ELSE 3
END;
2.5 分页查询(LIMIT)
2.5.1 基础分页
-- 前5条记录
SELECT * FROM employees LIMIT 5;
-- 跳过前10条取5条
SELECT * FROM employees LIMIT 10, 5;
2.5.2 现代分页语法
SELECT * FROM employees
LIMIT 5 OFFSET 10;
2.5.3 分页性能优化
-- 使用索引覆盖优化
SELECT id FROM employees
ORDER BY hire_date
LIMIT 10000, 20;
-- 然后通过主键获取完整数据
SELECT * FROM employees
WHERE id IN (上述查询结果);
2.6 结果去重(DISTINCT)
2.6.1 单字段去重
SELECT DISTINCT department FROM employees;
2.6.2 多字段去重
SELECT DISTINCT department, YEAR(hire_date)
FROM employees;
2.6.3 聚合函数去重
SELECT COUNT(DISTINCT department) AS dept_count
FROM employees;
2.7 条件分支(CASE)
SELECT
name,
salary,
CASE
WHEN salary > 15000 THEN '高收入'
WHEN salary BETWEEN 10000 AND 15000 THEN '中等收入'
ELSE '基础收入'
END AS income_level
FROM employees;
2.8 JSON格式输出
SELECT JSON_OBJECT(
'id', id,
'name', name,
'department', department
) AS employee_json
FROM employees
LIMIT 3;
(注:由于篇幅限制,此处展示核心内容,实际文章包含更多详细示例和解释)
正文到此结束
相关文章
热门推荐
评论插件初始化中...