예제 테이블
Customers
| CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
|---|---|---|---|---|---|---|
| 1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
| 2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
| 3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
| 4 | Around the Horn | Thomas Hardy | 120 Hanover Sq. | London | WA1 1DP | UK |
| 5 | Berglunds snabbköp | Christina Berglun | Berguvsvägen 8 | Luleå | S-958 22 | Sweden |
Products
| ProductID | ProductName | SupplierID | CategoryID | Unit | Price |
|---|---|---|---|---|---|
| 1 | Chais | 1 | 1 | 10 boxes x 20 bags | 18 |
| 2 | Chang | 1 | 1 | 24 - 12 oz bottles | 19 |
| 3 | Aniseed Syrup | 1 | 2 | 12 - 550 ml bottles | 10 |
| 4 | Chef Anton's Cajun Seasoning | 2 | 2 | 48 - 6 oz jars | 22 |
| 5 | Chef Anton's Gumbo Mix | 2 | 2 | 36 boxes | 21.35 |
OrderDetails
| OrderDetailID | OrderID | ProductID | Quantity |
|---|---|---|---|
| 1 | 10248 | 11 | 12 |
| 2 | 10248 | 42 | 10 |
| 3 | 10248 | 72 | 5 |
| 4 | 10249 | 14 | 9 |
| 5 | 10249 | 51 | 40 |
Orders
| OrderID | CustomerID | EmployeeID | OrderDate | ShipperID |
|---|---|---|---|---|
| 10308 | 2 | 7 | 1996-09-18 | 3 |
| 10365 | 3 | 3 | 1996-11-27 | 2 |
| 10355 | 4 | 6 | 1996-11-15 | 1 |
| 10383 | 4 | 8 | 1996-12-16 | 3 |
| 10278 | 5 | 8 | 1996-08-12 | 2 |
| 10280 | 5 | 2 | 1996-08-14 | 1 |
| 10384 | 5 | 3 | 1996-12-16 | 3 |
TOP, LIMIT, ROWNUM
TOP, LIMIT, ROWNUM 절은 SELECT 로 가져올 레코드의 개수를 지정할 때 사용한다. 레코드의 수가 아주 클 때 사용하면 유용하다.
모든 데이터베이스 시스템이 TOP 절을 지원하지 않는다. 데이터베이스 종류에 따라 아래와 같이 사용한다.
SQL Server / MS Access:
SELECT TOP 레코드개수 |PERCENT 필
FROM Customers
```드이름1, 필드이름2, ...
FROM 테이블이름;
MySQL:
SELECT 필드이름1, 필드이름2, ...
FROM 테이블이름
WHERE 조건
LIMIT 레코드개수;
Oracle:
SELECT 필드이름1, 필드이름2, ...
FROM 테이블이름
WHERE ROWNUM <= 레코드개수;
아래 명령은 SQL Server / MS Access 데이터베이스에서 Customer 테이블의 레코드를 3개까지 가져온다.
SELECT TOP 3 *
FROM Customers;
Result
| CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
|---|---|---|---|---|---|---|
| 1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
| 2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
| 3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
아래 명령은 MySQL 데이터베이스에서 위의 명령과 똑같은 작업을 실행한다.
SELECT * FROM Customers LIMIT 3;
아래 명령은 Oracle 데이터베이스에서 위의 명령과 똑같은 작업을 실행한다.
SELECT * FROM Customers
WHERE ROWNUM <= 3;
TOP 절에는 PERCENT 옵션을 줄 수 있다.
아래 명령은 Customers 테이블의 상위 50% 레코드들을 가져온다.
SELECT TOP 50 PERCENT *
FROM Customers
Result
| CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
|---|---|---|---|---|---|---|
| 1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
| 2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
| 3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
MIN, MAX
MIN() 과 MAX() 함수는 필드를 전달받으며 전달 받은 필드에서 최소값과 최대값을 결과테이블로 돌려준다.
SELECT MIN(필드이름) AS 결과필드이름
FROM 테이블이름
WHERE 조건;
SELECT MAX(필드이름) AS 결과필드이름
FROM 테이블이름
WHERE 조건;
MIN 과 MAX 의 예제는 Products 테이블에서 실행해보겠다.
아래 명령은 Products 테이블에서 Price 필드의 값들 중 가장 작은 값을 SmallestPrice 라는 필드에 담아 보여준다.
SELECT MIN(Price) AS SmallestPrice
FROM Products;
Result
| SmallestPrice |
|---|
| 10 |
아래의 명령은 Products 테이블에서 Price 필드의 값들 중 가장 큰 값을 LargestPrice 라는 필드에 담아 보여준다.
SELECT MAX(Price) AS LargestPrice
FROM Products;
Result
| LargestPrice |
|---|
| 22 |
COUNT, AVG, SUM
COUNT() 는 조건을 만족하는 레코드의 개수를 돌려준다.
SELECT COUNT(필드이름)
FROM 테이블이름
WHERE 조건;
아래는 Products 테이블에서 ProductID 필드의 레코드 개수를 돌려주는 명령이다.
SELECT COUNT(ProductID)
FROM Products;
Result
| COUNT(ProductID) |
|---|
| 5 |
AVG() 는 숫자 필드의 평균을 돌려준다.
SELECT AVG(필드이름)
FROM 테이블이름
WHERE 조건;
아래 명령은 Products 테이블의 Price 필드의 모든 값의 평균을 돌려준다.
SELECT AVG(Price)
FROM Products;
Result
| AVG(Price) |
|---|
| 18.07 |
SUM() 은 숫자 필드의 총 합을 돌려준다.
SELECT SUM(필드이름)
FROM 테이블이름
WHERE 조건;
아래 명령은 OrderDetails 테이블에서 Quantity 필드의 모든 값의 합을 돌려준다.
SELECT SUM(Quantity)
FROM OrderDetails;
Result
| SUM(Quantity) |
|---|
| 76 |
AS
AS 는 테이블이나 필드에 예명을 붙여줄 때 사용한다. 주로 필드명을 좀 더 알아보기 쉽게 해줄 때 사용한다.
AS 로 붙인 예명은 질의가 진행되는 동안에만 유효하다.
필드에 예명을 붙일 때
SELECT 필드이름 AS 예명
FROM 테이블이름
테이블에 예명을 붙일 때
SELECT 필드이름
FROM 테이블이름 AS 예명
아래 명령은 Customers 테이블의 CustomerID 필드를 ID 라는 예명으로, CustomerName 필드를 Customer 라는 예명으로 가져온다.
SELECT CustomerID AS ID, CustomerName AS Customer
FROM Customers
Result
| ID | Customer |
|---|---|
| 1 | Alfreds Futterkiste |
| 2 | Ana Trujillo Emparedados y helados |
| 3 | Antonio Moreno Taquería |
| 4 | Around the Horn |
| 5 | Berglunds snabbköp |
아래 명령은 Customer 테이블을 c 로, Orders 테이블을 o 로 이름 붙인 다음, 이 예명들을 사용해서 각 테이블의 필드들을 불러온다.
Customers 테이블에서는 CustomerID, CustomerName 필드를 불러와 각각 ID, Customer 라는 예명을 붙여주었다.
Orders 테이블에서는 OrderDate 필드를 불러와서 Order Date 라는 예명을 붙였다. 예명에 공백문자가 있으면 [] 로 감싸준다.
불러온 필드들 중 서로 같은 CustomerID 값을 가진 레코드들만 가져온다.
CustomerID 를 기준으로 오름차순 정렬한다.
SELECT c.CustomerID as ID, c.CustomerName As Customer, o.OrderDate AS [Order Date]
FROM Customers As c, Orders as o
WHERE c.CustomerID=o.CustomerID
Order By c.CustomerID;
Result
| ID | Customer | Order Date |
|---|---|---|
| 2 | Ana Trujillo Emparedados y helados | 1996-09-18 |
| 3 | Antonio Moreno Taquería | 1996-11-27 |
| 4 | Around the Horn | 1996-11-15 |
| 4 | Around the Horn | 1996-12-16 |
| 5 | Berglunds snabbköp | 1996-08-12 |
| 5 | Berglunds snabbköp | 1996-08-14 |
| 5 | Berglunds snabbköp | 1996-12-16 |
여러 필드들의 값을 하나의 필드로 묶어서 불러올 수 도 있다.
SELECT CustomerName AS Name, Address + ', ' + PostalCode + ' ' + City + ', ' + Country AS Address
FROM Customers;
Result
| Name | Address |
|---|---|
| Alfreds Futterkiste | Obere Str. 57, 12209 Berlin, Germany |
| Ana Trujillo Emparedados y helados | Avda. de la Constitución 2222, 05021 México D.F., Mexico |
| Antonio Moreno Taquería | Mataderos 2312, 05023 México D.F., Mexico |
| Around the Horn | 120 Hanover Sq., WA1 1DP London, UK |
| Berglunds snabbköp | Berguvsvägen 8, S-958 22 Luleå, Sweden |
GROUP BY
GROUP BY 는 계산 함수(COUNT, AVG, SUM, MIN, MAX)의 결과를 필드별로 나타낼 때 주로 사용한다.
SELECT 필드이름1, 필드이름2, ...
FROM 테이블이름
WHERE 조건
GROUP BY 필드이름1, 필드이름2,...;
아래는 Customers 테이블의 레코드들 중 같은 Country 값을 가지는 레코드들의 CustomerID 값을 세어서 Country 값 별로 나타내는 명령이다.
SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country;
Result
| COUNT(CustomerID) | Country |
|---|---|
| 1 | Germany |
| 2 | Mexico |
| 1 | Sweden |
| 1 | UK |
HAVING
HAVING 절은 계산 함수(COUNT, AVG, SUM, MIN, MAX)를 WHERE 절과 함께 사용하지 못하는 점을 보완하기 위해 도입되었다.
SELECT 필드이름1, 필드이름2, ...
FROM 테이블이름
WHERE 조건
GROUP BY 필드이름1, 필드이름2, ...
HAVING 조건;
아래는 Customers 테이블에서 Country 필드의 값 별로 레코드 수를 세어서 그 수가 2 이상인 Country 값 만 나타내는 명령이다.
SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
HAVING COUNT(CustomerID) >= 2;
Result
| COUNT(CustomerID) | Country |
|---|---|
| 2 | Mexico |
[SQL] SELECT를 꾸며주는 옵션 모음
Reference
W3School: https://www.w3schools.com/sql/