3.1 比较值:<、>、=、<>

编写 SQL 查询时最常用的关键字之一是WHERE. 正是在它的帮助下,我们告诉 MySQL 我们要过滤(选择)哪些表行。

在关键字之后,WHERE您可以编写非常复杂和棘手的条件。那么这个条件可以包含哪些操作呢?

操作员 描述 例子
< 较少的 工资 < 40000
> 更多的 工资 > 100000
<= 小于或等于 年龄 <= 25
>= 大于或等于 年龄 >= 18
= 等于 职业='程序员'
<>, != 不等于 年(加入日期)!= 2015

与 Java 语言不同,为了严格相等,这里使用一个等号字符,而不是两个

如果要检查值是否不相等,那么这可以通过两种方式完成:<>要么!=第一种方式用于 Pascal 等语言,第二种方式典型用于 C++ 等语言和爪哇。

对于 SQL 中的赋值,它与 Pascal 中一样使用:=,但很少使用赋值本身。

让我们编写一个查询,显示 2015 年未雇用的所有员工。


SELECT * FROM employee WHERE YEAR(join_date) != 2015
        

我们得到以下查询结果:

ID 姓名 职业 薪水 年龄 加入日期
1个 伊万诺夫伊万 程序员 100,000 25 2012-06-30
2个 彼得罗夫彼得 程序员 80,000 23 2013-08-12
3个 伊万诺夫谢尔盖 测试员 40,000 三十 2014-01-01
6个 瓦斯卡 1,000 3个 2018-01-01

3.2 逻辑运算AND、OR、NOT

您还可以WHERE使用逻辑运算AND,ORNOT。它们的写法与我在这里描述的完全一样。无&&||!

让我们编写一个 SQL 查询,其中我们选择 20 岁以上且薪水低于 50K 的员工。


SELECT * FROM employee WHERE age > 20 AND salary < 50000
        

我们得到以下查询结果:

ID 姓名 职业 薪水 年龄 加入日期
3个 伊万诺夫谢尔盖 测试员 40,000 三十 2014-01-01
5个 基连科阿纳斯塔西娅 办公室主管 40,000 25 2015-10-10

太容易了。让我们编写一个查询,在其中选择收入超过 100K 且不担任董事的员工:


SELECT * FROM employee WHERE salary >= 100000 AND NOT occupation = 'Director'
        

这里我们特地!=使用了运算符而不是符号NOT

我们得到以下查询结果:

ID 姓名 职业 薪水 年龄 加入日期
1个 伊万诺夫伊万 程序员 100,000 25 2012-06-30

3.3 BETWEEN:取值范围

在 SQL 中还有一个特殊的运算符BETWEEN,您可以使用它来检查变量是否位于两个值之间。此运算符在布尔表达式中使用。这种运算符的一般形式是:


variable BETWEEN bottom line AND top_bound
        

在这种情况下,与 Java 语言不同,下边界和上边界都包含在允许的区间内。

让我们写一个例子,我们选择薪水从 40K 到 100K 的所有员工。该请求将如下所示:

SELECT * FROM employee WHERE salary BETWEEN 40000 AND 100000

我们得到以下查询结果:

ID 姓名 职业 薪水 年龄 加入日期
1个 伊万诺夫伊万 程序员 100,000 25 2012-06-30
2个 彼得罗夫彼得 程序员 80,000 23 2013-08-12
3个 伊万诺夫谢尔盖 测试员 40,000 三十 2014-01-01
5个 基连科阿纳斯塔西娅 办公室主管 40,000 25 2015-10-10

该运算符BETWEEN不仅支持数值类型,还支持日期甚至字符串类型。在使用字符串的情况下,使用字典顺序:aaba 在 aabb 之前

3.4 IN:值列表

此外,SQL 有一个特殊的运算符IN,可以用来检查一个变量是否包含在指定的列表中。此运算符在布尔表达式中使用。这种运算符的一般形式是:

variable IN (value 1 , value 2 , ... value N)

让我们编写一个查询,在其中选择 20、25 或 30 岁的员工。该请求将如下所示:

SELECT * FROM employee WHERE age IN (20, 25, 30)

我们得到以下查询结果:

ID 姓名 职业 薪水 年龄 加入日期
1个 伊万诺夫伊万 程序员 100,000 25 2012-06-30
3个 伊万诺夫谢尔盖 测试员 40,000 三十 2014-01-01
5个 基连科阿纳斯塔西娅 办公室主管 40,000 25 2015-10-10

现在让我们编写一个查询,相反,我们选择年龄为not20、25 或 30 的员工。查询将如下所示:

SELECT * FROM employee WHERE age NOT IN (20, 25, 30)

我们得到以下查询结果:

ID 姓名 职业 薪水 年龄 加入日期
2个 彼得罗夫彼得 程序员 80,000 23 2013-08-12
4个 拉比诺维奇·莫伊沙 导演 200,000 35 2015-05-12
6个 瓦斯卡 1,000 3个 2018-01-01

一切都按预期进行。美丽。

3.5 LIKE:字符串模式

最后,另一个重要且经常使用的运算符 - LIKE。它在比较字符串时使用。它可用于设置字符串模式。此运算符在布尔表达式中使用。这种运算符的一般形式是:

variable LIKE 'sample'

模式中可以使用特殊字符:%_

  • 下划线表示任何字符,总是 1 个。
  • 百分比表示任意字符和任意次数(包括0次)。

让我们编写一个查询,选择所有姓氏以字母“I”开头的人。该请求将如下所示:

SELECT * FROM employee WHERE name LIKE 'I%'

我们得到以下查询结果:

ID 姓名 职业 薪水 年龄 加入日期
1个 伊万诺夫伊万 程序员 100,000 25 2012-06-30
3个 伊万诺夫谢尔盖 测试员 40,000 三十 2014-01-01

现在让任务复杂化——名称应包含“o”且名称应以“a”结尾。该请求将如下所示:

SELECT * FROM employee WHERE name LIKE '%o%a'

我们得到以下查询结果:

ID 姓名 职业 薪水 年龄 加入日期
4个 拉比诺维奇·莫伊沙 导演 200,000 35 2015-05-12

好吧,让我们让它更难一点。让我们过滤掉所有年龄以数字“3”开头的员工。该请求将如下所示:

SELECT * FROM employee WHERE age LIKE '3%'

我们得到以下查询结果:

ID 姓名 职业 薪水 年龄 加入日期
3个 伊万诺夫谢尔盖 测试员 40,000 三十 2014-01-01
4个 拉比诺维奇·莫伊沙 导演 200,000 35 2015-05-12
6个 瓦斯卡 1,000 3个 2018-01-01

顺便说一下,我们的age列是 type int,所以LIKE它不仅适用于字符串。不能不庆幸什么。