나는 궁금했다. 이러한 각 쿼리의 차이점은 무엇입니까?
-
SELECT * FROM `tablename`
-
SELECT * FROM `tablename` WHERE 1
-
SELECT * FROM `tablename` WHERE 1=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'
답변
아시다시피, 세 가지 모두 동일한 결과를 생성합니다. (부울 컨텍스트에서 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
다음과 같은 조건 을 쉽게 처리하는 데 사용됩니다 .
SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')
답변
1에서 MySQL은 WHERE 조건을 평가할 필요가 없습니다.
2와 3에서 where 조건은 정적이며 행 값을 기반으로하지 않습니다. 부울 논리로 평가되며 항상 참입니다.
기능적으로는 차이가 없습니다. 코드 명확성을 위해 1을 선택해야합니다.
답변
모두 동일하지만 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"
답변
그들은 모두 같은 대답을 출력했습니다. 그러나 2와 3이 작성되는 방식은 대부분 “Where”문을 제어하기위한 것이므로 나중에 쉽게 추가하거나 제거 할 수 있습니다.
나는 첫 번째와 세 번째 방법이 그것을 쓰는 올바른 방법이라고 생각합니다. 3 번과 같이 where 문이 필요하면 1 번이면 충분합니다.