구성요소
기본 문법
SELECT [ALL┃DISTINCT] 속성이름(들) // 찾는다. [전체|중복제거]
FROM 테이블이름(들) [테이블 별명] // <테이블>에서
[WHERE 검색조건(들)] // 조건에 맞는
[GROUP BY 속성이름] // <속성>으로 묶여있는
[HAVING 검색조건(들)] // <GROUP>에서 조건에 맞는
[ORDER BY 속성이름 [ASC┃DESC]] // [오름차순|내림차순] 정렬
---------------------------------------------------------------
[ ] : 대괄호 안의 SQL 예약어들은 선택적으로 사용한다.
| : 선택 가능한 문법들 중 한 개를 사용할 수 있다.
SQL
복사
DISTINCT
•
통사론
SELECT DISTINCT column1, column2, ...
FROM table_name;
SQL
복사
•
일반 구문
SELECT COUNT(DISTINCT Country) FROM Customers;
SQL
복사
•
구별 카운트 (다양한 국가 수 반환)
SELECT Count(*) AS DistinctCountries
FROM (SELECT DISTINCT Country FROM Customers);
SQL
복사
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 '축구의 역사') |
•
와일드 문자
와일드 문자 | 의미 | 사용 예 |
+ | 문자열을 연결 | ‘골프 ’ + ‘바이블’ : ‘골프 바이블’ |
% | 0개 이상의 문자열과 일치 | ‘%축구%’ : 축구를 포함하는 문자열 |
[ ] | 1개의 문자와 일치 | ‘[0-5]%’ : 0-5 사이 숫자로 시작하는 문자열 |
[^] | 1개의 문자와 불일치 | ‘[^0-5]%’ : 0-5 사이 숫자로 시작하지 않는 문자열 |
_ | 특정 위치의 1개의 문자와 일치 | ‘_구%’ : 두 번째 위치에 ‘구’가 들어가는 문자열 |
•
예시
// 축구에 관한 도서 중 가격이 20,000원 이상인 도서
SELECT *
FROM Book
WHERE bookname LIKE '%축구%' AND price >= 20000;
SQL
복사
꿀팁
SELECT
FROM
WHERE 1=1 -- 이걸 붙히는 이유 => 주석처리하는게 편해서
-- and id > 3 -- 이게 가능
and name LIKE 'name%'
;
SQL
복사
집계함수
집계 함수 | 문법 | 사용 예 |
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) |
•
예시
GROUP BY & HAVING
GROUP BY <속성> | GROUP BY로 투플을 그룹으로 묶은 후 SELECT 절에는 GROUP BY에서 사용한 <속성>과 집계함수만 나올 수 있음
• 맞는 예
SELECT custid, SUM(saleprice)
FROM Orders
GROUP BY custid;
• 틀린 예
SELECT bookid, SUM(saleprice)
/* SELECT 절에 bookid 속성이 올 수 없다 */
FROM Order
GROUP BY custid; |
HAVING <검색조건>
| WHERE 절과 HAVING 절이 같이 포함된 SQL 문은 검색 조건이 모호해질 수 있음.
HAVING 절은
① 반드시 GROUP BY 절과 같이 작성해야 하고
② WHERE 절보다 뒤에 나와야 함.
③ <검색조건>에는 SUM, AVG, MAX, MIN, COUNT와 같은 집계함수가 와야 함.
• 맞는 예
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; |
ORDER BY
오름차순 ASC
SELECT * FROM 테이블 ORDER BY 컬럼1 ASC; -- 생략가능
SQL
복사
내림차순 DESC
SELECT * FROM 테이블 ORDER BY 컬럼1 DESC;
SQL
복사
조인(JOIN)
•
2개의 테이블 합체
명령 | 문법 | 설명 |
일반 조인 | SELECT <속성들>
FROM 테이블1, 테이블2
WHERE <조인조건> AND <검색조건>
SELECT <속성들>
FROM 테이블1 INNER JOIN 테이블2 ON <조인조건>
WHERE <검색조건> | SQL 문에서는 주로 동등조인을 사용함.
두 가지 문법 중 하나를 사용할 수 있음. |
외부 조인 | SELECT <속성들>
FROM 테이블1 {LEFT | RIGHT | FULL [OUTER]} JOIN 테이블2
ON <조인조건>
WHERE <검색조건> | 외부조인은 FROM 절에 조인 종류를
적고 ON을 이용하여 조인조건을 명시함. |
•
예제
// 가격이 20,000원인 도서를 주문한 고객의 이름과 도서의 이름
SELECT Customer.name, Book.bookname
FROM Customer, Orders, Book
WHERE Customer.custid = Orders.custid AND Orders.bookid = Book.bookid AND Book.price = 20000;
SQL
복사
// 도서를 구매하지 않은 고객을 포함하여 고객의 이름과 고객이 주문한 도서의 판매가격
SELECT Customer.name, saleprice
FROM Customer LEFT OUTER JOIN Orders
ON Customer.custid = Orders.custid;
SQL
복사
부속질의
•
SQL 내의 또 다른 SQL 문
// 가장 비싼 도서의 이름
SELECT bookname
FROM Book
WHERE price = (SELECT MAX(price)
FROM Book );
SQL
복사
// 대한미디어에서 출판한 도서를 구매한 고객의 이름
SELECT name
FROM Customer
WHERE custid IN (SELECT custid
FROM Orders
WHERE bookid IN (SELECT bookid
FROM Book
WHERE publisher='대한'));
SQL
복사
집합 연산
•
합집합 UNION
{고객 이름} = {대한민국에 거주하는 고객 이름} ∪ {도서를 주문한 고객 이름}
// 대한민국에서 거주하는 고객의 이름과 도서를 주문한 고객의 이름
SELECT name
FROM Customer
WHERE address LIKE '대한민국%'
UNION
SELECT name
FROM Customer
WHERE custid IN (SELECT custid FROM Orders);
SQL
복사
•
차집합 MINUS
// 대한민국에서 거주하는 고객의 이름에서 도서를 주문한 고객의 이름 빼고
SELECT name
FROM Customer
WHERE address LIKE '대한민국%' AND name NOT IN
(SELECT name
FROM Customer
WHERE custid IN
(SELECT custid
FROM Orders));
SQL
복사
•
교집합 INTERSECT
// 대한민국에서 거주하는 고객 중 도서를 주문한 고객의 이름
SELECT name
FROM Customer
WHERE address LIKE '대한민국%' AND name IN
(SELECT name
FROM Customer
WHERE custid IN
(SELECT custid
FROM Orders));
SQL
복사
EXISTS
•
원래 단어에서 의미하는 것과 같이 조건에 맞는 튜플이 존재하면 결과에 포함시킴. 즉 부속질의문의 어떤 행이 조건에 만족하면 참임.
NOT EXISTS
•
부속질의문의 모든 행이 조건에 만족하지 않을 때만 참
// 주문이 있는 고객의 이름과 주소
SELECT name, address
FROM Customer cs
WHERE EXISTS (SELECT *
FROM Orders od
WHERE cs.custid = od.custid);
SQL
복사
LIMIT
•
반환할 레코드 수 지정
SELECT column_name(s)
FROM table_name
WHERE condition
LIMIT number;
SQL
복사
Binary
•
기본 집계함수들은