11장. GROUP BY와 HAVING 열의 그룹화 2개 이상의 열에 대한 그룹화

Slides:



Advertisements
Similar presentations
널 (null) 의 처리 널을 검색하는 방법 형식 예 ) takes 테이블에서 아직 학점이 부여되지 않은 학생의 학번을 검색 is null is not null ( 질의 64) select stu_id from takes where grade is null.
Advertisements

SQL 언어 SQL.
19.(코드+년도+월)별,(코드)별,전체총액을 한번에
SQL 0613.
Perfect! 대용량 데이터베이스 튜닝Ⅱ.
12 프로젝트 실습.
제로보드 소개 제로보드 설치하기 제로보드 관리하기
실전 데이터모델링 & 데이터베이스 설계와 구축
질의어와 SQL 기본 SQL 고급 SQL 데이타의 수정 데이타 정의 언어 내장 SQL
관계 대수와 SQL.
오라클 데이터베이스 성능 튜닝.
Database & Internet Computing Laboratory 한 양 대 학 교
Chapter 5 SQL: 확장된 질의, 주장, 트리거, 뷰.
SELECT 문 사원 테이블의 모든 정보를 출력하는 예제 1. 비교 연산자 SELECT 문의 형태
4장. 관계 대수와 SQL SQL 관계 데이터 모델에서 지원되는 두 가지 정형적인 언어
JDBC 프로그래밍 이수지 이동주 1.
7장 조인.
다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL
Apache Hive 빅데이터 분산 컴퓨팅 박영택.
SQL 개요 SQL 개요 - SQL은 현재 DBMS 시장에서 관계 DBMS가 압도적인 우위를 차지하는 데 중요한 요인의 하나
MySQL performance Xhark 김재홍.
데이터베이스 담당교수 신정식 Chapter 4 SQL(1).
18장. 뷰(View) 뷰의 생성 뷰의 열 이름 뷰의 변경 : WITH CHECK OPTION 뷰 테이블의 정보와 네비게이터
요약 정보 만들기.
오라클 데이터베이스 성능 튜닝.
롯데마트 CRM 데이터 분석 교육 2014년 12월 > RE::VISION 전용준 리비젼컨설팅 대표
SQL 함수 SQL 함수.
트랜잭션과 잠금 트랜잭션 처리 메커니즘을 자세히 이해한다. 트랜잭션의 종류를 파악한다.
6장. 물리적 데이터베이스 설계 물리적 데이터베이스 설계
4.2 SQL 개요 SQL 개요 SQL은 IBM 연구소에서 1974년에 System R이라는 관계 DBMS 시제품을 연구할 때 관계 대수와 관계 해석을 기반으로, 집단 함수, 그룹화, 갱신 연산 등을 추가하여 개발된 언어 1986년에 ANSI(미국 표준 기구)에서 SQL.
Database 소개.
단일 테이블 조회를 위한 SELECT 문을 이해한다. 열 제약조건과 행 제약조건을 이해한다. 결과 집합 변경 방법을 이해한다.
14 뷰(View) 뷰의 개념 뷰 관리.
제 17 장 (Oracle) 오라클에서 질의 최적화
뷰와 저장 프로시저 뷰의 개념을 이해한다. 뷰의 정의와 관리 방법을 이해한다. 뷰를 사용함으로써 생기는 장점을 알아본다.
16장. 테이블의 변경 새로운 행 삽입 테이블에서 테이블로 행을 복사 행 값의 변경 테이블에서 행 삭제
19장. 트랜잭션과 락(LOCK) 트랜잭션이란? MySQL의 트랜잭션 락(LOCK) 쉽게 배우는 MySQL 5.x
21장. 데이터베이스 설계지침 테이블과 열에 대한 지침 중복 데이터의 포함 열에 대한 자료형의 선택
9장 테이블 생성 및 변경, 삭제하기(DDL).
SQL.
2장. 학사관리 예제 DATABASE 학사 데이터베이스의 해설 테이블의 내용 무결성 규칙 쉽게 배우는 MySQL 5.x
강사: 이종인 다우 교육원 전임강사 / 온디멘드 수석 컨설턴트 / FMG 수석 컨설턴트
4장. 데이터베이스와 테이블 MySQL 데이터베이스 테이블의 생성 테이블 데이터 처리(삽입, 변경, 삭제) 작업
다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL
Chapter 3: Introduction to SQL
목 차 들어가기 ………… 2 작동원리 ………… 4 구문설명 ………… 6 FUNCTIONS …………11 예제 ………… 2
CHAPTER 06. 데이터베이스 자료의 조직적 집합체_데이터베이스 시스템의 이해
1장. SELECT 문장을 이용하여 원하는 데이터 가져오기
JSP 게시판 구현.
12장. SELECT 명령문: ORDER BY절 단일 열 정렬 순서번호로 정렬 오름차순과 내림차순 정렬 하나 이상의 행 정렬
Database 중고차 매매 DB 비즈니스IT 윤동섭.
9장. SELECT명령문 : WHERE 절 개요, 2. 관계연산자를 사용하는 조건
10장. SELECT명령문 : 통계함수 모든 열 선택(*) 2. SELECT 절의 수식
기본적인 SELECT문 작성.
14장. 부속 질의어 부속 질의어 규칙 열의 범위 상호 관련부속 질의어 복합키의 사용 쉽게 배우는 MySQL 5.x
학습목표 학습목표 본 장은 데이터베이스를 구성하는 개체, 속성, 관계 등을 다룬다. 특별히 데이터베이스의 구조를 테이블에 기초하여 조직하는 관계 데이터 모델은 개체(entity)와 관계(relationship) 들이 테이블의 집합 형태로 되어 간단하고 이해하기 쉬우며.
4.DECODE 함수를 이용한 IF 처리의 효율화
06. SQL 명지대학교 ICT 융합대학 김정호.
과제 #5 MySQL 연동 php문서에서 SQL문의 삽입, 삭제, 수정, 검색을 수행한다. 주어진 form을 최대한 활용한다.
20장. SQL명령문의 최적화 1. OR연산자의 사용을 피하라. 2. 불필요한 UNION연산자의 사용을 피하라.
How I Approach Tuning a SQL Statement
테이블 관리 테이블 생성,수정,삭제 데이터 입력 수정, 삭제 2010학년도 2학기.
2015년 2학년 1반.
Stored program 2 장종원
1장. 서 론 데이터베이스의 개요 모델의 종류 관계형 모델과 객체 지향형 데이터베이스 SQL이란 무엇인가?
쿼리 활용하기 1 담당교수 : 박흠 실용컴퓨터 데이터베이스 기초 Access 담당교수 박흠.
일반대학원 사용자 매뉴얼(학생)
8장. SELECT명령문 : FROM 절 FROM 절에서 테이블 명세 열 명세 다중 테이블 명세 가명 FROM절의 다양한 예제
fastestslowest 실제 질의문에서 사용 타입 추천 인덱스 SELECT list Default
GB ridge 웹 모바일및 빅데이터 응용과정 3주차: 데이터베이스 프로그래밍 [경기도형 대학생 취업브리지 사업]
Presentation transcript:

