Programing

SQL : 레코드가 있는지 올바르게 확인하는 방법

lottogame 2020. 5. 16. 10:00
반응형

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

반응형