3/9 TIL

큰모래·2023년 3월 12일
0
post-custom-banner

SQL (MYSQL)


SQL문 쿼리 작동 순서

  1. FROM, JOIN
  2. ON, WHERE
  3. 2차 테이블 완성
  4. GROUP BY
  5. 그룹함수
  6. 3차 테이블 완성
  7. HAVING
  8. ORDER BY
  9. LIMIT

문제 1

  • 가장 저액,고액 연봉
    SELECT MIN(salary)
    FROM emp 
    
    SELECT MAX(salary)
    FROM emp
  • 부서별 연봉 지출비
    SELECT 부서명, SUM(salary)
    FROM emp
    GROUP BY deptId;
  • 부서별 평균 연봉
    SELECT 부서명, AVG(salary)
    FROM emp
    GROUP BY deptId;
  • GROUP_CONCAT
    # CONCAT 은 열 간의 값들을 연결하는 반면 GROUP_CONCAT은 행 간의 값들을 연결한다.
    # 테이블에 저장된 name 데이터들을 id 역순으로 정렬하고 데이터 사이에 ', '를 통해 구분한다.
    GROUP_CONCAT(name ORDER BY id DESC SEPARATOR ', ')
  • TRUNCATE
    # TRUNCATE는 소숫점 버림 함수이다.
    # 평균연봉데이터를 0자릿수 아래로 버린다.
    TRUNCATE(AVG(salary),0)
  • IF 문
    # 만약, deptId가 1이라면 '홍보'를 아니라면 '기획'을 값으로 넣는다.
    IF(deptId = 1, '홍보', '기획')
  • CASE 문
    
    SELECT CASE
    WHEN bookId = 1 THEN '과학'
    WHEN bookId = 2 THEN '사회'
    ELSE '기타' END AS 책주제
  • 서브 쿼리
    SELECT *
    FROM (
    	쿼리문
    ) AS D
    ...

문제 2

  • 각 부서별 최고연봉자 1명의 정보를 출력 ( 최고연봉자가 두명이상이면 번호가 빠른순 조회)
    SELECT *
    FROM 
    (
    	SELECT dept.name AS 부서명, E.name AS 사원명, E.salary AS 최고연봉자
    	FROM emp AS E INNER JOIN
    	(  SELECT emp.deptId AS id, MAX(salary) AS 최고연봉
    	   FROM emp GROUP BY emp.deptId) AS D ON E.deptId = D.id
    	)
    	INNER JOIN dept ON E.deptId = dept.Id
    	WHERE E.salary = D.최고연봉
    	ORDER BY E.id
    ) AS G
    GROUP BY G.부서명

문제 3

  • LEFT JOIN LEFT JOINNULL 값인 칼럼도 출력한다. (INNER JOIN과 달리 합집합이기 때문에)
    SELECT D.name AS `부서명`, E.id AS `사원번호`, E.name AS `사원명`
    FROM dept AS D
    LEFT JOIN emp AS E
    ON E.deptId = D.id;
profile
큰모래
post-custom-banner

0개의 댓글