[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.또는이보다 낮은 연산자 우선 순위를 가지고 있기 때문이다. DB를 같은 표현을 볼 때마다
또는이보다 낮은 연산자 우선 순위를 가지고 있기 때문이다. DB를 같은 표현을 볼 때마다
A AND B OR C
앤드 먼저 평가, 즉 그것은 동등
(A AND B) OR C
명시 적 싶다면
A AND (B OR C)
대신, 당신은 괄호에 넣어해야합니다.
이 BTW SQL 특정하지 않습니다. 이러한 연산자의 우선 순위는 내가 아는 모든 프로그래밍 언어에서 동일 (즉 적어도 C, C에서 ++, C #을, Java 및 유닉스 쉘 스크립트).
-
==============================
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.에
에
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.MySQL의 설명서는 연산자 우선 순위에 페이지가 있습니다. 그것은 그를 표시하고 더 높은 우선 순위를 갖습니다. P1과 P2 또는 P3는 (P1과 P2) 또는 P3로 해석됩니다 그래서. 진리표 쉽게이 P1과 (P2 또는 P3) 다른 당신을 설득 할 것이다.
MySQL의 설명서는 연산자 우선 순위에 페이지가 있습니다. 그것은 그를 표시하고 더 높은 우선 순위를 갖습니다. P1과 P2 또는 P3는 (P1과 P2) 또는 P3로 해석됩니다 그래서. 진리표 쉽게이 P1과 (P2 또는 P3) 다른 당신을 설득 할 것이다.
-
==============================
5.그것은 부울 논리에 관한 것입니다, SQL에 대한 특별하지 않다. 귀하의 첫 번째 문은 다음과 같습니다
그것은 부울 논리에 관한 것입니다, SQL에 대한 특별하지 않다. 귀하의 첫 번째 문은 다음과 같습니다
A와 B 또는 C
어떤 C에 해당하는 경우 그 말은, 당신은 행을 얻을.
a와 (나 OR c)
A는 사실이다와 (b 또는 c)가 true입니다 만 행을 얻을.
-
==============================
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.첫 번째 쿼리에서 상태 = '활성'는 evalute 다음 상태 항목 조건 (상태) 상태 거짓 아니다
첫 번째 쿼리에서 상태 = '활성'는 evalute 다음 상태 항목 조건 (상태) 상태 거짓 아니다
두 번째 쿼리
. 그래서 조건 ( '연체'상태 = '활성'OR 상태 =) 처음으로 평가한다.
-
==============================
8.당신은 당신이 실제로 말을 괄호를 사용하지 않을 때는 때문입니다 :
당신은 당신이 실제로 말을 괄호를 사용하지 않을 때는 때문입니다 :
`date_next_payment` <= '2011-02-02' AND `status` = 'active' OR `status` = 'past due'.
어떤 수단 status` = '연체'이 기록이 너무 표시 될 때. 관계없이 다른 상태를 전달.
당신이 사용 괄호를 할 때 당신이 필요합니다 :
`date_next_payment` <= '2011-02-02'
상기 두 조건들 중 하나를 전달한다.
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
'SQL' 카테고리의 다른 글
[SQL] SSRS 2008 보고서의 제로 / 널 해결 방법으로 나누기 (0) | 2020.05.26 |
---|---|
[SQL] 어떻게 SQLite는 쉼표로 구분 된 값을 분할하려면? (0) | 2020.05.26 |
[SQL] 이동 평균 T-SQL의 계산 (0) | 2020.05.26 |
[SQL] 엔티티 프레임 워크 마이그레이션에 'GO'문을 추가 (0) | 2020.05.26 |
[SQL] sqlite가에서 DATETIME에서 달을 받기 (0) | 2020.05.26 |