Home [데이터베이스 시스템] 6강 - SQL
Post
Cancel

[데이터베이스 시스템] 6강 - SQL

💡해당 게시글은 방송통신대학교 정재화 교수님의 '데이터베이스 시스템' 강의를 개인 공부 목적으로 메모하였습니다.



학습 개요


  • 2차원 구조의 테이블에서 사용자가 다양한 유형의 검색 결과를 얻을 수 있도록 SQL은 SELECT문에 다양한 기능을 내포하고 있음
  • SELECT문은 산술, 논리 연산자 뿐만 아니라 관계형 데이터베이스에서만 사용 가능한 특수 연산자까지 사용자의 복잡한 요구를 표현할 수 있는 기능을 제공함
  • SELECT문은 함수 및 집계 함수를 사용한 질의를 통해 보다 복잡한 유형의 질의를 처리할 수 있는 형식을 지원함
  • SELECT문을 통해 향상된 질의 결과를 생성할 수 있는 산술, 논리, 비교 연산자와 특수 연산자 그리고 다양한 종류의 함수 및 집계 함수의 사용 방법에 대하여 알아봄



주요 용어


  • 조건 질의문
    • 산술 연산식, 함수 등을 사용하여 표현한 조건을 WHERE 절에 기술하여 조건을 만족하는 레코드만 검색하는 SELECT
  • ORDER BY
    • 검색 결과를 특정 컬럼에 대해 오름차순 또는 내림차순으로 정렬
  • 특수 연산자
    • 범위 포함 여부, 부분 일치 여부, 포함 여부 등 관계형 데이터베이스에서만 사용되도록 고안된 연산자
  • 함수
    • 특정 목적을 수행하도록 사전에 정의된 연산 및 기능을 수행한 후 결과 값을 반환하는 명령어 집합



강의록


데이터 정렬과 특수 연산자

SELECT명령어

image.png

  • 한 개 이상의 테이블에서 주어진 조건에 만족하는 레코드를 출력하는 명령문
  • 관계 대수의 셀렉트, 프로젝트, 조인, 카티션 프로덕트 연산자의 기능을 모두 포함하는 명령문
    • 필수 절인 SELECT절 장막 부가적인 목적으로 사용하는 절을 혼합하여 검색 기능을 구체화

SELECT의 구문형식

1
2
3
4
5
6
7
8
9
10
11
12
SELECT [DISTINCT] 컬럼1, 컬럼2, ..., 컬럼n
    FROM 테이블1, [INNER JOIN | OUTER JOIN
        테이블2, INNER JOIN | OUTER JOIN
        ON 조인 조건식1,
        테이블3,
            INNER JOIN | OUTER JOIN
        테이블m,
        ON 조인 조건식n]
    [WHERE 조건식 [중첩 질의]]
    [GROUP BY 컬럼1, 컬럼2, ..., 컬럼y
        [HAVING 조건]]
    [ORDER BY 컬럼1 [ASC | DESC], ..., 컬럼z [ASC | DESC]]

데이터의 정렬

  • ORDER BY 절을 사용

    1
    2
    3
    4
    
      `SELECT` 형식
      ORDER BY 컬럼1 [ASC | DESC],
          ...,
          컬럼n [ASC | DESC]
    
  • 검색 결과를 특정 컬럼에 대해 오름차순 또는 내림차순으로 정렬

    • 오름차순: ASC
    • 내림차순: DESC
    • 모두 생략 시 오름차순 기준

