[PROD]SQLハイスコアスイートセット1(SELECT、SUM/MAX/MIN、GROUP BY)


プログラマSQLハイスコアスイート


https://programmers.co.kr/learn/challenges

SQLの問題を解決する際のポイント

  • どのデータ列があるかをチェック
  • テーブル間の構造を確認する
  • 題の条件を正しく読み、注釈します(最後のソートまで!)
  • クエリ文の実行順序

    SELECT - 5순위 (필수)
    
    FROM - 1순위 (필수)
    
    WHERE - 2순위
    
    GROUP BY - 3순위
    
    HAVING - 4순위 // HAVING 은 GROUP BY가 적용된 이후에 실행됨
    
    ORDER BY - 6순위 // ORDER BY는 모든 데이터들을 조회가 완료된 다음, 최후에 정렬함

    SELECT, SUM, MAX, MIN


    条件を含めて検索WHERE 조건 = ''SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE INTAKE_CONDITION = 'Sick' ORDER BY ANIMAL_ID ASC
    検索の除外WHERE 조건 != ''SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE INTAKE_CONDITION != 'Aged' ORDER BY ANIMAL_ID ASC
    上位n個のレコードLIMIT nSELECT NAME FROM ANIMAL_INS ORDER BY DATETIME ASC LIMIT 1
    重複データ削除、非NULL値が集約XWHERE 조건 IS NOT NULL COUNT(DISTINCT 조건)SELECT COUNT(DISTINCT NAME) FROM ANIMAL_INS WHERE NAME IS NOT NULL
    まずWHERE条件によりNAMEはDISTINTを用いてNULL以外のデータの重複データを消去しCOUNTでカウントする

    GROUP BY


    何種類の動物がいるか数えなさい

    SELECT
           ANIMAL_TYPE
         , COUNT(ANIMAL_ID) AS count -- 그룹화된 것들의 각각의 개수 구함
      FROM ANIMAL_INS
     GROUP BY ANIMAL_TYPE -- 먼저 ANIMAL_TYPE 같은 것 끼리 데이터 그룹화됨
     ORDER BY ANIMAL_TYPE ASC 
     -- ORDER BY는 모든 데이터들을 조회가 완료된 다음, 최후에 정렬함

    同名の動物を探す


    まず、NAMEはNULLではありませんWHERE NAME IS NOT NULL名前でグループ化
    HAVING節では、GROUP BYデータの条件を提供するため、NAME数をCOUNTとし、2より大きいデータのみを受け入れるHAVING COUNT(NAME) >= 2名前でソート
    SELECT
           NAME
         , COUNT(NAME) as COUNT
      FROM ANIMAL_INS
     WHERE NAME is NOT NULL
     GROUP BY NAME
     HAVING COUNT(NAME) >= 2
     ORDER BY NAME

    養子縁組取得時間(1)


    編み始めたばかりのハーモニー
    SELECT
           HOUR(DATETIME)
      FROM ANIMAL_OUTS
     GROUP BY HOUR(DATETIME)
     HAVING HOUR(DATETIME) >= 9 and HOUR(DATETIME) < 20
     ORDER BY HOUR(DATETIME)
    SQLの実行中にエラーが発生しました.
    Unknown column 'DATETIME' in 'having clause'
    HAVINGを賭けるときは純粋なcolumn名を使います!
  • HAVING以降、条件を満たすcolumnは、追加コマンドのない純粋なcolumn名
  • を使用する必要がある.
  • HAVING HOUR(DATETIME) => HAVING 별칭
  • COMMAND付き列
  • SELECT HOUR(DATETIME)をHOURと宣言し、HAVINGセクションでこの別名
  • を使用する
    SELECT
           HOUR(DATETIME) as HOUR
         , COUNT(HOUR(DATETIME)) as COUNT
         -- 이미 HOUR(DATETIME)으로 group화된 데이터를 가짐
         -- COUNT(DATETIME) as COUNT 해줘도 괜찮음
      FROM ANIMAL_OUTS
     GROUP BY HOUR(DATETIME)
     HAVING HOUR >= 9 and HOUR < 20 -- HOUR 별칭 컬럼 사용
     ORDER BY HOUR(DATETIME)

    養子縁組取得時間(2)


    SETコマンドを使用する必要があります!(ユーザ定義変数)
    データベースにない時間を作成するには、0時から23時までにテーブルを作成する必要があります.

    カスタム変数by SET


    変数宣言法
    SET @변수명 = 변수값; -- 변수 선언, 값 대입
    SELECT @변수이름; -- 변수 출력
    SET以外の文では=が比較演算子として扱われているため、SELECTを用いて変数や付与を宣言する場合は:=を用いる!
    例1
    SET @VAR1 = 1;
    SET @VAR2 = 2;
    
    SELECT @VAR1; -- 결과 1
    SELECT @VAR1 + @VAR2; -- 결과 2
    例2
    SET @start = 15, @finish = 20;
    
    SELECT * FROM EMPLOYEE
    WHERE ID BETWEEN @start AND @finish;

    養子縁組の視点を得る(2)解答


    まず、現在のデータベースにない0~23ポイントの期間をSETで作成します.
    SET @HOUR := -1;
    
    SELECT (@HOUR := @HOUR + 1) AS HOUR
    FROM ANIMAL_OUTS
    WHERE @HOUR < 23;
    テーブルは0~23で完了しました
    HOUR変数にHOUR+1を挿入し、表は0から23まで完成する
    次にCOUNTテーブルを作成する必要があります
    もしHOUR(DATETIME)の養子縁組日の視点がHOUR変数と同じなら、個数COUNTを数えましょう!(SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @HOUR) AS COUNT
    SET @HOUR := -1; # 변수선언
    
    SELECT (@HOUR := @HOUR +1) AS HOUR,
    (SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @HOUR) AS COUNT 
    FROM ANIMAL_OUTS
    WHERE @HOUR < 23