수색…
소개
좋은 읽기 쉬운 SQL 쿼리를 작성하는 방법 및 우수 사례의 예.
키워드 및 이름의 서식 지정 및 철자법
테이블 / 열 이름
테이블 / 컬럼 이름을 포맷하는 두 가지 일반적인 방법은 CamelCase
와 snake_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
열을 반환합니다.