복붙노트

[SQL] SQL은 : 레코드가 존재하는 경우 어떻게 제대로 확인

SQL

SQL은 : 레코드가 존재하는 경우 어떻게 제대로 확인

내가 이것을 발견 된 일부 SQL 튜닝 문서를 읽기 :

(*) 수를 선택합니다 : - 행의 수를 계산 - 종종 잘못 기록의 존재를 확인하는 데 사용됩니다

SELECT COUNT (*) 정말 나쁜 것을인가?

기록의 존재를 확인하는 적절한 방법은 무엇입니까?

해결법

  1. ==============================

    1.그것은 다음 중 하나를 사용하는 것이 좋습니다 :

    그것은 다음 중 하나를 사용하는 것이 좋습니다 :

    -- 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에 좋은 조언, 대부분의 쿼리 옵티 마이저를 읽은 있지만 이론 (이상 데이터베이스)에 차이가있는 동안 (*) 어쨌든, 그래서, 당신은 실제로 어떤 차이를 알아 채지 못합니다.

  2. ==============================

    2.나는 전혀 카운트 기능을 사용하지 않으려는 것입니다 :

    나는 전혀 카운트 기능을 사용하지 않으려는 것입니다 :

    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
    
  3. ==============================

    3.당신이 사용할 수있는:

    당신이 사용할 수있는:

    SELECT 1 FROM MyTable WHERE <MyCondition>
    

    조건에 일치하는 레코드가없는 경우, 결과 레코드가 비어 있습니다.

  4. ==============================

    4.다른 답변은 아주 좋다, 그러나 또한 불필요한 행의 확인을 방지하기 위해, LIMIT 1 (또는 동등한를 추가하는 것이 유용 할 것이다.

    다른 답변은 아주 좋다, 그러나 또한 불필요한 행의 확인을 방지하기 위해, LIMIT 1 (또는 동등한를 추가하는 것이 유용 할 것이다.

  5. ==============================

    5.

    SELECT COUNT(1) FROM MyTable WHERE ...
    

    모든 레코드 통해 반복됩니다. 기록 존재를 사용하는 것이 나쁜 이유입니다.

    내가 사용하는 것이

    SELECT TOP 1 * FROM MyTable WHERE ...
    

    (1 개) 기록을 발견 한 후에는 루프를 종료합니다.

  6. ==============================

    6.당신이 사용할 수있는:

    당신이 사용할 수있는:

    SELECT COUNT(1) FROM MyTable WHERE ... 
    

    또는

    WHERE [NOT] EXISTS 
    ( SELECT 1 FROM MyTable WHERE ... )
    

    당신은 단순히 모든 필드가 아닌, 각 행에 대해 1의 값을 선택하고 있기 때문에이 SELECT *보다 더 효율적입니다.

    COUNT (*)와 COUNT (열 이름) 사이의 미묘한 차이도 있습니다 :

  7. ==============================

    7.당신이 사용할 수있는:

    당신이 사용할 수있는:

    SELECT 1 FROM MyTable WHERE... LIMIT 1
    

    사용 불필요한 필드의 확인을 방지하기 위해 1을 선택합니다.

    사용 LIMIT 1 불필요한 행의 검사를 방지합니다.

  8. ==============================

    8.나는이 방법을 사용하고 있습니다 :

    나는이 방법을 사용하고 있습니다 :

    IIF(EXISTS (SELECT TOP 1 1 
                    FROM Users 
                    WHERE FirstName = 'John'), 1, 0) AS DoesJohnExist
    
  9. ==============================

    9.기타 옵션 :

    기타 옵션 :

    SELECT CASE
        WHEN EXISTS (
            SELECT 1
            FROM [MyTable] AS [MyRecord])
        THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
    END
    
  10. from https://stackoverflow.com/questions/4253960/sql-how-to-properly-check-if-a-record-exists by cc-by-sa and MIT license