SQL - WHERE 子句



SQL WHERE 子句

SQL 的WHERE 子句用于过滤由 DML 语句(如 SELECT、UPDATE 和 DELETE 等)获得的结果。我们可以使用 WHERE 子句从单个表或多个表(联接操作后)中检索数据。

例如,您可以使用 WHERE 子句检索组织中某个部门的员工详细信息,或收入高于/低于某个金额的员工,或有资格获得奖学金的学生的详细信息等。此子句基本上提供了要检索哪些记录以及哪些记录要忽略的规范。

语法

SQL WHERE 子句的基本语法如下所示:

DML_Statement column1, column2,... columnN
FROM table_name
WHERE [condition];

这里,DML_Statement 可以是任何语句,例如 SELECT、UPDATE、DELETE 等。

您可以使用比较或逻辑运算符(例如,>、<、=、LIKE、NOT 等)指定条件。

WHERE 子句与 SELECT 语句

通常,SELECT 语句用于从表中检索数据。如果我们将 WHERE 子句与 SELECT 语句一起使用,我们可以根据特定条件(或表达式)过滤要检索的行。以下是它的语法:

SELECT column1, column2, ...
FROM table_name
WHERE condition;

示例

假设我们在 MySQL 数据库中使用 CREATE TABLE 语句创建了一个名为 CUSTOMERS 的表,如下所示:

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),
   PRIMARY KEY (ID)
);

以下 INSERT 查询将 7 条记录插入此表:

INSERT INTO CUSTOMERS VALUES
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00),
(2, 'Khilan', 25, 'Delhi', 1500.00),
(3, 'Kaushik', 23, 'Kota', 2000.00),
(4, 'Chaitali', 25, 'Mumbai', 6500.00),
(5, 'Hardik', 27, 'Bhopal', 8500.00),
(6, 'Komal', 22, 'Hyderabad', 4500.00),
(7, 'Muffy', 24, 'Indore', 10000.00);

创建的表如下所示:

ID 姓名 年龄 地址 薪水
1 Ramesh 32 艾哈迈达巴德 2000.00
2 Khilan 25 德里 1500.00
3 Kaushik 23 科塔 2000.00
4 Chaitali 25 孟买 6500.00
5 Hardik 27 博帕尔 8500.00
6 Komal 22 海得拉巴 4500.00
7 Muffy 24 因多尔 10000.00

在以下查询中,我们从 CUSTOMERS 表中获取 ID、NAME 和 SALARY 字段,用于薪水大于 2000 的记录:

SELECT ID, NAME, SALARY FROM CUSTOMERS 
WHERE SALARY > 2000;

输出

这将产生以下结果:

ID 姓名 薪水
4 Chaitali 6500.00
5 Hardik 8500.00
6 Komal 4500.00
7 Muffy 10000.00

WHERE 子句与 UPDATE 语句

UPDATE 语句用于修改表中现有的记录。使用 SQL WHERE 子句与 UPDATE 语句一起,我们可以更新特定记录。如果不使用 WHERE 子句,则 UPDATE 语句将影响表的所有记录。以下是语法:

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;

示例

在以下查询中,我们使用 WHERE 子句以及 UPDATE 语句将名为 Ramesh 的客户的薪水增加 10000:

UPDATE CUSTOMERS set SALARY = SALARY+10000 
where NAME = 'Ramesh';

输出

我们得到以下结果。我们可以观察到 2 个客户的年龄已被修改:

Query OK, 2 rows affected (0.02 sec)
Rows matched: 2  Changed: 2  Warnings: 0

验证

要验证更改是否反映在表中,我们可以使用 SELECT 语句,如以下查询所示:

SELECT * FROM CUSTOMERS WHERE NAME = 'Ramesh';

表显示如下:

ID 姓名 年龄 地址 薪水
1 Ramesh 32 艾哈迈达巴德 12000.00

WHERE 子句与 IN 运算符

使用 IN 运算符,您可以在 where 子句中指定值列表或子查询。如果您将 WHERE 和 IN 与 SELECT 语句一起使用,它允许我们检索表中与指定列表中的任何值匹配的行。以下是它的语法:

WHERE column_name IN (value1, value2, ...);

其中,column_name 是表的列,而 value1、value2 等是我们想要与 column_name 比较的值列表。

示例

假设您想显示 CUSTOMERS 表中具有 NAME 值 KhilanHardikMuffy 的记录,您可以使用以下查询:

SELECT * from CUSTOMERS 
WHERE NAME IN ('Khilan', 'Hardik', 'Muffy');

输出

获得的结果如下:

ID 姓名 年龄 地址 薪水
2 Khilan 25 德里 1500.00
5 Hardik 27 博帕尔 8500.00
7 Muffy 24 因多尔 10000.00

WHERE 子句与 NOT IN 运算符

使用 NOT IN 运算符的 WHERE 子句是使用 IN 运算符的 WHERE 子句的否定。

  • 如果您使用 WHERE 和 IN 运算符,则 DML 语句将作用于指定的(列的)值列表
  • 相反,如果您使用 WHERE 和 NOT IN 运算符,则 DML 操作将对不在指定列表中的(列的)值执行。
因此,如果您将 WHERE 子句与 NOT IN 运算符以及 SELECT 语句一起使用,则会检索与值列表不匹配的行。以下是语法:
WHERE column_name NOT IN (value1, value2, ...);

示例

在此示例中,我们显示来自 CUSTOMERS 表的记录,其中 AGE 不等于 252322

SELECT * from CUSTOMERS WHERE AGE NOT IN (25, 23, 22);

输出

我们获得如下所示的结果:

ID 姓名 年龄 地址 薪水
1 Ramesh 32 艾哈迈达巴德 12000.00
5 Hardik 27 博帕尔 8500.00
7 Muffy 24 因多尔 10000.00

WHERE 子句与 LIKE 运算符

使用 LIKE 运算符的 WHERE 子句允许我们过滤与特定模式匹配的行。此特定模式由通配符(如 %、_、[] 等)表示。以下是语法:

WHERE column_name LIKE pattern;

其中,column_name 是我们要对比模式的列,而 pattern 是可以包含通配符(如 %、_、[] 等)的字符串。

示例

以下查询将显示所有名称以 K 开头且长度至少为 4 个字符的记录:

SELECT * FROM CUSTOMERS WHERE NAME LIKE 'K___%';

输出

获得的结果如下:

ID 姓名 年龄 地址 薪水
2 Khilan 25 德里 1500.00
3 Kaushik 23 科塔 2000.00
6 Komal 22 海得拉巴 4500.00

WHERE 子句与 AND, OR 运算符

我们可以在 SQL 中一起使用 AND 和 OR 运算符,以在 WHERE 子句中组合多个条件,以过滤满足指定条件的行。AND 运算符将确保仅过滤满足所有条件的行,而 OR 运算符将过滤满足任何一个指定条件的记录。但是,这仅在指定一个条件不足以过滤所有所需行时使用。

以下是如何在 WHERE 子句中使用 AND 和 OR 运算符的语法:

WHERE (condition1 OR condition2) AND condition3;

示例

在以下查询中,我们根据某些条件从 CUSTOMERS 表中检索所有行。括号控制求值顺序,以便首先应用 OR 运算符,然后应用 AND 运算符:

SELECT * FROM CUSTOMERS
WHERE (AGE = 25 OR salary < 4500) 
AND (name = 'Komal' OR name = 'Kaushik');

输出

这将产生以下结果:

ID 姓名 年龄 地址 薪水
3 Kaushik 23 科塔 2000.00
广告