DB, Table 생성
SQL 기초를 익히기 위해 서점의 데이터를 가정하고 bookstore DB에 아래 3개의 table을 생성한다.
- book table


- customer table
))
- orders table
))
SQL문의 처리 순서
SELECT phone
FROM customer
WHERE name='김연아';
① FROM customer
② WHERE name='김연아'
③ SELECT phone
SELECT / FROM
- 기본 구조
SELECT [column]
FROM [table_name];- 모든 책의 제목과 가격

SELECT title, price
FROM book;- 모든 책의 가격과 제목

SELECT price, title
FROM book;- 모든 책의 번호, 제목, 출판사, 가격

SELECT * FROM book;- 중복을 제거한 모든 출판사

SELECT DISTINCT publisher
FROM book;DISTINCT는 중복되는 값을 제거하고 조회할 때 사용한다. DISTINCT가 붙은 column에서의 중복값은 1번만 조회된다.
만약 DISTINCT 뒤에 2개 이상의 column을 작성한다면 해당 column들을 하나로 묶고 중복을 제거한다.
작성된 column들에 해당하는 레코드 전체값이 동일한 경우만 제거하는 것이다. 설명만 읽으면 헷갈릴 수 있는데 아래 예를 보고 이해할 수 있다.

title, publisher가 같은 레코드만 하나의 레코드로 묶여 조회된다.
WHERE
- 기본 구조
SELECT [column]
FROM [table_name]
WHERE [expr]- 가격이 20,000원 미만인 책

SELECT * FROM book
WHERE price < 20000;- 제목이 '축구의 역사'인 책의 출판사

SELECT title, publisher
FROM book
WHERE title LIKE '축구의 역사';- 제목에 '축구'가 포함되는 책의 제목과 출판사

SELECT title, publisher
FROM book
WHERE title LIKE '%축구%';- 출판사 중 맨 오른쪽에서 2번째 문자가 '공'인 출판사

SELECT * FROM book
WHERE publisher LIKE '%공_';
AND / OR / IN / NOT IN / BETWEEN (WHERE 조건 결합)
- 제목에 '축구'가 포함되고 가격이 7000원 초과인 책 (AND)

SELECT * FROM book
WHERE title LIKE '%축구%' AND price > 7000;- 출판사가 '시공사' 혹은 '대한미디어'인 책 (OR)

SELECT * FROM book
WHERE publisher='시공사' OR publisher='대한미디어';- 출판사가 '시공사' 혹은 '대한미디어'인 책 (IN)

SELECT * FROM book
WHERE publisher IN ('시공사', '대한미디어');IN의 경우 괄호 안에 조건들을 나열하게 되는데 나열한 조건들은 OR 연산으로 검색되며, 조건들을 만족하는 모든 레코드를 조회할 수 있다. OR를 사용한 조회와 결과가 같지만 간단하게 작성이 가능하다는 장점이 있다.
- 출판사가 '시공사' 혹은 '대한미디어'가 아닌 책 (NOT IN)

SELECT * FROM book
WHERE publisher NOT IN ('시공사', '대한미디어');
NOT IN도 IN과 마찬가지로 OR 연산으로 검색된다.
- 가격이 10000원 이상, 20000원 이하인 책 (BETWEEN)

SELECT * FROM book
WHERE price BETWEEN 10000 AND 20000;BETWEEN은 범위를 한정해 조회하고 싶을 때 사용하며 기본 구조는 아래와 같다.
- 기본 구조
SELECT [column]
FROM [table_name]
WHERE [column] BETWEEN [하한] AND [상한]이상, 이하이므로 하한, 상한값도 포함되어 조회된다.
ORDER BY / ASC / DESC
- 기본 구조
SELECT [column]
FROM [table_name]
WHERE [expr]
ORDER BY [column] [ASC(생략 가능) / DESC]- 제목순으로 책 조회

SELECT * FROM book
ORDER BY title;- 가격순, 제목순으로 책 조회

SELECT * FROM book
ORDER BY price, title;- 가격 내림차순, 출판사 오름차순으로 책 조회

