跳至主要内容

SQL 中 WHERE 子句入门

在本教程中,您将学习如何使用 WHERE 子句在 SQL 中筛选行。
· 7分钟 阅读

使用 AI 探索

根据给定条件或一组条件从表中过滤行,是数据分析中非常常见的做法。在 SQL 中,您可以使用 where 子句来实现。本教程将带您在多种场景下使用它。

您将使用 PostgreSQL 作为 RDBMS(关系型数据库管理系统),但在使用其他数据库系统时,语法差异并不大。您将首先搭建一个 PostgreSQL 数据库,并手动创建一个包含国家数据的表。完成设置后,您将执行多条包含 WHERE 子句的筛选查询。

注意:要跟上本教程的节奏,您需要熟悉 SQL 和 PostgreSQL 的基础知识。如果不熟悉,以下资源可能会有所帮助。

在 PostgreSQL 中创建表

要跟随本教程操作,您需要在 PostgreSQL 中创建一个包含全球各国信息的表。该表将用于演示 WHERE 子句在不同场景下的用法。

步骤 1:创建新数据库

打开 pgAdmin(或您偏好的 SQL 界面)并创建一个新的 PostgreSQL 数据库。您可以将其命名为 world_data,或使用您喜欢的其他名称。

步骤 2:创建并填充我们的表

数据库就绪后,打开一个新的 SQL 查询编辑器窗口并运行以下 SQL 代码。它将创建一个名为 countries 的表,并插入一组记录,涵盖广泛的大洲、独立年份和地区:

-- Create the countries tableCREATE TABLE countries (    code VARCHAR(3) PRIMARY KEY,    name VARCHAR(100),    continent VARCHAR(50),    region VARCHAR(100),    surface_area NUMERIC,    indep_year INTEGER,    local_name VARCHAR(100),    gov_form VARCHAR(100),    capital VARCHAR(100),    cap_long NUMERIC,    cap_lat NUMERIC);-- Insert sample data into the countries tableINSERT INTO countries (code, name, continent, region, surface_area, indep_year, local_name, gov_form, capital, cap_long, cap_lat)VALUES('IND', 'India', 'Asia', 'Southern Asia', 3287263, 1947, 'Bharat', 'Federal Republic', 'New Delhi', 77.2090, 28.6139),('PAK', 'Pakistan', 'Asia', 'Southern Asia', 881912, 1947, 'Pakistan', 'Federal Republic', 'Islamabad', 73.0551, 33.6844),('CHN', 'China', 'Asia', 'Eastern Asia', 9596961, NULL, 'Zhongguo', 'People''s Republic', 'Beijing', 116.4074, 39.9042),('VNM', 'Vietnam', 'Asia', 'South-Eastern Asia', 331212, 1945, 'Việt Nam', 'Socialist Republic', 'Hanoi', 105.8544, 21.0285),('JPN', 'Japan', 'Asia', 'Eastern Asia', 377975, NULL, 'Nippon', 'Constitutional Monarchy', 'Tokyo', 139.6917, 35.6895),('DEU', 'Germany', 'Europe', 'Western Europe', 357386, 1955, 'Deutschland', 'Federal Republic', 'Berlin', 13.4050, 52.5200),('FRA', 'France', 'Europe', 'Western Europe', 551695, 843, 'France', 'Republic', 'Paris', 2.3522, 48.8566),('RUS', 'Russia', 'Europe', 'Eastern Europe', 17098242, 1991, 'Rossiya', 'Federation', 'Moscow', 37.6173, 55.7558),('UKR', 'Ukraine', 'Europe', 'Eastern Europe', 603500, 1991, 'Ukrayina', 'Republic', 'Kyiv', 30.5234, 50.4501),('EGY', 'Egypt', 'Africa', 'Northern Africa', 1002450, 1922, 'Misr', 'Republic', 'Cairo', 31.2357, 30.0444),('NGA', 'Nigeria', 'Africa', 'Western Africa', 923768, 1960, 'Nigeria', 'Federal Republic', 'Abuja', 7.4951, 9.0578),('AUS', 'Australia', 'Oceania', 'Australia and New Zealand', 7682300, 1901, 'Australia', 'Federal Parliamentary Democracy', 'Canberra', 149.1245, -35.3075),('USA', 'United States', 'North America', 'North America', 9833517, 1776, 'United States', 'Federal Republic', 'Washington, D.C.', -77.0369, 38.9072),('CAN', 'Canada', 'North America', 'North America', 9984670, 1867, 'Canada', 'Constitutional Monarchy', 'Ottawa', -75.6972, 45.4215),('BRA', 'Brazil', 'South America', 'South America', 8515767, 1822, 'Brasil', 'Federal Republic', 'Brasília', -47.9292, -15.7801),('ARG', 'Argentina', 'South America', 'South America', 2780400, 1816, 'Argentina', 'Federal Republic', 'Buenos Aires', -58.3816, -34.6037);

