programing

Oracle: '= ANY()' 대 'IN()'

nicescript 2023. 3. 8. 23:45
반응형

Oracle: '= ANY()' 대 'IN()'

우연히 ORACLE SQL에서 궁금한 내용을 발견했습니다(다른 항목에 있는지 확실하지 않음).구글에서 기호를 검색하기가 어렵기 때문에 위키로 물어봅니다.

값을 일련의 값과 비교하여 확인할 때 다음과 같은 작업을 수행할 수 있습니다.

WHERE x = ANY (a, b, c)

평소와 달리

WHERE x IN (a, b, c)

그래서 궁금해요, 이 두 가지 구문에는 어떤 이유가 있을까요?표준 구문과 홀수 구문이 각각1개씩 있습니까?아니면 둘 다 표준인가요?그리고 퍼포먼스상의 이유로 한쪽을 다른 쪽보다 선호합니까?

'= ANY' 구문에 대해 누구나 저에게 어떤 말을 할 수 있는지 궁금할 뿐입니다.

ANY 그 )SOME는 )의입니다.EXISTS다음 중 하나:

SELECT  *
FROM    mytable
WHERE   x <= ANY
        (
        SELECT  y
        FROM    othertable
        )

다음과 같습니다.

SELECT  *
FROM    mytable m
WHERE   EXISTS
        (
        SELECT  NULL
        FROM    othertable o
        WHERE   m.x <= o.y
        )

필드에서의 에서는 Null과 .IN.

를 한 모든 데이터베이스SQL Server,MySQL ★★★★★★★★★★★★★★★★★」PostgreSQL

IN- Equal to any member in the list
ANY- Compare value to **each** value returned by the subquery
ALL- Compare value to **EVERY** value returned by the subquery

<ANY() - less than maximum
>ANY() - more than minimum
=ANY() - equivalent to IN
>ALL() - more than the maximum
<ALL() - less than the minimum

예:

각 부서의 최저 급여와 동일한 급여를 받는 직원을 찾습니다.

SELECT last_name, salary,department_id
FROM employees
WHERE salary IN (SELECT MIN(salary)
                 FROM employees
                 GROUP BY department_id);

IT프로그래머가 아닌 IT프로그래머보다 급여가 적은 직원:

SELECT employee_id, last_name, salary, job_id
FROM employees
WHERE salary <ANY
                (SELECT salary
                 FROM employees
                 WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';

IT_PROG의 직무 ID를 가진 모든 직원의 급여보다 적은 급여를 받는 직원, IT_PROG가 아닌 직원:

SELECT employee_id,last_name, salary,job_id
FROM employees
WHERE salary <ALL
                (SELECT salary
                 FROM employees
                 WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';

....................

도움이 됐으면 좋겠다.-누린 파티마

간단히 말하면 O'Reilly의 "Mastering Oracle SQL"에서 인용한 것입니다.

"하위 쿼리에서 IN을 사용하는 것은 기능적으로 ANY를 사용하는 것과 같으며, 하위 쿼리에서 반환되는 세트에서 일치하는 항목이 발견되면 TRUE를 반환합니다."

"IN이 다른 어떤 것보다 직관적이기 때문에 이러한 상황에서는 거의 항상 IN을 사용합니다."

이것으로 ANY vs IN에 대한 궁금증이 해소되기를 바랍니다.

당신이 찾고 있는 것은 다음과 같습니다.

http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96533/opt_ops.htm#1005298 (Eddie Awad's Blog에 있는 링크) 요약하면 다음과 같습니다.

last_name IN ('SMITH', 'KING', 'JONES')

로 변환되다

last_name = 'SMITH' OR last_name = 'KING' OR last_name = 'JONES'

하는 동안에

salary > ANY (:first_sal, :second_sal)

로 변환되다

salary > :first_sal OR salary > :second_sal

옵티마이저는 ANY 연산자 또는 SOME 연산자 뒤에 서브쿼리를 사용하는 조건을 EXIST 연산자와 관련된 서브쿼리를 포함하는 조건으로 변환합니다.

ANY 구문을 사용하면 다음과 같은 것을 쓸 수 있습니다.

WHERE x > ANY(a, b, c)

또는 이벤트

WHERE x > ANY(SELECT ... FROM ...)

지구상에 ANY(및 그 형제 ALL)를 사용하는 사람이 실제로 있는지 확실하지 않습니다.

퀵 구글이 이 http://theopensourcery.com/sqlanysomeall.htm을 찾았습니다.

Any를 사용하면 = 이외의 연산자를 사용할 수 있으며, 다른 대부분의 경우(null의 경우 특수한 경우) IN과 같이 작동합니다.= 연산자와 함께 IN을 ANY로 생각할 수 있습니다.

이게 표준이에요.SQL 1992의 표준 스테이트

8.4 <술어>

[...]

<in predicate> ::=
    <row value constructor>
      [ NOT ] IN <in predicate value>

[...]

2) RVC를 <row value constructor>로 하고, IPV를 <in credicate value>로 합니다.

[...]

4) 표현

  RVC IN IPV

