Day_05 (SQL 쿼리문 실습 심화)

HD.Y·2023년 11월 3일
0

한화시스템 BEYOND SW

목록 보기
5/58
post-thumbnail

SQL 쿼리문 기본 문법 ✅

  • ORDER BY 절 : 출력 결과를 오름차순(ASC) 또는 내림차순(DESC)으로 정렬
    SELECT 속성명1, 속성명2, ... FROM 테이블명
    ORDERY BY 기준속성1 ASC/DESC, 기준속성2 ASC/DESC, ... ;

  • GROUP BY 절 : 특정 속성별로 묶어서 결과를 조회
    SELECT 속성명1, 속성명2, ... , 집계함수(속성명) FROM 테이블명 GROUP BY 속성명;

  • HAVING 절 : GROUP BY로 묶은 데이터에 조건을 부여하여 결과를 조회
    SELECT 속성명1, 속성명2, ... FROM 테이블명 GROUP BY 속성명 HAVING 조건;

  • IN : IN으로 지정된 값들 중에 해당하는 값을 조회
    SELECT 속성명1, 속성명2, ... FROM 테이블명 WHERE 속성명 IN(값1, 값2, ...);

  • JOIN : 두 개의 테이블을 하나의 테이블로 합치는 기능
    1. ( INNER ) JOIN : "테이블1" 과 "테이블2" 의 같은 속성값을 가지는 데이터를 출력
      SELECT 속성명1, 속성명2, ... FROM 테이블1 JOIN 테이블2
      ON 테이블1.속성명 = 테이블2.속성명 ;

    2. LEFT ( OUTER ) JOIN : "테이블1" (왼쪽 테이블) 의 속성을 기준으로 "테이블2" 에서 같은 값을 가지는 데이터를 가지고 있으면 출력하고, 없으면 비워둔다.
      SELECT 속성명1, 속성명2, ... FROM 테이블1 LEFT JOIN 테이블2
      ON 테이블1.속성명 = 테이블2.속성명 ;

    3. RIGHT ( OUTER ) JOIN : "테이블1" (오른쪽 테이블) 의 속성을 기준으로
      "테이블2" 에서 같은 값을 가지는 데이터를 가지고 있으면 출력하고, 없으면 비워둔다.
      SELECT 속성명1, 속성명2, ... FROM 테이블1 RIGHT JOIN 테이블2
      ON 테이블1.속성명 = 테이블2.속성명 ;
      - RIGHT JOIN 은 LEFT JOIN으로 다 표현할 수 있기 때문에 잘 사용하지는 않는다.

  • 서브 쿼리 : SELECT 문 안에서 SELECT 문을 한번 더 사용하는 것으로 SELECT, FROM, WHERE, HAVING, ORDER BY 뒤에 사용이 가능하다.
  • 기본 함수 : AVG (평균), MAX (최대값), MIN (최소값), COUNT (카운트) 등 이 있다.

SQL 쿼리문 실습하면서 알게된 문법 🧐

  • DATE_FORMAT : 날짜 데이터의 형태를 원하는 형태로 변경하는 것으로 예를 들면
    "2023-11-03 21:20:32" 초의 날짜 데이터의 형태를 "2023-11-03" 으로 변경하고자
    할 때 다음과 같이 사용한다.
    DATE_FORMAT("2023-11-03 21:20:32", "%Y-%m-%d")

  • 조건문
    1. IF 문 : SELECT IF(조건문, '참일때 값', '거짓일때 값') AS 새로운 컬럼 별칭;
    2. CASE 문 : CASE WHEN 속성='값1' THEN '원하는값1'
      WHEN 속성='값2' THEN '원하는값2' ... END AS 새로운 컬럼 별칭;
    3. IFNULL 문 : 속성의 값이 NULL 이면 지정한 값으로 대체하여 출력
      IFNULL(속성명, '대체할 값')

  • 두 날짜의 차이 계산 : DATEDIFF(일수 차이), TIMEDIFF(시간 차이),
    TIMESTAMPDIFF(형태(SECOND, MINUTE, HOUR, ... ) , 날짜1, 날짜2)