SELECT * FROM book
ORDER BY price DESC, publisher ASC;ORDER BY 뒤에 여러개의 column을 작성한 경우 왼쪽부터 순차적으로 정렬이 진행된다.
위 예의 경우 먼저 가격을 내림차순으로 정렬하고 출판사를 오름차순으로 정렬한다.
SUM / AVG / MIN / MAX / COUNT (집계 함수)
집계 함수는 여러개의 row를 입력으로 받아 계산 후 하나의 값을 return한다.
- 고객이 주문한 도서의 총 판매액

SELECT SUM(saleprice)
FROM orders;
SELECT SUM(saleprice) AS 총매출
FROM orders;- 2번 고객의 총 주문액

SELECT SUM(saleprice) AS 총주문액
FROM orders
WHERE custid=2;- 도서 주문의 총 판매액, 평균값, 최저액, 최고액

SELECT SUM(saleprice) AS Total,
AVG(saleprice) AS Average,
MIN(saleprice) AS Minimum,
MAX(saleprice) AS Maximum FROM orders;- 총 도서 주문수

SELECT COUNT(*)
FROM orders;
GROUP BY
- 기본 구조
SELECT [column]
FROM [table_name]
WHERE [expr]
GROUP BY [column]
ORDER BY [column] [ASC / DESC]
GROUP BY는 레코드를 그룹화할 때 쓰인다. column에 대해 같은 값을 가진 row를 묶어 그룹화한다.
집계 함수와 함께 쓰일 때가 많은데 위 서점 DB의 orders table에서 고객별(GROUP BY) 총 주문액(SUM)을 조회하고 싶을 때가 그 예다.
- 고객별 구매한 도서 수량과 총 주문액

SELECT custid, COUNT(*) AS 도서수량, SUM(saleprice) AS 총주문액
FROM orders
GROUP BY custid;위 코드에서 COUNT(*)를 COUNT(custid)로 변경해도 조회 결과는 같다. 둘의 차이점은 아래와 같다.
COUNT(*) : NULL값을 포함해 count 수행
COUNT(column) : NULL값을 제외하고 count 수행
- 10,000원 초과 주문 중 고객별 주문한 총 도서수량

SELECT custid, COUNT(*) AS 도서수량
FROM orders
WHERE saleprice > 10000
GROUP BY custid
ORDER BY custid;HAVING
- 기본 구조
SELECT [column]
FROM [table_name]
WHERE [expr]
GROUP BY [column]
HAVING [expr]
ORDER BY [column] [ASC / DESC]HAVING은 WHERE과 마찬가지로 뒤에 조건식이 온다.
HAVING은 GROUP BY로 그룹화된 결과 table에 새로운 조건을 추가할 수 있다는 점에서 WHERE과 다르다.
- 10,000원 초과 주문 중 고객별 주문한 총 도서수량, 단 2권 이상 구매한 고객

SELECT custid, COUNT(*) AS 도서수량
FROM orders
WHERE saleprice > 10000
GROUP BY custid
HAVING COUNT(*) > 1
ORDER BY custid;위 코드의 처리 순서
① FROM orders --> orders table에서
② WHERE saleprice > 10000 --> saleprice가 10,000원 초과인 레코드들을
③ GROUP BY custid --> custid로 그룹화하고
④ HAVING COUNT(*) > 1 --> 2권 이상 구매한 고객만 남긴다.
⑤ SELECT custid, COUNT(*) AS 도서수량
⑥ ORDER BY custid
'DB' 카테고리의 다른 글
| DB | 데이터 모델링, 개체-관계 모델(E-R Model) (0) | 2023.02.26 |
|---|---|
| DB | 데이터베이스 시스템 정의와 구성 요소, 3단계 데이터베이스 구조 (2) | 2023.01.02 |
| DB | SQL 기초 연습 (2) (0) | 2022.08.26 |
| DB | MySQL 정리 (0) | 2022.08.15 |
| DB | DATABASE1 정리 (0) | 2022.08.15 |