MySQL — 数据查询
介绍
MySQL数据查询是通过结构化查询语言(SQL)从数据库中提取数据的核心操作,其核心指令为SELECT语句。通过SELECT语句可提取指定字段或全部字段的数据,配合WHERE子句实现条件过滤,精准定位符合特定值的记录。多表关联查询依赖JOIN操作(如INNER JOIN、LEFT JOIN),基于共有字段整合数据。聚合函数(如SUM、COUNT、AVG)结合GROUP BY子句可对数据进行分类统计,HAVING子句则用于筛选分组后的结果集。排序功能通过ORDER BY实现,支持升序或降序排列,LIMIT和OFFSET子句控制分页显示。子查询允许嵌套查询逻辑,提升复杂需求的实现效率。为提高查询速度,合理设计索引是关键,避免全表扫描。MySQL还支持联合查询(UNION)、去重(DISTINCT)及正则表达式匹配等高级功能,兼顾灵活性与性能优化,满足从基础检索到复杂数据分析的多层次需求。
基础查询
MySQL基础查询使用SELECT语句,语法为SELECT 字段 FROM 表 WHERE 条件。支持算术、比较和逻辑运算符,可用AND/OR连接条件,ORDER BY排序,LIMIT限制结果数量,LIKE模糊匹配,是数据检索的核心操作。
- SELECT语句:检索数据的基本结构。
- 使用*查询所有列(谨慎使用,建议明确列名)。
SELECT column1, column2 FROM table_name;
-
WHERE子句:过滤符合条件的记录。
-
支持运算符:=, <>, >, <, BETWEEN, LIKE, IN, IS NULL等。
SELECT * FROM users WHERE age > 18 AND country = 'China';
-
DISTINCT去重:
SELECT DISTINCT country FROM users;
排序与分页
MySQL排序使用ORDER BY,可指定字段升序(ASC)或降序(DESC);分页通过LIMIT限制数量,OFFSET设置偏移量,常用于数据分段展示,语法如SELECT ... ORDER BY 字段 LIMIT 数量 OFFSET 偏移。
- ORDER BY:按列排序,支持多列和方向(ASC升序,DESC降序)。
SELECT name, age FROM users ORDER BY age DESC, name ASC;
- LIMIT与分页:
SELECT * FROM products LIMIT 10; -- 前10条SELECT * FROM products LIMIT 10 OFFSET 20; -- 跳过20条,取10条(第3页)
聚合与分组
MySQL聚合查询使用SUM、AVG、MAX、MIN、COUNT等函数统计数据,结合GROUP BY按字段分组,HAVING过滤分组结果,语法如SELECT 字段,COUNT(*) FROM 表 GROUP BY 字段 HAVING 条件,常用于分类汇总统计。
- 聚合函数:COUNT(), SUM(), AVG(), MAX(), MIN()。
SELECT AVG(salary) AS avg_salary FROM employees;
- GROUP BY分组:
SELECT department, COUNT(*) AS emp_count FROM employees GROUP BY department;
- HAVING过滤分组:
SELECT department, AVG(salary) FROM employees GROUP BY department HAVING AVG(salary) > 5000;
多表连接(JOIN)
MySQL多表连接(JOIN)通过关联字段整合数据,常用类型包括INNER JOIN(匹配行)、LEFT JOIN(左表全保留)、RIGHT JOIN和FULL JOIN,语法为表1 JOIN 表2 ON 条件,用于跨表数据关联与分析。
- INNER JOIN:返回两表匹配的行。
SELECT users.name, orders.amount FROM users INNER JOIN orders ON users.id = orders.user_id;
- LEFT/RIGHT JOIN:保留左表/右表所有记录。
SELECT users.name, orders.amount FROM users LEFT JOIN orders ON users.id = orders.user_id;
子查询与联合查询
MySQL子查询将查询嵌套在另一个查询中,用于条件判断(IN/EXISTS)或生成派生表;联合查询(UNION)合并多个SELECT结果,列数需一致且自动去重,适用于复杂数据筛选与结果拼接。
- 子查询:
SELECT name FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 100);
- UNION合并结果:
SELECT name FROM employees UNION SELECT name FROM contractors;
常见注意事项
- NULL处理:使用IS NULL或IS NOT NULL判断。
- 模糊查询:LIKE 'J%'(高效) vs LIKE '%son'(低效)。
- 事务与锁:高并发场景注意隔离级别(如READ COMMITTED)。
总结
MySQL数据查询是数据库操作的核心,主要依赖SELECT语句实现数据检索。基本语法包含SELECT指定列、FROM指定表,可配合WHERE子句设置过滤条件,使用比较运算符(=、>、<)、逻辑运算符(AND、OR、NOT)以及BETWEEN、IN、LIKE等特殊运算符进行精确或模糊匹配。DISTINCT关键字用于去重,AS可为列或表设置别名。聚合函数COUNT、SUM、AVG、MAX、MIN需配合GROUP BY分组使用,HAVING子句对分组结果二次过滤,与WHERE的执行顺序不同。多表查询通过JOIN实现,包括INNER JOIN(返回交集)、LEFT JOIN(左表全保留)、RIGHT JOIN(右表全保留)和FULL JOIN(全外连接)。
子查询分为标量子查询(返回单值)、列子查询(返回单列)和表子查询(返回临时表),常与IN、EXISTS配合使用。排序使用ORDER BY指定列及ASC/DESC方向,分页通过LIMIT偏移量实现。UNION合并多个查询结果并自动去重,UNION ALL保留重复记录。查询执行顺序遵循FROM→WHERE→GROUP BY→HAVING→SELECT→ORDER BY→LIMIT的逻辑流程,理解执行顺序对优化复杂查询至关重要。索引合理使用能显著提升查询效率,避免全表扫描。