MySQL的select语法是执行数据查询操作的基础,几乎所有从数据库中获取数据的需求都需要通过它来实现,掌握其用法是数据库操作入门的核心步骤。

select语法的基础结构
最基础的select语法用于从单表中查询指定字段的所有数据,结构非常简单,核心由查询字段和目标表两部分组成。
-- 查询users表中的所有字段数据 SELECT * FROM users; -- 查询users表中的id、name、age三个字段 SELECT id, name, age FROM users;
其中SELECT后面跟的是需要返回的字段名,多个字段用逗号分隔,*表示返回所有字段;FROM后面跟的是要查询的表名。
带条件筛选的select查询
实际使用中很少需要查询所有数据,通常会通过WHERE子句添加筛选条件,只返回符合条件的数据。
-- 查询年龄大于等于18岁的用户 SELECT id, name, age FROM users WHERE age >= 18; -- 查询名字为张三且年龄小于30岁的用户 SELECT * FROM users WHERE name = '张三' AND age < 30; -- 查询年龄是18、20、22岁的用户 SELECT * FROM users WHERE age IN (18, 20, 22); -- 查询名字以张开头的用户 SELECT * FROM users WHERE name LIKE '张%';
条件中可以使用比较运算符(>、<、=、>=、<=、!=)、逻辑运算符(AND、OR、NOT)以及IN、LIKE等关键字实现复杂筛选逻辑。
排序和分页查询
查询结果默认是无序的,我们可以通过ORDER BY对结果进行排序,通过LIMIT实现分页效果。
-- 按年龄升序排序,年龄相同按id降序排序 SELECT id, name, age FROM users ORDER BY age ASC, id DESC; -- 查询前10条数据 SELECT * FROM users LIMIT 10; -- 查询第11到20条数据,即跳过前10条,取10条 SELECT * FROM users LIMIT 10, 10;
ORDER BY后面跟排序字段,ASC表示升序(默认可省略),DESC表示降序;LIMIT的第一个参数是偏移量,第二个参数是返回的记录数。
分组查询与聚合函数
如果需要对数据进行分组统计,会用到GROUP BY子句和聚合函数,常见的聚合函数有COUNT、SUM、AVG、MAX、MIN。
-- 统计每个年龄段的用户数量 SELECT age, COUNT(*) AS user_count FROM users GROUP BY age; -- 查询每个年龄段的最大年龄和平均年龄 SELECT age, MAX(age) AS max_age, AVG(age) AS avg_age FROM users GROUP BY age; -- 筛选用户数量大于5的年龄段 SELECT age, COUNT(*) AS user_count FROM users GROUP BY age HAVING user_count > 5;
注意分组后筛选条件不能用WHERE,需要用HAVING子句,HAVING可以使用聚合函数作为条件。
多表关联查询
当查询的数据分布在多张表中时,需要使用关联查询,常见的有内连接、左连接、右连接。
-- 内连接查询用户和对应的订单信息,只返回两表都匹配的数据 SELECT u.id, u.name, o.order_no, o.amount FROM users u INNER JOIN orders o ON u.id = o.user_id; -- 左连接查询所有用户及其订单信息,没有订单的用户订单字段为NULL SELECT u.id, u.name, o.order_no, o.amount FROM users u LEFT JOIN orders o ON u.id = o.user_id; -- 右连接查询所有订单及其对应的用户信息,没有用户的订单用户字段为NULL SELECT u.id, u.name, o.order_no, o.amount FROM users u RIGHT JOIN orders o ON u.id = o.user_id;
关联查询通过ON指定两表的关联条件,INNER JOIN只返回匹配数据,LEFT JOIN返回左表所有数据和右表匹配数据,RIGHT JOIN返回右表所有数据和左表匹配数据。
select语法的执行顺序
了解select各子句的执行顺序有助于我们正确编写复杂查询,执行顺序如下:
- FROM:确定查询的表
- WHERE:筛选行数据
- GROUP BY:对数据进行分组
- HAVING:筛选分组后的数据
- SELECT:选择返回的字段
- ORDER BY:对结果排序
- LIMIT:限制返回的记录数
这个顺序也解释了为什么WHERE中不能使用聚合函数,而HAVING可以,因为聚合函数是在GROUP BY之后执行的。