홈으로 돌아가기

SQL 쿼리 작성 방법: 예제가 포함된 튜토리얼

이 튜토리얼은 SQL 쿼리를 작성하는 방법에 대한 포괄적인 가이드를 제공하며, SELECT 및 WHERE와 같은 기본 문, GROUP BY 및 HAVING을 사용한 고급 집계, 테이블 조인, 서브쿼리 및 가독성 모범 사례를 다룹니다. 독자는 모든 관계형 데이터베이스 시스템에 대해 효율적이고 유지 관리 가능한 SQL 쿼리를 작성하는 실용적인 기술을 습득합니다.

SQL 쿼리 마스터하기: 코드 예제가 포함된 단계별 튜토리얼
Advertisement 728x90

SQL 쿼리 작성 방법: 실전 예제와 함께 배우는 실용 튜토리얼

SQL 쿼리 작성 방법: 실전 예제와 함께 배우는 실용 튜토리얼

구조화 질의어(SQL)는 관계형 데이터베이스와 소통하는 보편적인 방법이지만, 효과적인 쿼리를 작성하는 것은 단순히 몇 가지 키워드를 나열하는 것 이상입니다. 이는 논리, 데이터에 대한 명확한 이해, 그리고 데이터베이스 작동 방식에 대한 이해가 결합된 과정입니다. 이 튜토리얼은 데이터베이스 시스템에 관계없이 정확할 뿐만 아니라 효율적이고 가독성이 높으며 유지보수가 용이한 SQL 쿼리를 작성하는 지식을 제공합니다.

배우게 될 내용

이 가이드를 마치면 처음부터 SQL 쿼리를 구성하고, 데이터를 정밀하게 필터링, 정렬 및 집계할 수 있게 됩니다. 쿼리 실행 순서의 중요성을 이해하고, 전문가 수준의 복잡한 SQL 문을 작성하기 위한 명확한 계획을 갖추게 됩니다. SQL 쿼리 작성은 데이터베이스 엔진이 실행하는 순서와 다른 특정 순서로 절을 작성하는 구조화된 과정입니다.

Google AdInline article slot

기본: SELECT 문

데이터 검색의 핵심은 SELECT 문입니다. 이는 데이터베이스에 보고 싶은 정확한 정보와 그 위치를 알려줍니다. 쿼리의 가장 기본적인 형태는 SELECTFROM 절로 구성됩니다.

SELECT column1, column2
FROM table_name;

예를 들어, 차원 테이블에서 직원 키와 성을 검색하려면 다음과 같이 사용합니다:

SELECT EmployeeKey, LastName
FROM DimEmployee;

SELECT *는 모든 열을 빠르게 확인할 때 유용할 수 있지만, 프로덕션 코드에서는 불필요한 데이터를 반환하고 성능에 영향을 미치며 테이블 스키마가 변경될 경우 애플리케이션이 손상될 수 있으므로 나쁜 관행으로 간주됩니다. 필요한 열만 항상 지정하세요.

Google AdInline article slot

WHERE 절로 논리 구축하기

데이터를 필터링하고 관련 행만 검색하려면 WHERE 절을 사용합니다. 이는 결과에 포함되기 위해 행이 충족해야 하는 검색 조건을 지정합니다. WHERE 절은 쿼리 구조에서 FROM 절 다음에 옵니다.

다양한 연산자를 사용하여 강력한 검색 조건을 구축할 수 있습니다. 예를 들어, "Smith"라는 특정 직원을 찾으려면 간단한 동등 비교를 사용할 수 있습니다:

SELECT EmployeeKey, LastName
FROM DimEmployee
WHERE LastName = 'Smith';

더 복잡한 필터링을 위해 LIKE 연산자를 사용하여 패턴 매칭을 할 수 있습니다. 다음 쿼리는 성에 "Smi" 패턴이 포함된 모든 직원을 찾습니다:

Google AdInline article slot
SELECT EmployeeKey, LastName
FROM DimEmployee
WHERE LastName LIKE '%Smi%';

ANDOR 같은 논리 연산자를 사용하면 여러 조건을 결합할 수 있습니다. AND는 모든 조건이 충족되어야 할 때, OR는 어떤 조건이든 참일 때 사용합니다. 예를 들어, 여러 기준을 충족하는 행을 찾으려면 다음과 같이 작성할 수 있습니다:

SELECT EmployeeKey, LastName
FROM DimEmployee
WHERE EmployeeKey <= 500
      AND LastName LIKE '%Smi%';

WHERE 절은 개별 행을 필터링하며 집계 결과를 필터링할 수 없다는 점에 유의하세요. IN 연산자는 값이 목록의 어떤 값과 일치하는지 확인하는 간결한 방법이며, BETWEEN은 범위 내의 값을 찾는 데 사용됩니다.

-- IN 사용
SELECT EmployeeKey, LastName
FROM DimEmployee
WHERE LastName IN ('Smith', 'Godfrey', 'Johnson');