데이터 정렬의 사용

  • 학번의 계좌 잔액을 잔액 기준으로 각각 오름차순, 내림차순으로 정렬하시오.

    학생번호 계좌번호 잔액
    201831-331215 123434-222222 800000
    201834-021216 123434-111111 600000
    201926-880215 123434-555555 300000
    201931-781109 123434-444444 400000
    201934-080621 123434-777777 300000
    201934-790902 123434-666666 100000
    202034-596541 123434-888888 1200000
    202031-816515 123434-999999 150000
    202031-354516 123435-111111 1000000
    202078-080621 123435-222222 500000
    202026-590930 123435-333333 450000
    1
    2
    
      SELECT * FROM 계좌
      	ORDER BY 잔액 ASC
    
    학생번호 계좌번호 잔액
    201934-790902 123434-666666 100000
    202031-816515 123434-999999 150000
    201926-880215 123434-555555 300000
    201934-080621 123434-777777 300000
    201931-781109 123434-444444 400000
    202026-590930 123435-333333 450000
    202078-080621 123435-222222 500000
    201834-021216 123434-111111 600000
    201831-331215 123434-222222 800000
    202031-354516 123435-111111 1000000
    202034-596541 123434-888888 1200000
    1
    2
    
      SELECT * FROM 계좌
      	ORDER BY 잔액 DESC
    
    학생번호 계좌번호 잔액
    202034-596541 123434-888888 1200000
    202031-354516 123435-111111 1000000
    201831-331215 123434-222222 800000
    201834-021216 123434-111111 600000
    202078-080621 123435-222222 500000
    202026-590930 123435-333333 450000
    201931-781109 123434-444444 400000
    201926-880215 123434-555555 300000
    201934-080621 123434-777777 300000
    202031-816515 123434-999999 150000
    201934-790902 123434-666666 100000
  • 수강 정보를 ‘학생번호’ 기분으로 1차 오름차순으로 정렬하고 ‘과목코드’를 기준으로 2차 내림차순으로 정렬하시오

    과목코드 학생번호 신청시각
    KO03 201831-331215 2019-02-11 13:31:45
    COM34 201831-331215 2020-02-20 13:54:22
    COM24 201831-331215 2019-08-22 12:23:31
    COM12 201831-331215 2019-08-21 23:25:25
    LAW21 201834-021216 2016-02-11 08:21:22
    KO03 201834-021216 2016-11-12 02:16:51
    HE25 201834-021216 2017-08-01 01:24:54
    COM34 201834-021216 2018-08-12 02:07:18
    HE31 201926-880215 2020-02-02 06:22:16
    HE25 201926-880215 2020-02-02 06:21:33
    1
    2
    
      SELECT * FROM 수강
      	ORDER BY 학생번호 ASC, 과목코드 DESC
    
    과목코드 학생번호 신청시각
    COM11 201934-790902 2019-02-28 08:32:54
    COM11 202026-590930 2019-02-20 16:00:21
    COM11 202078-080621 2019-02-21 15:21:54
    COM12 201831-331215 2019-08-21 23:25:25
    COM12 201931-781109 2018-08-02 03:25:16
    COM12 201978-610408 2015-02-24 10:25:40
    COM12 202026-590930 2019-02-20 16:00:21
    COM12 202031-816515 2019-02-07 02:44:33
    COM12 202034-596541 2019-02-20 16:00:21
    COM12 202078-080621 2019-02-21 15:21:54

특수 연산자

  • 범위, 부분 일치 여부, 포함 여부 등 RDBMS에서 사용되도록 고안된 연산자

    종류 사용 예 의미
    BETWEEN 컬럼명 BETWEEN V₁ AND V₂ 컬럼값이 V₁ ~ V₂ 사이에 존재하는지 검사
    LIKE 컬럼명 LIKE ‘V₁%’ V₁으로 시작하는 문자열 검사
      컬럼명 LIKE ‘%V₁’ V₁으로 끝나는 문자열 검사
      컬럼명 LIKE ‘%V₁%’ V₁이 문자열 내에 존재하는지 검사
      컬럼명 LIKE ‘V₁_’ V₁뒤에 한 문자만 일치하는지 검사
    IN 컬럼명 IN (V₁, … , Vₙ) 컬럼값이 V₁, V₂, …, Vₙ 중 하나와 일치하는지 검사

