[sql] SELECT * FROM tablename WHERE 1

나는 궁금했다. 이러한 각 쿼리의 차이점은 무엇입니까?

  1. SELECT * FROM `tablename`

  2. SELECT * FROM `tablename` WHERE 1

  3. 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 번이면 충분합니다.