当前位置: 首页 > news >正文

SQL学习日志 Day_3 :(SELECT查询语句入门)

一、开篇:SELECT 语句的定义与重要性

SELECT 语句是结构化查询语言中使用频率最高的一条命令,它的核心职责是从数据库的表中检索数据。无论多复杂的业务系统,最终呈现在用户面前的信息,几乎都离不开 SELECT 语句的幕后工作。当我们在浏览器中看到商品列表、订单详情、用户信息时,背后都是数据库执行了一条或多条 SELECT 查询,将结果返回给后端程序再渲染成页面。理解 SELECT 的工作原理,是掌握 SQL 的第一步,也是最为关键的一步。

SELECT 语句执行后会生成一个临时的数据集合,这个集合被称为结果集。结果集本身并不是数据库中真实存在的表,而是在内存中动态构建的一张虚拟表格。它的结构和普通数据表一致,由行和列组成,拥有相同的二维网格形态。概念上可以把结果集理解为原表经过条件筛选和列过滤后产生的一个子集快照,查询结束即消失。对于初学者而言,理解结果集的临时性有助于后续学习子查询、视图以及临时表等进阶概念。

在开始查询之前,我们需要确保当前会话已经选定了正确的数据库。USE 语句用于切换数据库上下文,它告诉 MySQL 服务后续的所有操作默认作用于哪一个数据库。如果之前已经执行过 USE RUNOOB 并且没有关闭查询窗口,则无需重复执行。但如果你重新打开了一个查询窗口或者连接曾中断重连,则需要再次执行 USE 语句,或直接在表名前加上数据库名称作为前缀。

USERUNOOB;

这条语句执行后,MySQL 会将 RUNOOB 设置为当前会话的默认数据库。后续执行的 SELECT、INSERT、UPDATE 等操作如果没有显式指定数据库名称,都将自动作用于 RUNOOB。这是一种会话级别的设置,不同查询窗口之间的 USE 设置互相独立,互不干扰。

二、SELECT 基本语法:两种查询形式的对比

SELECT 语句有两种基本写法。第一种是指定列查询,在 SELECT 关键字后面逐一列出需要返回的字段名称,多个字段之间用英文逗号分隔。第二种是使用星号通配符代替列名,代表查询表中的所有列。两种写法各有适用场景,指定列查询常用于正式的业务代码,而星号查询多用于调试和快速探索数据结构。

当我们需要从 Websites 表中获取所有网站的名称和所属国家时,可以采用指定列的查询方式,明确写出 name 和 country 两个字段名,让返回的结果集只包含这两列数据,屏蔽掉不需要的 id、url 和 alexa 字段。

SELECTname,countryFROMWebsites;

这条语句的执行逻辑是数据库先定位到 Websites 表,然后逐行读取数据,但只提取 name 和 country 两个列的值,其他列直接忽略。最终返回的结果集是一个只有两列的表格,列的顺序与 SELECT 后面的书写顺序完全一致,而非建表时定义的字段顺序。这种按需取列的做法在实际开发中非常重要,因为它能减少网络传输的数据量,同时让代码意图更加清晰,阅读代码的人一眼就能知道这段查询在获取什么信息。

三、SELECT * 实例:全列查询的使用场景与注意事项

使用星号查询是初学者最常接触的 SELECT 形式,它的写法简单直观,一条语句就能把整张表的数据全部展示出来。在学习和调试阶段,星号查询帮助我们快速了解一张表有哪些列、存储了什么数据,是探索陌生数据库结构的得力工具。但星号查询也有其局限性,在生产环境的应用程序代码中通常不建议使用,因为这会导致返回不必要的列,浪费数据库服务器的 I/O 资源和网络带宽。

下面的查询语句将 Websites 表中的所有记录和所有列一次性取出,结果集会完整复现建表时定义的五个字段以及对应的五行数据。

SELECT*FROMWebsites;

这条语句中的星号是一个通配符,代表表中的每一列。数据库在执行时会自动将星号展开为建表时定义的所有列名,按照表的原始列顺序返回。执行后我们看到的结果集中,id 列在最前,其后依次是 name、url、alexa 和 country,这个顺序和创建 Websites 表时定义的字段顺序保持一致。星号查询的优势在于快捷,劣势在于不可控。如果表结构后续被修改,增加了新的列,星号查询的返回结果也会跟着变化,可能导致依赖固定列顺序的后端程序出现错误。

四、演示数据库:RUNOOB 示例数据回顾