특수 연산자의 사용

  • 잔액이 20만원 이상 40만원 이하인 계좌의 계좌번호, 잔액, 학생번호를 출력하시오.

    계좌번호 잔액 학생번호
    123434-222222 800000 201831-331215
    123434-111111 600000 201834-021216
    123434-555555 300000 201926-880215
    123434-444444 400000 201931-781109
    123434-777777 300000 201934-080621
    123434-666666 100000 201934-790902
    123434-888888 1200000 202034-596541
    123434-999999 150000 202031-816515
    123435-111111 1000000 202031-354516
    123435-222222 500000 202078-080621
    123435-333333 450000 202026-590930
    123434-333333 400000 201978-610408
    1
    2
    
      SELECT 계좌번호, 잔액, 학생번호 FROM 계좌
          WHERE 잔액 BETWEEN 200000 AND 400000
    
    계좌번호 잔액 학생번호
    123434-555555 300000 201926-880215
    123434-444444 400000 201931-781109
    123434-777777 300000 201934-080621
    123434-333333 400000 201978-610408
    1
    2
    
      SELECT 계좌번호, 잔액, 학생번호 FROM 계좌
          WHERE 잔액 >= 200000 AND 잔액 <= 400000
    
    계좌번호 잔액 학생번호
    123434-555555 300000 201926-880215
    123434-444444 400000 201931-781109
    123434-777777 300000 201934-080621
    123434-333333 400000 201978-610408
  • 과목 코드가 ‘COM’으로 시작하는 과목의 과목코드, 과목명, 이수구분을 출력하시오.

    과목코드 과목명 학점 선수과목 이수구분 교수번호
    COM11 컴퓨터의이해 3   교양
    COM12 파이썬 프로그래밍 기초 3   교양
    COM24 자료구조 3 COM12 전공필수
    COM31 데이터베이스 시스템 3 COM24 전공필수
    COM34 알고리즘 3 COM24 일반선택
    COM44 클라우드 컴퓨팅 3   전공필수
    ECE24 놀이지도 3   전공필수
    ECE31 유아언어교육 3 ECE31 전공필수
    HE14 패션과문화 3   일반선택
    HE25 인체생리학 3   전공필수
    HE31 임상영양학 3 HE25 전공필수
    1
    2
    
      SELECT 과목코드, 과목명, 이수구분 FROM 과목
          WHERE 과목코드 = 'COM'
    
    과목코드 과목명 이수구분
         
    1
    2
    
      SELECT 과목코드, 과목명, 이수구분 FROM 과목
      	WHERE 과목코드 LIKE 'COM%'
    
    과목코드 과목명 이수구분
    COM11 컴퓨터의이해 교양
    COM12 파이썬 프로그래밍 기초 교양
    COM24 자료구조 전공필수
    COM31 데이터베이스 시스템 전공필수
    COM34 알고리즘 일반선택
    COM44 클라우드 컴퓨팅 전공필수
  • 소속학과가 ‘컴퓨터과학과’, ‘행정학과’, ‘법학과’인 교수의 교수이름, 직위, 소속학과를 출력하시오

    교수번호 교수이름 직위 소속학과 연봉
    186432-760829 최우성 조교수 생활학과 52000000
    189414-790829 한용운 조교수 법학과 45000000
    191924-730620 이동휘 부교수 행정학과 51000000
    194634-810228 김규식 정교수 컴퓨터학과 70000000
    194834-760517 정재화 부교수 컴퓨터학과 53000000
    201216-158465 정용제 조교수 국어국문학과 55000000
    201547-634895 현경석 정교수 생활학과 66000000
    210315-549413 황지수 부교수 유아교육과 52000000
    1
    2
    
      SELECT 교수 이름, 직위, 소속학과 FROM 교수
      	WHERE 소속학과 IN ('컴퓨터과학과', '행정학과', '법학과')
    
    교수이름 직위 소속학과
    한용운 조교수 법학과
    이동휘 부교수 행정학과
    김규식 정교수 컴퓨터학과
    정재화 부교수 컴퓨터학과