💯 실전 프로그래머스 mysql 문제 풀어보기 ( LV. 1 ~ 4 ) 💯

  • Q : 자동차 대여 기록에서 장기/단기 대여 구분하기 ( LV. 1 )

    • 이 문제는 DATE_FORMATDATEDIFF 를 알고 있어야 풀 수 있는 문제였다.
      여기서 주의할것은 DATEDIFF 로 날짜 차이를 계산해줬을때 시작하는 날짜는 포함이 안되므로 출력해서 나온 값에 "+1" 을 해줘야 된다는 점이다.

  • Q : 조건에 부합하는 중고거래 상태 조회하기 ( LV. 2 )

    • 이 문제는 CASE 반복문 을 알고 있어야 풀 수 있는 문제였다. 그 외 특별하게 어려운점은 없었다.

  • Q : 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기 ( LV. 3 )

    • 이 문제는 CONCAT 을 알고 있어야 풀 수 있는 문제였다. CONCAT은 문자열들을 연결해주는 문법이라고 생각하면 된다.
    • 이 문제에서 나는 조회수가 가장 높은 게시물을 검색하는 WHERE 조건절을 틀렸는데, 서브쿼리를 이용하여 풀 수 있다는 사실을 깨달았다.
    • 서브쿼리 문은 많이 사용된다고 하니 앞으로도 잘 익혀둬야겠다.

  • Q : 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 ( LV. 3 )

    • 이 문제 역시 서브궈리 문을 사용하여 풀 수 있는 문제였다. 복잡한 서브쿼리문을 작성할때 가장 쉬운 방법은 단계를 정해놓고 한단계씩 쿼리문을 작성해 나가는 것 같다. 각 단계별로 하나씩 조건을 추가해가다보면 어느샌가 쿼리문이 완성된 것을 볼 수 있었다.

  • Q : 오프라인/온라인 판매 데이터 통합하기 ( LV. 4 )

    • 이 문제는 2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품 ID, 유저 ID, 판매량을 출력하는 문제이다.
    • 내가 풀이한 방법이다.✍
      1. 2022년 3월 온라인 상품 판매 데이터를 구한다.
      2. 2022년 3월 오프라인 상품 판매 데이터를 구한다.
      3. 2개의 테이블을 행으로 합쳐줘야 되기 때문에 UNION ALL 을 사용한다.
      4. 여기서 UNION ALL 을 사용하려면 2개의 테이블의 열의 개수가 같아야 하는데,
        온라인 판매 테이블에만 USER_ID 항목이 있고 오프라인 판매 테이블에는 없어서 오류가 발생한다.
      5. 따라서 열의 개수를 맞춰주기 위해 열을 추가해줘야 하는데, 이 문제의 조건으로 오프라인 판매 테이블의 USER_ID는 NULL 로 표기하라고 주어졌다. 따라서 IFNULL 을 오프라인 판매 테이블의 열로 추가해준 뒤 UNION ALL 을 해줬더니 답이 나왔다.
      6. 이 문제에서 오프라인 판매 데이터의 3월 판매 실적이 없어서 실제로 NULL 로 표기된 값은 없었다. 또한, 위 대로 실행 후 답안 제출 시 오답이라고 뜨는데 이것은 오류로 보인다. IFNULL(NULL, 'NULL')의 값을 NULL AS 'NULL' 로 바꾼뒤 실행하면 정답이라도 나오는데 실제로 두개의 출력 값을 비교한 결과 정확히 일치했다. (NULL AS 'NULL' 로 실행 시 NULL 값이 NULL로 표기 안됨)

오늘의 느낀점 👀

  • 오늘은 SQL 쿼리문의 기본 문법 및 함수에 대해 알아본 시간이었다. 확실히 SQLD 자격증 공부를 하면서 SQL 쿼리문에 대해 공부한 것이 큰 도움이 됬다고 생각한다.😎

  • 실제로 프로그래머스를 통해 테스트 문제를 풀어본 건 처음이었지만, 처음엔 어려웠지만 한문제씩 풀어갈수록 문제를 어떻게 풀어가야 할지에 대한 방향이 보이기 시작했다.
    천리길도 한걸음씩이라는 말이 있듯이 주어진 조건들을 하나씩, 하나식 출력해가면서 풀어나가면 결국에 원하는 값을 출력할 수 있었다.

  • 드디어!! 오늘로서 부트캠프 시작한지 1주일이 되었다. 단 5일의 시간이었지만, 배운 내용으로 따지면 혼자 공부할때보다 몇 배는 많이 배운것 같다. 그정도로 부트캠프에 들어온것이 후회가 되지 않을 정도로 만족스럽게 듣고있다.

  • 또한, 처음엔 벨로그 쓰는 법도 몰라서 찾아가며 힘겹게 썻다면, 지금은 자연스럽게 글들을 써내려가고 있는 내자신을 보며 다시 한번 뿌듯함을 느낀다.

  • 자바 프로그래밍, 알고리즘, 자료구조 수업으로 들어가면 많이 헤멜것 같지만 그래도 열심히 노력한다면 해내지 못할것은 없다고 생각한다.
    늦게 시작한만큼 누구보다 열심히 노력할 것이고, 꼭 원하는 목표를 이뤄낼 것이다❗
profile
Backend Developer

0개의 댓글