-- BETWEEN 사용
SELECT EmployeeKey, LastName
FROM DimEmployee
WHERE EmployeeKey BETWEEN 100 AND 200;

Microsoft 문서에 따르면 검색 조건에 포함할 수 있는 조건자의 수에는 제한이 없으므로 매우 구체적이고 복잡한 필터링 논리가 가능합니다.

결과 구성 및 정리

데이터를 필터링한 후에는 가독성을 높이기 위해 결과를 정리하거나 계산을 수행해야 하는 경우가 많습니다. ORDER BY 절은 하나 이상의 열을 기준으로 결과 집합을 정렬합니다. 이는 SELECT 문 다음에 오며 오름차순(ASC, 기본값) 또는 내림차순(DESC)을 지정할 수 있습니다. 결과 집합에서 중복 행을 제거하려면 SELECT 바로 뒤에 DISTINCT 키워드를 사용합니다.

SELECT DISTINCT JobTitle
FROM HumanResources.Employee
ORDER BY JobTitle;

GROUP BY 절은 데이터 집계를 위한 강력한 도구입니다. 지정된 열에서 동일한 값을 가진 행을 그룹화하여 SUM, AVG, COUNT, MAX, MIN과 같은 요약 연산을 수행할 수 있습니다. 예를 들어, 각 판매 주문의 합계를 찾으려면 SalesOrderID로 그룹화하고 라인 합계를 합산할 수 있습니다:

SELECT SalesOrderID,
    SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
ORDER BY SalesOrderID;

GROUP BY의 결과를 필터링하려면 HAVING 절을 사용해야 합니다. 개별 행을 그룹화 전에 필터링하는 WHERE 절과 달리, HAVING은 집계가 발생한 후 그룹을 필터링합니다.

SELECT ProductID
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING AVG(OrderQty) > 5;

이러한 절을 작성하는 순서는 매우 중요합니다. 표준 SQL 쿼리는 SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY 순서를 따릅니다.

고급 기술: 조인과 서브쿼리

데이터는 종종 여러 테이블에 저장되며, JOIN 절을 사용하여 이를 결합합니다. INNER JOIN은 조인 조건이 충족되는 두 테이블의 레코드를 검색합니다. 예를 들어, Product 테이블을 SalesOrderDetail과 결합하여 판매 데이터와 함께 제품 정보를 얻을 수 있습니다.

서브쿼리(중첩 쿼리)는 다른 쿼리 내에 있는 쿼리입니다. 이는 다른 연산의 결과에 의존하는 데이터 조작 및 분석에 유용합니다. 상호 연관 서브쿼리는 내부 쿼리가 값을 위해 외부 쿼리에 의존하여 처리되는 각 행에 대해 반복적으로 실행되는 특히 복잡한 유형입니다. EXISTS 키워드는 종종 상호 연관 서브쿼리와 함께 사용되어 서브쿼리에 행이 존재하는지 테스트합니다.

가독성 높은 SQL 작성하기

작동하는 SQL을 작성하는 것은 절반의 싸움일 뿐이며, 유지보수가 가능한 SQL을 작성하는 것은 전문가의 필수 사항입니다. 다음 모범 사례를 따라 쿼리가 혼란의 원인이 아닌 협업 도구가 되도록 하세요:

  • 키워드 대문자 사용: SELECT, FROM, WHERE, JOIN과 같은 SQL 키워드는 대문자로 사용하세요. 이렇게 하면 열 및 테이블 이름과 구분되어 쿼리를 더 쉽게 스캔할 수 있습니다.
  • 줄 바꿈과 들여쓰기 사용: 각 주요 절을 새 줄에 배치하고 들여쓰기를 사용하여 서브쿼리나 조인 구조를 표시하세요. 이 시각적 계층 구조는 복잡한 논리를 명확하게 합니다.
  • 의미 있는 주석 추가: --를 사용하여 쿼리의 '무엇'이 아닌 '왜'를 설명하는 주석을 추가하세요. 이는 미래의 자신과 동료에게 매우 귀중합니다.
  • 설명적인 별칭 사용: AS로 열 이름을 바꾸거나 테이블 이름을 줄일 때는 의미 있는 별칭을 선택하세요. t1이나 a와 같은 모호한 이름은 피하세요.

출처

  1. WHERE (Transact-SQL) - SQL Server
  2. T-SQL Tutorial: Write Transact-SQL Statements
  3. SELECT Examples (Transact-SQL)
  4. PostgreSQL: Documentation: 17: 2.5. Querying a Table
  5. Data Management with SQL for Ecologists: Accessing Data With Queries
  6. EXISTS (Transact-SQL) - SQL Server
  7. Transact-SQL Syntax Conventions (Transact-SQL)
  8. How to Write SQL Queries Anyone Can Understand

— Editorial Team

Advertisement 728x90

다음 읽기