-
2장 SQL 기초DB & SQL/SQL 레벨업 2023. 8. 4. 19:14
6. SELECT 구문
1. SELECT 구와 FROM 구
2. WHERE 구
- IN 으로 OR조건을 간단하게 작성
- NULL 레코드를 선택할 때는 'IS NULL' 이라는 키워드 사용
ㆍNULL 아닌 레코드는 'IS NOT NULL'
3. GROUP BY 구
- GROUP BY 구를 사용하면, 테이블에서 단순하게 데이터를 선택하는 것뿐만 아니라 합계 또는 평균 등의 집계 연산을 SQL 구문으로 할 수 있다.
- SQL의 대표적인 집계 함수
함수 이름 설명 COUNT 레코드 수를 계산 SUM 숫자를 더함 AVG 숫자의 평균을 구함 MAX 최댓값을 구함 MIN 최솟값을 구함 4. HAVING 구
- HAVING 구를 사용하면 선택된 결과 집합에 또다시 조건을 지정할 수 있다.
- 즉, WHERE 구가 '레코드'에 조건을 지정한다면, HAVING 구는 '집합'에 조건을 지정하는 기능이라고 할 수 있다.
5. ORDER BY 구
- DESC : 내림차순 / ASC : 오름차순
- 오름차순의 경우 SQL의 기본 설정이므로 따로 ASC라는 키워드를 사용할 필요가 없다.
ㆍ모든 DBMS 공통 규칙
6. 뷰와 서브쿼리
- 뷰 : SELECT 구문을 데이터베이스 안에 저장할 수 있는 기능
뷰 만드는 방법
CREATE VIEW [뷰 이름] ([필드 이름1], [필드 이름2] ...) AS
CREATE VIEW CountAddress (v_address, cnt) AS SELECT address, COUNT(*) FROM Address GROUP BY address;
SELECT v_address, cnt FROM COUNTADDress; # 테이블 대신 뷰를 FROM 구에 지정
익명 뷰
- 뷰는 사용 방법이 테이블과 같지만 내부에는 데이터를 보유하지 않는다는 점이 테이블과 다르다.
- 뷰는 SELECT 구문이 중첩되어 있는 구조
# 뷰에서 데이터 선택 SELECT v_address, cnt FROM COuntAddress; # 뷰는 실행할 때 SELECT 구문으로 전개 SELECT v_address, cnt FROM (SELECT address AS v_address, COUNT(*) AS cnt FROM Address GROUP BY address) AS CountAddress;
- 서브쿼리 : FROM 구에 직접 지정하는 SELECT 구
서브쿼리를 사용한 편리한 조건 지정
- IN 과 서브쿼리 조합.
7. 조건 분기, 집합 연산, 윈도우 함수, 갱신
1. SQL과 조건 분기
CASE 식의 구문
- CASE 식의 구문에는 '단순 CASE 식'과 '검색 CASE 식' 이라는 두 종류가 있다.
- 다만 검색 CASE 식은 단순 CASE 식의 기능을 모두 포함하고 있으므로 검색 CASE 식만 기억해도 충분하다.
- 검색 CASE 식의 구문
CASE WHEN [평가식] THEN [식] WHEN [평가식] THEN [식] WHEN [평가식] THEN [식] 생략 ELSE [식] END
CASE 식의 작동
- 처음에 있는 WEHN 구의 평가식부터 평가되고 조건이 맞으면 THEN 구에서 지정한 식이 리턴되며 CASE 식 전체가 종료된다.
ㆍ만약 조건이 맞지 않으면 다음 WHEN 구로 이동해 같은 처리를 반복한다.
ㆍ마지막 WHEN 구까지 반복했는데 조건이 맞는 경우가 없다면 'ELSE'에서 지정한 식이 리턴되며 끝난ㄷ.
SELECT name, address, CASE WHEN address = '서울시' THEN '경기' WHEN address = '인천시' THEN '경기' WHEN address = '부산시' THEN '영남' WHEN address = '속초시' THEN '관동' WHEN address = '서귀포시' THEN '호남' ELSE NULL END AS district FROM Address;
- SELECT, WHERE, GROUP BY, HAVING, ORDER BY 구와 같은 곳 어디에나 적을 수 있으므로 다양한 기법으로 활용할 수 있다.
2. SQL의 집합 연산
UNION 으로 합집합 구하기
SELECT * FROM Address UNION SELECT * FROM Addess2;
- UNION은 합집합을 구할 때 이렇게 중복된 레코드를 제거한다.
- 이는 UNION만 그런 것이 아니라 이후 살펴보는 INTERSECT와 EXCEPT 등에서도 같다.
-만약 중복을 제외하고 싶지 않다면 'UNION ALL' 처럼 ALL 옵션을 붙이면 된다.
INTERSECT로 교집합 구하기
- 교집합을 구할 떄 사용하는 연산자는 INTERSECT로 '교차'라는 의미이다.
SELECT * FROM Address INTERSECT SELECT * FROM Address2;
- 중복된 것이 있다면 해당 레코드는 제외
EXCEPT로 집합구하기
- 차집합을 수행하는 EXCEPT 연산자로 '제외'라는 의미이다.
SELECT * FROM Address EXCEPT SELECT * FROM Address2;
- 이를 수식으로 나타내면 'Address - Address2'가 된다.
- EXCEPT는 순서에 따라 결과가 다르다.
3. 윈도우 함수
- 원도우 함수는 데이터를 가공하게 해준다는 점에서도 중요하지만, 이 책의 주제인 성능과 큰 관계가 있다.
- 윈도우 함수의 특징을 한마디로 정리하면 '집약 기능이 없는 GROUP BY 구' 이다.
- 원도우 함수도 테이블을 자르는 것은 GROUP BY와 같다.
- 윈도우 함수는 이를 'PARTITION BY' 라는 구로 수행한다.
- 차이점이 있다면 자른 후에 집약하지 않으므로 출력 결과의 레코드 수가 입력되는 테이블의 레코드 수와 같다.
- 윈도우 함수의 기본적인 구문은 집약 함수 뒤에 OVER 구를 작성하고, 내부에 자를 키를 지정하는 PARTITION BY 또는 ORDER BY를 입력하는 것이다.
SELECT address, COUNT(*) OVER(PARTITION BY address) FROM Address;
- GROUP BY와 출력되는 결과의 레코드 수가르다.
- 윈도우 함수로 사용할 수 있는 함수로는 COUNT 또는 SUM 같은 일반 함수 이외에도, 윈도우 함수 전용 함수로 제공되는 RANK 또는 ROW_NUMBER 등의 순서 함수가 있다.
ㆍ예를 들어 RANK 함수는 이름 그대로 지정된 키로 레코드에 순위를 붙이는 함수이다.
SELECT name, age, RANK() OVER(ORDER BY age DESC) AS rnk FROM Address;
- 값이 같다면 동일한 rnk 값이 나온다면 다음 순위는 건너뛴다.
ㆍ만약 이런 순위를 건너뛰는 작업 없이 순위를 구하고 싶을 때는 DENSE_RANK 함수를 사용한다.
SELECT name, age, DENSE_RANK() OVER(ORDER BY age DESC) AS dense_rnk FROM Address;
- 윈도우 함수에는 이 이외에도 RANGE 또는 ROWS 등의 여러 가지 세부 옵션을 지정하는 방법이 있다.
- 하지만 일단 PARTITION BY 와 ORDER BY 의 사용방법만 기억해도 충분이다.
4. 트랜잭션과 갱신
마치며..
- 간단하고 직관적으로 작성할 수 있다는 것이 비절차형 언어 SQL의 장점
- CASE 식은 조건 분기를 표현하는 중요한 도구, 포인트는 구문이 아니라 식을 바탕으로 한다는 것
- 쿼리는 입력과 출력을 모두 테이블에 있는 것을 바탕으로 할 수 있으므로 유연함
- SQL은 GROUP BY, UNION, INTERSECT 등 집합 이론을 바탕으로 만들어진 연산이 많음
- 윈도우 함수는 GROUP BY 구에서 집약 기능을 제외하고 자르는 기능만 남긴 것
'DB & SQL > SQL 레벨업' 카테고리의 다른 글
6장 결합 (0) 2023.08.08 5장 반복문 (0) 2023.08.07 4장 집약과 자르기 (0) 2023.08.07 3장 SQL의 조건 분기 (0) 2023.08.07 1장 DBMS 아키텍처 (0) 2023.08.04