SELECT
- SELECT 는 SQL 중에 가장 중요하다.
- 테이블에 저장되어 있는 데이터들을 효과적으로 검색/조회하는 SQL이다.
SELECT 기본 문법
SELECT [ ALL | DISTINCT ] 속성이름(들) - '*'은 모든 열을 나타내고 ,DISTINCT는 중복을 제거한다.
FROM 테이블명
[WHERE 검색조건]
[GROUP BY 속성이름]
[HAVING 검색조건]
[ORDER BY 속성이름 [ASC | DESC]] > ASC 오름차순이 기본(생략가능), DESC는 생략 불가능
[] : 대괄호 안의 SQL 예약어들은 선택적으로 사용
|: 선택 가능한 문법들 중 한 개를 사용 가능
처리순서
1. FROM
2. ON
3. JOIN
4. WHERE
5. GROUP BY
6. WITH CUBE 또는 WITH ROLLUP
7. HAVING
8. SELECT
9. DISTINCT
10. ORDER BY
11. TOP
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 '축구의 역사') |
LIKE와 같이 사용하는 와일드 문자
와일드 문자 | 의미 | 사용예 |
+ | 문자열을 연결 | '골프 ' + '바이블' : '골프 바이블' |
% | 0개 이상의 문자열과 일치 | '%축구%' : 축구를 포함하는 문자열 |
[] | 1개의 문자와 일치 | '[0-5]%' : 0-5 사이 숫자로 시작하는 문자열 |
[^] | 1개의 문자와 불일치 | '[^0-5]%' : 0-5 사이 숫자로 시작하지 않는 문자열 |
_ | 특정 위치의 1개의 문자와 일치 | '_구%' : 두 번째 위치에 '구'가 들어가는 문자열 |
집계 함수
집계 함수 | 문법 | 사용 예 |
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를 사용한 SELECT 절에는 GROUP BY에서 사용한 속성과 집계함수만 나올 수 있다.
HAVING 절은 GROUP BY 절의 결과 나타나는 그룹을 제한하는 역할을 한다.
또, GROUP BY 절과 같이 작성해야 하고 WHERE 절보다 뒤에 나와야 한다.
검색 조건에는 집계함수가 와야한다. 아래는 예시이다.
SELECT custid, COUNT(*) AS 도서수량 --AS를 써서 별칭을 설정한다.
FROM Orders
WHERE saleprice >= 8000
GROUP BY custid
HAVING count(*) >= 2;
|
여러 테이블에서의 SQL 질의
조건없이 테이블 간의 조인이 이루어진다. ( 카티전 프로덕트 )
SELECT *
FROM Customer, Orders;
|
조건을 추가함으로써 적절히 매칭된 결과를 획득 ( 동등 조인)
SELECT *
FROM Customer, Orders
WHERE Customer.custid = Orders.custid;
|
동등 조인의 표현 INNER JOIN 사용
SELECT *
FROM Customer INNER JOIN Orders
ON Customer.custid = Orders.custid;
|
외부조인
SELECT < 속성들>
FROM 테이블1 { LEFT | RIGHT | FULL [OUTER]} JOIN
테이블2 ON <조인조건>
WHERE <검색조건>
|
부속질의( 중첩질의 )
SELECT 문의 WHERE 절에 또 다른 테이블 결과를 이용하기 위해 다시 SELECT 문을 괄호로 묶는 것을 부속질의 라고 한다. 일반적으로 데이터가 대량일 경우 데이터를 모두 합쳐서 연산하는 조인보다 필요한 데이터만 찾아서 공급해주는 부속질의가 성능에 더 좋다.
예제1 - 부속질의의 결과가 단일행-단일열(1 X 1)인 경우
SELECT bookname
FROM price = (SELECT MAX(price)
FROM Book);
|
예제2 - 부속질의의 결과가 다중행-단일열(n X 1)인 경우
SELECT name
FROM Customer
WHERE custid IN (1, 2, 3, 4);
|
※ 부속질의는 SELECT 문에 나오는 결과 속성을 FROM 절의 테이블에서만 얻을 수 있고, 조인은 조인한 모든 테이블에서 결과 속성을 얻을 수 있다.
부속질의의 종류
명칭 | 위치 | 설명 |
스칼라 부속질의 | SELECT 절 | 단일 값을 반환하기 때문에 스칼라 부속질의라 한다. 결과 값은 단일 행, 단일 열의 스칼라 값으로 반환한다. |
인라인 뷰 | FROM 절 | FROM 절에서 결과를 뷰 형태로 반환하기 때문에 인라인 뷰라 한다. 조인에 참여하기 직전 필요한 데이터만 추출이 가능하므로 성능의 손실을 줄일 수 있다. |
중첩질의 | WHERE 절 | WHERE 절에 술어와 같이 사용되며 결과를 한정시키기 위해 사용된다. |
스칼라 부속질의
예제1)
SELECT custid, (SELECT name FROM Customer cs WHERE cs.custid=od.custid), SUM(saleprice)
FROM Orders od
GROUP BY custid;
|
예제2)
UPDATE sell
SET bookname=(SELECT bookname
FROM Book
WHERE Book.bookid = Orders.bookid);
|
인라인 뷰
예제1)
SELECT a.name, SUM(b.saleprice) "total"
FROM ( SELECT custid, name
FROM Customer
WHERE custid <= 2) a,
Orders b
WHERE a.custid = od.custid
GROUP BY a.name;
|
집합연산
합집합 - UNION
차집합 - EXCEPT ( MINUS )
교집합 - INTERSECT
예제)
SELECT name
FROM customer
EXCEPT
SELECT name
FROM Customer
WHERE custid IN (SELECT custid
FROM Orders);
|
ALL, SOME(ANY)
비교 연산자를 예로 들면 >ALL은 모든 값보다 크다는 것을 의미합니다. 즉, 최대값보다 크다는 것을 나타냅니다. 예를 들어 >ALL (1, 2, 3)은 3보다 크다는 것을 의미합니다. >ANY는 적어도 하나의 값보다 큼 즉, 최소값보다 크다는 것을 의미합니다. 따라서 >ANY (1, 2, 3)은 1보다 큼을 의미합니다
SELECT orderid, saleprice
FROM Orders
WHERE saleprice > ALL ( SELECT saleprice
FROM orders
WHERE custid = '3');
|
EXISTS
EXISTS는 다른 연산자와 달리 왼쪽에 스칼라 값이나 열을 명시하지 않는다. 때문에 반드시 부속질의에 주질의의 열이름이 제공되어야 한다. 조건에 맞는 튜플이 존재하면 결과에 포함시킨다. 즉 부속질의문의 어떤 행이 조건에 만족하면 참이다.반면 NOT EXISTS는 부속질의문의 모든 행이 조건에 만족하지 않을 떄만 참이다.
SELECT name, address
FROM Customer cs
WHERE EXISTS ( SELECT *
FROM Orders od
WHERE cs.custid = od. custid);
|
① cs의 첫 행을 가져와서 부속질의문에 cs 값으로 입력한다.
② od의 어떤 행에서 cs의 고객번호와 같은 것을 찾으면 EXISTS는 참이 되어 cs의 첫 행에 대한 name과 address가 반환된다.
③ 다음으로 cs의 두 번째 행이 부속질의문에 입력되고 이것은 cs의 모든 행에 대하여 반복된다.
TOP n 질의
SQL 실행 결과에서 상위 n개의 행만 반환한다.
SELECT TOP 2 custid, name, phone
FROM Customer
ORDER BY name;
|
'보안개발 정리' 카테고리의 다른 글
SQL 문법 정리 - INSERT, UPDATE, DELETE (0) | 2021.12.14 |
---|---|
SQL 문법 정리 - CREATE , ALTER , DROP (1) | 2021.12.14 |
데이터 베이스 정리 (2) | 2021.12.13 |