💡 GROUP BY
- GROUP BY 컬럼
컬럼의 값 중 NULL도 있다면 NULL도 하나의 그룹이 될수 있음
=> 사원, 대리, 과장, 차장, 부장, 직급이 정해지지 않은(NULL)이 있을 때, 이를 직급 별로 group화 하면, 6개로 그룹화 가능 - GROUP BY 절에서는 SELECT 절과는 달리 ALIAS 명을 사용할 수 없음
- 집계 함수는 WHERE 절에 올 수 없음
=>집계 함수는 GROUP BY 절에서 사용 가능 - WHERE 절은 전체 데이터를 GROUP으로 나누기 전에 행들을 미리 제거하는 역할
💡 GROUP BY - HAVING 절 [53]
- GROUP BY가 없다고 해서 HAVING에 오류가 발생하지는 않는다
예시)
SELECT SUM(주문금액) AS 합계
FROM 주문
HAVING AVG(주문금액) > 100;
=> GROUP BY가 생략된 경우, 적절한 PK로 그룹핑 되고, 그 그룹의 주문 금액 평균이 100보다 크다면 해당 주문금액들의 총합을 출력하는 쿼리이다.
주문ID | 주문금액
-----------------
1 | 80
2 | 120
3 | 90
4 | 110
5 | 95
이와 같은 테이블이 있다면, 주문ID에 대해 자동 그룹핑될 것이고, 해당 그룹마다 평균 주문금액이 100보다 큰 것은, 주문ID 2와 4의 그룹이므로, 해당 그룹의 주문 금액 합은 120+110=230이다.
합계
-----
230
- COUNT와 같은 집계함수를 AVG함수로 감싸 평균을 구할 수 없다
COUNT는 말 그대로 카운트 한 값을 한 레코드로 출력하는 것이고, 이의 평균이랄 것으로 나눌 값이 명시되지 않기 때문에 AVG함수와 함께 쓸 수 없다
예시)
SELECT 메뉴ID, 사용유형코드, AVG(COUNT(*)) AS AVGCNT
FROM 시스템사용이력
GROUP BY 메뉴ID, 사용유형코드;
💡 ORDER BY [56] [57]
- GROUP BY를 사용할 경우 GROUP BY 표현식이 아닌 값은 기술될 수 없음
예시)
SELECT 지역, SUM(매출금액) AS 매출금액
FROM 지역별매출
GROUP BY 지역
ORDER BY 년 DESC;
=> 지역에 대해서 그룹핑 되어 매출금액의 SUM을 구하기 때문에, 이를 년이라는 컬럼으로 ORDER할 수 없다
- ORACLE에서는 NULL값을 가장 큰 값으로 간주
=> 오름차순 정렬 시 NULL이 가장 마지막에
=> 내림차순 정렬 시 NULL이 가장 먼저 - SQL server에서는 NULL을 가장 작은 값으로 간주
=> 오름차순 정렬 시 NULL이 가장 먼저
=> 내림차순 정렬 시 NULL이 가장 마지막에 - ORDER BY정레 컬럼명 대신 ALIAS 명이나 컬럼 순서를 나타내는 정수를 혼용하여 사용할 수 있음
💡 SELECT 문장 실행 순서 [59]
FROM > WHERE > GROUP BY > HAVING > SELECT > ORDER BY
💡 TOP() 질의문
- SQL server의 TOP N 질의문에서 N에 해당하는 값이 동일한 경우 함께 출력되도록 하는 WITH TIES 옵션을 ORDER BY 절과 함께 사용해야 함
- 예시)
SELECT TOP(3) WITH TIES 팀명, 승리건수
FROM 팀별성적
ORDER BY 승리건수 DESC;
=>팀별성적에서 팀명과 높은 순으로 승리건수를 조회하는데, 가장 위 3개를 조회한다. 단 3위의 승리건수와 동일한 팀이 있다면 해당 팀까지도 같이 출력한다.
💡 EQUI JOIN 문장
- SELECT 테이블1.칼럼명, 테이블2.칼럼명,...
FROM 테이블1, 테이블2
WHERE 테이블1.칼럼명1=테이블2.칼럼명2;
=> WHERE 절에 JOIN 조건을 넣음 - SELECT 테이블1.칼럼명, 테이블2.칼럼명,...
FROM 테이블1 INNER JOIN 테이블2
ON 테이블1.칼럼명1=테이블2.칼럼명2;
=> ON 절에 JOIN 조건을 넣음
💡 JOIN
- 일반적으로 JOIN은 PK와 FK 값의 연관성에 의해 성립됨
- DBMS 옵티마이저는 FROM 절에 나열된 테이블들을 임의로 2개씩 묶어서 JOIN을 처리함
- EQUI JOIN은 JOIN에 관여하는 테이블 간의 컬럼 값들이 정확하게 일치하는 경우에 사용되는 방법임
- EQUI JOIN은 = 연산자에 의해서만 수행되며, 그 이외의 비교 연산자를 사용하는 경우에는 모두 NON EQUI JOIN임
- 대부분 NON EQUI JOIN을 수행할 수 있지만, 때로는 설계상의 이유로 수행이 불가능한 경우도 있음
'CS > SQLD' 카테고리의 다른 글
[sqld 오답노트] 2-1 SQL 기본 (2) (0) | 2023.11.15 |
---|---|
[sqld 오답노트] 2-1 SQL 기본 (1) (0) | 2023.11.14 |
[sqld 오답노트] 1-2 데이터 모델과 성능 (0) | 2023.11.07 |
[sqld 오답노트] 1-1 데이터 모델 (1) | 2023.11.06 |