예제 테이블
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/