11장. GROUP BY와 HAVING 열의 그룹화 2개 이상의 열에 대한 그룹화 3. 수식의 그룹화 4. NULL 값의 그룹화 5. GROUP BY와 DISTINCT 6. HAVING 절의 소개 7. HAVING 절의 예제 8. HAVING 절에 대한 일반적인 규칙 2019-04-11 쉽게 배우는 MySQL 5.x

11.1 열의 그룹화 -GROUP BY 절은 동일성을 기초하여 여러 개의 행을 그룹화 -HAVING 절은 WHERE 절과 유사한 기능을 가지며, 그룹의 조건을 지정 11.1 열의 그룹화 [예제 11-1] STUDENT 테이블에 있는 학생의 입학년도별 그룹을 출력하라. mysql> select substring(stu_no, 1, 4)     -> from student     -> group by substring(stu_no, 1, 4); +-------------------------+ | substring(stu_no, 1, 4) | | 2000                    | | 2004                    | | 2006                    | | 2007                    | 4 rows in set (0.00 sec) GROUP BY 절을 사용하지 않고, DISTINCT를 사용하면 동일한 결과 출력 mysql> select distinct(substring(stu_no, 1, 4))    -> from student; 2019-04-11 쉽게 배우는 MySQL 5.x

[예제 11-1] GROUP BY절을 사용하여 생성된 중간결과 substring(stu_no, 1, 4) stu_no                      stu_name ----                   ----------------------------    ------------------------- 2000                   20001001, 20001015, 20001021    김유신, 박도준, 이상길 2004                   20041002, 20041007, 20041033    김유미, 정인정, 연개소문 2006                   20061011, 20061014, 20061048    박정인, 고혜진, 김영호  2007                   20071001, 20071010, 20071022    장수인, 홍길동, 이순신                        20071300, 20071307, 20071405    유하나, 김문영, 최차영 -동일한 년도를 가지고 있는 모든 행은 그룹으로 구성 -중간 결과에 있는 각 행에 대하여 년도 열은 하나의 값 -다른 모든 열은 여러 개의 값(STU_NO, STU_NAME은 여러 개의 값) 최종 결과 값은 +-------------------------+ | substring(stu_no, 1, 4) | | 2000                    | | 2004                    | | 2006                    | | 2007                    | 2019-04-11 쉽게 배우는 MySQL 5.x

