SQL(Structured Query Language)의 의미
SELECT: 질의 결과 추출되는 속성 리스트를 열거한다
FROM: 질의에 어느 테이블이 사용되는지 열거한다
WHERE: 질의의 조건을 작성한다
| 구분 | SQL | 일반 프로그래밍 언어 |
|---|---|---|
| 용도 | 데이터베이스에서 데이터를 추출하여 문제 해결 | 모든 문제 해결 |
| 입출력 | 입력과 출력 모두 테이블 | 모든 형태의 입출력 가능 |
| 번역 | DBMS | 컴파일러 |
| 문법 | SELECT * FROM Book; | int main() {…} |
발전 역사
사용 방식
SELECT * FROM 고객; 이라고 직접 타이핑SQL의 분류
SELECT 문
SELECT [ALL | DISTINCT] 속성이름(들) -- 5
FROM 테이블이름(들) -- 1
[WHERE 검색조건(들)] -- 2
[GROUP BY 속성이름] -- 3
[HAVING 검색조건(들)] -- 4
[ORDER BY 속성이름 [ASC | DESC]] -- 6SELECT DISTINCT publisher
FROM Book;ALL(기본값): 결과 테이블이 튜플의 중복을 허용하도록 지정DISTINCT: 결과 테이블이 튜플의 중복을 허용하지 않도록 지정WHERE 조건
| 술어 | 연산자 | 사용 예 |
|---|---|---|
| 비교 | =, <>, <, <=, >, >= | price < 20000 |
| 범위 | BETWEEN | price BETWEEN 10000 AND 20000 |
| 집합 | IN, NOT IN | price IN (10000, 20000, 30000) |
| 패턴 | LIKE | bookname LIKE ‘축구의 역사’ |
| NULL | IS NULL, IS NOT NULL | price IS NULL |
| 복합조건 | AND, OR, NOT | (price < 20000) AND (bookname LIKE ‘축구의 역사’) |
SELECT *
FROM Book
WHERE price BETWEEN 10000 AND 20000;
-- 혹은
SELECT *
FROM Book
WHERE price >= 10000 AND price <= 20000;SELECT *
FROM Book
WHERE publisher NOT IN ('굿스포츠', '대한미디어');| 와일드 문자 | 의미 | 사용 예 |
|---|---|---|
| % | 0개 이상의 문자열과 일치 | ‘%축구%’ : 축구를 포함하는 문자열 |
| [ ] | 1개의 문자와 일치 | ‘[0-5]%’ : 0-5 사이 숫자로 시작하는 문자열 |
| [^] | 1개의 문자와 불일치 | ‘[^0-5]%’ : 0-5 사이 숫자로 시작하지 않는 문자열 |
| _ | 특정 위치에 있는 1개의 문자와 일치 | ‘_구%’ : 두 번째 위치에 ‘구’가 들어가는 문자열 |
LIKE + 와일드문자 사용SELECT *
FROM Book
WHERE publisher LIKE '굿스포츠' OR publisher LIKE '대____';
-- 참고) WHERE publisher='굿스포츠'; (X)ORDER BY
SELECT *
FROM Book
ORDER BY price DESC, publisher ASC;집계함수
| 집계 함수 | 문법 | 사용 예 |
|---|---|---|
| SUM | SUM([ALL | DISTINCT] 속성이름) | SUM(price) |
| AVG | AVG([ALL | DISTINCT] 속성이름) | AVG(price) |
| COUNT | COUNT({[[ALL | DISTINCT] 속성이름] | * }) | COUNT(*) |
| MAX | MAX([ALL | DISTINCT] 속성이름) | MAX(price) |
| MIN | MIN([ALL | DISTINCT] 속성이름) | MIN(price) |
AS 키워드-- 아래와 같이 작성 시 속성이름 변경 가능
SELECT SUM(saleprice) AS Total,
AVG(saleprice) AS Average,
MIN(saleprice) AS Minimum,
MAX(saleprice) AS Maximum
FROM Orders; 
COUNT
-- 마당서점의 도서 판매건수를 구하세요(실행결과: 10)
SELECT COUNT(*)
FROM Orders;
-- 고객이 구매한 마당서점의 도서 종류 개수를 구하세요(실행결과: 8)
SELECT COUNT(DISTINCT bookid)
FROM Orders;GROUP BY
SELECT custid, COUNT(*) AS 도서수량
FROM Orders
WHERE saleprice >= 8000
GROUP BY custid
HAVING COUNT(*) >= 2
ORDER BY custid;GROUP BY & HAVING 절 주의사항
GROUP BY를 사용해 튜플을 그룹으로 묶으면 SELECT 절에는 GROUP BY에서 사용한 <속성>과 집계 함수만 나올 수 있다
-- 맞는 예
SELECT custid, SUM(saleprice)
FROM Orders
GROUP BY custid;
-- 틀린 예
SELECT bookid, SUM(saleprice) -- SELECT 절에는 bookid 속성이 올 수 없다
FROM Orders
GROUP BY custid;
WHERE 절과 HAVING 절이 같이 포함된 SQL 문은 검색 조건이 모호해질 수 있다.
HAVING 절은
-- 맞는 예
SELECT custid, COUNT(*) AS 도서수량
FROM Orders
WHERE saleprice >= 8000
GROUP BY custid
HAVING COUNT(*) >= 2;
-- 틀린 예
SELECT custid, COUNT(*) AS 도서수량
FROM Orders
HAVING COUNT(*) >= 2 -- 순서가 틀렸다
WHERE saleprice >= 8000
GROUP BY custid;
조인 문법
SQL 문에서는 주로 동등조인을 사용한다
다음 두 가지 문법 중 하나를 사용할 수 있다
SELECT <속성들>
FROM 테이블1, 테이블2
WHERE <조인조건> AND <검색조건>
-- 또는
SELECT <속성들>
FROM 테이블1
INNER JOIN 테이블2
ON <조인조건>
WHERE <검색조건>
외부조인이면 FROM 절에 조인 종류를 적고 ON을 이용하여 조인조건을 명시한다
FULL OUTER JOIN은 SQL 표준 문법에는 있지만 MySQL은 지원하지 않는다
SELECT <속성들>
FROM 테이블1
{LEFT | RIGHT | FULL[OUTER]} JOIN 테이블2
ON <조인조건>
WHERE <검색조건>
조인
SELECT Customer.name, Book.bookname
FROM Customer, Orders, Book
WHERE Customer.custid=Orders.custid AND Orders.bookid=Book.bookid;외부 조인
SELECT Customer.name, saleprice
FROM Customer
LEFT OUTER JOIN Orders
ON Customer.custid=Orders.custid;