표에서 1을 선택한다는 것은 무슨 의미입니까?


146

나는 다음과 같이 많은 쿼리를 보았습니다.

Select 1  
From table

이것은 무엇을 1의미하며 어떻게 실행될 것이며 무엇을 반환합니까?

또한 어떤 유형의 시나리오에서 사용할 수 있습니까?


전체 문의 사항을 알려주십시오
gbn

답변:


107

SELECT 1 FROM TABLE_NAME"테이블에서 1 반환"을 의미합니다. 그것은 자체적으로 꽤 주목할 수 없으므로 일반적으로 함께 사용되며 WHERE종종 EXISTS(@gbn 메모와 같이 반드시 모범 사례는 아니지만 실제로 의미가없는 경우에도 주목할만큼 일반적입니다. 즉, 다른 사람들이 사용하기 때문에 즉시 사용할 수 있고 즉시 "더 분명해"집니다. 물론 그것은 점성 닭고기 대 계란 문제 일 수 있지만 일반적으로 머 무르지는 않습니다)).

 SELECT * FROM TABLE1 T1 WHERE EXISTS (
     SELECT 1 FROM TABLE2 T2 WHERE T1.ID= T2.ID
 );

기본적으로는 위의 표 2에서 해당 ID를 (이것은 분명 인위적인 예입니다,하지만 난 그게 아이디어를 전달 믿습니다. 개인적으로, 나는 아마 위의 할 것가 표 1에서 모든 것을 반환 SELECT * FROM TABLE1 T1 WHERE ID IN (SELECT ID FROM TABLE2);나는 같은 것을 볼로 우연히 설득력이없는 이유가없는 한 독자에게 더 분명하게 FAR ).

편집하다

실제로 지금까지 잊어 버린 한 가지 사례가 있습니다. 외부 언어를 사용하여 데이터베이스에 값이 있는지 확인하려는 경우 때때로 SELECT 1 FROM TABLE_NAME사용됩니다. 이것은 개별 열을 선택하는 것보다 큰 이점을 제공하지는 않지만 구현에 따라 SELECT *DB를 언어로 반환하는 열이 많을수록 데이터가 커지기 때문에 종종 을 수행하는 것보다 상당한 이점을 제공 할 수 있습니다 결과적으로 더 많은 시간이 소요됩니다.


그리고 왜 "일반적으로"존재합니까? 이유에 대한 증거가 있습니까?
gbn

6
그리고 신화를 전파하기위한 -1...EXISTS (SELECT 1...
gbn

2
@Gbn 왜 다른 것보다 더 자주 본 적이 있는지 모르겠습니다. 나는 그것을 훨씬 더 자주 본 적이있다.
cwallenpoole

2
점성 치킨? 그거 먹고 싶지 않아! 어쩌면 그것은 '치명적인 닭고기와 계란 문제'여야합니까?
No'am Newman

2
@Ben : IN과 EXIST는 일반적으로 동일한 계획에 최적화합니다
gbn

106

select 1 from table테이블의 모든 행에 대해 상수 1을 반환합니다. 레코드가 where절 및 / 또는과 일치하는지 저렴하게 결정하려는 경우에 유용합니다 join.


1
이 대답은 나에게 가장 적합한 만든
조셉 Astrahan에게

2
실제로 매우 중요한 점은 " 테이블의 모든 행마다"입니다. 따라서 예를 들어 1 억 행이있는 테이블의 상태 점검과 같이 "테이블 가용성"을 확인하면 1 억 "1"의 결과 집합이 종료됩니다. (주 : 이것이 생산에서 결코 일어나지 않을 것입니다;);))
conny

말 그대로 여기에 허용되는 답변이어야합니다!
Fahad Javed

40

당신이 같은 것을 의미한다면

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT 1 FROM table WHERE...) 

다음 보다 더 나은 신화 입니다1

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT * FROM table WHERE...) 

1또는 *(가) 무시됩니다 존재하고 당신이 당이 쓸 수있는 은 ANSI SQL 1992 표준 페이지 191 :

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT 1/0 FROM table WHERE...) 