[예제 11-2] 각 입학년도별 총 학생 수를 출력하라. mysql> select substring(stu_no, 1, 4), count(*)     -> from student     -> group by substring(stu_no, 1, 4); +------------------------+----------+ | substring(stu_no, 1,4) | count(*) | | 2000                   |        3 | | 2004                   |        3 | | 2006                   |        3 | | 2007                   |        6 | 4 rows in set (0.02 sec) COUNT(*) 함수는 서로 다른 모든 행에 대하여 연산하지 않고 각 그룹화 된 행에 의존하여 실행된다. 다시 말하면, COUNT(*) 함수는 각 그룹화된 행에서 계산된다. 2019-04-11 쉽게 배우는 MySQL 5.x

[예제11-3] 등록한 학생에 대하여 학번, 등록횟수, 각 학생이 받은 장학금의 전체 합을 출력하라. mysql> select stu_no, count(*), sum(jang_total)     -> from fee     -> group by stu_no; +----------+----------+-----------------+ | stu_no   | count(*) | sum(jang_total) | | 20001015 |        8 |        18000000 | | 20061011 |        4 |         5800000 | | 20071001 |        2 |          500000 | | 20071010 |        2 |          500000 | | 20071022 |        2 |          500000 | | 20071300 |        2 |         2500000 | | 20071307 |        2 |          500000 | | 20071405 |        2 |         3000000 | 8 rows in set (0.02 sec) 2019-04-11 쉽게 배우는 MySQL 5.x

[예제11-4] 박정인 학생에 대하여 학번, 등록한 횟수의 수를 출력하라. mysql> select stu_no, count(*)     -> from fee     -> where stu_no in     -> (select stu_no     -> from student     -> where stu_name = '박정인')     -> group by stu_no; +----------+----------+ | stu_no   | count(*) | | 20061011 |        4 | 1 row in set (0.00 sec) 2019-04-11 쉽게 배우는 MySQL 5.x

11.2 2개 이상의 열에 대한 그룹화 GROUP BY 절에 2개 이상의 열 명세를 사용할 수 있다. 11.2 2개 이상의 열에 대한 그룹화 GROUP BY 절에 2개 이상의 열 명세를 사용할 수 있다. [예제11-5] 학년별, 주야인원을 출력하라. 단, 출력 순서는 학년별 오름차순, 주야 오름차순이다. mysql> select  grade, juya, count(*)     -> from student     -> group by grade, juya     -> order by grade, juya; +-------+------+----------+ | grade | juya | count(*) | |     1 | 주   |        3 | |     1 | 야   |        3 | |     2 | 주   |        3 | |     3 | 주   |        1 | |     3 | 야   |        1 | |     4 | 주   |        2 | |     4 | 야   |        2 | 7 rows in set (0.00 sec) 2019-04-11 쉽게 배우는 MySQL 5.x

