SELECT * FROM tablename WHERE 1


129

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

  1. SELECT * FROM `tablename`

  2. SELECT * FROM `tablename` WHERE 1

  3. SELECT * FROM `tablename` WHERE 1=1


9
태그에 "너무 좁은"플래그가 있습니까? 이는 전부는 아니지만 많은 SQL 언어에 적용되기 때문입니다. MSSQL과 Oracle에서도 자주 볼 수 있습니다. 아포스트로피는 무엇입니까? mysql 객체 이름을 인용하는 데 사용되는 백틱이 아닌가?
Cee McSharpface 20

3
@dlatikay 당신은 태그를 편집 할 수 있습니다 ...
Braiam

2
흠. 왜 간단하지 ... WHERE TRUE않습니까? 나는 (MySQL을 포함한 대부분의 SQL에서) TRUE가 멋진 매크로라는 것을 알고 1있지만 여전히 독자에게는 조금 더 분명하지 않습니까?

2
2는 대부분의 SQL 방언에서 유효하지 않습니다
edc65

답변:


177

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'

11
또한 프로그래밍 방식으로 추가하는 경우, 나중에 실행하기 위해 문자열로 쿼리를 작성하는 경우 WHERE 1=1당신이 문자열에 추가하려고하는 상태가 처음 인 경우가 필요합니다, 그래서 당신이 (알아서 할 필요가 없습니다 WHERE앞에 ) 또는 아닙니다.
빈센트 Olivert 리에라

45
6 년 동안 프로그래밍을 해왔으며이 일을 생각하지 않았습니다. 감사합니다!
SimonGates

6
ORDER BY 1두 개 이상의 SELECT 문을 통합하는 경우 열 이름 대신 @dlatikay 구문이 필요합니다.
마크 스튜어트

5
@SimonGates 저는 6 년 동안 프로그래밍을 해왔으며 다른 일을 생각하지 않았습니다. lol
WernerCD

4
@WernerCD 필자는 일종의 목록에 필터 절 목록을 작성한 다음 " AND "구분 기호로 문자열 조인을하는 것이 훨씬 합리적이라고 생각합니다 .
Zev Spitz

76

아시다시피, 세 가지 모두 동일한 결과를 생성합니다. (부울 컨텍스트에서 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.


6
이것은 다른 답변이하는 모든 것을 말하지만 # 2가 ANSI와 호환되지 않는다는 차이점을 결정적으로 지적하는 탁월한 답변입니다.
underscore_d

16

퍼포먼스와 결과의 차이에 대해 질문하는 경우, 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표현식이므로 필터가 없습니다. 모든 레코드가 선택됩니다.


14

모두 동일하지만 2와 3은 AND/OR다음과 같은 조건 을 쉽게 처리하는 데 사용됩니다 .

SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')

8

1에서 MySQL은 WHERE 조건을 평가할 필요가 없습니다.

2와 3에서 where 조건은 정적이며 행 값을 기반으로하지 않습니다. 부울 논리로 평가되며 항상 참입니다.

기능적으로는 차이가 없습니다. 코드 명확성을 위해 1을 선택해야합니다.


7

모두 동일하지만 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"

4 개의 선행 공백은 코드 블록을 나타냅니다. 제발 편집 제대로 포맷 및보고 답을 도움 편집 전체 마크 다운은 성경의 서식을.
Mathieu Guindon

4

그들은 모두 같은 대답을 출력했습니다. 그러나 2와 3이 작성되는 방식은 대부분 "Where"문을 제어하기위한 것이므로 나중에 쉽게 추가하거나 제거 할 수 있습니다.

나는 첫 번째와 세 번째 방법이 그것을 쓰는 올바른 방법이라고 생각합니다. 3 번과 같이 where 문이 필요하면 1 번이면 충분합니다.


3

MS SQL 1과 3은 동일하지만 옵션 2가 작동하지 않고 옵션 2는 MS SQL에서와 같이 유효하지 않은 명령문이며 WHERE는 일부 값을 비교하는 데 사용됩니다. 예를 들어 :

  1. ID에서 3 (유효한) 인 'myTable에서 *를 선택하십시오.
  2. Select * from 'myTable 여기서 1 = 1은 Select * from'myTable, 여기서 2 = 2는 Select * from 'myTable 여기서 3 = 3은 아이디어를 얻습니다 (유효한)는 Select * From'myTable '과 같습니다.

2
  1. SELECT * FROM table_name : where 문을 실행하여 테이블의 모든 레코드를 제공합니다.
  2. SELECT * FROM table_name WHERE 1 : 조건이 항상 참인 경우, 대부분 해커가 모든 시스템에 액세스하는 데 사용됩니다. 2 & 3보다 SQL 인젝션에 대해 들었다면 해커가 테이블의 모든 레코드를 얻기 위해 빌드 해야하는 시나리오입니다.
  3. SELECT * FROM table_name 여기서 1 = 1 : 테이블의 모든 레코드를 제공하지만 where 문을 비교 한 다음 앞으로 이동합니다. 기본적으로 그 이후에 더 많은 명령문을 추가하거나 제거하기 위해 추가됩니다.

1

결과 -세 쿼리 모두에 대해 tablename 대신 지정된 테이블의 모든 레코드를 제공합니다.

SELECT * FROM tablename WHERE 1-이 답변을 확인

SELECT * FROM tablename WHERE 1=1-이 답변을 확인

WHERE 절 최적화에 대한 자세한 정보는 다음을 확인하십시오. MYSQL , SQLite , SQL

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.