SQL ANY, ALL运算符
在SQL中,运算符的意义与数学运算符相同。它们是用于执行比较或逻辑操作的关键字。在SQL中,有四种类型的运算符。算术运算符、比较运算符、逻辑运算符和位运算符。
SQL ANY和ALL运算符 用于在子查询返回的一组值与单个值之间进行比较。这些是逻辑运算符。
ANY和ALL运算符必须先于标准比较运算符(如>、>=、<、<=、=、<>、!=
),后面跟着一个子查询。ANY和ALL的主要区别在于,如果子查询中的任何值满足条件,ANY返回true,而ALL则返回true。
SQL ANY运算符
ANY运算符用于验证查询的任意一条记录是否满足所需的条件。
如果给定条件对于指定范围内的任何值都满足,则此运算符返回TRUE。如果指定范围内的任何值都不满足给定条件,此运算符返回false。您还可以与此运算符一起使用另一个查询(子查询)。
语法
SQL – ANY运算符的基本语法如下-
Column_name operator ANY (subquery)
其中,
- column_name 是主查询中的列名。
-
operator 是比较运算符,如=,<,>,<=,>=或<>。
-
subquery 是一个SELECT语句,返回一个列的值。
使用>
运算符的ANY
通常,ANY运算符用于将一个值与子查询返回的一组值进行比较,在这种情况下,我们可以使用它与 > (大于)运算符一起验证特定列值是否大于子查询返回的任何记录的列值。
示例
为了更好地理解,让我们考虑包含客户的个人详细信息的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语句将值插入到这个表中:
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'kaushik', 23, 'Kota', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (6, 'Komal', 22, 'MP', 4500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (7, 'Muffy', 24, 'Indore', 10000.00 );
表格将如下所示创建-
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 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 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
现在,让我们尝试列举出工资大于32岁顾客的任何顾客的工资详细信息,即在这种情况下是Chaitali,Hardik,Komal和Muffy。
select * from customers
WHERE SALARY > ANY (select SALARY from CUSTOMERS where AGE = 32);
输出
得到的结果如下:
+----+----------+-----+---------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+---------+----------+
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+---------+----------+
使用<
运算符的ANY
类似于“>”运算符,我们可以使用“<”(小于)运算符与ANY一起使用,以验证特定列值是否小于子查询返回的记录中的任何列值。
示例
在这里,我们试图找到在CUSTOMERS表中先前创建的任何薪水 小于 所有顾客薪水的平均薪水的不同年龄的客户。
SELECT DISTINCT AGE
FROM customers
WHERE SALARY < ANY (SELECT avg(SALARY) FROM CUSTOMERS);
输出
在执行上述查询时,我们得到以下输出结果 −
+-----+
| AGE |
+-----+
| 22 |
| 23 |
| 25 |
| 32 |
+-----+
任何与 =
运算符
当我们使用 =
(等于)运算符与任何一起使用时,它会验证特定列的值是否等于子查询返回的任何记录的列值。
示例
在下面的查询中,我们尝试返回所有年龄 等于 以“K”开头的任何客户姓名的客户的详细信息。
select * from customers
WHERE AGE = ANY (SELECT AGE FROM CUSTOMERS where NAME LIKE 'K%');
输出
生成的结果如下 –
+----+----------+-----+---------+---------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+---------+---------+
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
+----+----------+-----+---------+---------+
SQL – ALL运算符
ALL运算符返回SELECT语句的所有记录。
- 如果给定的条件对于范围中的所有值都满足,则返回TRUE。
-
它总是返回一个布尔值。
-
它与SQL查询中的SELECT,WHERE和HAVING语句一起使用。
-
子查询返回的值的数据类型必须与外部查询表达式的数据类型相同。
语法
SQL – ALL运算符的基本语法如下:
Column_name operator ALL (subquery)
其中,
- column_name - 是主查询中的一个列的名称。
-
operator - 是一个比较运算符,如 =、<、>、<=、>= 或 <>。
-
subquery - 是返回单个列值的SELECT语句。
现在,让我们看一些SQL – ALL运算符的示例。
带WHERE语句的ALL
当我们在WHERE子句中使用ALL运算符时,它根据指定的条件过滤子查询的结果。
SQL中的WHERE子句用于根据特定条件从查询中筛选行。它作用于表中的各个行,允许您指定查询返回的数据中每行必须满足的条件。
示例
如果我们考虑上面创建的customers表,以下查询返回所有薪水不等于任何年龄为25的客户薪水的客户的详细信息 –
select * from CUSTOMERS where SALARY <> ALL (select SALARY from CUSTOMERS where AGE = 25);
输出
上述查询的输出如下所示:
+----+---------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+---------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+---------+-----+-----------+----------+
全部使用HAVING语句
在SQL中, ALL 运算符也可以与HAVING子句一起使用,根据适用于组中所有聚合值的条件过滤GROUP BY查询的结果。
示例
以下SQL查询用于获取工资 小于 平均工资的所有客户的详细信息 –
select NAME, AGE, ADDRESS, SALARY from CUSTOMERS
GROUP BY NAME, AGE, ADDRESS, SALARY
HAVING SALARY < ALL (SELECT avg(SALARY) from CUSTOMERS);
输出
上述查询的输出结果如下:
+---------+-----+-----------+---------+
| NAME | AGE | ADDRESS | SALARY |
+---------+-----+-----------+---------+
| kaushik | 23 | Kota | 2000.00 |
| Khilan | 25 | Delhi | 1500.00 |
| Komal | 22 | MP | 4500.00 |
| Ramesh | 32 | Ahmedabad | 2000.00 |
+---------+-----+-----------+---------+
注意 − 在SQL Server中,每当使用聚合函数时,SELECT语句中使用的表的所有列都必须在GROUP BY子句中出现,以根据使用的聚合函数对表进行汇总。