복붙노트

[SQL] 정확히 어떻게 사용 또는 MySQL의 문은 괄호없이 /와 다른 점은 무엇입니까?

SQL

정확히 어떻게 사용 또는 MySQL의 문은 괄호없이 /와 다른 점은 무엇입니까?

나는이 쿼리를 가지고 :

SELECT * FROM (`users`) WHERE `date_next_payment` <= '2011-02-02' 
    AND `status` = 'active' OR `status` = 'past due'

어느 올바른 결과를 반환하지 않습니다. 그러나, 괄호 OR 조건을 추가하면 그렇게 같이 작동합니다 :

SELECT * FROM (`users`) WHERE `date_next_payment` <= '2011-02-02'
    AND (`status` = 'active' OR `status` = 'past due')

내 질문은 왜 다른 무엇입니까? 나는 이제 다른 괄호없이 OR 문을 고려하고 있다고 이해; 하지만 난 다르다 방법을 이해하지 않습니다.

나는이에 도움이 된 모든 문서를 발견하지 않았습니다. 거기 어떤 링크가 있다면 정말 감사하겠습니다.

해결법

  1. ==============================

    1.또는이보다 낮은 연산자 우선 순위를 가지고 있기 때문이다. DB를 같은 표현을 볼 때마다

    또는이보다 낮은 연산자 우선 순위를 가지고 있기 때문이다. DB를 같은 표현을 볼 때마다

    A AND B OR C
    

    앤드 먼저 평가, 즉 그것은 동등

    (A AND B) OR C
    

    명시 적 싶다면

    A AND (B OR C)
    

    대신, 당신은 괄호에 넣어해야합니다.

    이 BTW SQL 특정하지 않습니다. 이러한 연산자의 우선 순위는 내가 아는 모든 프로그래밍 언어에서 동일 (즉 적어도 C, C에서 ++, C #을, Java 및 유닉스 쉘 스크립트).

  2. ==============================

    2.

    SELECT * FROM (`users`) WHERE `date_next_payment` <= '2011-02-02' 
    AND `status` = 'active' OR `status` = 'past due'
    

    이 예에서, 어디 하나 모든 레코드를 얻을 것이다

    가) date_next_payment는 2011년 2월 2일 앞에있는 상태가 활성화됩니다

    b) 상태가있다 past_due

    그래서 past_due 기록은 날짜에 의해 제한되지 않습니다.

    SELECT * FROM (`users`) WHERE `date_next_payment` <= '2011-02-02'
    AND (`status` = 'active' OR `status` = 'past due')
    

    이 예제에서는 모든 레코드 어디를 얻을 것이다

    가) date_next_payment는 2011년 2월 2일 전에이다

    b)의 상태는 하나 또는 활성 인 past_due

    그들은 수학이나 논리처럼 브래킷이 작동 - 그래서 같은 각 단계 걸릴 장소를 보는 상상 ... 괄호 안에 문을 먼저 평가받을 :

    SELECT * FROM (`users`) WHERE `date_next_payment` <= '2011-02-02'
    AND (`status` = 'active' OR `status` = 'past due')
    

    그래서 기록은 활성 상태로 발생 ...

    SELECT * FROM (`users`) WHERE `date_next_payment` <= '2011-02-02'
    AND (TRUE OR FALSE)
    

    는 OR 조건 (TRUE 또는 FALSE) == TRUE와이 후 평가하여,

    SELECT * FROM (`users`) WHERE `date_next_payment` <= '2011-02-02'
    AND TRUE
    

    그리고 날짜는 2011-01-01입니다

    SELECT * FROM (`users`) WHERE TRUE
    AND TRUE
    

    그리고 마지막으로, TRUE와 TRUE == TRUE

    SELECT * FROM (`users`) WHERE TRUE
    

    그래서 기록이 반환됩니다 ...

    쿼리를 상상하는 것은 데이터베이스의 각 행에 대해이 같은 단계에서 실행되고 때로는 어디 괄호를 넣어하는 방법을 이해하는 데 도움이됩니다.

  3. ==============================

    3.에

    SELECT * FROM (`users`) WHERE `date_next_payment` <= '2011-02-02' 
        AND `status` = 'active' OR `status` = 'past due'
    

    먼저 date_next_payment <= '2011-02-02'AND 상태 = '활성화'와 다음이의 부울 대답은 '연체'= 완료 또는 상태로됩니다 고려할 것

    에있는 동안

    SELECT * FROM (`users`) WHERE `date_next_payment` <= '2011-02-02'
        AND (`status` = 'active' OR `status` = 'past due')
    

    첫 번째 또는 완료됩니다 다음과 수행됩니다 ... 그게 전부는 Y이 서로 다른 대답을 줄 것이다

  4. ==============================

    4.MySQL의 설명서는 연산자 우선 순위에 페이지가 있습니다. 그것은 그를 표시하고 더 높은 우선 순위를 갖습니다. P1과 P2 또는 P3는 (P1과 P2) 또는 P3로 해석됩니다 그래서. 진리표 쉽게이 P1과 (P2 또는 P3) 다른 당신을 설득 할 것이다.

    MySQL의 설명서는 연산자 우선 순위에 페이지가 있습니다. 그것은 그를 표시하고 더 높은 우선 순위를 갖습니다. P1과 P2 또는 P3는 (P1과 P2) 또는 P3로 해석됩니다 그래서. 진리표 쉽게이 P1과 (P2 또는 P3) 다른 당신을 설득 할 것이다.

  5. ==============================

    5.그것은 부울 논리에 관한 것입니다, SQL에 대한 특별하지 않다. 귀하의 첫 번째 문은 다음과 같습니다

    그것은 부울 논리에 관한 것입니다, SQL에 대한 특별하지 않다. 귀하의 첫 번째 문은 다음과 같습니다

    A와 B 또는 C

    어떤 C에 해당하는 경우 그 말은, 당신은 행을 얻을.

    a와 (나 OR c)

    A는 사실이다와 (b 또는 c)가 true입니다 만 행을 얻을.

  6. ==============================

    6.당신은 괄호를 추가 할 때 조건이 변경됩니다.

    당신은 괄호를 추가 할 때 조건이 변경됩니다.

    초기 경우, 결과 세트는 조건을 만족하는 레코드 이루어져

    `date_next_payment` <= '2011-02-02' AND `status` = 'active' 
    

    또는 조건

     `status` = 'past due'.
    

    당신은 괄호를 추가 한 후 결과 세트는 조건을 만족하는 레코드로 구성됩니다

    `date_next_payment` <= '2011-02-02' 
    

    그리고 조건 중

    `status` = 'active' 
    

    또는

    `status` = 'past due'
    
  7. ==============================

    7.첫 번째 쿼리에서 상태 = '활성'는 evalute 다음 상태 항목 조건 (상태) 상태 거짓 아니다

    첫 번째 쿼리에서 상태 = '활성'는 evalute 다음 상태 항목 조건 (상태) 상태 거짓 아니다

    두 번째 쿼리

    . 그래서 조건 ( '연체'상태 = '활성'OR 상태 =) 처음으로 평가한다.

  8. ==============================

    8.당신은 당신이 실제로 말을 괄호를 사용하지 않을 때는 때문입니다 :

    당신은 당신이 실제로 말을 괄호를 사용하지 않을 때는 때문입니다 :

    `date_next_payment` <= '2011-02-02'     AND `status` = 'active'
    OR
    `status` = 'past due'.
    

    어떤 수단 status` = '연체'이 기록이 너무 표시 될 때. 관계없이 다른 상태를 전달.

    당신이 사용 괄호를 할 때 당신이 필요합니다 :

     `date_next_payment` <= '2011-02-02'
    

    상기 두 조건들 중 하나를 전달한다.

  9. from https://stackoverflow.com/questions/4872180/how-exactly-does-using-or-in-a-mysql-statement-differ-with-without-parentheses by cc-by-sa and MIT license