如何在 SQL 中使用比较和 IS NULL 操作符

介绍

在某些 Structured Query Language (SQL) 语句中, WHERE 语句 语句可以用来限制该操作会影响哪个行。

SQL 允许用户编写包含各种不同类型的预示符的搜索条件,每个预示符使用特定的运算符来评估行.本指南将概述两种类型的预示符和所使用的运算符: comparison operatorsIS NULL 运算符。

<$>[info] 虽然本指南将在其示例中仅使用 SELECT statements,但这里所解释的概念可以在一系列 SQL 操作中使用。

前提条件

要遵循本指南,您需要运行某种类型的关系数据库管理系统(RDBMS)的计算机,该系统使用SQL。

<$>[注] :请注意,许多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 操作员来过滤数据. 如果您想学习如何使用BETWEENIN操作员,分别使用范围和会员预测,我们建议您在 如何在 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)

请注意,此结果集不包括MichelleMilton。这是因为,从字母字母上说,单个字母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

Published At
Categories with 技术
Tagged with
comments powered by Disqus