[예제 11-5] GROUP BY절의 중간결과는 학년별 주야구분별로 학번을 그룹화   grade   juya   stu_no    ------- ------ ----------------------------       1   주     20071001,20071300,20071405       1   야     20071010,20071022,20071307       2   주     20041007,20061011,20061014       3   주     20041002       3   야     20041033       4   주     20001015, 20001021       4   야     20001001, 20061048 최종 결과 값은 +-------+------+----------+ | grade | juya | count(*) | |     1 | 주   |        3 | |     1 | 야   |        3 | |     2 | 주   |        3 | |     3 | 주   |        1 | |     3 | 야   |        1 | |     4 | 주   |        2 | |     4 | 야   |        2 | 7 rows in set (0.00 sec) 2019-04-11 쉽게 배우는 MySQL 5.x

[예제11-6]STUDENT 테이블에서 학년, 반, 주야구분이 서로 다른 모든 조합을 인원수로 출력하라. mysql> select grade, class, juya, count(*) mysql> select class, grade, juya, count(*)     -> from student -> from student     -> group by grade, class, juya; -> group by class, grade, juya; +-------+-------+------+----------+ +-------+-------+------+----------+ | grade | class | juya | count(*) | | class | grade | juya | count(*) | |     1 |     1 | 주   |        2 | |     1 |     1 | 주   |        2 | |     1 |     2 | 주   |        1 | |     1 |     2 | 주   |        2 | |     1 |     3 | 야   |        3 | |     1 |     4 | 주   |        2 | |     2 |     1 | 주   |        2 | |     2 |     1 | 주   |        1 | |     2 |     2 | 주   |        1 | |     2 |     2 | 주   |        1 | |     3 |     2 | 주   |        1 | |     2 |     3 | 주   |        1 | |     3 |     3 | 야   |        1 | |     3 |     1 | 야   |        3 | |     4 |     1 | 주   |        2 | |     3 |     3 | 야   |        1 | |     4 |     3 | 야   |        2 | |     3 |     4 | 야   |        2 | 9 rows in set (0.00 sec) 9 rows in set (0.00 sec) 예제에서 우측과 같이 학년과 반을 서로 바꾸어 보자. 출력되는 순서가 반을 기준으로 오름차순으로 출력될 뿐 결과값은 동일하게 출력된다. 2019-04-11 쉽게 배우는 MySQL 5.x

[예제11-7]FEE 테이블에서 각 학생별로 대학 재학시 총 납입한 금액과  등록금 최대값, 가장 적게 받은 장학금, 등록 횟수를 출력하라. mysql> select stu_no, sum(fee_pay), max(fee_total),     -> min(jang_total), count(*)     -> from fee     -> group by stu_no; +----------+--------------+----------------+-----------------+----------+ | stu_no   | sum(fee_pay) | max(fee_total) | min(jang_total) | count(*) | | 20001015 |      5100000 |        3000000 |         1000000 |        8 | | 20061011 |      6700000 |        3500000 |          500000 |        4 | | 20071001 |      6000000 |        3500000 |          500000 |        2 | | 20071010 |      6000000 |        3500000 |          500000 |        2 | | 20071022 |      6000000 |        3500000 |          500000 |        2 | | 20071300 |      4000000 |        3500000 |          500000 |        2 | | 20071307 |      6000000 |        3500000 |          500000 |        2 | | 20071405 |      3500000 |        3500000 |          500000 |        2 | 8 rows in set (0.16 sec) 2019-04-11 쉽게 배우는 MySQL 5.x

