나를 기록하기/[자격증] SQLD

[SQLD] 2과목 1장 - SQL 기본(Q.52~63)

배고파요 2022. 5. 21. 22:19
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 이라는 테이블이 있다.
        1. ~ ORDER BY  COL1  DESC; 
        2. ~ ORDER BY  COL1  DESC  NULLS LAST
        3. ~ ORDER BY COL1;
        4. ~ ORDER BY COL1 NULLS FIRST
.예시 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 절 뒤의 오는 컬럼이 기준이 됨.
  •  
  •  
  • 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 을 수행할 수 있지만, 때로는 설계상의 이유로 수행이 불가능한 경우도 있음.
  • 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