本章的 SELECT 语句练习全部基于 RUNOOB 数据库中的 Websites 表进行。这张表的设计非常简洁,只有五个字段,分别是 id、name、url、alexa 和 country,存储了五条全球知名网站的示例数据。在继续深入学习更多查询技巧之前,我们需要再次确认这张表的数据是完整且正确的,确保后续每一次查询的结果都有据可依。

我们可以用已经学过的全列查询语句来验证当前表中的数据状态,确认五条网站记录是否都还存在,各列的值是否与预期一致。

SELECT*FROMWebsites;

执行后得到的结果表格中,第一行是 Google 的数据,id 为 1,alexa 排名为 1,country 为 USA。第二行是淘宝,第三行是菜鸟教程,第四行是微博,这三条记录的 country 都是 CN。第五行是 Facebook,country 为 USA。这个数据集合将成为后续所有 SELECT 变式练习的基础。如果在之前的练习中执行过 DELETE 或 UPDATE 操作,导致数据发生了变化,可以通过重新执行 INSERT 语句来恢复原始数据,保证练习环境的一致性。

五、SELECT Column 深入理解:列的选择与顺序控制

指定列查询不仅仅是简单地少写几列,它背后蕴含着 SQL 查询优化的思想。数据库系统在处理查询时,只返回我们指定的列,意味着它可以从磁盘上只读取那些列的值,跳过无关列的数据块。在列数众多、数据量庞大的生产环境中,合理选择返回的列能够显著提升查询性能。此外,指定列查询也让结果集的结构变得可预测,无论表结构如何变化,只要指定的列还在,返回的列数和列序就不会变。

当我们只需要网站的排名信息和名称时,可以同时查询 alexa 和 name 这两列,而不必把 url 和 country 也带出来。列的排列顺序完全由 SELECT 后面的书写顺序决定,把 alexa 写在前面,结果集中 alexa 就会出现在第一列。

SELECTalexa,nameFROMWebsites;

这条语句的执行结果中,alexa 列排在左侧,name 列排在右侧。这个顺序可以任意调换,如果我们把 name 写在前面,那么 name 就会成为结果集的第一列。这种灵活性意味着我们可以在查询层面直接完成数据列的重排,而不需要等到数据返回应用程序后再做处理。在生成报表、导出数据等场景中,合理利用 SELECT 的列顺序控制,可以省去很多后处理的工作量。

六、结果集的概念与导航机制

结果集是 SELECT 语句执行后在内存中生成的临时数据表。它虽然在外观上和普通数据库表没有区别,同样由行和列构成,但它并不存储在磁盘上,查询结束、连接关闭后结果集也随之销毁。对于应用程序开发者而言,理解结果集的游标导航机制是编写数据库交互代码的基础。大多数数据库编程接口都提供了在结果集中逐行移动的功能,允许开发者从第一行开始,依次读取每一行的数据,直到所有行处理完毕。

以 Websites 表为例,当我们执行 SELECT 查询后,结果集中会包含满足条件的若干行数据,应用程序可以通过编程语言提供的数据库函数在结果集上执行移动和读取操作。

SELECTname,urlFROMWebsitesWHEREcountry='CN';

这条查询会返回三行数据,对应淘宝、菜鸟教程和微博。在程序代码中,通常使用循环结构配合游标函数来逐行处理这个结果集。首先调用 Move-To-First-Record 将指针定位到第一行,然后调用 Get-Record-Content 读取当前行的 name 和 url 值,接着调用 Move-To-Next-Record 将指针移到下一行,如此反复直到所有行都处理完毕。不同编程语言的数据库驱动对这些函数的封装方式不同,但底层原理都是一致的,都是基于结果集的游标导航模型。

七、SELECT 与 USE 的关系:每次都需要输入吗

初学者在练习过程中经常遇到一个困惑:为什么有时候不输入 USE 语句也能正常查询,有时候却提示找不到表。这个问题的答案在于 MySQL 的会话机制。每个数据库连接都维护着一个当前数据库的上下文变量,USE 语句的作用就是修改这个变量的值。只要连接不断开、查询窗口不关闭,之前设置的当前数据库就会一直保持有效。但连接一旦中断或打开了新的窗口,上下文变量会被重置,就需要重新执行 USE 或者采用显式指定数据库名的方式来查询。

在 MySQL Workbench 中,还可以通过双击左侧导航栏中的数据库名称来快速切换当前数据库,其效果等同于执行 USE 语句,操作更加便捷直观。

SELECT*FROMRUNOOB.Websites;

这种写法在表名前面加上了数据库名称作为前缀,两个名称之间用点号连接。它的优势在于不依赖 USE 语句设置的当前数据库,无论会话上下文指向哪个数据库,这条查询都能准确找到 RUNOOB 库中的 Websites 表。在跨库查询、编写存储过程或者不确定当前数据库环境时,使用这种完全限定名的写法是一种安全且明确的选择。