집합 연산자

  • 테이블은 집합, 레코드는 집합에 포함된 원소
  • 집합 이론에서의 이진 연산
    • 합집합: UNION, UNION ALL
    • 교집합: INTERSECT
    • 차집합: EXCEPT
  • 집합 연산자 사용 조건
    • 테이블 R과 S의 차수 및 각 컬럼의 도메인이 일치
  • 교집합 및 차집합은 지원하지 않는 상용 DBMS가 있어 NOT IN등의 연산자를 사용하여 우회

집합 연산자의 사용

  • 과목 테이블에서 ‘컴퓨터의 이해’를 강의하는 교수와 ‘데이터베이스 시스템’을 강의하는 교수의 교수번호를 출력하시오.

    과목코드 과목명 학점 선수과목 이수구분 교수번호
    COM11 컴퓨터의이해 3   교양
    COM12 파이썬 프로그래밍 기초 3   교양
    COM24 자료구조 3 COM12 전공필수
    COM31 데이터베이스 시스템 3 COM24 전공필수
    COM34 알고리즘 3 COM24 일반선택
    COM44 클라우드 컴퓨팅 3   전공필수
    ECE24 놀이지도 3   전공필수
    1
    2
    3
    4
    5
    
      SELECT 교수번호
          FROM 과목 WHERE 과목명 = '컴퓨터의 이해'
      UNION
      SELECT 교수번호
          FROM 과목 WHERE 과목명 = '데이터베이스 시스템'
    
    교수번호
    192634-810228
    194834-760517
    • SELECT모두 교수 번호 추출
      • 결합하려는 두 SELECT절의 순서와 도메인이 동일해야 함

함수의 사용

함수의 개념

  • 특정 목적을 수행하도록 사전에 정의된 연산 및 기능을 수행한 후 결과 값을 반환하는 명령어 집합
  • 고도의 데이터 조작을 지원하고 SQL문 작성의 편의성을 유지
    • 선언적 언어 특성 상 표현 불가능한 데이터 조작을 프로그래밍 언어적 특성을 맞춘 확장된 언어를 사용
      • PL/SQL, TransactSQL, SQL Procedural 등
  • DBMS는 검색 결과가 사용자에게 어떤 형태로 사용되도록 여러 데이터 타입에 대한 다양한 사전 정의 함수를 제공

숫자 함수

  • 삼각 함수, 상수, 올림과 버림, 난수 등의 숫자 데이터 타입에 적용할 수 있는 계산을 위한 함수

    종류 사용 예 의미
    ABS() ABS(X) X의 절대 값을 반환
    SIN(), COS() SIN(X) X의 삼각함수 값을 반환
    CEILING(), FLOOR() CEILING(X), FLOOR(X) X의 보다 크지(작지) 않은 최소(최대)의 정수
    LN() LN(X) 자연 로그 lnX의 값을 반환
    PI() PI() 원주율(π) 값을 반환
    POWER() POWER(X, Y) 거듭 제곱 X^Y 값을 반환
    RAND() RAND() 0과 1 사이의 임의의 값을 반환
    ROUND() ROUND(X[, Y]) X의 Y번째 소수점 위치의 수를 반올림한 값을 반환
    SQRT() SQRT(X) X의 제곱근의 값을 반환
    TRUNCATE() TRUNCATE(X, Y) X의 Y번째 소수점 이하를 버림한 값을 반환

