引言
在某些结构化查询语言 (SQL)语句中,WHERE
子句可以用来限制给定操作会影响哪些行。他们通过定义特定的条件来做到这一点,这些条件被称为搜索条件,每一行必须满足才会受到影响。搜索条件由一个或多个谓词组成,它们是特殊的表达式,计算结果为“true”、“false”或“unknown”,并且操作只影响那些WHERE
子句中的每个谓词计算结果为“true”的行。
SQL允许用户编写包含各种不同类型谓词的搜索条件,每种谓词都使用特定的操作符来计算行。本指南将概述两种类型的谓词及其使用的操作符:比较操作符和IS NULL
操作符。
虽然本指南在示例中只使用SELECT
语句,但这里解释的概念可以用于许多SQL操作。特别是,WHERE
子句及其搜索条件是UPDATE
和DELETE
操作的关键组成部分。
前期准备
为了学习本指南,你需要一台运行某种使用SQL的关系数据库管理系统(RDBMS)的计算机。
注意:请注意,许多RDBMS使用它们自己独特的SQL实现。虽然本教程中概述的命令适用于大多数RDBMS,但如果你在MySQL以外的系统上测试它们,确切的语法或输出可能会有所不同。
你还需要一个装载了一些示例数据的数据库和表,可以在其中练习使用相关命令。
连接到MySQL并设置一个示例数据库
如果SQL数据库系统运行在远程服务器上,请从本地设备SSH到服务器:
ssh sammy@your_server_ip
然后打开MySQL服务器提示符,将==sammy==
替换为你的MySQL用户账户的名称:
mysql -u sammy -p
创建一个名为comparison_null_db
的数据库:
CREATE DATABASE comparison_null_db;
如果数据库成功创建,您将收到这样的输出:
OutputQuery OK, 1 row affected (0.01 sec)
要选择comparison_null_db
数据库,运行以下USE
语句:
USE comparison_null_db;
OutputDatabase changed
选择comparison_null_db
后,在其中创建一个表。
为了跟随本指南中使用的例子,想象一下你和你的一群朋友都决定变得更加活跃,并把跑步作为一种锻炼。为此,你的朋友都设定了下个月想跑多少英里的个人目标。你决定在一个SQL表中记录朋友的里程目标,以及他们实际跑的英里数,这个表包含以下三列:
-
name
:每个朋友的名字,使用varchar
数据类型表示,不超过15个字符 -
goal
:每个朋友希望在过去的一个月里跑多少英里的目标,使用int
数据类型表示为整数 -
result
:每个朋友在一个月里最终跑了多少英里,同样用int
表示
运行下面的CREATE TABLE
语句来创建一个名为running_goals
的表,它包含以下三列:
CREATE TABLE running_goals (
name varchar(15),
goal int,
result int
);
OutputQuery OK, 0 rows affected (0.012 sec)
然后加载包含一些示例数据的running_goals
表。运行下面的INSERT INTO
操作来添加7行数据,代表你的7个朋友,他们的运行目标和结果:
INSERT INTO running_goals
VALUES
('Michelle', 55, 48),
('Jerry', 25, NULL),
('Milton', 45, 52),
('Bridget', 40, NULL),
('Wanda', 30, 38),
('Stewart', 35, NULL),
('Leslie', 40, 44);
OutputQuery OK, 7 rows affected (0.004 sec)
Records: 7 Duplicates: 0 Warnings: 0
注意,其中三行result
的值是NULL
。在这个例子中,假设这些朋友只是没有报告他们过去一个月的跑步英里数,所以他们的result
值被输入为NULL
。
有了这些,你就可以开始学习如何在SQL中使用比较和IS NULL
操作符了。
理解WHERE语句
在任何SQL操作,读取数据从现有表,您可以遵循“从”与“地方”条款来限制数据的操作会影响到什么。WHERE
子句通过定义一个搜索条件来实现这一点;不满足条件的行被排除在外,而满足条件的行则被包含在内。
一个搜索条件由一个或多个谓词或表达式组成,这些表达式可以计算一个或多个值表达式并返回“true”、“false”或“unknown”的结果。在SQL中,值表达式——有时也称为标量表达式——是任何返回单个值的表达式。值表达式可以是字面量,如字符串、数值、数学表达式或列名。请注意,几乎总是在WHERE
子句谓词中至少有一个值表达式是操作的FROM
子句中引用的表中的列的名称。
当运行包含WHERE
子句的SQL查询时,DBMS将对FROM
子句定义的逻辑表中的每一行应用搜索条件。然后,它将只返回所有谓词在搜索条件中求值为“true”的行。
SQL标准定义了18种类型的谓词,尽管不是每个RDBMS在其SQL实现中都包含每种谓词。下面是5种最常用的谓词类型,以及对每种类型及其使用的操作符的简要说明。
比较:比较谓词比较一个值表达式与另一个值表达式;在查询中,几乎总是至少有一个这样的值表达式是列的名称。这7个比较运算符是:
-
=
: 测试两个值是否相等 -
!=
: 测试两个值是否不相等 -
<>
: 测试两个值是否不相等 -
<
: 测试第一个值是否小于第二个值 -
>
: 测试第一个值是否大于第二个值 -
<=
: 测试第一个值是否小于或等于第二个值 -
>=
: 测试第一个值是否大于或等于第二个值
Null:使用IS Null
操作符的谓词测试给定列中的值是否为Null。范围:范围谓词使用BETWEEN
操作符测试一个值表达式是否落在两个其他值之间。成员关系:这种类型的谓词使用IN
操作符测试一个值是否属于给定集合。模式匹配:模式匹配谓词使用LIKE
操作符测试一个值是否与包含通配符的字符串模式匹配
正如引言中提到的,本指南重点介绍如何使用SQL的BETWEEN
和in
操作符来过滤数据。如果你想学习如何使用比较或IS NULL
操作符,我们建议你看看这篇关于如何在SQL中使用比较和IS NULL操作符的指南。或者,如果你想学习如何使用like
操作符来基于包含通配符的字符串模式过滤数据,请跟随我们的指南在SQL中如何使用通配符。最后,如果你想了解更多关于WHERE
子句的信息,你可能会对我们关于如何在SQL中使用WHERE子句的教程感兴趣。
比较谓词
WHERE
子句比较谓词使用六个比较操作符中的一个来比较两个值表达式。它们通常遵循如下语法:
SELECT column_list
FROM table_name
WHERE column_name OPERATOR value_expression;
WHERE
关键字后面是一个值表达式,在大多数SQL操作中,它是一个列的名称。在搜索条件中提供列名作为值表达式,告诉RDBMS使用该列中每一行的值作为该行按搜索条件迭代的值表达式。因为数据库系统按顺序对每一行应用搜索条件,所以比较操作符将根据指定列中的值的搜索条件是否为真来包含或过滤某一行。
为了说明,运行以下查询,它将从running_goals
表的name
和goal
列中返回值。注意,WHERE
子句使用了一个比较谓词,它将导致查询仅返回goal
值等于40
的行:
SELECT name, goal
FROM running_goals
WHERE goal = 40;
你的朋友只有两个目标是在过去的一个月里恰好跑40公里,因此这个查询只返回这两行:
Output+---------+------+
| name | goal |
+---------+------+
| Bridget | 40 |
| Leslie | 40 |
+---------+------+
2 rows in set (0.00 sec)
为了说明其他比较操作符是如何工作的,运行以下查询,这些查询与前一个示例相同,只是每个查询使用不同的比较操作符。
<>
操作符测试两个值是否不相等,因此这个查询返回goal
值不等于40
的每一行:
SELECT name, goal
FROM running_goals
WHERE goal <> 40;
Output+----------+------+
| name | goal |
+----------+------+
| Michelle | 55 |
| Jerry | 25 |
| Milton | 45 |
| Wanda | 30 |
| Stewart | 35 |
+----------+------+
5 rows in set (0.00 sec)
<
操作符测试第一个值表达式是否小于第二个值表达式:
SELECT name, goal
FROM running_goals
WHERE goal < 40;
Output+---------+------+
| name | goal |
+---------+------+
| Jerry | 25 |
| Wanda | 30 |
| Stewart | 35 |
+---------+------+
3 rows in set (0.00 sec)
>
操作符用于测试第一个值表达式是否大于第二个:
SELECT name, goal
FROM running_goals
WHERE goal > 40;
Output+----------+------+
| name | goal |
+----------+------+
| Michelle | 55 |
| Milton | 45 |
+----------+------+
2 rows in set (0.00 sec)
<=
操作符测试第一个值是否小于或等于第二个值:
SELECT name, goal
FROM running_goals
WHERE goal <= 40;
Output+---------+------+
| name | goal |
+---------+------+
| Jerry | 25 |
| Bridget | 40 |
| Wanda | 30 |
| Stewart | 35 |
| Leslie | 40 |
+---------+------+
5 rows in set (0.00 sec)
>=
操作符用于测试第一个值是否大于或等于第二个值:
SELECT name, goal
FROM running_goals
WHERE goal >= 40;
Output+----------+------+
| name | goal |
+----------+------+
| Michelle | 55 |
| Milton | 45 |
| Bridget | 40 |
| Leslie | 40 |
+----------+------+
4 rows in set (0.00 sec)
等价操作符(’ = ')和不等价操作符(<>
)可以像预期的那样处理字符串值。下面的查询返回每一行的name
值等于'Leslie'
:
SELECT name
FROM running_goals
WHERE name = 'Leslie';
因为表中只有一个朋友名为Leslie,所以这个查询只返回这一行:
Output+--------+
| name |
+--------+
| Leslie |
+--------+
1 row in set (0.00 sec)
在比较字符串值时,<
、>
、<=
和>=
操作符都会计算字符串的字母关系。换句话说,如果编写一个谓词来测试一个字符串是否“小于”另一个字符串,那么测试的是第一个字符串是否在第二个字符串的字母顺序之前。类似地,如果谓词测试一个字符串是否“大于”另一个字符串,就是测试第一个字符串是否在字母顺序上排在第二个字符串之后。
为了说明这一点,运行下面的查询。这将返回name
值“小于”字母“M”的每一行的name
和goal
值。换句话说,对于name
值在字母顺序上排在M
之前的每一行,搜索条件将计算为true
:
SELECT name
FROM running_goals
WHERE name < 'M';
Output+---------+
| name |
+---------+
| Jerry |
| Bridget |
| Leslie |
+---------+
3 rows in set (0.00 sec)
注意,这个结果集不包含Michelle
和Milton
。这是因为,从字母顺序上讲,单个字母“M”出现在任何以“M”开头且包含多个字母的字符串之前,因此这两个朋友没有出现在结果集中。
Null
在SQL中,NULL
是一个保留关键字,用于表示缺失或未知值。Null是一个状态,而不是一个实际的值;它不代表零个或一个空字符串。
你可以使用IS NULL
操作符来测试给定的值表达式是否为NULL:
. . .
WHERE column_name IS NULL
. . .
使用这种类型的谓词,数据库系统将查看指定列中的每一行的值,并评估每个值是否为Null。如果列中的值确实为Null,那么搜索条件将为这些行求值为“true”,它们将包含在结果集中。
为了说明,运行以下返回name
和result
列的查询:
SELECT name, result
FROM running_goals
WHERE result IS NULL;
这个查询中的WHERE
子句中的搜索条件测试了每一行的result
值是否为Null。如果是,则谓词的计算结果为" true ",结果集中就包含了这一行:
Output+---------+--------+
| name | result |
+---------+--------+
| Jerry | NULL |
| Bridget | NULL |
| Stewart | NULL |
+---------+--------+
3 rows in set (0.00 sec)
因为你的三个朋友还没有报告他们在过去的一个月里最终跑了多少英里,当你向表中加载数据时,这些值被记录为NULL
。因此,查询中的搜索条件求值为“true”,因此结果集中只包含这三行。文章来源:https://www.toymoban.com/news/detail-696039.html
总结
遵循本指南,您学习了如何使用SQL的比较和“为空”操作符“,”条款来限制一个操作会影响的行。虽然这里显示的命令在大多数关系数据库上都可以工作。但请注意,每个SQL数据库都使用自己独特的SQL标准实现。关于每个命令及其所有选项的更完整描述,读者可以查阅相应DBMS的官方文档。文章来源地址https://www.toymoban.com/news/detail-696039.html
到了这里,关于如何使用SQL系列 之 如何在SQL中使用比较运算符和IS NULL运算符的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!