1. SQL 분류

DDL = 구조 생성/변경/삭제
CREATE, ALTER, DROP

DML = 데이터 검색/삽입/수정/삭제
SELECT, INSERT, UPDATE, DELETE

DCL = 권한 관리
GRANT, REVOKE

2. SELECT 기본형

SELECT 속성명
FROM 테이블명
WHERE 조건
GROUPBY 그룹기준
HAVING 그룹조건
ORDERBY 정렬기준;

순서 암기:

SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY

3. SELECT

전체 조회

SELECT*
FROM Book;
  • = 모든 속성

특정 속성 조회

SELECT bookname, price
FROM Book;

중복 제거

SELECT DISTINCT publisher
FROM Book;

DISTINCT = 중복 제거


4. WHERE 조건

비교

WHERE price=10000
WHERE price<>10000
WHERE price>10000
WHERE price>=10000
WHERE price<10000
WHERE price<=10000
= 같다
<> 같지 않다
> 초과
>= 이상
< 미만
<= 이하

5. BETWEEN

WHERE price BETWEEN 10000 AND 20000

뜻:

10000 이상 20000 이하

중요:

BETWEEN은 양끝 포함

같은 뜻:

WHERE price>=10000 AND price<=20000

6. IN

WHERE publisher IN ('굿스포츠','대한미디어')

뜻:

출판사가 굿스포츠 또는 대한미디어

같은 뜻:

WHERE publisher='굿스포츠'
OR publisher='대한미디어'

7. LIKE 패턴 검색

%

WHERE booknameLIKE'%축구%'

뜻:

앞뒤에 뭐가 있든 '축구'가 포함되면 됨

예:

축구의 역사
월드컵 축구 이야기

_

WHERE booknameLIKE'_구%'

뜻:

첫 글자는 아무거나 1글자
두 번째 글자가 '구'
그 뒤는 아무거나

예:

축구의 역사

축 = _

구 = 구

의 역사 = %


자주 나오는 패턴

LIKE'축구%'
축구로 시작
LIKE'%축구'
축구로 끝남
LIKE'%축구%'
축구 포함
LIKE'_구%'
두 번째 글자가 구
LIKE'__구%'
세 번째 글자가 구

8. NULL

WHERE phone IS NULL
전화번호가 없는 고객
WHERE phone IS NOT NULL
전화번호가 있는 고객

주의:

phone = NULL

이렇게 쓰면 안 됨.


9. AND OR NOT

WHERE price >= 10000 AND price <= 20000

둘 다 만족

WHERE publisher = '굿스포츠'
OR publisher = '대한미디어'

하나라도 만족

WHERE NOT publisher = '굿스포츠'

반대 조건


10. ORDER BY

ORDER BY priceASC;
오름차순, 작은 값 → 큰 값
ORDER BY price DESC;
내림차순, 큰 값 → 작은 값

기본값은 ASC.

SELECT *
FROM Book
ORDER BY price DESC;

11. 집계 함수

SUM = 합계
AVG = 평균
COUNT = 개수
MAX = 최댓값
MIN = 최솟값

합계

SELECT SUM(saleprice)
FROM Orders;

평균

SELECT AVG(saleprice)
FROM Orders;

개수

SELECT COUNT(*)
FROM Orders;
COUNT(*) = 전체 행 개수

최댓값

SELECT MAX(price)
FROM Book;

최솟값

SELECT MIN(price)
FROM Book;

12. GROUP BY

같은 값끼리 묶어서 계산.

SELECT custid, SUM(saleprice)
FROM Orders
GROUPBY custid;

뜻:

고객별 총 구매금액

중요 규칙:

GROUP BY를 쓰면 SELECT에는
GROUP BY에 쓴 속성 + 집계함수
위주로 써야 함

13. HAVING

그룹 결과에 조건 걸기.

SELECT custid,COUNT(*)
FROM Orders
GROUP BY custid
HAVING COUNT(*) >= 2;

뜻:

주문을 2번 이상 한 고객

WHERE vs HAVING

WHERE = 행 조건
HAVING = 그룹 조건

예:

WHERE price>=10000

개별 행 조건

HAVING SUM(saleprice)>=20000

그룹 합계 조건


14. JOIN

JOIN = 테이블 연결.

PDF 예제 기준 연결키:

Customer ↔ Orders = custid
Book ↔ Orders = bookid