숫자 함수의 사용

  • 졸업까지 8학기가 소요된다고 가정할 때, 각 학과의 학생이 평균적으로 이수해야 하는 학점을 계산하여 학과이름과 함께 출력하시오. 단, 평균 학점의 소수점 이하의 값은 버림하시오.

    학과이름 단과대학 주소 전화번호 졸업학점
    국어국문학과 인문과학대학 02-3668-4550 120
    법학과 사회과학대학 02-3668-4590 130
    생활과학과 자연과학대학 02-3668-4640 125
    유아교육과 교육대학대학 02-3668-4670 125
    컴퓨터과학과 자연과학대학 02-3668-4650 130
    행정학과 사회과학대학 02-3668-4600 120
    영어영문학과 인문과학대학 02-3668-4510 135
    농학과 자연과학대학 02-3668-4600 140
    1
    2
    3
    
      SELECT 학과이름, 졸업학점 / 8, 
          TRUNCATE(졸업학점/8, 0)
          FROM 학과
    
    학과이름 졸업학점 / 8 TRUNCATE(졸업학점/8, 0)
    국어국문학과 15.0 15
    법학과 16.25 16
    생활과학과 15.625 15
    유아교육과 15.625 15
    컴퓨터과학과 16.25 16
    행정학과 15.0 15
    영어영문학과 16.875 16
    농학과 17.5 17

문자 함수

  • 문자열 조작 및 문자 형식 변환 등의 문자와 관련된 다양한 연산을 지원하는 함수

    종류 사용 예 의미
    CHAR_LENGTH() CHAR_LENGTH(X) X의 글자수를 반환 (한글도 1글자로 계산)
    CONCAT() CONCAT(X, Y) X와 Y 문자열을 결합
    LOWER() LOWER(X) X의 문자를 모두 소문자로 변환
    UPPER() UPPER(X) X의 문자를 모두 대문자로 변환
    SUBSTRING() SUBSTRING(X, A, B) X의 A번째 문자부터 B개의 문자열을 반환
    TRIM()/LTRIM()/ RTRIM() TRIM(X)/LTRIM(X)/ RTRIM(X) 양쪽/왼쪽/오른쪽 공백 문자를 제거하고 반환

문자 함수의 사용

  • 학생의 학생번호, 학생이름, 성별, 생년월일을 출력하시오. 단 학생번호는 앞 6자리만 출력하고 성별 뒤에는 ‘성’을 붙이시오.

    학생번호 학생이름 성별 생년월일 나이 전화번호
    201831-331215 김마리아 1991-06-18 29 010-0000-0002
    201834-021216 유관순 1902-12-16 118 010-0000-0001
    201926-880215 지청천 1988-02-15 32 010-0000-0005
    201931-781109 안창호 1978-11-09 42 010-0000-0004
    201934-080621 박은식 1959-09-30 61 010-0000-0007
    201934-790902 안중근 1979-09-02 41 010-0000-0006
    1
    2
    
      SELECT SUBSTRING(학생번호, 1, 6), 학생이름, CONCAT(성별, '성')
      	FROM 학생
    
    SUBSTRING(학생번호, 1, 6) 학생이름 CONCAT(성별, ‘성’)
    201831 김마리아 여성
    201834 유관순 여성
    201926 지청천 여성
    201931 안창호 남성
    201934 박은식 여성
    201934 안중근 남성

날짜 함수

  • 날짜 및 시간 데이터 타입에 적용되어 산술 연산 및 시간 형 변환 등의 조작을 위한 함수

    종류 사용 예 의미
    ADDDATE() ADDDATE(X, INTERVAL Y 단위) X에 Y 단위의 시간을 더한 날짜를 반환
    ADDTIME() ADDTIME(X, Y) X에 Y 시각을 더한 날짜를 반환
    CURDATE(), CURRENT_DATE() CURDATE(), CURRENT_DATE() 현재 날짜를 반환
    CURTIME(), CURRENT_TIME() CURTIME(), CURRENT_TIME() 현재 시간을 반환
    DATE() DATE(X) X에서 날짜(년, 월, 일)을 반환
    YEAR() YEAR(X) X에서 년 값을 반환

