SQL : 레코드가 있는지 올바르게 확인하는 방법
SQL Tuning 설명서를 읽은 결과 :
Select count(*)
:
-행 수를 계산합니다
.-종종 레코드의 존재를 확인하는 데 잘못 사용됩니다
가 Select count(*)
정말 나쁜?
기록이 있는지 확인하는 올바른 방법은 무엇입니까?
다음 중 하나를 사용하는 것이 좋습니다.
-- Method 1.
SELECT 1
FROM table_name
WHERE unique_key = value;
-- Method 2.
SELECT COUNT(1)
FROM table_name
WHERE unique_key = value;
첫 번째 대안은 결과 또는 하나의 결과를 제공하지 않아야하며, 두 번째 개수는 0 또는 1이어야합니다.
사용중인 문서는 몇 살입니까? 좋은 조언을 읽었지만 최근 RDBMS의 대부분의 쿼리 최적화 프로그램은 SELECT COUNT(*)
어쨌든 최적화 하므로 이론 (및 오래된 데이터베이스)에는 차이가 있지만 실제로는 차이를 느끼지 않아야합니다.
Count 함수를 전혀 사용하지 않는 것이 좋습니다.
IF [NOT] EXISTS ( SELECT 1 FROM MyTable WHERE ... )
<do smth>
예를 들어 데이터베이스에 사용자를 삽입하기 전에 사용자가 있는지 확인하려는 경우 쿼리는 다음과 같습니다.
IF NOT EXISTS ( SELECT 1 FROM Users WHERE FirstName = 'John' AND LastName = 'Smith' )
BEGIN
INSERT INTO Users (FirstName, LastName) VALUES ('John', 'Smith')
END
당신이 사용할 수있는:
SELECT 1 FROM MyTable WHERE <MyCondition>
조건과 일치하는 레코드가 없으면 결과 레코드 세트가 비어 있습니다.
다른 답변은 꽤 좋지만 불필요한 행을 확인하지 못하도록 추가 LIMIT 1
(또는 이에 상응하는 )를 사용하는 것이 좋습니다.
당신이 사용할 수있는:
SELECT COUNT(1) FROM MyTable WHERE ...
또는
WHERE [NOT] EXISTS
( SELECT 1 FROM MyTable WHERE ... )
SELECT *
모든 필드가 아닌 각 행에 대해 단순히 값 1을 선택하기 때문에 보다 효율적 입니다.
COUNT (*)와 COUNT (열 이름) 사이에는 미묘한 차이가 있습니다.
COUNT(*)
null을 포함하여 모든 행을 계산합니다.COUNT(column name)
Null이 아닌 열 이름 만 계산합니다.
SELECT COUNT(1) FROM MyTable WHERE ...
모든 레코드를 통해 반복됩니다. 이것이 레코드 존재에 사용하기 어려운 이유입니다.
나는 사용할 것이다
SELECT TOP 1 * FROM MyTable WHERE ...
1 개의 레코드를 찾은 후 루프가 종료됩니다.
당신이 사용할 수있는:
SELECT 1 FROM MyTable WHERE... LIMIT 1
select 1
불필요한 필드 확인을 방지하는 데 사용 합니다.
사용 LIMIT 1
불필요한 행의 검사를 방지 할 수 있습니다.
나는 이런 식으로 사용하고 있습니다 :
IIF(EXISTS (SELECT TOP 1 1
FROM Users
WHERE FirstName = 'John'), 1, 0) AS DoesJohnExist
다른 옵션 :
SELECT CASE
WHEN EXISTS (
SELECT 1
FROM [MyTable] AS [MyRecord])
THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
END
참고 URL : https://stackoverflow.com/questions/4253960/sql-how-to-properly-check-if-a-record-exists
'Programing' 카테고리의 다른 글
JavaScript를 사용하여 운영 체제 버전을 찾는 방법은 무엇입니까? (0) | 2020.05.16 |
---|---|
.NET에 사용 가능한 읽기 전용 일반 사전이 있습니까? (0) | 2020.05.16 |
Workbench를 사용하여 서버에서 데이터베이스의 ER 모델을 얻는 방법 (0) | 2020.05.16 |
몽구스 문서를 어떻게 일반 객체로 바꾸나요? (0) | 2020.05.16 |
NumPy 배열은 JSON 직렬화 가능하지 않습니다 (0) | 2020.05.16 |