ALL比较符的用法

ANY

SOME

Compares a value to each value in a list or returned by a query. Must be preceded by =, !=, >, <, <=, >=. Can be followed by any expression or subquery that returns one or more values.

Evaluates to FALSE if the query returns no rows.

SELECT * FROM employees
  WHERE salary = ANY
  (SELECT salary
   FROM employees
  WHERE department_id = 30)
  ORDER BY employee_id;

ALL

Compares a value to every value in a list or returned by a query. Must be preceded by =, !=, >, <, <=, >=. Can be followed by any expression or subquery that returns one or more values.

Evaluates to TRUE if the query returns no rows.

SELECT * FROM employees
  WHERE salary >=
  ALL (1400, 3000)
  ORDER BY employee_id;
 
 
以scott/tiger 的emp表作为示例:
scott@TEST0924> select * from emp;
 
     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20
      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
      7566 JONES      MANAGER         7839 02-APR-81       2975                    20
      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20
      7839 KING       PRESIDENT            17-NOV-81       5000                    10
      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30
      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20
      7900 JAMES      CLERK           7698 03-DEC-81        950                    30
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10
 
14 rows selected.
 
ALL:类似AND操作符,即要满足所有条件,大于所有值,即大于最大值。
scott@TEST0924> select empno,sal from emp
  2  where sal>all(2000,3000);
 
     EMPNO        SAL
---------- ----------
      7839       5000
等价于大于所有的值
scott@TEST0924> select empno,sal from emp
  2  where sal>2000 and sal>3000;
 
     EMPNO        SAL
---------- ----------
      7839       5000
等价于大于最大的那个值
scott@TEST0924> select empno,sal from emp
  2  where sal>3000;
 
     EMPNO        SAL
---------- ----------
      7839       5000
 
如果all后面跟着子查询:
scott@TEST0924> SELECT e2.sal FROM   emp e2 WHERE  e2.deptno = 20;
 
       SAL
----------
       800
      2975
      3000
      1100
      3000
 
scott@TEST0924> SELECT e1.empno, e1.sal
  2  FROM   emp e1
  3  WHERE  e1.sal > ALL (SELECT e2.sal
  4  FROM   emp e2
  5  WHERE  e2.deptno = 20);
 
     EMPNO        SAL
---------- ----------
      7839       5000
等价于
scott@TEST0924> SELECT e1.empno, e1.sal
  2  FROM   emp e1
  3  WHERE  e1.sal > ALL (800,2975,3000,1100,3000);
 
     EMPNO        SAL
---------- ----------
      7839       5000
等价于大于最大值:
scott@TEST0924> SELECT e1.empno, e1.sal FROM   emp e1
  2   WHERE  e1.sal > 3000;
 
     EMPNO        SAL
---------- ----------
      7839       5000
等价于
scott@TEST0924> SELECT e1.empno, e1.sal
  2  FROM   emp e1
  3  WHERE  NOT (e1.sal <= ANY (SELECT e2.sal
  4  FROM emp e2
  5  WHERE e2.deptno = 20));
 
     EMPNO        SAL
---------- ----------
      7839       5000
也等价于
scott@TEST0924> SELECT e1.empno, e1.sal                                                                                                            
  2  FROM   emp e1
  3  WHERE  NOT EXISTS (SELECT e2.sal
  4  FROM emp e2
  5  WHERE e2.deptno = 20
  6  AND   e1.sal <= e2.sal);
 
 
     EMPNO        SAL
---------- ----------
      7839       5000
 
如果all的子查询有返回值,则
  • "x = ALL (...)": The value must match all the values in the list to evaluate to TRUE.所有值都要匹配
  • "x != ALL (...)": The value must not match any values in the list to evaluate to TRUE.至少有一个值不匹配
  • "x > ALL (...)": The value must be greater than the biggest value in the list to evaluate to TRUE.大于最大的值
  • "x < ALL (...)": The value must be smaller than the smallest value in the list to evaluate to TRUE.小于最小的值
  • "x >= ALL (...)": The value must be greater than or equal to the biggest value in the list to evaluate to TRUE.大于等于最大的值
  • "x <= ALL (...)": The value must be smaller than or equal to the smallest value in the list to evaluate to TRUE.小于等于最小的值
如果all的子查询返回值为0行,则
scott@TEST0924> SELECT e2.sal FROM emp e2 WHERE e2.deptno = 100
  2  ;
 