기본 조인

SELECT Customer.name, Orders.saleprice
FROM Customer, Orders
WHERE Customer.custid= Orders.custid;

뜻:

고객번호가 같은 것끼리 연결해서
고객 이름과 판매가격 출력

세 테이블 조인

SELECT Customer.name, Book.bookname, Orders.saleprice
FROM Customer, Book, Orders
WHERE Customer.custid= Orders.custid
AND Book.bookid= Orders.bookid;

뜻:

고객 이름, 주문한 책 이름, 판매가격 출력

15. INNER JOIN

SELECT Customer.name, Orders.saleprice
FROM CustomerINNERJOIN Orders
ON Customer.custid= Orders.custid;

뜻:

양쪽 테이블에서 조건이 일치하는 행만 출력

암기:

INNER JOIN = 교집합 느낌

16. LEFT OUTER JOIN

SELECT Customer.name, Orders.saleprice
FROM CustomerLEFTOUTERJOIN Orders
ON Customer.custid= Orders.custid;

뜻:

왼쪽 테이블 Customer는 전부 출력
Orders와 매칭되면 주문 정보 출력
매칭 안 되면 Orders 쪽은 NULL

암기:

LEFT OUTER JOIN = 왼쪽은 무조건 살림

시험 문장:

주문하지 않은 고객도 포함하여 출력

이러면 LEFT OUTER JOIN 가능성 높음.


17. RIGHT OUTER JOIN

SELECT Customer.name, Orders.saleprice
FROM CustomerRIGHTOUTERJOIN Orders
ON Customer.custid= Orders.custid;

뜻:

오른쪽 테이블 Orders는 전부 출력
Customer와 매칭 안 되면 Customer 쪽은 NULL

암기:

RIGHT OUTER JOIN = 오른쪽은 무조건 살림

18. FULL OUTER JOIN

SELECT Customer.name, Orders.saleprice
FROM CustomerFULLOUTERJOIN Orders
ON Customer.custid= Orders.custid;

뜻:

왼쪽, 오른쪽 둘 다 전부 출력
매칭 안 되는 쪽은 NULL

암기:

FULL OUTER JOIN = 양쪽 다 살림

19. JOIN 한 줄 암기

INNER JOIN = 일치하는 것만
LEFT OUTER JOIN = 왼쪽 전부
RIGHT OUTER JOIN = 오른쪽 전부
FULL OUTER JOIN = 양쪽 전부

20. 부속질의 / 서브쿼리

SQL 안에 SQL.

SELECT bookname
FROM Book
WHERE price= (
SELECT MAX(price)
FROM Book
);

뜻:

가장 비싼 도서 이름 출력

안쪽 먼저:

SELECT MAX(price)
FROM Book;

그다음 바깥쪽 실행.


21. IN 부속질의

SELECT name
FROM Customer
WHERE custidIN (
SELECT custid
FROM Orders
);

뜻:

주문한 적 있는 고객 이름

22. 상관 부속질의

안쪽 SQL이 바깥쪽 SQL 값을 사용함.

SELECT b1.bookname
FROM Book b1
WHERE b1.price> (
SELECT AVG(b2.price)
FROM Book b2
WHERE b2.publisher= b1.publisher
);

뜻:

같은 출판사의 평균 가격보다 비싼 책

핵심:

b2.publisher= b1.publisher

안쪽 쿼리가 바깥쪽 b1.publisher를 씀.


23. 집합연산

PDF에 나옴.

UNION = 합집합
MINUS = 차집합
INTERSECT = 교집합

UNION

SELECT custid
FROM Customer
UNION
SELECT custid
FROM Orders;

뜻:

Customer의 custid와 Orders의 custid를 합침
중복은 제거

MINUS

SELECT custid
FROM Customer
MINUS
SELECT custid
FROM Orders;

뜻:

전체 고객 중 주문하지 않은 고객번호

앞에서 뒤를 뺌.


INTERSECT

SELECT custid
FROM Customer
INTERSECT
SELECT custid
FROM Orders;

뜻:

Customer에도 있고 Orders에도 있는 고객번호
즉 주문한 적 있는 고객번호

24. EXISTS

조건에 맞는 행이 존재하면 참.

SELECT name
FROM Customer c
WHERE EXISTS (
SELECT*
FROM Orders o
WHERE c.custid= o.custid
);

뜻:

주문한 적 있는 고객 이름

NOT EXISTS

SELECT name
FROM Customer c
WHERENOTEXISTS (
SELECT*
FROM Orders o
WHERE c.custid= o.custid
);

뜻:

주문한 적 없는 고객 이름

25. CREATE

테이블 생성.

CREATETABLE NewBook (
    bookid NUMBER,
    bookname VARCHAR2(20),
    publisher VARCHAR2(20),
    price NUMBER,
PRIMARYKEY(bookid)
);

제약조건

PRIMARY KEY = 기본키
FOREIGN KEY = 외래키
NOT NULL = NULL 금지
UNIQUE = 중복 금지
DEFAULT = 기본값
CHECK = 조건 제한

예:

CREATETABLE NewBook (
    bookid NUMBERPRIMARYKEY,
    bookname VARCHAR2(20)NOTNULL,
    publisher VARCHAR2(20),
    price NUMBERDEFAULT10000CHECK(price>1000)
);

26. FOREIGN KEY

FOREIGNKEY(custid)REFERENCES Customer(custid)

뜻:

현재 테이블의 custid가
Customer 테이블의 custid를 참조함

27. ALTER

테이블 구조 변경.

속성 추가

ALTERTABLE NewBook
ADD isbn VARCHAR2(13);

속성 변경

ALTERTABLE NewBook
MODIFY isbn NUMBER;

속성 삭제

ALTERTABLE NewBook
DROPCOLUMN isbn;

기본키 추가

ALTERTABLE NewBook
ADDPRIMARYKEY(bookid);

28. DROP

테이블 자체 삭제.

DROPTABLE NewBook;

중요:

DROP = 테이블 구조 + 데이터 모두 삭제
DELETE = 데이터만 삭제

29. INSERT

데이터 삽입.

INSERTINTO Book(bookid, bookname, publisher, price)
VALUES (11,'스포츠 의학','한솔의학서적',90000);

속성 생략 가능:

INSERTINTO Book
VALUES (11,'스포츠 의학','한솔의학서적',90000);

단, 테이블 속성 순서와 값 순서가 정확히 맞아야 함.


30. 대량 삽입

INSERTINTO NewBook(bookid, bookname, publisher, price)
SELECT bookid, bookname, publisher, price
FROM Book;

뜻:

Book의 조회 결과를 NewBook에 한꺼번에 삽입

31. UPDATE

데이터 수정.

UPDATE Customer
SET address='대한민국 부산'
WHERE custid=5;

뜻:

custid가 5인 고객의 주소 수정

주의:

UPDATE Customer
SET address='대한민국 부산';

WHERE 없으면 전체 고객 주소가 바뀜.


32. DELETE

데이터 삭제.

DELETEFROM Customer
WHERE custid=5;

뜻:

custid가 5인 고객 삭제

전체 삭제:

DELETEFROM Customer;

뜻:

Customer 테이블의 모든 데이터 삭제
테이블 구조는 남음

진짜 시험 직전 암기표

SELECT = 조회
FROM = 테이블
WHERE = 행 조건
GROUP BY = 그룹 묶기
HAVING = 그룹 조건
ORDER BY = 정렬

DISTINCT = 중복 제거
BETWEEN = 이상 이하
IN = 목록 중 하나
LIKE = 패턴 검색
% = 여러 글자
_ = 한 글자
IS NULL = NULL 찾기

SUM = 합계
AVG = 평균
COUNT = 개수
MAX = 최댓값
MIN = 최솟값

INNER JOIN = 일치하는 것만
LEFT OUTER JOIN = 왼쪽 전부
RIGHT OUTER JOIN = 오른쪽 전부
FULL OUTER JOIN = 양쪽 전부

UNION = 합집합
MINUS = 차집합
INTERSECT = 교집합
EXISTS = 존재하면 참

CREATE = 테이블 생성
ALTER = 구조 변경
DROP = 테이블 삭제
INSERT = 데이터 삽입
UPDATE = 데이터 수정
DELETE = 데이터 삭제

진짜 위험한 건 이 5개임:

1. BETWEEN은 양끝 포함
2. LIKE에서 %는 여러 글자, _는 한 글자
3. WHERE는 행 조건, HAVING은 그룹 조건
4. LEFT OUTER JOIN은 왼쪽 전부 출력
5. DROP은 테이블 삭제, DELETE는 데이터 삭제