八、总结:SELECT 语句学习的阶段性收获

回顾本章的学习内容,我们从 SELECT 语句的基本定义出发,理解了它作为数据检索核心工具的重要地位。通过对比指定列查询和星号全列查询两种形式,我们掌握了按需取列和快速探查数据的不同策略。通过对 RUNOOB 数据库中 Websites 表的反复查询练习,我们加深了对结果集概念的理解,知道它是内存中的临时表格,查询结束即销毁。我们还学习了 USE 语句与会话上下文的关系,以及如何通过完全限定表名来编写不依赖当前数据库设置的查询语句。

SELECT 语句的学习不会到此为止。在后续的章节中,我们将在基础 SELECT 之上逐步叠加 WHERE 条件过滤、ORDER BY 结果排序、GROUP BY 分组聚合、多表 JOIN 连接等高级功能。但无论未来学习多么复杂的查询,其核心骨架始终是 SELECT 列名 FROM 表名 这个最基本的结构。把今天的每一个练习亲手敲一遍,确保每一次查询都得到预期的结果,这将为后续的进阶学习打下坚实的根基。

http://www.zskr.cn/news/1449737.html

相关文章:

  • JWT令牌在多端跨域场景下的安全访问校验实践
  • mpv.net 终极指南:Windows平台高性能媒体播放器完整配置与实战技巧
  • IDEA装了LiteFlowX插件后,我写规则文件再也没翻过文档(智能提示+跳转真香)
  • 如何5分钟搭建个人音乐库:洛雪音乐聚合音源终极指南
  • 别再只看风速了!固定翼新手选飞行天气,这3个APP和2个关键数据更重要
  • IPXWrapper完整指南:让Windows 10/11完美运行经典游戏联机
  • 鸣潮模组终极指南:15+功能解锁,彻底改变你的游戏体验
  • 电路设计入门:从元器件到实战项目,零基础掌握电子制作核心技能
  • OmenSuperHub完整指南:解锁惠普游戏本隐藏性能的终极工具
  • 【浏览器智能体】Browser Use 与现有 pytest-bdd 框架的深度整合方案
  • Unity游戏开发避坑:用.NET 4.x和System.Data.SqlClient搞定SQL Server 2022连接(保姆级教程)
  • 从卓晴到稚晖君:盘点那些硬核技术大佬的“神仙”个人实验室
  • 告别手动画框!用SurgicalSAM实现手术器械的“一句话分割”:从类提示到精准掩码的保姆级解析
  • JetBrains IDE试用期重置终极教程:简单快速恢复30天免费使用
  • 别只敲命令了!用Shell脚本把openEuler日常操作自动化(附5个实用脚本)
  • 从HUSTOJ迁移到Hydro OJ:一个老牌OJ维护者的踩坑与平滑升级指南
  • 告别WPS看图!用这个免费插件让Windows 10/11文件夹直接预览SVG图片
  • 大麦网演唱会抢票神器:Python自动化脚本告别黄牛高价票
  • 中牟沙发翻新换皮换布哪家好、匠阁、御匠、锦修三大品牌哪个靠谱公司推荐、怎么选沙发翻新服务商 - 卓一科技
  • 荥阳沙发翻新换皮换布哪家好、匠阁、御匠、锦修三大品牌哪个靠谱公司推荐、怎么选沙发翻新服务商 - 卓一科技
  • Streamlit开发LLM应用时,关于`st.session_state`和页面重渲染的3个关键陷阱
  • 2026年CAD转PDF完全教程:批量转换方法与AutoCAD导出详细步骤一看就会
  • 昆山装修公司设计师怎么选:从业年限与落地能力的判断逻辑 - 资讯焦点
  • 超越KITTI文档:深度拆解calib.txt,揭秘多相机标定数据在自动驾驶仿真中的真实用法
  • 保姆级避坑指南:Ubuntu 18.04上ROS Melodic安装全流程(含国内源与rosdep更新终极方案)
  • Android TV Leanback高级开发实战指南:架构设计与交互模式深度解析
  • YOLOv8模型在RK3588上部署的实战避坑:从ONNX导出到RKNN转换的关键步骤详解
  • 移动电源DIY改造:从IP5305电路分析到18650电池扩容实战
  • 技术文档可视化革命:Mermaid Live Editor如何重塑团队协作效率
  • 大语言模型聊天机器人的缺陷与应对:从幻觉、偏见到安全实践