Oracle 数据库查询与过滤:对我这个初学者真正有帮助的体会

发布: (2026年1月20日 GMT+8 06:59)
5 min read
原文: Dev.to

Source: Dev.to

今天安静但重要的SQL日

没有新表。没有花哨的连接。只是在学习如何对已有的数据提出更好的问题。

本课全部围绕 查询和过滤行——基本上是学习如何精确告诉数据库我想要返回什么,且仅返回这些。

我通过一个简单的 toys 表学会了这些,老实说帮助很大。Oracle 课程以一种奇特但有趣的方式授课,让你在学习的同时还能获得乐趣。它们通过易于理解、贴近生活的概念,使那些令人望而生畏的主题看起来不那么吓人。

create table toys (
  toy_name varchar2(100),
  colour   varchar2(10),
  price    number(10,2)
);

insert into toys values ( 'Sir Stripypants',   'red',   0.01 );
insert into toys values ( 'Miss Smelly_bottom','blue',  6.00 );
insert into toys values ( 'Cuteasaurus',       'blue', 17.22 );
insert into toys values ( 'Mr Bunnykins',      'red',  14.22 );
insert into toys values ( 'Baby Turtle',       'green', null );

commit;

Source:

选择行(以及为什么 SELECT * 是陷阱)

最先要学会的是,SELECT 实际上有两个职责:

  • FROM → 数据所在的位置
  • SELECT → 我真正想要返回的列

起初,SELECT * FROM toys; 非常方便,但只适用于数据库很小的情况。想象一下,一个拥有超过 10 000 行的大型数据库——SELECT * 并不能帮助你在其中找到 Mr Bunnykins

select toy_name, price
from toys;

这迫使你 思考到底需要哪些数据,同时它还能:

  • 减少网络传输的数据量
  • 在列结构变化时出错的概率更低

仅此一点就已经改变了我的查询写法。要具体、要高效。

使用 WHERE 过滤行

与其获取表中的所有数据,你可以开始提出类似以下的问题:

“只显示红色玩具”

select *
from toys
where colour = 'red';

“只给我一行特定的数据”

select *
from toys
where toy_name = 'Sir Stripypants';

很简单,但这几乎是所有实际查询的基础。

合并条件:ANDOR 与困惑

这部分让我比预期更吃惊。

where toy_name = 'Mr Bunnykins'
or  toy_name = 'Baby Turtle'
and colour = 'green';

结果并不是我预期的,因为 ANDOR 之前执行。SQL 并不像我们的大脑那样从左到右读取条件。

解决办法? 始终使用括号。

where (toy_name = 'Mr Bunnykins' or toy_name = 'Baby Turtle')
  and colour = 'green';

现在查询正好按照看起来应该的方式工作。仅此就帮我避免了以后出现的 bug。

使用 IN 的值列表

而不是写:

where colour = 'red'
   or colour = 'green'
   or colour = 'blue'
   or colour = 'yellow';

您可以写:

where colour in ( 'red', 'green', 'blue', 'yellow' );

更简洁、更易读,而且更高效——尤其是当您只需要从 100 000+ 行中挑选出少量行时。

使用 =BETWEEN 的范围

where price between 6 and 20;

重要细节:BETWEEN 包括两端。如果想要严格的边界,需要自行写出:

where price > 6
  and price `:
where colour <> 'green';

但再次强调——NULL 是特殊的。要排除 null,必须使用:

where colour is not null;

这里没有快捷方式。

最后思考

这节课虽然不显眼,但却很重要。SQL 中的其他所有内容都建立在此之上:

  • Aggregations
  • Joins
  • Subqueries
  • Real‑world analytics

如果你不能自信地过滤数据,其他一切都会崩溃。

脆弱的感受

我正在学习放慢节奏、明确表达,并编写可读且高效的查询。

如果你也在学习 SQL,偶尔因为 WHERE 子句而感到尴尬、被绊倒……你并不孤单。

我会继续记录这段旅程——包括困惑、豁然开朗以及所有过程。

Back to Blog

相关文章

阅读更多 »

SQLite 中的系统事务到用户事务

用户事务:逃离自动提交 默认情况下,SQLite 运行在 autocommit 模式。每个非 SELECT 语句都会被包装在它自己的事务中:!Autocommit tr...

在 Prisma API 中没人谈论的问题

Prisma 让在 Node.js 中访问 SQL 数据库变得极其简洁——模式易于阅读,使用简单的 findMany 就能快速入门。在构建了一些真实的…