와 동등하다

  RVC = ANY IPV  

사실 그 '우리'는<in predicate>는 「동작」에하고 있습니다.8.7 <quantified comparison predicate>인 Oracle SQL을

아마 링크된 기사 중 하나에서 지적하고 있을 것입니다만, 일치하는 것(=)을 찾을 때 두 사람이 같은 것을 반환하는 것은 사실이 아닙니다.다만, 다양한 회답(><등)을 찾고 있는 경우는, 「IN」을 사용할 수 없고, 「ANY」를 사용할 필요가 있습니다.

난 초보야, 내가 뭔가 놓쳤다면 용서해줘...

MySql은 문서의 모든 내용을 잘 지웁니다.

ANY 키워드는 비교 연산자 뒤에 와야 합니다.이 키워드는 "서브쿼리가 반환하는 컬럼의 모든 값에 대해 비교가 TRUE이면 TRUE를 반환한다"를 의미합니다.예를 들어 다음과 같습니다.

SELECT s1 FROM t1 WHERE s1 > ANY (SELECT s1 FROM t2);

표 t1에 (10)을 포함하는 행이 있다고 가정합니다.t2의 값 7이 10보다 작기 때문에 테이블 t2에 (21,14,7)이 포함되어 있으면 이 식은 TRUE입니다.테이블 t2에 (20,10)이 포함되어 있는 경우 또는 테이블 t2가 비어 있는 경우 식은 FALSE가 됩니다.테이블 t2에 (NULL, NULL, NULL)이 포함되어 있으면 식을 알 수 없습니다(NULL).

https://dev.mysql.com/doc/refman/5.5/en/any-in-some-subqueries.html

또한 Alan Beulieu의 SQL 학습에는 다음과 같은 내용이 기재되어 있습니다.

대부분의 사람들이 IN을 선호하지만 = ANY를 사용하는 것은 IN 연산자를 사용하는 것과 같습니다.

가 ★★★★★★★★★★★★★★★★★★★★★★ ★★★★★★★★★★any일부 Oracle 버전 또는 mssql 버전에서는 IN 목록이 1000/999 요소로 제한되기 때문입니다.한편, 「 」는, 「 」, 「 」의 사이에= any () 1000으로 .

SQL 쿼리가 웹 요청을 크래시하는 것을 좋아하는 사람은 없습니다.그래서 실제적인 차이가 있다.

두 번째 이유는 보다 현대적인 형태이다. 표현은 '아예'와 같은 이 있기 > all (...).

세 번째 이유는 영어가 모국어가 아닌 저에게 IN보다 any와 all을 사용하는 것이 더 자연스러운 것처럼 보이기 때문입니다.

언급URL : https://stackoverflow.com/questions/2298550/oracle-any-vs-in

반응형