날짜 함수의 사용

  • 수강신청 시작일 ‘2020년 2월 8일 00시 00분 00초’를 기준으로 15일 이내에 수강 신청된 수강 데이터의 학생번호, 과목코드, 신청시각을 출력하시오.

    과목코드 학생번호 신청시각
    COM11 201934-790902 2019-02-28 08:32:54
    COM11 202026-590930 2019-02-20 16:00:21
    COM11 202078-080621 2019-02-21 15:21:54
    COM12 201831-331215 2019-08-21 23:25:25
    COM12 201931-781109 2018-08-02 03:25:16
    COM12 201978-610408 2015-02-24 10:25:40
    COM12 202026-590930 2019-02-20 16:00:21
    COM12 202031-816515 2019-02-07 02:44:33
    1
    2
    3
    
      SELECT 학생번호, 과목코드, 신청시각
          FROM 수강
          WHERE TIMESTAMPDIFF(DAY, 신청시각, '2020-2-8-00:00:00') < 15
    
    학생번호 과목코드 신청시각
    202026-590930 COM24 2020-02-17 22:15:34
    202034-596541 COM24 2020-02-17 22:15:30
    201831-331215 COM34 2020-02-20 13:54:22
    202026-590930 COM34 2020-02-22 11:45:55
    202034-596541 COM34 2020-02-22 11:45:55
    201926-880215 COM44 2020-02-02 06:21:55
    202026-590930 HE14 2020-02-21 22:51:43
    201934-790902 HE25 2020-02-11 21:35:44

그룹 질의문

집계 함수

  • 특정 칼럼에 집계 함수를 통해 다양한 통계 연산을 수행할 수 있는 기능
  • SELECT절 또는 HAVING절에 기술
  • 집계 함수의 종류
    • COUNT
      • 칼럼에 있는 값들의 개수
    • SUM
      • 칼럼에 있는 값들의 합
    • AVG
      • 칼럼에 있는 값들의 평균
    • MAX
      • 칼럼에서 가장 큰 값
    • MIN
      • 칼럼에서 가장 작은 값

집계 함수의 사용

  • 단과대학의 총 수를 출력하시오

    학과이름 단과대학 주소 전화번호 졸업학점
    국어국문학과 인문과학대학 02-3668-4550 120
    법학과 사회과학대학 02-3668-4590 130
    생활과학과 자연과학대학 02-3668-4640 125
    유아교육과 교육과학대학 02-3668-4670 125
    컴퓨터과학과 자연과학대학 02-3668-4650 130
    행정학과 사회과학대학 02-3668-4600 120
    영어영문학과 인문과학대학 02-3668-4510 135
    자연과학대학 자연과학대학 02-3668-4600 140
    1
    2
    
      SELECT COUNT(단과대학)
          FROM 학과
    
    COUNT(단과대학)
    8
    1
    2
    
      SELECT COUNT(DISTINCT 단과대학)
          FROM 학과
    
    COUNT(DISTINCT 단과대학)
    4
    1
    2
    
      SELECT COUNT(DISTINCT 단과대학) AS 단과대학수
          FROM 학과
    
    단과대학수
    4

그룹 질의

  • 특정 기준으로 레코드를 그룹화하고 각 레코드 그룹에 대해 집계 함수를 적용하는 질의

    1
    2
    
      `SELECT` 형식
          GROUP BY 컬럼
    
    • SELECT절에 그룹의 기준과 집계 함수 이외의 컬럼은 포함 불가능