[예제11-8] 등록한 학생에 대하여 학번, 이름, 납입금의 총액을 출력하라. mysql> select s.stu_no, stu_name, sum(fee_pay)     -> from student s, fee f     -> where s.stu_no = f.stu_no     -> group by s.stu_no, stu_name; +----------+----------+--------------+ | stu_no   | stu_name | sum(fee_pay) | | 20001015 | 박도준   |      5100000 | | 20061011 | 박정인   |      6700000 | | 20071001 | 장수인   |      6000000 | | 20071010 | 홍길동   |      6000000 | | 20071022 | 이순신   |      6000000 | | 20071300 | 유하나   |      4000000 | | 20071307 | 김문영   |      6000000 | | 20071405 | 최차영   |      3500000 | 8 rows in set (0.05 sec) 2019-04-11 쉽게 배우는 MySQL 5.x

11.3 수식의 그룹화 SQL 제품은 수식을 그룹화 할 수 있는 기능을 제공 11.3 수식의 그룹화 SQL 제품은 수식을 그룹화 할 수 있는 기능을 제공 [예제 11-9] 등록 연도에 대하여 등록된 수를 출력하라. mysql> select fee_year, count(*)     -> from fee     -> group by fee_year; +----------+----------+ | fee_year | count(*) | | 2000     |        2 | | 2001     |        2 | | 2006     |        4 | | 2007     |       16 | 4 rows in set (0.00 sec) 2019-04-11 쉽게 배우는 MySQL 5.x

Ceil( ) 함수는 소수 이하 자리가 0.5 이하도 무조건 올림을 수행 [예제 11-10] 동아리 가입번호를 기초로 하여 학생들을 그룹화하라. 이 때 그룹 1은 가입번호 1부터 3까지이며, 그룹 2는 가입번호 4부터 6까지의 순서로 3명씩을 한 그룹으로 그룹화한다. 그리고 각 그룹에 대하여 학생의 수와 가장 높은 학번을 출력한다. mysql> select ceil(cir_num/3), count(*), max(stu_no)     -> from circle     -> group by ceil(cir_num/3); +-----------------+----------+-------------+ | ceil(cir_num/3) | count(*) | max(stu_no) | |               1 |        3 | 20071307    | |               2 |        3 | 20071001    | |               3 |        1 | 20001021    | 3 rows in set (0.06 sec) Ceil( ) 함수는 소수 이하 자리가 0.5 이하도 무조건 올림을 수행 2019-04-11 쉽게 배우는 MySQL 5.x

11.4 NULL 값의 그룹화 NULL 값을 가지고 있는 열을 그룹화한다면 NULL 값은 하나의 그룹으로 구성 [예제 11-11] 서로 다른 장학코드를 그룹화하고 인원수를 출력하라. mysql> select ifnull(jang_code,null) "장학코드", count(*)     -> from fee     -> group by jang_code; +----------+----------+ | 장학코드 | count(*) | | NULL     |        4 | | 1        |        7 | | 10       |        8 | | 11       |        3 | | 2        |        1 | | 21       |        1 | 6 rows in set (0.00 sec) 2019-04-11 쉽게 배우는 MySQL 5.x

11.5 GROUP BY와 DISTINCT 11.6 HAVING절의 소개 • SELECT 절이 GROUP BY 절에서 지정한 모든 열을 가지고 있다면 DISTINCT(통계 함수의 외부에 사용될 때)는 필요하지 않다. • GROUP BY 절은 열이 중복된 값을 갖지 않도록 행을 그룹화하기 때문이다. 11.6 HAVING절의 소개 • GROUP BY 절은 FROM 절로부터 생성되는 결과의 행을 그룹화 • HAVING 절은 특별한 그룹 속성을 기초로 하여 행의 그룹을 선택 • HAVING 절에 있는 조건은 WHERE 절에 있는 일반적인 조건처럼 보인다. • WHERE 절에 있는 조건 수식에서는 통계 함수를 사용 불가능 • 부속 질의어에서는 통계 함수를 사용 가능 • HAVING 절의 조건에 있는 수식은 통계 함수를 사용 가능 2019-04-11 쉽게 배우는 MySQL 5.x

