SQL 查询数据:简单查询数据(SELECT)

本章节将介绍如何简单使用 select 语句的从数据库查询数据。

SELECT 语句

SELECT 是 SQL(结构化查询语言)中最核心、最常用的语句,用于从数据库表中查询数据,是数据查询的基础。它支持简单的单表查询、复杂的多表关联、数据过滤、排序、聚合、分组等操作,几乎所有数据读取场景都离不开 SELECT。

基本语法结构

SELECT 语句的核心语法遵循固定逻辑,从简单到复杂的通用结构如下:

SELECT [DISTINCT] 列名1 [AS 别名1], 列名2 [AS 别名2], ... | *  -- 要查询的列
FROM 表名1 [AS 表别名1]                                        -- 数据来源表
[JOIN 表名2 [AS 表别名2] ON 关联条件]                          -- 多表关联(可选)
[WHERE 过滤条件]                                               -- 行级过滤(可选)
[GROUP BY 分组列1, 分组列2, ...]                               -- 分组聚合(可选)
[HAVING 分组过滤条件]                                          -- 分组后过滤(可选)
[ORDER BY 排序列1 [ASC|DESC], 排序列2 [ASC|DESC], ...]         -- 排序(可选)
[LIMIT 行数 [OFFSET 偏移量]];                                  -- 限制结果行数(可选,不同数据库语法略有差异)

核心子句说明:

  • SELECT  指定要返回的列(或计算字段、聚合函数),* 表示返回所有列

  • FROM  指定数据来源的表(可单表 / 多表)

  • JOIN ... ON  多表关联(如 INNER JOIN、LEFT JOIN 等),建立表之间的关联关系,后续介绍

  • WHERE  过滤行数据,只返回满足条件的行(在分组前过滤)

  • GROUP BY  按指定列分组,通常配合聚合函数(SUM/COUNT/AVG 等)使用

  • HAVING  过滤分组后的结果(分组后过滤,只能用聚合函数或 GROUP BY 列)

  • ORDER BY  按指定列排序,ASC 升序(默认),DESC 降序

  • LIMIT/OFFSET  限制返回的行数(MySQL/SQLite),SQL Server 用 TOP,Oracle 用 ROWNUM

返回单列

我们将从最简单的 SELECT 语句开始介绍,如下:

select name from user

上述语句使用 SELECT 语句从 user 表中查询并返回一个名为 name 的列的数据,输出如下:

name|
----+
张三  |
李四  |
王五  |
赵六  |
孙七  |
周八  |
吴九  |
郑十  |
钱十一 |
孙十二 |

10 row(s) fetched.

注意事项:

(1)未排序:如果自行测试该查询时,数据输出顺序可能与示例不同,这是正常的。未显式排序时,返回数据的顺序无特殊意义,只要行数一致即说明查询正常。

(2)未过滤:上述一条简单的 SELECT 语句将返回 user 表中所有行,数据没有过滤,也没有排序。如果在一张上千万的数据表执行没有过滤条件的语句,将非常慢,可能会导致数据库性能降低。如何过滤将在后续几章详细讨论。

(3)空格的使用:在处理 SQL 语句时,其中所有空格都被忽略。SQL 语句可以在一行上给出,也可以分成许多行。多数  SQL 开发人员认为将 SQL 语句分成多行更容易阅读和调试。例如:

select 
    name 
from user

(4)结束 SQL 语句:多条 SQL 语句必须用分号(;)分隔,单条语句是否需加分号看具体 DBMS,但无论是否必需,加分号都无坏处。

(5)大小写规则:SQL 语句不区分大小写(如 SELECT 和 select 等效),但表名、列名、值的大小写可能受 DBMS / 配置影响。

(6)书写习惯:建议关键字大写、表 / 列名小写,便于代码阅读调试,非强制要求。

返回多列

如果需从单表中查询多个列,仍使用 SELECT 语句,唯一区别是需在 SELECT 关键字后列出多个列名,且列名之间必须用逗号分隔。例如:

select 
    user_id,name,gender,age,phone 
from user

上述语句使用 SELECT 语句从 user 表中查询名为 user_id、name、gender、age 和 phone  的列,输出如下:

user_id|name|gender|age|phone      |
-------+----+------+---+-----------+
      1|张三  |男     | 25|13800138000|
      2|李四  |女     | 30|13800138001|
      3|王五  |男     | 28|13800138002|
      4|赵六  |女     | 22|13800138003|
      5|孙七  |男     | 35|13800138004|
      6|周八  |女     | 27|13800138005|
      7|吴九  |      | 32|13800138006|
      8|郑十  |女     | 29|13800138007|
      9|钱十一 |男     | 24|13800138008|
     10|孙十二 |女     | 31|13800138009|

10 row(s) fetched.

注意:select 语句选择多列时,列名之间使用逗号(,)分隔,但最后一个列名后绝对不能加逗号 —— 若在最后一列的后面额外添加逗号,会直接导致语句执行报错。错误信息如下:

SQL 错误 [1064] [42000]: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from user' at line 3

返回所有列

SELECT 语句除了指定具体列名(一个或多个)外,也可通过通配符 * 检索表中所有列,无需逐个列出列名,例如:

select * from user

上述语句使用 SELECT 语句从 user 表中返回所有列的数据。输出如下:

user_id|name|gender|age|phone      |email                |address        |create_time        |update_time        |
-------+----+------+---+-----------+---------------------+---------------+-------------------+-------------------+
      1|张三  |男     | 25|13800138000|zhangsan@example.com |北京市朝阳区建国路88号   |2025-01-24 02:41:00|2025-12-24 14:44:13|
      2|李四  |女     | 30|13800138001|lisi@example.com     |上海市浦东新区张江路100号 |2025-01-18 14:22:00|2025-12-24 14:44:13|
      3|王五  |男     | 28|13800138002|wangwu@example.com   |广州市天河区天河路385号  |2025-01-19 15:49:00|2025-12-24 14:44:13|
      4|赵六  |女     | 22|13800138003|zhaoliu@example.com  |深圳市南山区科技园10号   |2025-01-11 11:56:00|2025-12-24 14:44:13|
      5|孙七  |男     | 35|13800138004|                     |杭州市西湖区西湖路58号   |2025-01-27 12:17:00|2025-12-24 14:44:13|
      6|周八  |女     | 27|13800138005|zhouba@example.com   |成都市武侯区武侯祠大街231号|2025-01-12 01:37:00|2025-12-24 14:44:13|
      7|吴九  |      | 32|13800138006|wujiu@example.com    |重庆市渝中区解放碑路18号  |2025-01-06 19:15:00|2025-12-24 14:44:13|
      8|郑十  |女     | 29|13800138007|zhengshi@example.com |武汉市武昌区中南路99号   |2025-01-26 19:22:00|2025-12-24 14:44:13|
      9|钱十一 |男     | 24|13800138008|qianshiyi@example.com|西安市雁塔区雁塔路15号   |2025-01-22 15:08:00|2025-12-24 14:44:13|
     10|孙十二 |女     | 31|13800138009|                     |南京市玄武区玄武湖路78号  |2025-01-01 17:34:00|2025-12-24 14:44:13|

10 row(s) fetched.

注意,返回列的顺序通常与表定义的物理顺序一致(但非绝对),不过这一般不会造成影响 —— 因为数据通常会交由应用程序按需格式化展示。

通配符(*)的使用建议:

  • 非必要时尽量不使用:虽可省去列名列举的麻烦,但返回无关列会降低查询和应用程序性能。

  • 优势场景:通配符 * 可以返回名称未知的列,适合需获取全量列但列名不明确的情况。

  

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号