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
,OR
和NOT
。它们的写法与我在这里描述的完全一样。无&&
,||
或!
让我们编写一个 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 |
现在让我们编写一个查询,相反,我们选择年龄为not
20、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
它不仅适用于字符串。不能不庆幸什么。