[예제 11-12] 세 번 이상 등록한 학생의 학번과 등록 횟수를 출력하라. mysql> select stu_no, count(*)     -> from fee     -> group by stu_no     -> having count(*) > 2; +----------+----------+ | stu_no   | count(*) | | 20001015 |        8 | | 20061011 |        4 | 2 rows in set (0.00 sec) GROUP BY 절의 중간 결과 +----------+----------+----------+ | stu_no   | fee_year | fee_term | | 20001015 | 2000     |     1, 2 | |          | 2001     |     1, 2 | |          | 2006     |     1, 2 | |          | 2007     |     1, 2 | | 20061011 | 2006     |     1, 2 | | 20071001 | 2007     |     1, 2 | | 20071010 | 2007     |     1, 2 | | 20071022 | 2007     |     1, 2 | | 20071300 | 2007     |     1, 2 | | 20071307 | 2007     |     1, 2 | | 20071405 | 2007     |     1, 2 | 2019-04-11 쉽게 배우는 MySQL 5.x

11.7 HAVING 절의 예제 [예제 11-13] 2006년에 등록한 학생의 학번과 등록 횟수를 출력하라. mysql> select stu_no, fee_year, count(*)     -> from fee     -> group by stu_no, fee_year     -> having fee_year = '2006'; +----------+----------+----------+ | stu_no   | fee_year | count(*) | | 20001015 | 2006     |        2 | | 20061011 | 2006     |        2 | 2 rows in set (0.00 sec) 2019-04-11 쉽게 배우는 MySQL 5.x

[예제11-14]재학중에 납부한 등록금의 전체 납부금액이 5,000,000원 이상인 각 학생에 대하여 출력하라. mysql> select stu_no, sum(fee_pay)     -> from fee     -> group by stu_no     -> having sum(fee_pay) >= 5000000; +----------+--------------+ | stu_no   | sum(fee_pay) | | 20001015 |      5100000 | | 20061011 |      6700000 | | 20071001 |      6000000 | | 20071010 |      6000000 | | 20071022 |      6000000 | | 20071307 |      6000000 | 6 rows in set (0.00 sec) 2019-04-11 쉽게 배우는 MySQL 5.x

[예제 11-15] 여학생이면서 재학중 납부한 전체등록금이 2,000,000원 이상인 학생의 학번과 등록금의 총액을 출력하라. mysql> select stu_no, sum(fee_pay)     -> from fee     -> where stu_no in     -> (select stu_no     -> from student     -> where substring(id_num, 8, 1) =2)     -> group by stu_no     -> having sum(fee_pay) >= 2000000; +----------+--------------+ | stu_no   | sum(fee_pay) | | 20071300 |      4000000 | | 20071307 |      6000000 | | 20071405 |      3500000 | 3 rows in set (0.03 sec) 2019-04-11 쉽게 배우는 MySQL 5.x

[예제 11-16] 재학중 납부한 등록금 총액이 가장 많은 각 학생에 대한 학번과 등록금의 총액을 출력하라(만약 등록금 총액이 모두 같거나 모두 많다면, 이 질의어는 많은 학생을 반환할 것이다). mysql> select stu_no, sum(fee_pay)     -> from fee     -> group by stu_no     -> having sum(fee_pay) >= all     -> (select sum(fee_pay)     -> group by stu_no); +----------+--------------+ | stu_no   | sum(fee_pay) | | 20061011 |      6700000 | 1 row in set (0.00 sec) 2019-04-11 쉽게 배우는 MySQL 5.x

11.8 HAVING 절에 대한 일반적인 규칙 -HAVING 절에서 사용된 각 열의 이름은 통계 함수 내부에서 사용하거나 GROUP BY 절의 열의 리스트에서 사용되어야 한다. -통계 함수의 결과는 항상 각 그룹에 대하여 하나의 값으로 구성 -그룹화되는 열 명세의 결과는 그룹 당 하나의 값으로 구성 -그룹화가 되지 않는 열의 명세의 결과는 값들의 집합으로 구성 mysql> select birth_year, count(*)     -> from student     -> group by birth_year     -> having class = 2; ERROR 1054 (42S22): Unknown column 'class' in 'having clause' CLASS 열이 통계 함수 내부에서도 그룹화를 수행하는 열의 리스트에서도 사용되지 않고 HAVING 절에서 사용되기 때문 2019-04-11 쉽게 배우는 MySQL 5.x