나는 다음과 같이 많은 쿼리를 보았습니다.
Select 1
From table
이것은 무엇을 1
의미하며 어떻게 실행될 것이며 무엇을 반환합니까?
또한 어떤 유형의 시나리오에서 사용할 수 있습니까?
나는 다음과 같이 많은 쿼리를 보았습니다.
Select 1
From table
이것은 무엇을 1
의미하며 어떻게 실행될 것이며 무엇을 반환합니까?
또한 어떤 유형의 시나리오에서 사용할 수 있습니까?
답변:
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를 언어로 반환하는 열이 많을수록 데이터가 커지기 때문에 종종 을 수행하는 것보다 상당한 이점을 제공 할 수 있습니다 결과적으로 더 많은 시간이 소요됩니다.
...EXISTS (SELECT 1...
select 1 from table
테이블의 모든 행에 대해 상수 1을 반환합니다. 레코드가 where
절 및 / 또는과 일치하는지 저렴하게 결정하려는 경우에 유용합니다 join
.
당신이 같은 것을 의미한다면
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...)
exists (select 1/0
. 매력처럼 작동
그것이 말하는 것을 수행합니다-항상 정수 1을 반환합니다. where 절과 일치하는 레코드가 있는지 확인하는 데 사용됩니다.
select 1 from table
일부 데이터베이스에서는 연결을 테스트하기위한 쿼리로 사용되며 연결 풀에서 연결을 검색하거나 리턴 할 때 자주 사용됩니다.
널리 알려져 있지는 않지만 쿼리에는 HAVING
절이없는 절이 있을 수 있습니다 GROUP BY
.
이러한 상황에서는 HAVING
조항이 전체 세트에 적용됩니다. 분명히, SELECT
절은 열을 참조 할 수 없습니다. 그렇지 않으면 "정확한"오류가 발생합니다. "그룹 BY에 포함되어 있지 않기 때문에 선택에서 열이 유효하지 않습니다"등.
따라서, 리터럴 값이 있어야합니다 (SQL 제로 열이있는 결과 집합을 허용하지 않기 때문에 - 왜?!) 사용하고 리터럴 값 1 ( INTEGER
) 일반적으로 사용되는 다음 경우 HAVING
절들을 평가는 TRUE
다음 결과 집합이 하나 하나 개의 행이 될 것입니다 값 1을 표시하는 열, 그렇지 않으면 빈 세트가 표시됩니다.
예 : 열에 둘 이상의 고유 값이 있는지 확인하려면 다음을 수행하십시오.
SELECT 1
FROM tableA
HAVING MIN(colA) < MAX(colA);
SELECT MIN(colA) < MAX(colA) FROM tableA
않습니까?
좀 더 구체적으로 말하면, 이것을 사용하여
SELECT 1 FROM MyUserTable WHERE user_id = 33487
대신에
SELECT * FROM MyUserTable WHERE user_id = 33487
결과를 보지 않아도되기 때문입니다. 데이터베이스에 숫자 1을 묻는 것은 매우 쉽습니다 (검색 할 필요가 없기 때문에).
테이블에 데이터가 있는지 모르는 경우 다음 쿼리를 사용할 수 있습니다.
SELECT cons_value FROM table_name;
예를 들어 :
SELECT 1 FROM employee;
따라서이 SQL 쿼리를 사용하여 테이블에 데이터가 있는지 확인하고 행 수는이 테이블에 존재하는 행 수를 나타냅니다.
WHERE 절을 기준으로 true 또는 false를 확인하려면 condition이 가장 저렴한 방법으로 표에서 1을 선택하십시오.
그 이유는 적어도 MySQL에게는 또 다른 이유입니다. 이것은 MySQL 매뉴얼 에서 가져온 것입니다
InnoDB는 테이블에 이러한 값을 저장하는 대신 시작 후 테이블에 처음 액세스 할 때 테이블의 인덱스 카디널리티 값을 계산합니다. 이 단계는 데이터를 여러 테이블로 분할하는 시스템에서 상당한 시간이 걸릴 수 있습니다. 이 오버 헤드는 초기 테이블 열기 조작에만 적용되므로 나중에 사용할 수 있도록 테이블을 "웜업"하기 위해 SELECT 1 FROM tbl_name LIMIT 1과 같은 명령문을 실행하여 시작 직후에 액세스하십시오.