728x90
반응형
구성요소
기본 문법
SELECT [ALL┃DISTINCT] 속성이름(들) // 찾는다.
FROM 테이블이름(들) [테이블 별명] // <테이블>에서
[WHERE 검색조건(들)] // 조건에 맞는
[GROUP BY 속성이름] // <속성>으로 묶여있는
[HAVING 검색조건(들)] // <GROUP>에서 조건에 맞는
[ORDER BY 속성이름 [ASC┃DESC]] // 오름차순/내림차순 정렬
---------------------------------------------------------------
[ ] : 대괄호 안의 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;
집계함수
집계 함수 | 문법 | 사용 예 |
SUM | SUM([ALL | DISTINCT] 속성이름) |
AVG | AVG([ALL | DISTINCT] 속성이름) |
COUNT | COUNT({[[ALL | DISTINCT] 속성이름] |
MAX | MAX([ALL | DISTINCT] 속성이름) |
MIN | MIN([ALL | DISTINCT] 속성이름) |
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; //생략가능
- 내림차순 DESC
SELECT * FROM 테이블 ORDER BY 컬럼1 DESC;
조인
- 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;
// 도서를 구매하지 않은 고객을 포함하여 고객의 이름과 고객이 주문한 도서의 판매가격
SELECT Customer.name, saleprice
FROM Customer LEFT OUTER JOIN Orders
ON Customer.custid = Orders.custid;
부속질의
- SQL 내의 또 다른 SQL 문
// 가장 비싼 도서의 이름
SELECT bookname
FROM Book
WHERE price = (SELECT MAX(price)
FROM Book );
// 대한미디어에서 출판한 도서를 구매한 고객의 이름
SELECT name
FROM Customer
WHERE custid IN (SELECT custid
FROM Orders
WHERE bookid IN (SELECT bookid
FROM Book
WHERE publisher='대한'));
집합 연산
- 합집합 UNION
{고객 이름} = {대한민국에 거주하는 고객 이름} ∪ {도서를 주문한 고객 이름}
// 대한민국에서 거주하는 고객의 이름과 도서를 주문한 고객의 이름
SELECT name
FROM Customer
WHERE address LIKE '대한민국%'
UNION
SELECT name
FROM Customer
WHERE custid IN (SELECT custid FROM Orders);
- 차집합 MINUS
// 대한민국에서 거주하는 고객의 이름에서 도서를 주문한 고객의 이름 빼고
SELECT name
FROM Customer
WHERE address LIKE '대한민국%' AND name NOT IN
(SELECT name
FROM Customer
WHERE custid IN
(SELECT custid
FROM Orders));
- 교집합 INTERSECT
// 대한민국에서 거주하는 고객 중 도서를 주문한 고객의 이름
SELECT name
FROM Customer
WHERE address LIKE '대한민국%' AND name IN
(SELECT name
FROM Customer
WHERE custid IN
(SELECT custid
FROM Orders));
EXISTS
- 원래 단어에서 의미하는 것과 같이 조건에 맞는 튜플이 존재하면 결과에 포함시킴. 즉 부속질의문의 어떤 행이 조건에 만족하면 참임.
NOT EXISTS
- 부속질의문의 모든 행이 조건에 만족하지 않을 때만 참
// 주문이 있는 고객의 이름과 주소
SELECT name, address
FROM Customer cs
WHERE EXISTS (SELECT *
FROM Orders od
WHERE cs.custid = od.custid);
반응형
'데이터베이스 > MySQL' 카테고리의 다른 글
테이블 구성 (0) | 2024.04.01 |
---|---|
데이터 조작어 (DML) (0) | 2024.04.01 |
CMD 명령어 (0) | 2024.04.01 |