SQL Day 3パケット、集約関数、JOIN


Day 2復習

  • 数値型関数のうち、正数、0、負数から1、0、-1を返す関数は?
  • 列1と列2を異なるフォーマットで返したい場合、使用する文字型関数は?
  • Pythonには、Slixingのような3つの文字型関数がありますか?
  • スペースまたはスケジュールテキスト削除関数とは?
  • 年月日に戻り、時分秒に戻る日付型関数は?
  • NOW()とSYSTATE()の違いは?
  • 1.今日学んだこと


    データパケット(GROUP BY,DISTINT),統計関数,合計生WITH ROLLUP,GROUPING()関数,HAVING節,JOINについて学習した.テーブル同士がつながっていないのでやりたいことができなかったので、今回JOINを習った時はとても楽しかったです

    2.わかりにくい部分


    A) JOIN


    I'm deadly serious. 信頼できる人の紹介で接続...接続は最高です...
    -- 형태
    select * 
    	from  테이블1 as 별칭1 
    		join 테이블2 as 별칭2  
    			on a.컬럼명1 = b.컬럼명2 

    a)内部連結

  • 他の表を接続して使用する場合はJOIN
  • が必要です.
  • は、1つのテーブル内で接続および出力するときにサブクエリ
  • を必要とする.
    select a.Population, a.Name, b.Name, b.Continent
    from city a
    join country b
    on a.CountryCode = b.code
    where b.Continent = 'europe'
    order by a.Population
    limit 1;
    #455	Città del Vaticano	Holy See (Vatican City State)
    

    a)外部接続

  • くらい書いておけばいいので、もっと価値のある方向に行けばいいです.(親の食卓へ)
  • -- 형태
    select * 
    	from  테이블1 as 별칭1 
    		left join 테이블2 as 별칭2  #left or right
    			on a.컬럼명1 = b.컬럼명2 

    3.覚えておきたい部分


    1)差別、


    A) GROUP BY

  • OOは総合的な良い文法です.
  • WHEREとORDER BYの間で使用します.
  • #박스오피스에서 2019년 개봉영화중 영화 유형별 최대/최소 매출액과 총매출액 
    select movie_type, max(sale_amt) as 최대매출액, min(sale_amt) as 최소매출액, sum(sale_amt) as 총매출액
    from box_office where  release_date like '2019%'
    group by movie_type 
    order by sale_amt;
    
    #대륙별 총면적이 넓고 총인구, 국가수가 많은 순으로
    select continent, sum(SurfaceArea) as 총면적, sum(Population) as 총인구, count(*) as 국가수
     from country group by continent order by 2 desc , 3 desc;
     
     -- join과 활용
    #부서별 평균봉급, 총 봉급, 인원수  
    select d.dept_name, avg(c.salary), sum(c.salary), count(a.emp_no)
    from employees a 
    join dept_emp b on a.emp_no = b.emp_no
    join salaries c on a.emp_no = c.emp_no
    join departments d on b.dept_no = d.dept_no
    group by b.dept_no;

    a)DISTINCT(重複除外用)

  • selectセクションで、コラム名の前に明記すると、類似の集団化の結果が得られます.
  • はまた、重複除外
  • を行うことができる.
  • ですが、GROUP BYはソートも可能です.
  • B)HAVINGを使用して順番を守る

  • GROUP BY統計のクエリでは、条件に一致する値を返すために使用されます.
  • だからGROUP BYの後ろについて
    #개봉 월별로 순위가 탑10에 있는 영화 수 구하기 # 그룹내 조건걸기  having 탑텐 영화가 2편이상 
    select extract(year_month from release_date) as 개봉년월, count(*) 개봉편수
    from box_office where ranks between 1 and 10
    group by extract(year_month from release_date)
    having count(*) > 1;
    
    -- 서브쿼리에서 활용
    select year(release_date),movie_name,sale_amt 
     from box_office where ranks =1 having sale_amt > (select avg(sale_amt) from box_office where ranks =1);

    C)ハングル使用エラー

    select if(grouping(b.name) = 1,'전체도시수',b.name), count(A.Name) as '도시 개수' #if와 grouping을 활용하여 전체도시개수 별칭 지정하기
    from city a
    join country b
    on a.CountryCode = b.code
    group by b.name with rollup
    order by 2 desc;
    町中別称、1267間違い.英語に変えたら大丈夫です.
    Error Code: 1267. Illegal mix of collations (utf8mb4_0900_ai_ci,COERCIBLE) and (latin1_swedish_ci,IMPLICIT) for operation 'if' 0.000 sec...

    2)よく使われているようで、


    A)WITH ROLLUPとGROUPING()関数の合計生産

  • 00で集計を行い、統計値の合計も表示したい場合は
  • を使用します.
  • GROUP BY列名WITH ROLLUP
  • のみ、値のみ、名前なし、NULL値です.
  • IFおよびGROUPING関数を使用して、
  • のNULL値に別名を指定します.
  • GROUPING()関数の戻り値(1:合計、0:小計)
  • -- 2019년 개봉작 중 영화유형별 매출액과 총합
    select if(grouping(movie_type) = 1, '전체 총합', movie_type) 영화유형, sum(sale_amt)  #if(조건,조건이 맞을시반환값, 조건이 다를시 반환값)
    from box_office where release_date like '2019%' and quarter(release_date) = 1 and sale_amt >= 10000000
    group by movie_type with rollup #총계출산 
    order by 1, 2 desc;

    B)JOIN外部キー使用


  • 職員と関係があるのはemp noで、部門と関係があるのはdept noです.外部キーを使用して他のテーブルに関連付ける場合は、他のテーブルの資料も同時に使用できます.
  • #부서별 평균봉급, 총 봉급, 인원수  
    select d.dept_name, avg(c.salary), sum(c.salary), count(a.emp_no)
    from employees a 
    join dept_emp b on a.emp_no = b.emp_no
    join salaries c on a.emp_no = c.emp_no
    join departments d on b.dept_no = d.dept_no
    group by b.dept_no;

    C)集約関数

  • count(),min( ), max(), avg() , SUM(), VAR_POP(), stdDEV_POP()
  • 個、最高値、最高値、平均値、合計、分散、標準偏差
  • セグメントで、統計関数を使用するとデータが歪む可能性があります.
  • # 유럽에서 인구가 가장 작은 국가
    select name, min(Population)
    from country where  Continent = 'europe';
    #Holy See (Vatican City State)	1000 정답
    # Albania	1000  오답: 가장 작은 인구는 맞지만 국가명과 매치하진 않는다, 단순위 맨 위 국가가 나왔다. 그래서 서브쿼리를 써야한다.
    --  서브쿼리 (한 테이블에서 집계쿼리 활용할 때)
    select a.Name, b.min_Population 
    from (select min(Population) as min_Population from country where Continent = 'europe')b, 
    country a where a.Population = b.min_Population;
    #Holy See (Vatican City State): 1000
    
    -- join과 활용할 때도 서브쿼리가 필요하다.
    # 세계에서 인구가 가장 작은 도시
    select min(a.Population), a.Name, b.Name, b.Continent 
    from city a
    join country b
    on a.CountryCode = b.code
    #42	Oranjestad	Aruba	North America (오답: 인구와 이름 미스매치)
    
    # 파생 테이블 서브쿼리
    select c.min_Population, a.Name, b.Name, b.Continent #인구와 이름 미스매치
    from (select min(Population) as min_Population from city) c, city a
    join country b
    on a.CountryCode = b.code
    where a.Population = c.min_Population;
    #정답: 42	Adamstown	Pitcairn	Oceania