728x90
📕 2과목 - SQL 기본 및 활용
📌 1장 - SQL 기본
📍 53번 ? ( https://www.youtube.com/watch?v=sWugWwr27wY )
- GROUP BY 가 없을 때도, HAVING 절을 쓸 수 있음.
- --> 테이블 전체를 하나의 GROUP으로 생각하면 됨.
- HAVING 절에 집계함수(SUM, AVG, COUNT 등등) 가 들어간 경우에는, SELECT 에 이 집계함수를 넣었을 때 값이 나올 수 있는 지를 생각해보면 됨.
+) 2023.03.10 :: 48회차 공부 추가.
📍 55번 :: ORDER BY 안에 CASE문 사용 ?
- SELECT ID FROM TAB_1
GROUP BY ID
HAVING COUNT(*) = 2
ORDER BY ( CASE WHEN ID = 999 THEN 0 ELSE ID END ); - ORDER BY 안에도 CASE 문을 쓸 수 있고.
특정 값을 우선 정렬할 때 사용함.
- https://mjn5027.tistory.com/107
- 이 주문테이블을 일자순으로 조회하되, 주문상태가 '배송시작'인 행을 제일 상단에 출력하고 싶다.
📍 56번 ?
- SELECT 절의 집계함수를 제외한 나머지 컬럼들은 모두 GROUP BY로 사용되어야 함.
- ORDER BY 절은 GROUP BY 절과 관련하여 그 기준이 되는 갈럼들이나 그룹 함수가 사용 가능함.
- SELECT 지역, SUM(매출금액) AS 매출금액 FROM 지역별매출 GROUP BY 지역 ORDER BY 년 DESC;
- ORDER BY 에 들어가 있는 "년" 이 SELECT 절에 없고, GROUP BY 에도 없어서 안 됨.
- HAVING 절과 ORDER BY 절 에는
- GROUP BY 절과 관련하여 그 기준이 되는 칼럼들 이나 그룹함수(SUM, COUNT, AVG 등등) 사용 가능
- SELECT 지역, SUM(매출금액) AS 매출금액 FROM 지역별매출 GROUP BY 지역 HAVING SUM(매출금액) > 1000 ORDER BY COUNT(*) ASC;
- 이때의 COUNT(*) 는 " SUM(매출금액) AS 매출금액 " 의 갯수임.
📍 ORDER BY ?
- ASC (오름차순) 이면 낮은 것 에서 높은 것으로.
- 1 --> 2
- 2022.05.21 ---> 2022.06.01
- NULL 값
- ORACLE
- NULL 값이 가장 큰 값으로 간주.
- 오름차순 일 경우 ::: 가장 마지막에.
- 내림차순 일 경우 ::: 가장 처음에.
- 오라클에는 NULL 순서를 정의할 수 있는데,
예시) TAB_1 이라는 테이블이 있다.- ~ ORDER BY COL1 DESC;
- ~ ORDER BY COL1 DESC NULLS LAST;
- ~ ORDER BY COL1;
- ~ ORDER BY COL1 NULLS FIRST;
- ORACLE
.예시 1번. | .예시 2번. | .예시 3번. | .예시 4번. |
COL1 | COL1 | COL1 | COL1 |
NULL | 3 | 1 | NULL |
3 | 2 | 2 | 1 |
2 | 1 | 3 | 2 |
1 | NULL | NULL | 3 |
-
-
- SQL Server
- NULL 값이 가장 작은 값으로 간주.
- 오름차순 일 경우 ::: 가장 처음에.
- 내림차순 일 경우 ::: 가장 마지막에.
-
- ORDER BY 절에서 컬럼명 대신 Alias 명이나 컬럼 순서를 나타내는 정수도 사용가능함. 두개를 혼합해서도 가능.
- GROUP BY 절을 사용하는 경우 ORDER BY 절에 집계 함수 사용 가능.
📍 SELECT 문장 실행 순서 ?
- FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY
📍 60번 ?
- 승리건수가 높은 3팀을 뽑되, 승리건수가 동점일 경우, 같이 뽑는다.
- TOP-N 쿼리
- SQL Server에서의 TOP(N)은 ORDER BY에 의한 정렬 작업을 하는 가운데서 N번째까지 찾았을 때 정렬 작업을 멈추도록 하는 쿼리.
- 오라클 ::: SELECT 팀명, 승리건수 FROM 팀별성적 WHERE ROWNUM <= 3 ORDER BY 승리건수 DESC;
- ① FROM 팀별성적
- ② WHERE ROWNUM <=3
- 3건을 찾게되면 더이상 데이터를 찾지 않음.
- ③ ORDER BY 승리건수 DESC
- 그렇게 데이터를 3건 찾고 난 후, 승리건수로 내림차순으로 정렬함.
- ❗❗ 무조건 3건을 찾고, 승리건수 높은 순으로 정렬함. ---> 3건만 나올 수 밖에 없음.
- SELECT TOP(3) WITH TIES 팀명, 승리건수 FROM 팀별성적 ORDER BY 승리건수 DESC;
- TOP WITH TIES
- TOP 과 동일하게 상위 N개의 데이터를 조회하는데, 동일한 데이터가 있을 경우 함깨 출력함.
- ORDER BY절이 반드시 함께 와야함.
- ( TOP 의 경우, ORDER BY절이 없어도 가능함. )
- 동일한 데이터는 ORDER BY 절 뒤의 오는 컬럼이 기준이 됨.
- TOP WITH TIES
- RANK() OVER()는 동일 순위인 경우 1,1,3, 형식으로 출력하지만
- ROW_NUMBER() OVER()는 동일 순위인 경우 1,2,3, 형식으로 출력
- DENSE_RANK() OVER()는 동일 순위인 경우 1,1,2 형식으로 출력
📍 62번 ?
- 배우(배우번호, 배우명, 성별)
- 영화(영화번호, 영화명, 제작년도)
- 출연(배우번호, 영화번호, 출연료)
- SELECT 영화명, 배우명, 출연료
- FROM 배우, 영화, 출연
- WHERE 출연료 >= 8888
- AND 출연.영화번호 = 영화.영화번호
- AND 출연.배우번호 = 배우.배우번호;
- (가능)
- WHERE 절의 "테이블.컬럼" 을 정확하게 입력하면 되는 듯.
- SELECT 의 컬럼은 "테이블.컬럼" 으로 적지 않아도 되는 것 같음.
- 아마 SELECT 순서 때문이지 않을까 싶음.
- FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY
📍 JOIN ? (Q.63)
- 일반적으로 JOIN 은 PK 와 FK 값의 연관성에 의해 성립됨.
- 하지만, 어떤 경우에는 PK 와 FK 의 관계가 없어도 논리적인 값들의 연관만으로도 JOIN 성립이 가능.
- EQUI JOIN 은 JOIN에 관여하는 테이블 간의 컬럼 값들이 정확하게 일치할 때 사용함.
- 대부분 NON EQUI JOIN 을 수행할 수 있지만, 때로는 설계상의 이유로 수행이 불가능한 경우도 있음.
- NON EQUI JOIN 에는 BETWEEN 과 부등호 가능함.
- 어쩌다DBA 문제풀이 유튜브 [7:50] 다시보기.
- DBMS 옵티마이져는 FROM 절에 나열된 테이블이 아무리 많아도 항상 2개의 테이블씩 짝을 지어 JOIN 을 수행함.
-- 63번
CREATE TABLE 배우 ( 배우번호 VARCHAR2(10) PRIMARY KEY, 배우명 VARCHAR2(10), 성별 VARCHAR2(10));
CREATE TABLE 영화 ( 영화번호 VARCHAR2(10) PRIMARY KEY, 영화명 VARCHAR2(10), 제작년도 DATE);
CREATE TABLE 출연 ( 배우번호 VARCHAR2(10), 영화번호 VARCHAR2(10), 출연료 VARCHAR2(10), CONSTRAINT Q63_PK PRIMARY KEY (배우번호, 영화번호) );
CREATE TABLE 등급 ( 출연료등급 VARCHAR2(10) PRIMARY KEY, 최소출연료 NUMBER, 최대출연료 NUMBER );
-- DBMS 옵티마이져
SELECT 배우명, 영화명, 출연료
FROM 출연 JOIN 배우 ON 출연.배우번호 = 배우.배우번호
JOIN 영화 ON 영화.영화번호 = 출연.영화번호;
-- EQUI JOIN
SELECT 배우명, 영화명, 출연료
FROM 배우, 영화, 출연
WHERE 배우.배우번호 = 출연.배우번호
AND 영화.영화번호 = 출연.영화번호;
-- +) 2023.03.10 :: 48회 추가.
-- NON EQUI JOIN
SELECT 배우명, 영화명, 출연료, 출연료등급
WHERE 배우.배우번호 = 출연.배우번호
AND 영화.영화번호 = 출연.영화번호
AND 출연.출연료 BETWEEN 등급.최소출연료 AND 등급.최대출연료;
📍 ?
- N
728x90
'나를 기록하기 > [자격증] SQLD' 카테고리의 다른 글
[SQLD] 2과목 2장 - SQL 활용(Q.92~127) (0) | 2022.05.24 |
---|---|
[SQLD] 2과목 2장 - SQL 활용(Q.65~91) (0) | 2022.05.22 |
[SQLD] 2과목 1장 - SQL 기본(Q.36~51) (0) | 2022.05.21 |
[SQLD] 2과목 1장 - SQL 기본(Q.22~35) (0) | 2022.05.17 |
[SQLD] 2과목 1장 - SQL 기본(Q.1~21) (0) | 2022.05.16 |