在日常开发中,数据是系统的核心。无论是电商网站的商品列表,还是社交平台的用户动态,背后都离不开数据库的支持。MySQL 作为最流行的开源关系型数据库之一,它的查询语句(SELECT)是我们获取数据的主要方式。
最简单的查询:从一张表里拿数据
假设你正在维护一个小型博客系统,所有文章都存放在名为 articles 的表中。你想查看所有文章的标题和作者,只需要这样写:
SELECT title, author FROM articles;
这条命令会返回 title 和 author 两列的所有数据。如果你不关心具体字段,只想看全部内容,可以用星号代替:
SELECT * FROM articles;
加条件筛选:只查你需要的数据
现实场景中很少需要查全部数据。比如你只想看某个特定作者的文章,比如“张三”,就可以加上 WHERE 条件:
SELECT title, created_at FROM articles WHERE author = '张三';
还可以组合多个条件。例如,查找“张三”在 2024 年之后发表的文章:
SELECT title FROM articles WHERE author = '张三' AND created_at > '2024-01-01';
模糊查找:关键词搜索很常用
有时候记不清完整信息,比如只知道作者名字里带“伟”。这时候可以用 LIKE 配合通配符:
SELECT * FROM articles WHERE author LIKE '%伟%';
这里的百分号(%)代表任意字符出现任意次数。如果想查以“王”开头的名字,可以写 '王%'。
排序与限制:让结果更有序
查出来的数据默认是按存储顺序排列的,但通常我们希望最新的在前面。加上 ORDER BY 就能实现:
SELECT title, created_at FROM articles ORDER BY created_at DESC;
DESC 表示降序,也就是时间越近排越前。如果想去掉它变成升序,用 ASC 或者直接省略。
当数据量很大时,可能只想看前几条。比如首页只展示最新 5 篇文章:
SELECT title, author FROM articles ORDER BY created_at DESC LIMIT 5;
去重处理:避免重复干扰
如果只是统计有哪些作者写过文章,而不在乎每人写了多少篇,可以用 DISTINCT 去掉重复值:
SELECT DISTINCT author FROM articles;
这样返回的结果里每个作者只会出现一次。
多表联查:跨表获取关联信息
实际项目中数据往往分布在不同表中。比如用户信息在 users 表,文章在 articles 表,通过 user_id 关联。要查出每篇文章及其作者的邮箱,就得用 JOIN:
SELECT a.title, u.email FROM articles a JOIN users u ON a.user_id = u.id;
这里给表起了别名(a 和 u),让语句更简洁。这种内连接(INNER JOIN)只会返回两边都能匹配上的记录。
如果还想包括那些没有对应用户的“孤儿文章”,就得换成左连接:
SELECT a.title, u.email FROM articles a LEFT JOIN users u ON a.user_id = u.id;
这样即使用户不存在,文章也会显示出来,只是邮箱为空。