介绍
在某些 Structured Query Language (SQL) 语句中, WHERE
语句 语句可以用来限制该操作会影响哪个行。
SQL 允许用户编写包含各种不同类型的预示符的搜索条件,每个预示符使用特定的运算符来评估行.本指南将概述两种类型的预示符和所使用的运算符: comparison operators 和 IS NULL
运算符。
<$>[info]
虽然本指南将在其示例中仅使用 SELECT
statements,但这里所解释的概念可以在一系列 SQL 操作中使用。
前提条件
要遵循本指南,您需要运行某种类型的关系数据库管理系统(RDBMS)的计算机,该系统使用SQL。
- 运行 Ubuntu 20.04 的服务器,具有管理权限的非根用户和与 UFW 配置的防火墙,如我们在 Ubuntu 20.04 的初始服务器设置指南中所述。
- MySQL 安装并在服务器上安全,如在 How To Install MySQL on Ubuntu 20.04中所述。 本指南与新创建的用户进行验证,如在 Step 3中所述。
<$>[注] 注:请注意,许多RDBMS使用自己的独特的SQL实现,虽然本教程中描述的命令将在大多数RDBMS上工作,包括PostgreSQL和SQLite,但如果您在MySQL以外的系统上测试它们,确切的语法或输出可能会有所不同。
连接到MySQL并设置样本数据库
如果您的 SQL 数据库系统在远程服务器上运行,则从本地计算机输入 SSH 到服务器:
1[environment local]
2ssh sammy@your_server_ip
然后打开MySQL服务器提示,用您的MySQL用户帐户的名称代替sammy
:
1mysql -u sammy -p
从提示中创建一个名为 comparison_null_db
的数据库:
1CREATE DATABASE comparison_null_db;
如果数据库创建成功,您将收到这样的输出:
1[secondary_label Output]
2Query OK, 1 row affected (0.01 sec)
若要选择 comparison_null_db
数据库,请运行以下 USE
语句:
1USE comparison_null_db;
1[secondary_label Output]
2Database changed
在选择comparison_null_db
后,创建表中。
为了跟随本指南中使用的示例,想象一下,你和一群朋友都决定变得更活跃,并以跑步为练习。 为此,你的朋友都设定了自己想要在下个月跑多少英里的个人目标。
名称
:每个朋友的名字,用最多15个字符的varchar
数据类型表示目标
:每个朋友的目标是他们希望在过去一个月内跑多少英里,用int
数据类型表示为整数结果
:每个朋友最终在一个月内跑了多少英里,再次表示为int
运行下面的CREATE TABLE
语句,创建一个名为running_goals
的表,其中包含这三个列:
1CREATE TABLE running_goals (
2name varchar(15),
3goal int,
4result int
5);
1[secondary_label Output]
2Query OK, 0 rows affected (0.012 sec)
然后加载 Running_goals
表中的一些样本数据,运行以下INSERT INTO
操作,添加七行数据,代表你的七个朋友,他们的运行目标和他们的结果:
1INSERT INTO running_goals
2VALUES
3('Michelle', 55, 48),
4('Jerry', 25, NULL),
5('Milton', 45, 52),
6('Bridget', 40, NULL),
7('Wanda', 30, 38),
8('Stewart', 35, NULL),
9('Leslie', 40, 44);
1[secondary_label Output]
2Query OK, 7 rows affected (0.004 sec)
3Records: 7 Duplicates: 0 Warnings: 0
请注意,这些行中的三个结果
值为NULL
。为本示例的目的,假设这些朋友在过去一个月内没有报告他们跑的英里数,所以他们的结果
值被输入为NULL
。
有了它,您可以随时跟随其余的指南,并开始学习如何在 SQL 中使用比较和IS NULL
运算符。
理解Where
条款预言
在任何从现有表中读取数据的 SQL 操作中,您可以按照从
条款与哪里
条款来限制该操作会影响哪些数据。
搜索条件由一个或多个 predicates 或表达式组成,可以评估一个或多个值表达式并返回一个结果为真实
,假
或未知
。在 SQL 中,一个 _value 表达式 - 也有时被称为 _scalar 表达式 - 是返回单个值的任何表达式。
当运行包含WHERE
条款的 SQL 查询时,DBMS 会将搜索条件应用到由FROM
条款定义的逻辑表中的每个行,然后只会返回搜索条件中的每个预言评估为真实
的行。
SQL 标准定义了 18 种类型的序列,虽然并非每个 RDBMS 都包括它们在其 SQL 实现中。
比较:比较预测将一个值表达式与另一个值表达式进行比较;在查询中,通常至少其中一个值表达式是列的名称。
=
:測試兩個值是否等同>
:測試兩個值是否不等同- ``:測試第一個值是否小於第二個值
>
:測試第一個值是否大於第二個值<=
:測試第一個值是否小於或等於第二個值>=
:測試第一個值是否大於或等於第二個值
Null:使用IS NULL
运算符测试的预测表明特定列中的值是否为Null
Range:范围预测表使用BETWEEN
运算符来测试一个值表达式是否在另外两个值表达式之间
会员性:此类型的预测表使用IN
运算符来测试一个值是否是特定集的成员
Pattern Match:模式匹配预测使用LIKE
运算符来测试一个值是否匹配一个字符串模式
正如介绍中提到的,本指南专注于如何使用 SQL 比较和 IS NULL 操作员来过滤数据. 如果您想学习如何使用BETWEEN
或IN
操作员,分别使用范围和会员预测,我们建议您在 如何在 SQL 中使用 BETWEEN 和 IN 操作员上查看本指南。
预言比较
「WHERE」条款比较预测使用六个比较运算器中的一个来比较一个值表达式与另一个。
1SELECT column_list
2FROM table_name
3WHERE column_name OPERATOR value_expression;
在WHERE
的关键字后,有一个值表达式,在大多数 SQL 操作中是列的名称。在搜索条件中提供列名称作为值表达式,告诉 RDBMS 将该列的每个行值用作搜索条件的该行迭代的值表达式。
为了说明,运行以下查询,该查询将返回从运行_目标
表的名称
和目标
列的值。 注意WHERE
条款如何使用比较预兆,从而导致查询只返回具有目标
值等于40
的行:
1SELECT name, goal
2FROM running_goals
3WHERE goal = 40;
在过去一个月里,只有两个朋友的目标是跑40英里,所以查询只返回了这两个行:
1[secondary_label Output]
2+---------+------+
3| name | goal |
4+---------+------+
5| Bridget | 40 |
6| Leslie | 40 |
7+---------+------+
82 rows in set (0.00 sec)
要说明其他比较运算符的工作方式,请运行以下查询,这些查询与上一个示例相同,但每个运算符都使用不同的比较运算符。
「<>」運算器測試兩個值是否等同性,因此此查詢返回每行其「目標」值不等於「40」的值:
1SELECT name, goal
2FROM running_goals
3WHERE goal <> 40;
1[secondary_label Output]
2+----------+------+
3| name | goal |
4+----------+------+
5| Michelle | 55 |
6| Jerry | 25 |
7| Milton | 45 |
8| Wanda | 30 |
9| Stewart | 35 |
10+----------+------+
115 rows in set (0.00 sec)
<
操作符测试第一个值表达式是否小于第二个值表达式:
1SELECT name, goal
2FROM running_goals
3WHERE goal < 40;
1[secondary_label Output]
2+---------+------+
3| name | goal |
4+---------+------+
5| Jerry | 25 |
6| Wanda | 30 |
7| Stewart | 35 |
8+---------+------+
93 rows in set (0.00 sec)
>
运算器测试第一个值表达式是否大于第二个:
1SELECT name, goal
2FROM running_goals
3WHERE goal > 40;
1[secondary_label Output]
2+----------+------+
3| name | goal |
4+----------+------+
5| Michelle | 55 |
6| Milton | 45 |
7+----------+------+
82 rows in set (0.00 sec)
<=
运算符测试第一个值是否小于或等于第二个值:
1SELECT name, goal
2FROM running_goals
3WHERE goal <= 40;
1[secondary_label Output]
2+---------+------+
3| name | goal |
4+---------+------+
5| Jerry | 25 |
6| Bridget | 40 |
7| Wanda | 30 |
8| Stewart | 35 |
9| Leslie | 40 |
10+---------+------+
115 rows in set (0.00 sec)
>=
运算器测试第一个值是否大于或等于第二个值:
1SELECT name, goal
2FROM running_goals
3WHERE goal >= 40;
1[secondary_label Output]
2+----------+------+
3| name | goal |
4+----------+------+
5| Michelle | 55 |
6| Milton | 45 |
7| Bridget | 40 |
8| Leslie | 40 |
9+----------+------+
104 rows in set (0.00 sec)
等同性(=
)和不等同性(<>
)运算符的字符串值是可以预期的,下面的查询返回每个行的名称
值等于Leslie
值:
1SELECT name
2FROM running_goals
3WHERE name = 'Leslie';
由于表中只有一个名为Leslie
的朋友,因此查询只会返回该行:
1[secondary_label Output]
2+--------+
3| name |
4+--------+
5| Leslie |
6+--------+
71 row in set (0.00 sec)
在比较字符串值时,<``,
>,
<=和
>=操作员都评估字符串的字母关系方式。 换句话说,如果你写一个测试一个字符串是否
小于另一个字符串的序列,你正在测试第一个字符串是否在字母字母字母字母上先于第二个字符串,同样,如果你的序列测试一个字符串是否
大于`另一个字符串,你正在测试第一个字母字符串是否在第二个字符串之后。
为了说明,运行下面的查询. 这将返回每个字母M
以下名
和目标
值的行,其名
值小于
字母M
。
1SELECT name
2FROM running_goals
3WHERE name < 'M';
1[secondary_label Output]
2+---------+
3| name |
4+---------+
5| Jerry |
6| Bridget |
7| Leslie |
8+---------+
93 rows in set (0.00 sec)
请注意,此结果集不包括Michelle
或Milton
。这是因为,从字母字母上说,单个字母M
在任何以M
开头且有多个字母的字符串之前,所以这两个朋友都被排除在这个结果集中。
零预言
在 SQL 中,NULL
是一个保留的关键字,用于表示缺失或未知值。 Null 是一个状态,而不是一个实际值;它 **不代表零或一个空串。
您可以使用IS NULL
运算符来测试给定的值表达式是否为Null:
1. . .
2WHERE column_name IS NULL
3. . .
使用此类型的预测,数据库系统会从指定的列中查看每个行的值,并评估每个行是否为Null。
为了说明,运行以下查询,返回名称
和结果
列:
1SELECT name, result
2FROM running_goals
3WHERE result IS NULL;
此查询中的WHERE
条款中的搜索条件会测试每个行的结果
值是否为Null。
1[secondary_label Output]
2+---------+--------+
3| name | result |
4+---------+--------+
5| Jerry | NULL |
6| Bridget | NULL |
7| Stewart | NULL |
8+---------+--------+
93 rows in set (0.00 sec)
由于三位朋友尚未报告他们在过去一个月内最终跑了多少英里,所以当您加载数据表时,这些值被记录为NULL
。
结论
通过遵循本指南,您了解如何在WHERE
条款中使用 SQL 比较和IS NULL
运算符来限制一个操作会影响的行。 虽然这里显示的命令应该在大多数关系数据库上工作,但请注意,每个 SQL 数据库都使用其独特的 SQL 标准实现。
如果您想了解有关使用 SQL 的更多信息,我们鼓励您查看本系列中的其他教程在 如何使用 SQL。