수색…


소개

좋은 읽기 쉬운 SQL 쿼리를 작성하는 방법 및 우수 사례의 예.

키워드 및 이름의 서식 지정 및 철자법

테이블 / 열 이름

테이블 / 컬럼 이름을 포맷하는 두 가지 일반적인 방법은 CamelCasesnake_case :

SELECT FirstName, LastName
FROM Employees
WHERE Salary > 500;
SELECT first_name, last_name
FROM employees
WHERE salary > 500;

이름은 객체에 저장된 내용을 설명해야합니다. 이것은 열 이름이 일반적으로 단수이어야 함을 의미합니다. 테이블 이름이 단수인지 복수인지는 크게 논의되는 질문이지만 실제로는 복수 테이블 이름을 사용하는 것이 일반적입니다.

tbl 또는 col 과 같은 접두사 또는 접미사를 추가하면 가독성이 떨어 지므로이를 피하십시오. 그러나 때때로 SQL 키워드와의 충돌을 피하기 위해 사용되며 트리거 및 색인 (일반적으로 이름은 쿼리에서 언급되지 않음)과 함께 사용됩니다.

키워드

SQL 키워드는 대소 문자를 구분하지 않습니다. 그러나 대문자로 쓰는 것이 일반적입니다.

고르다 *

SELECT * 는 테이블에 정의 된 순서대로 모든 열을 반환합니다.

SELECT * 사용할 때 테이블 정의가 변경 될 때마다 쿼리에서 반환하는 데이터가 변경 될 수 있습니다. 이렇게하면 응용 프로그램이나 데이터베이스의 서로 다른 버전이 서로 호환되지 않을 위험이 높아집니다.

또한 필요 이상으로 열을 읽으면 디스크 및 네트워크 I / O의 양이 증가 할 수 있습니다.

따라서 실제로 검색 할 열을 명시 적으로 지정해야합니다.

--SELECT *                                 don't
  SELECT ID, FName, LName, PhoneNumber  -- do
  FROM Emplopees;

대화 형 쿼리를 수행 할 때는 이러한 고려 사항이 적용되지 않습니다.


그러나 EXISTS가 실제 데이터를 무시하기 때문에 SELECT * 는 EXISTS 연산자의 부속 조회에서 손상되지 않습니다 (적어도 하나의 행이 발견 된 경우에만 점검합니다). 같은 이유로 EXISTS의 특정 열을 나열하는 것은 의미가 없으므로 SELECT * 실제로 더 적합합니다.

-- list departments where nobody was hired recently
SELECT ID,
       Name
FROM Departments
WHERE NOT EXISTS (SELECT *
                  FROM Employees
                  WHERE DepartmentID = Departments.ID
                    AND HireDate >= '2015-01-01');

들여 쓰기

널리 인정되는 표준은 없습니다. 모두가 동의하는 것은 모든 것을 한 줄로 짜내는 것이 나쁘다는 것입니다.

SELECT d.Name, COUNT(*) AS Employees FROM Departments AS d JOIN Employees AS e ON d.ID = e.DepartmentID WHERE d.Name != 'HR' HAVING COUNT(*) > 10 ORDER BY COUNT(*) DESC;

최소한 모든 절을 새 줄에 넣고 줄이 너무 길어지면 줄을 나눕니다.

SELECT d.Name,
       COUNT(*) AS Employees
FROM Departments AS d
JOIN Employees AS e ON d.ID = e.DepartmentID
WHERE d.Name != 'HR'
HAVING COUNT(*) > 10
ORDER BY COUNT(*) DESC;

때때로 절을 도입 한 SQL 키워드 다음의 모든 항목이 동일한 열에 들여 쓰기됩니다.

SELECT   d.Name,
         COUNT(*) AS Employees
FROM     Departments AS d
JOIN     Employees AS e ON d.ID = e.DepartmentID
WHERE    d.Name != 'HR'
HAVING   COUNT(*) > 10
ORDER BY COUNT(*) DESC;

(이것은 SQL 키워드를 정렬 할 때도 수행 할 수 있습니다.)

또 다른 일반적인 스타일은 중요한 키워드를 자신의 줄에 넣는 것입니다.

SELECT
    d.Name,
    COUNT(*) AS Employees
FROM
    Departments AS d
JOIN
    Employees AS e
    ON d.ID = e.DepartmentID
WHERE
    d.Name != 'HR'
HAVING
    COUNT(*) > 10
ORDER BY
    COUNT(*) DESC;

여러 개의 유사한 표현식을 세로로 정렬하면 가독성이 향상됩니다.

SELECT Model,
       EmployeeID
FROM Cars
WHERE CustomerID = 42
  AND Status     = 'READY';

여러 줄을 사용하면 SQL 명령을 다른 프로그래밍 언어에 포함하기가 더 어려워집니다. 그러나 많은 언어에는 C #의 @"..." , Python의 """...""" 또는 C ++의 R"(...)" 과 같은 여러 줄 문자열에 대한 메커니즘이 있습니다.

조인

명시 적 조인은 항상 사용해야합니다. 암시 적 조인 에는 몇 가지 문제점이 있습니다.

  • 조인 조건은 WHERE 절의 어딘가에 있으며 다른 필터 조건과 섞여 있습니다. 이렇게하면 조인 할 테이블과 그 테이블을 보는 것이 더 힘들어집니다.

  • 위와 같은 이유로 실수의 위험이 높으며 나중에 발견 될 가능성이 큽니다.

  • 표준 SQL에서 명시 적 조인은 외부 조인 을 사용하는 유일한 방법입니다.

    SELECT d.Name,
           e.Fname || e.LName AS EmpName
    FROM      Departments AS d
    LEFT JOIN Employees   AS e ON d.ID = e.DepartmentID;
    
  • 명시 적 조인을 사용하면 USING 절을 사용할 수 있습니다.

    SELECT RecipeID,
           Recipes.Name,
           COUNT(*) AS NumberOfIngredients
    FROM      Recipes
    LEFT JOIN Ingredients USING (RecipeID);
    

    (두 테이블 모두 동일한 열 이름을 사용해야합니다.
    USING은 자동으로 결과에서 중복 된 열을 제거합니다. 예를 들어,이 쿼리의 조인은 단일 RecipeID 열을 반환합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow