맨위로가기

Select (SQL)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

SELECT 문은 데이터베이스에서 데이터를 선택하는 데 사용되는 SQL의 핵심 구문이다. 구문은 SELECT 절, FROM 절, WHERE 절, GROUP BY 절, HAVING 절, ORDER BY 절, 부속 질의, LIMIT 절, 윈도우 함수 등으로 구성된다. SELECT 문은 테이블의 열을 지정하거나, `*`를 사용하여 모든 열을 표시할 수 있으며, 산술 연산자와 그룹 함수를 사용할 수 있다. 또한, 열 별칭, ALL/DISTINCT 지정, 단일 행 함수, 그룹 함수, 집합 연산, JOIN 절 등을 활용하여 다양한 데이터 조작과 검색을 수행한다. 데이터베이스 시스템은 윈도우 함수와 행 페이지네이션 기능을 제공하여 결과 집합을 제한하고 계층적 데이터를 처리할 수 있다.

더 읽어볼만한 페이지

  • SQL 키워드 - TRUNCATE (SQL)
    TRUNCATE는 SQL에서 테이블 내의 모든 데이터를 빠르게 삭제하는 명령어로, 외래 키 제약 조건 무시, 테이블 잠금 방식, 트랜잭션 처리 방식 등 DELETE 명령어와 차이를 보이며, WHERE 절을 사용할 수 없어 테이블의 모든 행을 삭제하고, 일부 데이터베이스 시스템에서는 롤백이 불가능할 수 있다.
  • SQL 키워드 - Null (SQL)
    Null은 SQL에서 데이터베이스 테이블 열의 값 부재를 나타내는 특별한 표식으로, 0이나 빈 문자열과 구별되며 삼진 논리와 관련된 특별한 처리 방식으로 인해 데이터베이스 설계 및 쿼리 작성 시 주의가 필요하고 SQL 표준 구현에 대한 논쟁이 존재한다.
Select (SQL)

2. 구문

SELECT 문은 SQL에서 데이터를 조회하는 데 사용되는 가장 기본적인 구문이다. SELECT 문은 하나 이상의 테이블 또는 표현식에서 데이터를 검색하며, 쿼리라고도 불린다.[4]

기본적인 SELECT 문의 구조는 다음과 같다.

```sql

SELECT [ALL | DISTINCT] 컬럼명 [,컬럼명...]

FROM 테이블명 [,테이블명...]

[WHERE 조건식]

[GROUP BY 컬럼명 [HAVING 조건식]]

[ORDER BY 컬럼명]

```

각 절의 역할은 다음과 같다.


  • `SELECT` 절: 결과에 포함할 열을 지정한다. `*`를 사용하여 모든 열을 선택할 수 있다.
  • `FROM` 절: 데이터를 가져올 테이블을 지정한다. 여러 테이블을 지정하여 JOIN할 수 있다.
  • `WHERE` 절: 반환되는 행을 제한하는 조건을 지정한다.
  • `GROUP BY` 절: 특정 열을 기준으로 행을 그룹화한다.
  • `HAVING` 절: `GROUP BY` 절의 결과에 대한 조건을 지정한다.
  • `ORDER BY` 절: 결과를 정렬한다.
  • `DISTINCT` 키워드: 중복 데이터를 제거한다.[5]


위의 구문들 중에서 `SELECT` 절과 `FROM` 절은 필수 절이며, 나머지는 선택적으로 사용 가능하다.

다음은 `SELECT` 쿼리의 예시이다.

```sql

SELECT *

FROM Book

WHERE price > 100.00

ORDER BY title;

```

위 쿼리는 'Book' 테이블에서 'price' 열의 값이 100.00보다 큰 모든 행을 검색하고, 'title' 열을 기준으로 오름차순 정렬하여 결과를 반환한다.

대부분의 DBMS은 테이블 없이 SELECT 절을 사용하여 계산을 수행할 수 있도록 허용한다.

```sql

SELECT 1+1, 3*2;

```

위 쿼리의 결과는 다음과 같다.

`1+1``3*2`
26


2. 1. SELECT 절

`SELECT` 절은 `SELECT` 문에서 필수적인 부분으로, 데이터베이스에서 데이터를 선택하여 보여주는 역할을 한다. `SELECT` 키워드 바로 뒤에 결과에 포함할 열 목록을 지정하거나, 별표(`*`)를 사용하여 모든 열을 반환하도록 지정할 수 있다.[4]

`SELECT` 문은 SQL에서 가장 일반적인 연산이며, "쿼리"라고 불린다. `SELECT`는 하나 이상의 테이블 또는 표현식에서 데이터를 검색하며, 표준 `SELECT` 문은 데이터베이스에 지속적인 영향을 미치지 않는다. (일부 비표준 `SELECT` 구현은 예외)[4]

쿼리를 통해 사용자는 원하는 데이터를 설명할 수 있으며, DBMS은 자체적으로 계획, 최적화를 수행하고 해당 결과를 생성하는 데 필요한 물리적 연산을 수행한다.

`SELECT`는 SQL에서 가장 복잡한 문이며, 선택적 키워드와 절을 포함할 수 있다. 예를 들어 `FROM` 절,`WHERE` 절,`GROUP BY` 절,`HAVING` 절,`ORDER BY` 절,`DISTINCT` 키워드[5] 등을 사용하여 데이터를 상세하게 제어할 수 있다.

`SELECT` 절에서는 산술 연산자, 단일행 함수, 그룹 함수 등을 사용하여 데이터를 가공하고 표시할 수 있다. 예를 들어, 가격에 대한 세금을 계산하거나, 문자열을 결합하거나, 특정 조건에 맞는 데이터만 선택하는 등의 작업이 가능하다.

다음은 `SELECT` 쿼리의 예시이다.



SELECT *

FROM Book

WHERE price > 100.00

ORDER BY title;



위 쿼리는 'Book' 테이블에서 'price' 열의 값이 100.00보다 큰 모든 행을 검색하고, 'title' 열을 기준으로 오름차순 정렬하여 결과를 반환한다. `*`는 'Book' 테이블의 모든 열을 포함하도록 지정한다.

`SELECT` 절에서 표현식을 사용하여 데이터를 투영할 수도 있다.



SELECT isbn,

title,

price,

price * 0.06 AS sales_tax

FROM Book

WHERE price > 100.00

ORDER BY title;



위 예제는 'price'의 6%로 계산된 판매세액이 포함된 'sales_tax'라는 추가 열을 함께 반환한다.

다음은 표를 이용한 `SELECT` 쿼리 예시와 그 결과이다.

{| class="wikitable"

|-

! 표 "T"

! 쿼리

! 결과

|-

|align="center"|

C1C2
1a
2b



|| SELECT * FROM T

|align="center"|

C1C2
1a
2b



|-

|align="center"|

C1C2
1a
2b



|| SELECT C1 FROM T

|align="center"|

C1
1
2



|-

|align="center"|

C1C2
1a
2b



|| SELECT * FROM T WHERE C1 = 1

|align="center"|

C1C2
1a



|-

|align="center"|

C1C2
1a
2b



|| SELECT * FROM T ORDER BY C1 DESC

|align="center"|

C1C2
2b
1a



|-

|

|| SELECT 1+1, 3*2

|align="center"|

`1+1``3*2`
26



|}

2. 1. 1. 유효성 검사

컬럼명은 데이터베이스 테이블에서 각 열에 붙여지는 이름이다. 이 이름을 정할 때는 다음 규칙과 주의사항을 따라야 한다.

  • 사용할 수 있는 문자:
  • * 영문 알파벳 (A-Z, a-z)
  • * 숫자 (0-9)
  • * 특수문자: $, #, _ (밑줄)
  • 첫 글자는 반드시 영문 알파벳으로 시작해야 한다.
  • 길이는 최대 30자까지 가능하다.
  • 기본적으로 대문자로 표시된다. 소문자로 표시하려면 ""(큰따옴표)로 묶어야 한다.
  • 데이터베이스 관리 시스템(DBMS)에서 미리 정해둔 예약어(예: SELECT, FROM, WHERE 등)는 사용할 수 없다.


예를 들어, "ProductName", "Price_USD", "Order#Date" 등은 올바른 컬럼명이지만, "1st_Name", "SELECT" 등은 잘못된 컬럼명이다.

2. 1. 2. 컬럼 별칭

`SELECT` 문에서 컬럼 별칭(alias)은 `컬럼명 [AS] 컬럼별칭` 형태로 지정하여 컬럼을 다른 이름으로 표시할 수 있다. `AS`는 생략 가능하다.[1] WHERE 절, GROUP BY 절, HAVING 절에서는 컬럼 별칭을 사용할 수 없다.[1] 컬럼명은 기본적으로 영문 대문자로 표시되지만, 소문자 등으로 표시하려면 단일 행 함수를 사용하거나 큰따옴표("")로 묶어야 한다.[1]
예시:```sql

SELECT employee_id AS 사원번호, last_name AS 성, first_name AS 이름

FROM employees;

```

위 예시에서 `employee_id` 컬럼은 "사원번호"로, `last_name` 컬럼은 "성"으로, `first_name` 컬럼은 "이름"으로 표시된다.

2. 1. 3. ALL / DISTINCT 지정

ALL: 테이블에 같은 데이터 행이 있어도 모든 데이터를 반환한다. 특별히 지정하지 않으면 ALL이 기본값으로 선택된다.
DISTINCT (UNIQUE): 테이블에 같은 데이터 행이 있는 경우 중복을 제거하고 한 건만 반환한다. 그룹 함수와 함께 사용 가능하다 (Access 제외).

2. 1. 4. 단일행 함수

단일행 함수는 한 번에 하나의 행을 처리하여 결과를 반환하는 함수이다. 이러한 함수는 SELECT 절, WHERE 절, ORDER BY 절에서 사용할 수 있으며, 중첩하여 사용하는 데 제한이 없다. 단일행 함수에는 문자 함수, 숫자 함수, 날짜 함수, 데이터 형식 변환 함수 등이 있다.

  • 문자 함수: 문자를 조작하는 함수로, DBMS마다 지원하는 함수에 차이가 있다.


함수설명예시지원 DBMS
`LOWER`문자열을 소문자로 변환LOWER(ABC) → abc대부분의 DBMS
`UPPER`문자열을 대문자로 변환UPPER(xyz) → XYZ대부분의 DBMS
`INITCAP`문자열의 첫 글자만 대문자로 변환INITCAP(world) → WorldOracle, PostgreSQL
`INSERT`문자열에 특정 문자열을 치환/삽입INSERT(123,2,1,to) → 1to3MySQL, DB2
`CONCAT`문자열을 결합CONCAT(blue,bird) → bluebirdOracle, MySQL, DB2
`LEFT`/`RIGHT`문자열의 왼쪽/오른쪽 부분을 추출MySQL, SQL Server 등
`SUBSTR`문자열의 특정 부분을 추출SUBSTR(architecture,6,3) → tecOracle, MySQL 등
`INSTR`문자열에서 특정 문자의 위치를 찾음INSTR(emperor,r) → 5Oracle, MySQL, Access
`LENGTH`/`LEN`문자열의 길이를 반환(공백 포함)LENGTH(Sri Jayawardenepura Kotte) → 24
`TRIM`문자열의 시작과 끝에서 지정된 문자 제거TRIM(S FROM sword) → word대부분의 DBMS
`REPLACE`문자열 내의 모든 특정 문자를 다른 문자로 변경REPLACE(encyclopedia,e,u) → uncyclopudia
`REPEAT`/`REPLICATE`지정된 문자를 여러 번 반복REPEAT(S,5) → SSSSSMySQL, PostgreSQL 등
`REVERSE`문자열을 거꾸로 뒤집음REVERSE(Lee) → eeLMySQL, SQL Server
`SPACE`공백 문자열을 생성MySQL, SQL Server, DB2 등


  • 숫자 함수: 숫자를 조작하는 함수로, `ROUND`(반올림), `TRUNC`(버림), `MOD`(나머지) 등이 일반적으로 사용된다.


함수설명예시
`ROUND`지정된 자릿수에서 반올림ROUND(123.456,0) → 123, ROUND(123.456,1) → 123.5, ROUND(123.456,-1) → 120
`TRUNC`지정된 자릿수에서 버림TRUNC(123.456,-2) → 100
`MOD`나눗셈의 나머지를 반환MOD(1000,30) → 10


  • 날짜 함수: 날짜를 조작하는 함수로, DBMS마다 사용법이 크게 다를 수 있다.

  • 데이터 형식 변환 함수: 특정 데이터 형식을 다른 데이터 형식으로 변환하는 함수로, DBMS마다 사용 가능한 함수가 다르다.

2. 1. 5. 그룹 함수

그룹 함수는 그룹화된 행에 대해 하나의 결과를 반환하는 함수이다. SELECT 절(단, GROUP BY 절에 지정된 열만), HAVING 절, ORDER BY 절에서 사용할 수 있다. 중첩은 2단계까지 가능하다.

그룹 함수의 종류는 다음과 같다.

함수설명
AVG평균값
MAX최댓값
MIN최솟값
SUM합계
COUNT반환되는 행 수
STDDEV표준 편차[1]



; COUNT

COUNT 함수는 행 수를 반환하며, '''합계 값을 반환하는 것은 아니다'''. 합계 값을 구하려면 SUM 함수를 사용해야 한다.[1] 예를 들어, 정규화가 수행되지 않은 '판매 실적' 테이블 (상품 번호, 상품명, 판매일, 판매 개수)에서 각 상품별 총 판매 개수를 구하려고 할 때, 다음과 같은 SQL 쿼리를 사용할 수 있다.

```sql

SELECT 상품명, COUNT(판매 개수) FROM 판매 실적 GROUP BY 상품명

```

위 쿼리는 각 상품명의 등장 빈도, 즉 판매된 횟수 (판매 개수는 고려하지 않음)를 반환한다.[1]

COUNT 함수에서 ALL 또는 DISTINCT를 사용할 수 있다. 예를 들어, `COUNT(DISTINCT 판매일)`을 사용하면 날짜별로 판매된 상품 수를 반환한다. (같은 날에 팔린 상품의 중복을 제거) 생략하거나 ALL을 사용하면 총 개수를 반환한다.[1]

`COUNT(*)`는 NULL 값을 포함한 모든 행 수를 반환하지만, `COUNT(열 이름)`은 NULL 값을 제외한 행 수를 반환한다.[1]

2. 1. 6. 집합 연산

여러 테이블에서 질의(쿼리) 결과를 참조하는 복합 쿼리를 처리하기 위한 연산자를 사용한 구문이다. UNION (합집합), UNION ALL (전체 집합), INTERSECT (교집합), EXCEPT 또는 MINUS (차집합) 등이 있지만, DBMS 환경에 따라 사용할 수 없거나 연산자 명칭이 다른 경우도 있다. 각 연산자는 우선순위가 없으며, 왼쪽에서 오른쪽 순서로 처리된다.[1]

주요 조건은 다음과 같다.[1]

  • 쿼리할 행을 일치시켜야 한다.
  • 각 SELECT 절에 대응하는 행의 데이터 형식 종류를 일치시켜야 한다 (일부 데이터 형식에서 호환성을 가짐).
  • 데이터 크기는 일치하지 않아도 된다.
  • 어떤 조건을 만족하면, 열 이름이 달라도 된다.
  • UNION ALL 외에는 정렬되어 반환된다. 기본값은 앞 구문의 첫 번째 열을 기준으로 한다.

2. 2. FROM 절

SELECT 문에서 FROM 절은 데이터를 가져올 테이블을 지정하는 필수적인 부분이다. 여러 테이블을 지정하면 JOIN을 통해 결합이 이루어지며, WHERE 절을 사용하여 공통 열의 결합 관계를 지정할 수도 있다. 하지만 이 경우 외부 조인(OUTER JOIN)은 불가능하다. Oracle DBMS에서는 (+) 기호를 사용하여 외부 조인을 수행할 수 있다.[4]

테이블이 필요 없는 쿼리의 경우 DUAL 테이블과 같은 더미 테이블을 지정할 수 있지만, 많은 처리 시스템에서 FROM 절 생략을 허용하는 확장이 이루어졌다.

FROM 절에서는 테이블에 별칭(alias)을 지정할 수 있다. 별칭을 지정하면 이후에는 반드시 해당 별칭을 사용해야 하며, 원래 테이블 이름을 사용하면 오류가 발생한다. 예를 들어, `Book` 테이블에 `b`라는 별칭을 지정하고, `b.isbn`, `b.title`과 같이 사용하는 식이다.

2. 2. 1. 결합 (JOIN 절)

JOIN은 여러 테이블에서 행을 참조할 때 사용하는 기능이다. 다양한 종류의 JOIN이 있으며, 각각 다른 상황에 맞게 사용된다.

  • 크로스 조인 (Cross Join):
  • 데카르트 곱을 생성한다. 즉, 두 테이블의 모든 행 조합을 반환한다.
  • 결합 조건은 지정할 수 없다.
  • 일부 DBMS에서는 지원하지 않을 수 있다.

  • 내부 조인 (Inner Join):
  • 두 테이블에서 지정된 조건이 일치하는 행만 반환한다.
  • 등가 조인 (Equi Join): 결합 조건으로 등호(=)를 사용한다. 일반적으로 가장 많이 사용되는 조인 방법이다.
  • 예시: 더불어민주당 소속 국회의원 명단과 각 의원의 지역구 정보를 결합하여, 각 의원의 이름과 지역구를 함께 표시할 수 있다.
  • 비등가 조인 (Non-Equi Join): 결합 조건으로 등호 외의 연산자(>, <, <>, BETWEEN 등)를 사용한다.
  • 예시: 특정 날짜 범위 내에 발생한 더불어민주당 관련 사건 목록을 추출할 때 사용할 수 있다.
  • 자연 조인 (Natural Join): 두 테이블에서 같은 이름을 가진 열을 기준으로 자동으로 결합한다.
  • `NATURAL JOIN` 키워드를 사용하며, 공통 열을 별도로 지정할 필요가 없다.
  • 주의: 공통 열을 테이블 이름이나 별칭으로 수식하면 오류가 발생한다.
  • 자기 조인 (Self Join): 같은 테이블을 두 번 사용하여 결합한다.
  • 예시: 더불어민주당 내에서 특정 인물을 멘토로 하는 의원 목록을 추출할 때 사용할 수 있다.

  • 외부 조인 (Outer Join):
  • 한쪽 테이블에는 해당 행이 존재하지만, 다른 쪽 테이블에는 해당 행이 존재하지 않는 경우에도 결과를 반환한다.
  • 왼쪽 외부 조인 (Left Outer Join): 왼쪽 테이블의 모든 행과 오른쪽 테이블에서 조건이 일치하는 행을 반환한다.
  • 오른쪽 외부 조인 (Right Outer Join): 오른쪽 테이블의 모든 행과 왼쪽 테이블에서 조건이 일치하는 행을 반환한다.
  • 완전 외부 조인 (Full Outer Join): 양쪽 테이블의 모든 행을 반환하며, 조건이 일치하지 않는 경우 NULL 값을 채운다.
  • 일부 DBMS에서는 지원하지 않을 수 있다.

일반적인 등가 조인 형식 (예시):```sql

SELECT 의원.이름, 지역구.지역구명

FROM 의원

INNER JOIN 지역구 ON 의원.지역구ID = 지역구.지역구ID;

```

위 예시는 '의원' 테이블과 '지역구' 테이블을 '지역구ID'를 기준으로 결합하여, 각 의원의 이름과 해당 지역구명을 함께 보여준다.

2. 3. WHERE 절

WHERE 절은 데이터를 추출하는 선택 조건식을 지정한다. 단일 식 외에도 여러 조건을 조회하거나, 테이블 간 결합 관계를 지정할 때 사용된다. WHERE 절에는 그룹 함수를 사용할 수 없다는 규칙이 있다.[4]

WHERE 절은 비교 술어가 참이 아닌 행을 결과 집합에서 제거한다.

다음은 `price` 열의 값이 100.00보다 큰 `Book` 테이블의 모든 행을 검색하고, `title`을 기준으로 오름차순 정렬하는 `SELECT` 쿼리 예제이다.

```sql

SELECT *

FROM Book

WHERE price > 100.00

ORDER BY title;

```

`SELECT` 문은 SQL에서 가장 복잡한 문이며, `WHERE` 절 외에도 다음과 같은 선택적 키워드와 절이 있다.

  • `FROM` 절: 데이터를 검색할 테이블을 나타낸다. `JOIN` 하위 절을 포함할 수 있다.
  • `GROUP BY` 절: 공통 값을 가진 행을 더 작은 행 집합으로 만든다. `WHERE` 절은 `GROUP BY` 절보다 먼저 적용된다.
  • `HAVING` 절: `GROUP BY` 절의 결과로 나오는 행을 필터링하는 술어를 포함한다.
  • `ORDER BY` 절: 결과 데이터를 정렬하는 데 사용할 열과 정렬 방향(오름차순 또는 내림차순)을 지정한다.


둘 이상의 테이블이 있는 경우, 결과 집합은 모든 행 조합이 된다. 예를 들어 T1 테이블에 3개 행, T2 테이블에 5개 행이 있다면, `SELECT * FROM T1, T2`는 T1과 T2 행의 모든 조합, 즉 15개 행을 반환한다.

;BETWEEN

WHERE 절에서 일정 범위 내의 행을 구할 때는 `BETWEEN`을 사용하면 편리하다. 형식은 다음과 같다.

```text

열 이름 BETWEEN (A AND B)

```

A 이상 B 이하에 해당하는 행이 선택된다. (이상, 이하 관계이며, 미만 또는 초과를 구하려면 OR 연산자와 부등호를 사용해야 한다.)

;IN

서브 쿼리를 사용하여 복수 조건을 조회할 수 있다. (자세한 내용은 서브 쿼리 항목 참조)

2. 3. 1. 패턴 매칭 검색

SQL 문에서는 부분 일치 검색이 가능하다. 패턴 매칭에 사용되는 와일드 카드에는 "%"(0 문자 이상)와 "_" (1 문자)가 있다.[1] 형식은 다음과 같다.[1]

```text

WHERE 열 이름 LIKE '_A%'

```

여기에서 A 앞에 한 문자, A 뒤에 0 문자 이상의 값이 선택된다 (예: JAPAN, CAROL, CASTLE, 5A 등).[1]

2. 3. 2. NULL 처리

조건식의 값이 널(NULL) 값인 경우를 구하려면 NULL을 사용한다. 형식은 다음과 같다.

:WHERE 열 이름 IS NULL

여기서 '''열 이름 = NULL'''이라고 하면 에러가 발생한다. NULL은 값이 존재하지 않는 상태이며, 값에 공백이 있는 경우에는 NULL이 되지 않는다.

2. 4. GROUP BY 절

GROUP BY 절은 데이터를 그룹화하는 데 사용되며, 그룹화 열 또는 컬럼명을 포함하는 식을 지정한다. 이때 컬럼 별명은 사용할 수 없다. SELECT 문에서 GROUP BY 절을 사용할 때, 그룹 함수를 제외하고 그룹화되지 않은 열이 있다면 해당 열도 함께 작성해야 한다.[4]

예를 들어, `SELECT A, B FROM LIST GROUP BY A, B;` 와 같이 작성할 수 있다. 여기서 A를 기준으로 그룹화하지만, B 열도 함께 명시해야 오류가 발생하지 않는다.

GROUP BY 절을 포함하면 뷰를 만들 수 없다. 이는 SELECT 문에서 그룹 함수를 사용하거나 `DISTINCT` 절을 사용하는 경우에도 마찬가지이다.[4]

SQL에서 `GROUP BY` 절은 공통 값을 가진 행을 더 작은 행 집합으로 묶는 데 사용된다. `WHERE` 절은 `GROUP BY` 절보다 먼저 적용된다.[4] `HAVING` 절은 `GROUP BY` 절의 결과로 나오는 행을 필터링하는 데 사용되며, 집계 함수를 포함할 수 있다.[4]

다음은 여러 테이블을 쿼리하고, 그룹화 및 집계를 사용하여 각 책과 관련된 저자 수를 반환하는 예시이다.

```sql

SELECT Book.title AS Title,

count(*) AS Authors

FROM Book

JOIN Book_author

ON Book.isbn = Book_author.isbn

GROUP BY Book.title;

```

결과는 다음과 같이 나타날 수 있다.

TitleAuthors
SQL Examples and Guide4
The Joy of SQL1
An Introduction to SQL2
Pitfalls of SQL1


2. 5. HAVING 절

HAVING 절은 `GROUP BY` 절로 집계한 결과에 대해 조건을 지정할 때 사용하며, 그룹 함수를 사용할 수 있다. HAVING 절의 순서는 `GROUP BY` 절과 전후가 되어도 상관없다.[1]

2. 6. ORDER BY 절

`ORDER BY` 절은 결과를 정렬할 때 사용하며, SQL 구문에서 항상 마지막에 위치한다. 쉼표를 사용하여 여러 열을 기준으로 정렬할 수 있다. 기본 정렬 방식은 `ASC` (오름차순)이며, `DESC` (내림차순)를 사용하여 내림차순으로 정렬할 수도 있다. 열 이름 대신 열의 위치를 나타내는 숫자(서수)를 사용하여 정렬할 수도 있다. 예를 들어, 두 번째 열을 기준으로 정렬하려면 `ORDER BY 2`와 같이 사용할 수 있다.[4]

`NULL` 값은 정렬 순서에서 특별하게 처리된다. `NULL`은 무한대의 값으로 간주되어, 오름차순 정렬에서는 마지막에, 내림차순 정렬에서는 처음에 나타난다.

2. 7. 부속 질의 (Subqueries)

쿼리는 중첩될 수 있으며, 이를 통해 하나의 쿼리 결과를 관계 연산자 또는 집계 함수를 통해 다른 쿼리에서 사용할 수 있다. 중첩된 쿼리는 '서브쿼리'라고도 한다. 조인 및 기타 테이블 연산은 많은 경우에 계산적으로 더 빠른 대안을 제공하지만, 서브쿼리를 사용하면 실행에 계층 구조가 도입되어 유용하거나 필요할 수 있다. 다음은 집계 함수 `AVG`가 서브쿼리의 결과를 입력으로 받는 예제이다.



SELECT isbn,

title,

price

FROM Book

WHERE price < (SELECT AVG(price) FROM Book)

ORDER BY title;



서브쿼리는 외부 쿼리의 값을 사용할 수 있으며, 이 경우 상관 서브쿼리라고 한다.

1999년부터 SQL 표준은 WITH 절, 즉 공통 테이블 표현식(CTE)이라고 하는 명명된 서브쿼리를 허용한다. CTE는 또한 자체를 참조하여 재귀할 수 있다.

부속 질의는 값이 일정하지 않은 값에 대해 질의가 가능하며, 반드시 ( )로 묶어야 한다. FROM 절, WHERE 절, HAVING 절에서 사용할 수 있다. FROM 절에서 지정되지 않은 다른 테이블을 참조할 수도 있으며, 중첩에도 제한이 없지만 성능이 저하될 수 있다.

부속 질의에 대해 단일 행을 선택하려면 비교 연산자를 사용한다. 이 경우, 여러 행이 검색되면 오류가 발생한다. 만약, 여러 행을 선택하려는 경우, 일반적으로 IN, 그 외 ANY(SOME) + 비교 연산자, ALL + 비교 연산자, 또는 EXISTS를 사용한다. 어떤 식에도 앞에 NOT을 붙이면 부정 표현이 된다. 이러한 비교 조건의 표기는 DBMS 환경에 따라 다르다.

;IN

: IN은 괄호 안에 어떤 값이든 들어있는 경우 참을 반환하는 연산자이다. 예를 들어 상품(상품번호, 상품명, …)이라는 테이블에서 상품번호가 3과 8인 상품명을 추출한다고 하자. 이 경우 `SELECT 상품명 FROM 상품 WHERE 상품번호 = 3 OR 상품번호 = 8`과 같이 표기해도 되지만, IN을 사용하면 다음과 같이 간결하게 나타낼 수 있다.



SELECT 상품명 FROM 상품 WHERE 상품번호 IN (3,8)



이를 부속 질의에 응용할 수도 있다. 예를 들어 납품(전표번호, 행번호, 상품번호, 납품일, 개수, …)이라는 테이블에서 한 번이라도 납품된 상품을 나타내고 싶은 경우에는 다음과 같이 한다.



SELECT 상품명 FROM 상품 WHERE 상품번호 IN (SELECT 상품번호 FROM 납품)



위의 쿼리를 실행하면 한 번이라도 납품된 상품이 추출된다. 반대로, NOT IN을 사용하면 납품 테이블에 한 번도 납품되지 않은 상품이 추출된다.

;EXISTS

: EXISTS는 그 값이 존재하는지를 탐색하는 연산자이며, 존재하는 경우 참을 반환한다. 앞서 언급한 예시를 EXISTS로 표기하면 다음과 같다.



SELECT 상품명 FROM 상품 WHERE EXISTS (SELECT * FROM 납품 WHERE 상품.상품번호 = 납품.상품번호)



결과적으로, IN으로 표기한 경우와 동일한 결과를 나타내지만, 실행 순서가 다르다. 일반적으로 부속 질의를 먼저 실행하고 그 결과를 사용하여 주 질의를 실행하지만, 위의 예시의 경우 부속 질의 내에서 부속 질의에 없는 테이블(상품 테이블)을 참조하므로 부속 질의를 먼저 실행할 수 없다. 이처럼, 그 FROM 절에 없는 테이블의 열을 참조하는 부속 질의를 '''상관 부속 질의'''라고 하며, 이 경우 주 질의 테이블의 행마다 부속 질의가 반복 실행된다. 단, 그만큼 성능이 저하되므로, 실용적으로는 앞서 언급한 예시와 같이 표기하는 것이 좋다.

2. 8. LIMIT 절 (결과 제한)

MySQL, PostgreSQL 등 일부 DBMS는 `LIMIT` 절을 사용하여 결과로 반환되는 행의 수를 제한할 수 있다. `ORDER` 절 뒤에 `LIMIT` 절을 사용하여 선택할 행을 제한한다. `LIMIT` 절에는 시작 행과 가져올 행 수를 지정하거나, 가져올 행 수만 지정할 수 있다.

예를 들어, '응시자' 테이블(학생 번호, 학생 이름, 국어, 수학, 영어)에서 성적(국어+수학+영어)이 높은 상위 10명의 학생을 추출하려면 다음과 같이 SQL 쿼리를 작성할 수 있다.

```sql

SELECT 학생명, SUM(국어+수학+영어) AS 성적 FROM 학생 ORDER BY 성적 DESC LIMIT 1, 10

```

위 쿼리에서 `LIMIT 1, 10`은 2번째 행부터 10개의 행을 가져온다는 의미이다. 만약 해당자가 11명 이상일 경우, 학생 번호의 오름차순이 두 번째 정렬 기준이 된다. `LIMIT n`과 같이 시작 행을 생략하면 처음부터 n개의 행을 가져온다.

표준 SQL에서는 `FETCH FIRST` 절을 사용하여 비슷한 기능을 수행할 수 있다.

```sql

SELECT * FROM T

FETCH FIRST 10 ROWS ONLY

```

이 구문은 CA DATACOM/DB 11, IBM DB2, SAP SQL Anywhere, PostgreSQL, EffiProz, H2, HSQLDB 버전 2.0, Oracle 12c 및 Mimer SQL에서 지원된다.

마이크로소프트 SQL 서버에서는 `FETCH FIRST`를 지원하지만, `ORDER BY` 절의 일부로 간주된다. `ORDER BY`, `OFFSET`, `FETCH FIRST` 절이 모두 필요하다.

```tsql

SELECT * FROM T

ORDER BY acolumn DESC OFFSET 0 ROWS FETCH FIRST 10 ROWS ONLY

```

다음은 여러 DBMS에서 `LIMIT` 쿼리를 수행하는 방법을 나타낸 표이다.

SQLDBMS
MS SQL Server (Microsoft SQL Server 6.5에서도 작동)
네테자, MySQL, MariaDB (버전 10.6부터 표준 버전도 지원), SAP SQL Anywhere, PostgreSQL (버전 8.4부터 표준도 지원), SQLite, HSQLDB, H2, Vertica, Polyhedra, Couchbase Server, Snowflake Computing, OpenLink Virtuoso
오라클
SELECT FIRST 10 * from T Ingres
SELECT FIRST 10 * FROM T order by a Informix
SELECT SKIP 20 FIRST 10 * FROM T order by c, d Informix (행 번호는 order by가 평가된 후에 필터링, SKIP 절은 v10.00.xC4 fixpack에 도입)
SELECT TOP 10 * FROM TMS SQL Server, SAP ASE, MS Access, SAP IQ, Teradata
Teradata
SELECT TOP 20, 10 * FROM TOpenLink Virtuoso (20을 건너뛰고 다음 10을 제공)[8]
SELECT TOP 10 START AT 20 * FROM TSAP SQL Anywhere (버전 9.0.1부터 표준도 지원)
SELECT FIRST 10 SKIP 20 * FROM TFirebird
Firebird (버전 2.1부터)
IBM Db2
IBM Db2 (새로운 행은 테이블 T의 키 열과 비교한 후 필터링)


2. 8. 1. 윈도우 함수

SQL 윈도우 함수는 현재 행과 관련된 테이블 행 집합에 대해 계산을 수행하며, 집계 함수와 유사하게 작동한다.[7] 윈도우 함수 호출에는 항상 '''OVER''' 절이 포함된다.

`ROW_NUMBER() OVER`는 반환된 행에 대해 단순 테이블을 생성하는 데 사용될 수 있다. 예를 들어, 다음은 10개 이하의 행만 반환하도록 하는 예시이다.

```sql

SELECT * FROM

( SELECT

ROW_NUMBER() OVER (ORDER BY sort_key ASC) AS row_number,

columns

FROM tablename

) AS foo

WHERE row_number <= 10

```

`ROW_NUMBER`는 비결정적일 수 있다. `sort_key`가 고유하지 않은 경우 쿼리를 실행할 때마다 `sort_key`가 동일한 행에 대해 서로 다른 행 번호가 할당될 수 있다. `sort_key`가 고유하면 각 행은 항상 고유한 행 번호를 얻게 된다.

`RANK() OVER` 윈도우 함수는 `ROW_NUMBER`와 유사하게 작동하지만, 동점 조건이 발생할 경우 ''n''개 이상의 행을 반환할 수 있다. 예를 들어, 나이가 가장 어린 상위 10명의 사람을 반환하는 경우, 같은 나이의 사람이 두 명 있다면 11개의 행을 반환할 수 있다. 다음은 그 예시이다.

```sql

SELECT * FROM (

SELECT

RANK() OVER (ORDER BY age ASC) AS ranking,

person_id,

person_name,

age

FROM person

) AS foo

WHERE ranking <= 10

```

SQL:2003의 윈도우 함수는 결과 집합의 파티션에 적용되는 집계 함수이다.

예를 들어,

```sql

sum(population) OVER( PARTITION BY city )

```

위의 예시는 현재 행과 동일한 `city` 값을 가진 모든 행의 인구수의 합을 계산한다.

파티션은 집계를 수정하는 '''OVER''' 절을 사용하여 지정한다. 구문은 다음과 같다.

```

:: =

OVER ( [ PARTITION BY , ... ]

[ ORDER BY ] )

```

`OVER` 절은 결과 집합을 분할하고 정렬할 수 있다. 정렬은 `row_number`와 같은 순서 관련 함수에 사용된다.

관계형 데이터베이스 및 SQL 엔진 공급업체의 윈도우 함수 기능 구현은 매우 다양하다. 대부분의 데이터베이스는 적어도 일부 형태의 윈도우 함수를 지원한다. 그러나 자세히 살펴보면 대부분의 공급업체가 표준의 하위 집합만 구현한다는 것이 분명해진다. 강력한 `RANGE` 절을 예로 들어 보겠다. 오라클(Oracle), DB2, 스파크/하이브(Spark/Hive), 구글 빅 쿼리(Google Big Query)만이 이 기능을 완벽하게 구현한다. 최근에 공급업체는 배열 집계 함수와 같은 새로운 확장을 표준에 추가했다. 이는 분산 파일 시스템(하둡, 스파크, 구글 빅쿼리)에 대해 SQL을 실행하는 상황에서 특히 유용하다. 여기서 우리는 분산 관계형 데이터베이스(MPP)보다 데이터 공동 위치 보장이 약하다. 모든 노드에 데이터를 균등하게 분산시키는 대신, 분산 파일 시스템에 대해 쿼리를 실행하는 SQL 엔진은 데이터를 중첩하여 네트워크를 통한 과도한 셔플과 관련된 잠재적으로 비용이 많이 드는 조인을 피함으로써 데이터 공동 위치 보장을 달성할 수 있다. 윈도우 함수에서 사용할 수 있는 사용자 정의 집계 함수는 또 다른 매우 강력한 기능이다.

2. 8. 2. 행 페이지네이션

'''행 페이지네이션'''[9]은 데이터베이스 쿼리의 결과 중 일부만 표시하여 대용량 데이터를 효율적으로 처리하는 기법이다. 한 번에 모든 결과를 표시하는 대신, 사용자가 요청하는 페이지 단위(예: 10개 행)로 데이터를 나눠서 보여준다. 사용자는 다음 페이지, 이전 페이지 등으로 이동하며 데이터를 탐색할 수 있다.

이는 특히 클라이언트와 서버 간의 전용 연결이 없는 웹 환경에서 유용하다. 클라이언트는 서버의 모든 행을 읽고 표시하기 위해 기다릴 필요 없이, 필요한 부분만 빠르게 확인할 수 있다.

행 페이지네이션을 구현하는 방법은 데이터베이스 관리 시스템(DBMS)에 따라 다를 수 있다. 다음은 일반적인 변수 설명이다.

  • `{rows}`: 한 페이지에 표시할 행의 수
  • `{page_number}`: 현재 페이지 번호
  • `{begin_base_0}`: 페이지가 시작하는 행 번호 - 1 = (`{page_number}` - 1) * `{rows}`


다음은 여러 DBMS에서 행 페이지네이션을 구현하는 예시를 보여주는 표이다.

SQL방언
SQL ANSI 2008
PostgreSQL
SQL Server 2012
Derby
Oracle 12c
DB2 12
Mimer SQL
MySQL
MariaDB
PostgreSQL
SQLite
MySQL
MariaDB
SQLite
Sybase, ASE 16 SP2
Sybase 12.5.3:
Sybase 12.5.2:
SQL Server 2005
SQL Server 2000
Oracle 11


3. 계층적 질의

일부 데이터베이스는 특수 구문을 사용하여 계층적 데이터를 처리한다.

SQL:2003의 윈도우 함수는 결과 집합의 파티션에 적용되는 집계 함수이다.

예를 들어,



sum(population) OVER( PARTITION BY city )



는 현재 행과 동일한 'city' 값을 가진 모든 행의 인구수의 합을 계산한다.

파티션은 집계를 수정하는 '''OVER''' 절을 사용하여 지정한다. 구문은 다음과 같다.



<OVER_CLAUSE> :: =

OVER ( [ PARTITION BY <expr>, ... ]

[ ORDER BY <expression> ] )



OVER 절은 결과 집합을 분할하고 정렬할 수 있다. 정렬은 row_number와 같은 순서 관련 함수에 사용된다.

4. 쿼리 평가 (ANSI)

ANSI SQL 표준에 따른 SELECT 문의 처리 순서는 다음과 같다.[10]

1. FROM 절: FROM 절이 평가되고, FROM 절의 처음 두 테이블에 대해 교차 조인 또는 카테시안 곱이 생성되어 가상 테이블 Vtable1이 생성된다.

2. ON 절: ON 절이 vtable1에 대해 평가된다. 조인 조건 g.Userid = u.Userid를 충족하는 레코드만 Vtable2에 삽입된다.

3. 외부 조인: 외부 조인이 지정된 경우, vTable2에서 삭제된 레코드가 VTable 3에 추가된다. 예를 들어, 아래 쿼리에서 어떤 그룹에도 속하지 않은 모든 사용자가 Vtable3에 다시 추가된다.



select u.*

from users u left join groups g on g.Userid = u.Userid

where u.LastName = 'Smith'

and u.FirstName = 'John'


4. WHERE 절: WHERE 절이 평가된다. 이 경우 사용자 John Smith에 대한 그룹 정보만 vTable4에 추가된다.

5. GROUP BY 절: GROUP BY가 평가된다. 아래 쿼리에서 vTable5는 GroupName과 같이 그룹화된 vTable4에서 반환된 멤버로 구성된다.



select g.GroupName, count(g.*) as NumberOfMembers

from users u inner join groups g on g.Userid = u.Userid

group by GroupName



6. HAVING 절: HAVING 절이 HAVING 절이 참인 그룹에 대해 평가되어 vTable6에 삽입된다.



select g.GroupName, count(g.*) as NumberOfMembers

from users u inner join groups g on g.Userid = u.Userid

group by GroupName

having count(g.*) > 5



7. SELECT 목록: SELECT 목록이 평가되어 Vtable 7으로 반환된다.

8. DISTINCT 절: DISTINCT 절이 평가된다. 중복 행이 제거되어 Vtable 8로 반환된다.

9. ORDER BY 절: ORDER BY 절이 평가되어 행을 정렬하고 VCursor9를 반환한다. 이는 ANSI가 커서를 정렬된 행 집합(관계형이 아님)으로 정의하기 때문에 테이블이 아닌 커서이다.

5. 데이터 생성

T-SQL에서 데이터를 생성하는 방법은 다음과 같다.

`UNION ALL`을 사용하는 방법:

```tsql

SELECT 1 AS a, 1 AS b UNION ALL

SELECT 1, 2 UNION ALL

SELECT 1, 3 UNION ALL

SELECT 2, 1 UNION ALL

SELECT 5, 1

```

SQL Server 2008은 SQL:1999 표준에 명시된 "행 생성자" 기능을 지원한다. 다음은 행 생성자를 사용하는 예시이다.

```tsql

SELECT *

FROM (VALUES (1, 1), (1, 2), (1, 3), (2, 1), (5, 1)) AS x(a, b)

참조

[1] 웹사이트 Transact-SQL Syntax Conventions http://msdn2.microso[...] 2023-05-23
[2] 웹사이트 SQL SELECT Syntax http://dev.mysql.com[...]
[3] 문서
[4] 서적 SQL Server Language Reference http://msdn.microsof[...] Microsoft 2007-09-15
[5] 서적 SAS 9.4 SQL Procedure User's Guide https://books.google[...] SAS Institute 2013-07-10
[6] 서적 SQL: A Complete Reference https://books.google[...] Tata McGraw-Hill Education
[7] 간행물 PostgreSQL 9.1.24 Documentation - Chapter 3. Advanced Features https://www.postgres[...]
[8] 웹사이트 9.19.10. The TOP SELECT Option http://docs.openlink[...] 2019-10-01
[9] 문서
[10] 서적 Inside Microsoft SQL Server 2005: T-SQL Querying



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com