나는 궁금했다. 이러한 각 쿼리의 차이점은 무엇입니까?
SELECT * FROM `tablename`
SELECT * FROM `tablename` WHERE 1
SELECT * FROM `tablename` WHERE 1=1
... WHERE TRUE
않습니까? 나는 (MySQL을 포함한 대부분의 SQL에서) TRUE가 멋진 매크로라는 것을 알고 1
있지만 여전히 독자에게는 조금 더 분명하지 않습니까?
나는 궁금했다. 이러한 각 쿼리의 차이점은 무엇입니까?
SELECT * FROM `tablename`
SELECT * FROM `tablename` WHERE 1
SELECT * FROM `tablename` WHERE 1=1
... WHERE TRUE
않습니까? 나는 (MySQL을 포함한 대부분의 SQL에서) TRUE가 멋진 매크로라는 것을 알고 1
있지만 여전히 독자에게는 조금 더 분명하지 않습니까?
답변:
MySQL에서는 2와 3이 동일하고 기능적으로 1도 동일합니다.
where 1
표준이 아니므로 다른 사람들이 지적했듯이 다른 방언에서는 작동하지 않습니다.
사람들은 추가 where 1
또는 where 1 = 1
있도록 where
조건을 쉽게 약간의 "주석 /에 추가하여 쿼리 / 추가 또는 제거 할 수 있습니다 and
..."구성 요소를.
즉
SELECT * FROM `tablename` WHERE 1=1
--AND Column1 = 'Value1'
AND Column2 = 'Value2'
WHERE 1=1
당신이 문자열에 추가하려고하는 상태가 처음 인 경우가 필요합니다, 그래서 당신이 (알아서 할 필요가 없습니다 WHERE
앞에 ) 또는 아닙니다.
ORDER BY 1
두 개 이상의 SELECT 문을 통합하는 경우 열 이름 대신 @dlatikay 구문이 필요합니다.
" AND "
구분 기호로 문자열 조인을하는 것이 훨씬 합리적이라고 생각합니다 .
아시다시피, 세 가지 모두 동일한 결과를 생성합니다. (부울 컨텍스트에서 MySQL은 정수 "1"을 true로 처리합니다. 실제로 "0"이 아닌 모든 숫자는 true로 처리됩니다.
MySQL 옵티마이 저는 다음 절 에서 상수 조건을 제거 하도록 명시 적으로 문서화 되어 WHERE
있습니다.
지속적인 상태 제거. . . :
(B> = 5 AND B = 5) OR (B = 6 AND 5 = 5) OR (B = 7 AND 5 = 6)-> B = 5 OR B = 6
따라서 세 가지 모두 정확히 동일한 코드로 컴파일됩니다.
그것들은 모두 기능적으로 동일하며 동일한 성능 특성을 가져야합니다.
즉, 첫 번째와 세 번째는 표준 SQL입니다. 두 번째는 많은 데이터베이스에서 일종의 부울 식 오류를 발생시킵니다. 따라서 나는 그것을 피하는 것이 좋습니다 (MySQL의 엄격한 SQL 모드에서 작동하는지 여부는 확실하지 않습니다).
동적 WHERE
절을 구성 할 때 세 번째가 종종 사용됩니다 . AND <condition>
머무는 것에 대해 걱정하지 않고 추가 조건을 쉽게 추가 할 수 있습니다 AND
.
퍼포먼스와 결과의 차이에 대해 질문하는 경우, 2와 3은 같지 않으며 WHERE TRUE
첫 번째와 동일합니다.
1 - SELECT * FROM table_name
table_name
(필터 없음)의 모든 데이터 결과
2 - SELECT * FROM table_name WHERE 1
1은 TRUE
필터 로 평가 되지 않으므로 모든 레코드가 반환됩니다.
3 - SELECT * FROM table_name where 1=1
마지막 것과 동일합니다. 1 = 1은 TRUE
표현식이므로 필터가 없습니다. 모든 레코드가 선택됩니다.
모두 동일하지만 2와 3은 AND / OR 조건에 대한 동적 쿼리를 만드는 데 사용됩니다.
sqlquery =" SELECT * FROM `tablename` where 1 =1 "
우리는 동적 쿼리를 만들기 위해 2와 3 형식을 사용하므로 "where"키워드가 추가되었음을 알고 필터를 계속 추가합니다. 처럼
sqlquery = sqlquery + "and columna =a"
"AND columna =a " then
몇 줄 뒤에 새 필터가 있으면 "AND coulmnb = b"등을 추가합니다.
첫 번째 또는 초기 쿼리에 키워드가있는 위치에 대해서는 SQL 쿼리를 확인할 필요가 없습니다.
SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')
그렇지 않으면 우리는 쓸 수 있습니다 sqlquery = "SELECT * FROM tablename"
그때
에는 '어디에'조항이없는 경우 sqlquery
다음
sqlquery = sqlquery + "where columna =a"
그밖에
sqlquery = sqlquery + "and columna =a"