1
postgres가 이것을 존중한다는 사실을 확인했습니다 exists (select 1/0. 매력처럼 작동
alex

22

그것이 말하는 것을 수행합니다-항상 정수 1을 반환합니다. where 절과 일치하는 레코드가 있는지 확인하는 데 사용됩니다.


22
음-문제는 "이것이 무엇을 의미 하는가?"가 아니라 "이것은 좋은 습관"입니다. 나는 그것이 성능 관점에서 차이를 만들지 않는다는 데 동의하지만, 1은 일반적으로 "참"으로 해석되기 때문에 개발자가 사용하는 규칙입니다.
Neville Kuyt

20

select 1 from table 일부 데이터베이스에서는 연결을 테스트하기위한 쿼리로 사용되며 연결 풀에서 연결을 검색하거나 리턴 할 때 자주 사용됩니다.


2
저의 경우였습니다 .JBOSS와 TOMCAT 응용 프로그램에서 일반적입니다.
Valter Silva

13

결과는 1테이블의 모든 레코드에 대한 것입니다. __


실제로는 빈 테이블을 만들고 쿼리를 실행하려고했지만 결과는 6입니다.
r0ng December

9

널리 알려져 있지는 않지만 쿼리에는 HAVING절이없는 절이 있을 수 있습니다 GROUP BY.

이러한 상황에서는 HAVING조항이 전체 세트에 적용됩니다. 분명히, SELECT절은 열을 참조 할 수 없습니다. 그렇지 않으면 "정확한"오류가 발생합니다. "그룹 BY에 포함되어 있지 않기 때문에 선택에서 열이 유효하지 않습니다"등.

따라서, 리터럴 값이 있어야합니다 (SQL 제로 열이있는 결과 집합을 허용하지 않기 때문에 - 왜?!) 사용하고 리터럴 값 1 ( INTEGER) 일반적으로 사용되는 다음 경우 HAVING절들을 평가는 TRUE다음 결과 집합이 하나 하나 개의 행이 될 것입니다 값 1을 표시하는 열, 그렇지 않으면 빈 세트가 표시됩니다.

예 : 열에 둘 이상의 고유 값이 있는지 확인하려면 다음을 수행하십시오.

SELECT 1
  FROM tableA
HAVING MIN(colA) < MAX(colA);

"분명히 SELECT 절은 열을 참조 할 수 없습니다"-부울 식을 선택하는 것이 더 합리적이지 SELECT MIN(colA) < MAX(colA) FROM tableA않습니까?
Paul Spiegel

7

좀 더 구체적으로 말하면, 이것을 사용하여

SELECT 1 FROM MyUserTable WHERE user_id = 33487

대신에

SELECT * FROM MyUserTable WHERE user_id = 33487

결과를 보지 않아도되기 때문입니다. 데이터베이스에 숫자 1을 묻는 것은 매우 쉽습니다 (검색 할 필요가 없기 때문에).


위의 의견에 따라 Select 1이 select *보다 성능이 좋지 않은 것처럼 보입니다. 그렇습니까?
eRaisedToX

5

테이블에 데이터가 있는지 모르는 경우 다음 쿼리를 사용할 수 있습니다.

SELECT cons_value FROM table_name;

예를 들어 :

SELECT 1 FROM employee;
  1. 총 행 수를 포함하는 열을 리턴하고 모든 행은 동일한 상수 값 1을 갖습니다 (이 경우 모든 행에 대해 1을 리턴 함).
  2. 테이블에 행이 없으면 아무것도 반환하지 않습니다.

따라서이 SQL 쿼리를 사용하여 테이블에 데이터가 있는지 확인하고 행 수는이 테이블에 존재하는 행 수를 나타냅니다.


3

당신은 값 "원하는이 수단 때문에 몇 가지 이유로 내부 쿼리로 사용되는 시간의 출력 또는 대부분으로는"당신은 .. 내부 쿼리의 결과에 따라 외부 쿼리를 계산하기 위해 사용하지 항상 원하는 일을 하지만, 특정 가치가 있습니다 ...

이것은 정적으로 출력을 값 1로 제공합니다.


3

WHERE 절을 기준으로 true 또는 false를 확인하려면 condition이 가장 저렴한 방법으로 표에서 1을 선택하십시오.


2

나는 항상 다음과 같은 SQL 주입에 사용된다는 것을 알았습니다.

www.urlxxxxx.com/xxxx.asp?id=99 union select 1,2,3,4,5,6,7,8,9 from database;

이 숫자는 데이터베이스가 존재하는 위치를 추측하고 지정한 데이터베이스의 열 이름과 테이블 값을 추측하는 데 사용할 수 있습니다.


0

간단히 말해, 테이블에서 첫 번째 열을 검색하고 있음을 의미합니다. 직원을 선택합니다. Emply_num, Empl_no From 직원; 여기서는 Employees에서 select 1을 사용하고 있습니다. 이는 Emply_num 열을 검색 중임을 의미합니다. 감사


그런 구문을 기억하지만 기억할 수없는 데이터베이스에만 해당됩니다. PostgreSQL?
diynevala

0

그 이유는 적어도 MySQL에게는 또 다른 이유입니다. 이것은 MySQL 매뉴얼 에서 가져온 것입니다

InnoDB는 테이블에 이러한 값을 저장하는 대신 시작 후 테이블에 처음 액세스 할 때 테이블의 인덱스 카디널리티 값을 계산합니다. 이 단계는 데이터를 여러 테이블로 분할하는 시스템에서 상당한 시간이 걸릴 수 있습니다. 이 오버 헤드는 초기 테이블 열기 조작에만 적용되므로 나중에 사용할 수 있도록 테이블을 "웜업"하기 위해 SELECT 1 FROM tbl_name LIMIT 1과 같은 명령문을 실행하여 시작 직후에 액세스하십시오.


0

이것은 IF EXISTS ()와의 편의를 위해 사용되었습니다. 그렇지 않으면 당신은 함께 갈 수 있습니다

select * from [table_name]

이미지 'IF EXISTS'의 경우 지정된 조건을 가진 행이 존재하는지 또는 행의 내용이 중요하지 않다는 것을 알아야합니다.

select 1 from Users

위의 예제 코드는 no를 반환합니다. 행 수는 no와 같습니다. 단일 열에 1 인 사용자

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