no rows selected
=ALL,按照原来的值输出
scott@TEST0924> SELECT e1.empno, e1.sal
  2  FROM   emp e1
  3  WHERE  e1.sal=ALL (SELECT e2.sal FROM emp e2 WHERE e2.deptno = 100);
 
     EMPNO        SAL
---------- ----------
      7369        800
      7499       1600
      7521       1250
      7566       2975
      7654       1250
      7698       2850
      7782       2450
      7788       3000
      7839       5000
      7844       1500
      7876       1100
      7900        950
      7902       3000
      7934       1300
 
14 rows selected.
 
!=ALL也按照原来的值输出,但不知道按什么排序的?
scott@TEST0924> SELECT e1.empno, e1.sal FROM   emp e1
  2  WHERE  e1.sal!=ALL (SELECT e2.sal FROM emp e2 WHERE e2.deptno = 100);
 
     EMPNO        SAL
---------- ----------
      7369        800
      7902       3000
      7788       3000
      7698       2850
      7782       2450
      7839       5000
      7654       1250
      7521       1250
      7499       1600
      7876       1100
      7900        950
      7566       2975
      7934       1300
      7844       1500
 
14 rows selected.
 
<ALL,按原来的值降序输出
scott@TEST0924> SELECT e1.empno, e1.sal
  2  FROM   emp e1
  3  WHERE  e1.sal<ALL (SELECT e2.sal FROM emp e2 WHERE e2.deptno = 100);
 
     EMPNO        SAL
---------- ----------
      7839       5000
      7902       3000
      7788       3000
      7566       2975
      7698       2850
      7782       2450
      7499       1600
      7844       1500
      7934       1300
      7521       1250
      7654       1250
      7876       1100
      7900        950
      7369        800
 
14 rows selected.
<=ALL和<ALL一样按原来的值降序输出
scott@TEST0924> SELECT e1.empno, e1.sal
  2  FROM   emp e1
  3  WHERE  e1.sal<=ALL (SELECT e2.sal FROM emp e2 WHERE e2.deptno = 100);
 
     EMPNO        SAL
---------- ----------
      7839       5000
      7902       3000
      7788       3000
      7566       2975
      7698       2850
      7782       2450
      7499       1600
      7844       1500
      7934       1300
      7521       1250
      7654       1250
      7876       1100
      7900        950
      7369        800
 
14 rows selected.
 
>ALL和>=ALL,按原来的升序输出
scott@TEST0924> SELECT e1.empno, e1.sal
  2  FROM   emp e1
  3  WHERE  e1.sal > ALL (SELECT e2.sal FROM emp e2 WHERE e2.deptno = 100);
 
     EMPNO        SAL
---------- ----------
      7369        800
      7900        950
      7876       1100
      7521       1250
      7654       1250
      7934       1300
      7844       1500
      7499       1600
      7782       2450
      7698       2850
      7566       2975
      7788       3000
      7902       3000
      7839       5000
 
14 rows selected.
 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
union all 是一种 SQL 查询中的操作,用于将两个或多个 SELECT 语句的结果集合并为一个结果集。它与 union 操作不同的是,union all 不会去除重复的行,而是将所有的行都包括在结果集中。 使用 union all 的方法如下: 1. 编写多个 SELECT 语句,确保它们的列数和数据类型相匹配。 2. 使用 UNION ALL 关键字将多个 SELECT 语句连接起来,并按照需要的顺序排列。 例如: ``` SELECT column1, column2 FROM table1 UNION ALL SELECT column1, column2 FROM table2; ``` 这个查询将返回 table1 和 table2 中所有的行,并将它们合并成一个结果集。 在使用 union all 时需要注意以下几点: 1. 列数和数据类型必须一致:每个 SELECT 语句的列数和数据类型必须相同,否则会导致语法错误。 2. 结果集按顺序合并:union all 操作会按照 SELECT 语句的顺序将结果集合并,所以需要注意 SELECT 语句的顺序。 3. 不去除重复行:与 union 操作不同,union all 不会去除重复的行,所以结果集可能包含重复的行。如果需要去除重复行,可以使用 union 操作替代。 4. 性能影响:由于 union all 不去除重复行,所以在合并结果集时不需要进行额外的去重操作,相比于 union 操作,union all 的性能更高。但是,如果确实需要去除重复行,使用 union all 会导致性能下降。 希望这些信息对你有所帮助!如果你有其他问题,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值