SELECT 문의 기본 문법
SELECT [ALL┃DISTINCT] 속성이름(들)
FROM 테이블이름(들)
[WHERE 검색조건(들)]
[GROUP BY 속성이름]
[HAVING 검색조건(들)]
[ORDER BY 속성이름 [ASC┃DESC]]
WHERE 조건
술어 | 연산자 | 사용 예 |
비교 | =,<>,<,<=,>,>= | price < 100 |
범위 | BETWEEN | price BETWEEN 10 AND 20 |
집합 | IN, NOT IN | publisher IN ('굿스포츠', '미디어') |
패턴 | LIKE | 두번째 위치에 구 -> LIKE '_구%' |
NULL | IS NULL, IS NOT NULL | price IS NULL |
복합조건 | AND, OR, NOT | price < 2000 AND price IS NULL |
와일드 문자의 종류
와일드 문자 | 의미 | 사용 예 |
+ | 문자열 연결 | '골프' + '바이블' |
% | 0개 이상의 문자열과 일치 | '%축구%' : 축구를 포함하는 문자열 |
[] | 1개의 문자와 일치 | '[0-5]%' : 0-5 사이 숫자로 시작하는 문자열 |
[^] | 1개의 문자와 불일치 | '[^0-5]%' : 0-5 사이 숫자로 시작하지 않는 문자열 |
_ | 특정 위치의 1개의 문자와 일치 | '_구%' : 두 번째 위치에 '구'가 들어가는 문자열 |
ORDER BY
- 가격순으로 검색하고, 가격이 같으면 이름순으로 검색 : ORDER BY price, bookname
- 가격의 내림차순으로 검색, 만약 가격이 같다면 이름 오름차순으로 검색 : ORDER BY price DESC, bookname ASC
- 특정값 우선 정렬하기 ORDER BY FIELD (column, 1순위, 2순위, 3순위, n순위...)
집계 함수와 GROUP BY
집계 함수
- 집계 함수([ALL | DISTINCT] 속성이름)
- SELECT SUM(price) FROM Orders WHERE custid = 2;
- SELECT SUM(price) AS Total, AVG(price), MIN(prive), Max(price) FROM Orders;
- SELECT COUNT(*) FROM Orders;
GROUP BY
- GROUP BY로 투플을 그룹으로 묶은 후 SELECT 절에는 GROUP BY에서 사용한 <속성>과 집계 함수만 가능
- 고객별로 : SELECT custid, SUM(price) FROM Orders GROUP BY custid;
HAVING
- 반드시 GROUP BY 절과 같이 작성해야 함
- WHERE 절보다 뒤에 나와야 함
- <검색조건>에는 SUM, AVG, MAX, MIN, COUNT와 같은 집계 함수가 와야 함
두 개 이상 테이블에서 SQL 질의
조인
- 고객과 주문에 관한 데이터를 고객번호 순으로 정렬
- SELECT * FROM Customer, Orders WHERE Customer.custid = Orders.custid ORDER BY Customer.custid;
명령 | 문법 | 설명 |
일반조인 | SELECT <속성들> FROM 테이블1, 테이블2 WHERE <조인조건> AND <검색조건> |
SQL 문에서는 주로 동등조인 사용 |
SELECT <속성들> FROM 테이블1 INNER JOIN 테이블2 ON <조인조건> WHERE <검색조건> |
||
외부조인 | SELECT <속성들> FROM 테이블1 {LEFT | RIGHT | FULL [OUTER]} JOIN 테이블2 ON <조인조건> WHERE <검색조건> |
외부조인은 FROM 절에 조인 종류를 적고 ON을 이용해 조인조건 명시 |
부속 질의
- SQL 문 안에 또다른 SQL 문
- SELECT name FROM Customer WHERE custid IN (SELECT custid FROM Orders) WHERE bookid IN (SELECT bookid FROM Book WHERE publisher = '대한미디어'));
집합 연산
합집합 UNION, 차집합 MINUS, 교집합 INTERSECT
MySQL에는 MINUS, INTERSECT 연산자가 없으므로 다음과 같이 표현함
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);
'CS > 데이터베이스' 카테고리의 다른 글
Mariadb / MySQL (0) | 2023.07.25 |
---|---|
[MYSQL] 날짜 관련 정리 (0) | 2023.04.05 |
[MySQL] REGEXP (0) | 2023.03.21 |
부속질의(subquery) (0) | 2023.02.22 |
SQL 내장 함수 (1) | 2023.02.22 |