SELECT * FROM Customers
WHERE CustomerID = ANY (SELECT CustomerID FROM Customers WHERE MemberCategory = 'A')SELECT * FROM Customers
WHERE CustomerID IN (SELECT CustomerID FROM Customers WHERE MemberCategory = 'A')如果说以上两句查询完全等同的话,那么请问ANY这个关键词存在的意义又是什么呢?
表示CustomerID在查询的CustomerID范围之内的.第一句:CustomerID = ANY (SELECT CustomerID FROM Customers WHERE MemberCategory = 'A')
表示CustomerID等于任何一个查询出来的CustomerID.所以在这种情况下,两句结果一致.
in的输入可以是自面值列表货返回单列的子查询,any/some和all仅支持用子查询作为输入
如果你要用自面值列表作为这些谓词的输入,必须把该列值转化为子查询原文见T-SQL查询 P210
Some在此表示满足其中一个的意义,是用or串起来的比较从句。
Any也表示满足其中一个的意义,也是用or串起来的比较从句,区别是any一般用在非“=”的比较关系中,这也很好理解,英文中的否定句中使用any肯定句中使用sone,这一点是一样的。
All则表示满足其其中所有的查询结果的含义,使用and串起来的比较从句。
下面是一些例子
找出员工中,只要比部门号为10的员工中的任何一个员工的工资高的员工的姓名个工资。也就是说只要比部门号为10的员工中的那个工资最少的员工的工资高就满足条件。 select ename,sal
From emp
Where sal > any(select sal from emp where deptno = 10); 这里推荐用any,如果你非要用some也是没有任何问题的,结果是一样的,只是一般来讲some用在“=”的比较从句中。
select ename,sal
From emp
Where sal > some(select sal from emp where deptno = 10); 上面的用法完全OK的。
select ename,sal
From emp
Where sal = some(select sal from emp where deptno = 30) and deptno not in (select deptno from emp where deptno = 30); 上面才是some的正常用法。其含义是找到和30部门员工的任何一个人工资相同的那些员工。虽然没有找到。
最后一个关键字all的用法也很简单就是要与子查询的每一结果都要匹配。 select ename,sal
From emp
Where sal > all(select sal from emp where deptno = 20); 上面的SQL语句的意义与前面的就完全不一样了,其意义是找到比部门号为20的员工的所有员工的工资都要高的员工,也就是比那个工资最高的员工的还要高的员工
总的来说some和any用法意义是一样的,仅在词法上有不同,都表示对子查询结果集中“或”的比较关系,而all则是对子查询结果集总每一个结果“与”的关系
可是 > ANY 就没有IN与其等价了.