• Home
  • About
    • Che1's Blog photo

      Che1's Blog

      Che1's Dev Blog

    • Learn More
    • Facebook
    • Instagram
    • Github
    • Steam
    • Youtube
  • Posts
    • All Posts
    • Django
    • Python
    • Front-end
    • Algorithm
    • etc
    • All Tags
  • Projects

[SQL] SELECT를 꾸며주는 옵션 모음

07 Oct 2017

Reading time ~6 minutes

예제 테이블

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 목차
  • [SQL] JOIN, UNION
  • [SQL] DELETE
  • [SQL] UPDATE
  • [SQL] INSERT INTO
  • [SQL] SELECT를 꾸며주는 옵션 모음
  • [SQL] WHERE
  • [SQL] SELECT
  • [SQL] SQL 이란?

[SQL] SELECT를 꾸며주는 옵션 모음
  • TOP, LIMIT, ROWNUM
  • MIN, MAX
  • COUNT, AVG, SUM
  • AS
  • GROUP BY
  • HAVING
  • 참고 문헌

Reference

W3School: https://www.w3schools.com/sql/



SQL Share Tweet +1