该表包含全球约 16 个国家的不同信息。表包含以下列:

  • code:表的主键,表示某个国家的通用国家代码

  • name:国家名称

  • continent:国家所属的大洲

  • region:国家所在的地理区域

  • surface_area:国家的面积

  • indep_year:国家获得独立的年份

  • local_name:国家的本地名称

  • gov_form:国家现行的政体类型

  • capital:国家首都

  • cap_long:国家首都的经度

  • cap_lat:国家首都的纬度

现在让我们使用 WHERE 子句开始筛选一些记录。

使用 SQL WHERE 子句

在 SQL 中,WHERE 子句可让您基于文本和数值来筛选记录。您可以比较这些值,支持以下基于比较的运算:

  • = 等于

  • <> 和 != 不等于

  • < 小于

  • > 大于

  • <= 小于或等于

  • >= 大于或等于

按照 SQL 标准,建议使用 <> 而不是 !=。

现在让我们获取 code 为 AUS 的国家记录。此处应比较的列是 code,待比较的值是 AUS。查询为:

SELECT * FROM countries WHERE code = 'AUS';

您将得到:

请注意以下几点:

  • WHERE 子句总是位于 FROM 之后。

  • 在 SQL 中,字符串使用单引号括起。

接下来看看数值比较。获取独立年份(indep_year)晚于 1901 的国家记录:

SELECT * FROM countries WHERE indep_year > 1901;

您将获得共 3 个在 1901 年之后独立的国家的记录。请注意此处使用的比较符。indep_year 列的数据类型是整数,因此比较时不需要引号。

您可以在一个 WHERE 子句中使用 AND 和 OR 连接多个条件。以下查询获取这些国家的记录:where continent = 'Asia' and indep_year > 1900 ——

SELECT * FROM countries WHERE continent = 'Asia' AND indep_year > 1901;

您将获得位于 Asia 大洲且在 1901 年之后独立的共三个国家的信息。请注意,在上述查询中,您同时比较了文本值和数值。作为练习,您可以在 WHERE 子句中尝试不同的 AND 与 OR 组合。

注意:当您将 AND 与 OR 组合使用时,请不要忘记用括号将每个条件括起来。否则,SQL 在确定条件求值的优先级时会产生歧义。

使用以下查询,您将获得总共六个国家。

SELECT * FROM countries WHERE(continent = 'Europe' AND indep_year > 1900)or(continent = 'Asia' AND indep_year > 1900);

您甚至可以在一个 WHERE 子句中连接两个以上的条件:

SELECT * FROM countries WHERE continent = 'Asia' OR indep_year > 1900 OR surface_area > 652090;

在这里,您将获得共 15 个国家:它们要么位于 Asia,要么在 1901 年之后独立,或者国土面积大于 652090。

现在将该查询改为更具限制性的 AND 版本:

SELECT * FROM countries WHERE continent = 'Asia' AND indep_year > 1901 AND surface_area > 652090;

在这种情况下,您将获得两个国家。

您还可以在 WHERE 子句中配合使用子查询。假设您想获取国土面积最大的国家记录,但并不知道国家的最大国土面积是多少。遇到这种情况,以下查询可以帮您解决:

SELECT * FROM countries WHERE surface_area in (SELECT MAX(surface_area) FROM countries);

您应该会得到 Russia 的记录。

结论

恭喜您完成本教程。根据条件筛选查询结果是一项至关重要的技能,而本教程正是对其的入门介绍。若您希望进一步提升 SQL 技能,可以查看我们的课程(链接见下)。

Sayak Paul

作者

Sayak Paul

Sayak 就职于 Hugging Face,负责编写代码、撰写文章并进行演讲。他的大部分时间都围绕 Diffusers 库相关的工作展开。他还是 DataCamp 的项目讲师,并创作了许多 DataCamp 教程。工作之外,您常常会看到他在 Netflix 上第 n 次刷《金装律师》。

SQL WHERE 子句常见问题

我可以在 WHERE 子句中同时使用文本列和数值列吗?

可以。您可以按文本(例如 'Asia')和数值(例如 > 1901)同时进行筛选。请记住,文本值必须用单引号括起。

SQL 中的 <> 和 != 有区别吗?

两者都表示“不等于”,但 <> 是标准的 SQL 运算符。某些数据库也支持 !=,但为保证兼容性,最好使用 <>。

如何筛选包含 NULL 值的记录?

使用 IS NULL 或 IS NOT NULL。例如:

SELECT * FROM countries WHERE indep_year IS NULL;
我可以在 WHERE 子句中使用子查询吗?

可以。子查询可以用于将某列与另一条查询的结果进行比较。例如:

SELECT * FROM countries WHERE surface_area = (SELECT MAX(surface_area) FROM countries);
WHERE 子句位于 FROM 子句之前还是之后?

WHERE 子句总是出现在 FROM 子句的之后,并在 GROUP BY 或 ORDER BY 等子句的之前。

我可以将 WHERE 与 JOIN 一起使用吗?

当然可以。您可以在执行 JOIN 之后使用 WHERE 子句来筛选联接后的结果集。

主题