그룹 질의의 사용

  • 소속학과별 교수의 수를 출력하시오

    교수번호 교수이름 직위 소속학과 연봉
    186432-760829 최우성 조교수 생활과학과 52000000
    201547-634895 현경석 정교수 생활과학과 66000000
    189414-790829 한용윤 조교수 법학과 45000000
    191924-730620 이동휘 부교수 행정학과 51000000
    194634-810228 김규식 정교수 컴퓨터과학과 70000000
    194834-760517 정재화 부교수 컴퓨터과학과 53000000
    201216-158465 정용제 조교수 국어국문학과 55000000
    210315-549413 황지수 부교수 유아교육과 52000000
    1
    2
    3
    
      SELECT 소속학과, COUNT(*) AS 교수수
          FROM 교수
          GROUP BY 소속학과
    
    소속학과 교수수
    생활과학과 2
    법학과 1
    행정학과 1
    컴퓨터과학과 2
    국어국문학과 1
    유아교육과 1
    1
    2
    3
    
      SELECT 소속학과, COUNT(*) AS 교수수, 교수이름 -- 칼럼의 원자성 위배하기 때문에 사용 불가능
          FROM 교수
          GROUP BY 소속학과
    
    소속학과 교수수 교수이름
    생활과학과 2 최우성, 현경석
    법학과 1 한용윤
    행정학과 1 이동휘
    컴퓨터과학과 2 김규식, 정재화
    국어국문학과 1 정용제
    유아교육과 1 황지수

조건 그룹 질의

  • 그룹 질의의 결과 레코드에 대해 출력 조건을 기술하는 질의

    1
    2
    3
    
      `SELECT` 형식
        GROUP BY 칼럼
        HAVING 조건
    
  • 조건에 대한 기술

    • WHERE
      • 레코드에 대한 조건을 기술
    • HAVING
      • 집계 결과 레코드에 대한 조건을 기술

조건 그룹 질의의 사용

  • 2개 이상의 전공을 신청한 학생의 학생 번호와 신청 전공수를 출력하시오

    학생번호 학과이름 이수학점
    201831-331215 국어국문학과 9
    201831-331215 컴퓨터과학과 39
    201834-021216 국어국문학과 81
    201926-880215 생활과학과 48
    201931-781109 유아교육과 93
    201934-790902 유아교육과 87
    201978-610408 법학과 87
    1
    2
    3
    
      SELECT 학생번호, COUNT(*) AS 신청_전공수
      	FROM 강좌
      	GROUP BY 학생번호
    
    학생번호 신청_전공수
    201831-331215 2
    201834-021216 1
    201926-880215 1
    201931-781109 1
    201934-790902 1
    201978-610408 2
    1
    2
    3
    4
    
      SELECT 학생번호, COUNT(*) AS 신청_전공수
      	FROM 강좌
      	GROUP BY 학생번호
      		HAVING 신청_전공수 >= 2
    
    학생번호 신청_전공수
    201831-331215 2
    201978-610408 2
    202026-590930 2
    1. 어떤 기준으로 GROUP BY수행할 지
      • 학생 번호
    2. COUNT의 조건은 어떻게 명시할지
      • WHERE절 아닌 HAVING



연습 문제


  1. 다음의 고객 테이블에서 아래의 SQL의 실행 결과로 올바른 것은?

    • 고객 테이블

      고객번호(PK) 고객이름 직장주소 연락처
      C540 홍길동 서울시 종로구 1234
      C101 김영희 서울시 종로구 5678
      C211 신채호 광주시 광산구 1111
      C343 이희영 부산시 북구 2222
      C425 박상진 경기도 광주시 3333
      C551 나철 대구시 달서구 5555
      1
      2
      
        SELECT 고객이름, 직장주소 FROM 고객
        WHERE 직장주소 LIKE '%광주%'
      

    a.

    고객이름 직장주소
    신채호 광주시 광산구
    박상진 경기도 광주시
    • LIKE연산자는 관계형 DBMS을 위해 만들어진 특수 연산자로, 부분 일치하는 컬럼을 검색하는데 사용 됨
    • %광주%는 문자열 내부에 ‘광주’가 존재하는지 검사하는 표현이므로 ‘광주’가 어느 위치에 있어도 결과에 포함 됨
  2. 다음의 고객 테이블에서 아래의 SQL의 실행 결과로 올바른 것은?

    • 고객 테이블

      고객번호(PK) 고객이름 직장주소 연락처
      C540 홍길동 서울시 종로구 1234
      C101 김영희 서울시 종로구 5678
      C211 신채호 광주시 광산구 1111
      C343 이희영 부산시 북구 2222
      C425 박상진 경기도 광주시 3333
      C551 나철 대구시 달서구 5555
      1
      2
      
        SELECT 고객이름, 연락처 FROM 고객
            WHERE CHAR_LENGTH(고객이름) = 2
      

    a.

    고객이름 직장주소
    나철 5555
    • CHAR_LENGTH()함수는 컬럼 값의 글자수를 반환하는 함수
    • WHERE 절에서 CHAR_LENGTH(고객이름) = 2는 고객이름이 두 글자인 컬럼을 찾는 조건을 표현하므로 결과에 이름이 외자인 고객만 출력 됨
  3. 다음의 고객 테이블에서 아래의 SQL의 실행 결과로 올바른 것은?

    • 고객 테이블

      고객번호(PK) 고객이름 직장주소 연락처
      C540 홍길동 서울시 종로구 1234
      C101 김영희 서울시 종로구 5678
      C211 신채호 광주시 광산구 1111
      C343 이희영 부산시 북구 2222
      C425 박상진 경기도 광주시 3333
      C551 나철 대구시 달서구 5555
      1
      2
      
        SELECT 직장주소, COUNT(*), 연락처 FROM 고객
            GROUP BY 직장주소
      

    a. 오류 발생

    • GROUP BY절은 특정 기준 컬럼을 대상으로 레코드를 그룹화하고 집계 함수를 적용하는 질의 기법임
    • 이때 SELECT절에는 SELECT절에 그룹의 기준과 집계 함수 이외의 컬럼은 포함 불가능함
    • 주어진 SQL에서는 그룹의 기준과 집계 함수에 포함되지 않는 ‘연락처’ 컬럼이 나열되어 있으므로 실행 시 오류가 발생함



정리 하기


  • ORDER BY절은 검색 결과를 특정 컬럼에 대해 오름차순 또는 내림차순으로 정렬함
    • 오름차순은 ASC, 내림차순은 DESC키워드를 컬럼과 기술하여 정렬의 순서를 결정함
  • BETWEEN, IN, LIKE는 관계형 데이터베이스에서만 사용되도록 고안된 연산자로 범위, 부분 일치, 포함 여부 조건을 기술하기 위해 사용 됨
  • 특정 목적을 수행하도록 사전에 정의된 연산 및 기능을 수행한 후 결과 값을 반환하는 명령어 집합인 함수를 이용하여 보다 정교하게 데이터 검색 결과를 만들 수 있음
  • 그룹 질의는 특정 기준으로 레코드를 그룹 화하고 각 레코드 그룹에 대해 집계 함수를 적용하는 질의임
  • 집계 함수로는 COUNT, SUM, AVG, MIN, MAX가 있음
    • 그룹 질의 후 처리 결과에 대한 조건을 제시하기 위해 HAVING절을 사용함



체크 포인트


  1. 다음 BETWEEN연산의 의미와 동일한 것은?

    1
    2
    3
    
     SELECT * FROM 성적
         WHERE (점수 BETWEEN 90 AND 95)
         AND 학과 = '컴퓨터과학과'
    

    a. 점수 >= 90 AND 점수 <= 95

  2. 다음과 같은 student 테이블의 스키마가 주어졌을 때, 주어진 요구에 대한 SQL 질의어로 옳은 것은?

    1
    2
    
     student(studno, name, grade, score, deptno)
     (단, studno는 학번, name은 학생 이름, grade는 학년, score는 성적, deptno는 학생이 속한 학과 번호를 의미하며, studno는 기본키이다)
    
    1
    
     student 테이블에서 학과 번호가 100번 이상인 학과들의 평균 성적 검색
    

    a.

    1
    2
    3
    
     SELECT deptno, AVG(score) FROM student
     WHERE deptno >= 100
     GROUP BY deptno
    
Contents

[파이썬 프로그래밍 기초] 6강 - 선택 구조

[운영 체제] 6강 - 교착 상태