예제로 익히는 SQL - 2회차

Suhyeon Lee·2024년 10월 2일
0

수업 목표

  1. SQL 기본 구조: SELECT, FROM을 이용한 쿼리문 작성
  2. 중복값을 제거하는 DISTINCT 함수 숙지
  3. SQL 조건문: WHERE, CASE WHEN 이해
  4. SQL 결과값 정렬: ORDER BY 이해



SQL 기본 구조: SELECT, FROM

SELECT *
FROM basic.users -- basic이라는 DB(저장 창고)에 있는 users라는 테이블 가져온다
  • SELECT문을 사용하여 테이블의 (=열, 컬럼, 필드라고도 부름)을 선택할 수 있음
    • 원하는 컬럼을 가지고 오는 역할을 SELECT문에 써 주면 됨
      • e.g. 평균 나이 구하는 데에 얼마나 구매했는지는 필요 없으니 불러오지 않아도 됨
    • 테이블에 어떤 컬럼값이 존재하는지 모르는 상태(아무 조건도 없는 상태)라면 아스테리크(*) 기호를 사용하여 모든 컬럼값을 일일히 명시하지 않고 추출 가능 → 쿼리 작성 전 꼭 체크하고 형태 파악하기
  • 하나의 DB에는 여러 개의 table이 존재할 수 있음(basic.users, basic.theglory, ...)
  • MySQL에서 구문 마지막은 세미콜론(;)으로 끝내야 함
    • 다수의 SQL을 작성할 때 세미콜론을 사용 → 실행하고 싶은 SQL 구문에 마우스 커서를 두고 ctrl+Enter 버튼을 누르면 해당 SQL만 실행됨

우리가 이 테이블이 어떻게 생겼는지 모른다고 가정했을 때 무조건 아스테리크 기호를 이용해 테이블이 어떻게 생겼는지 한번 체크한 뒤 필요한 컬럼 확인하기!



DISTINCT: 중복값 제거

날짜요일
2024-03-11월요일
2024-03-18월요일
2024-03-19화요일
  • 위와 같이 컬럼의 값이 중복되는 경우 DISTINCT 구문을 활용해 중복 없이 컬럼 조회
-- 모든 컬럼을 조회할 경우 
SELECT * 
FROM 테이블이름 
;
-- 특정 컬럼을 조회할 경우
SELECT 컬럼이름, 컬럼이름 
FROM 테이블이름
;
-- 특정 컬럼을 중복 없이 조회할 경우
SELECT DISTINCT 컬럼이름
FROM 테이블이름 
;
  • 예시
    • 중복값을 제거하지 않으면 한 사람이 여러 번 접속한 것도 전부 카운팅됨
SELECT 	COUNT(game_account_id) AS usercnt
		, COUNT(DISTINCT game_accound_id) AS distinctusercnt
FROM basic.users
;

-- usercnt 29,999
-- distinctusercnt 27,141



SQL 조건문

WHERE: 테이블의 모든 데이터를 가져오고 싶지 않을 때

  • SQL의 WHERE문은 조건을 의미
    • 테이블의 특정 데이터만 가져오고 싶을 때
  • SELECT, FROM과 달리 필수는 아님
-- WHERE 절을 이용, 특정 조건을 만족하는 데이터 가져오기 
SELECT *
FROM basic.theglory 
WHERE 성별 ='F'
;



CASE WHEN: 조건에 따른 데이터 구분

  • CASE WHEN을 통해 조건에 따라 다른 결과값을 부여
    • WHEN은 조건에 따라 더 추가 할 수 있음
    • 조건식을 모두 만족하지 않을 경우 ELSE로 간주
SELECT	CASE 
			WHEN 조건식1 THEN 결과1
        	WHEN 조건식2 THEN 결과2
        	ELSE 결과3 
		END AS 새로운 컬럼이름
FROM 테이블명
;
  • CASE WHEN절의 작동 순서
    • 가장 상단에 위치하는 WHEH을 우선으로 하여 참과 거짓을 구분하고 그 다음 WHEN 절을 수행, 마지막으로 ELSE 절을 수행
    • 두 번째 WHEN은 첫 번째 WHEN에서 빠져나온 것만 가지고 실행



조건문을 지원하는 연산자

  • WHERE, CASE WHEN 조건문은 다양한 연산자를 지원함
연산자연산의 예의미
>, <N<10, N>10N이 10 미만, N이 10 초과
>=, <=N<=10, N>=10N이 10 이하, N이 10 이상
=N=10N이 10인 값
!=N!=10N이 10이 아닌 값
LIKELIKE('%과자%')문자열이 ~와 같을 때
(문자열을 기준으로 앞,뒤 문자열과 상관없이
볼 때 %를 앞뒤에 작성해줍니다.)
ANDA AND BA 그리고 B를 모두 만족하는 값
ORA OR BA 또는 B인 값
NOT, !NOT A, !AA가 아닌 값
BETWEENA BETWEEN 10 AND 20A가 10과 20 사이에 포함된 값
INA IN BB에 A가 포함된 값
NOT INA NOT IN BB에 A가 포함되지 않은 값
IS NULLA IS NULLA 값이 비어있는 값
IS NOT NULLA IS NOT NULLA 값이 비어있지 않는 값
  • LIKE 예시

    SELECT *
    FROM basic.users
    WHERE txt LIKE('%과자%')
    
    -- 맛있는 과자
    -- 과자는 살찐다
    
    SELECT *
    FROM basic.users
    WHERE txt LIKE('%과자')
    
    -- 맛있는 과자
    
    SELECT *
    FROM basic.users
    WHERE txt LIKE('과자%')
    
    -- 과자는 살찐다
    • %에 공백이 포함되는지 여부는 RDBMS마다 다름
  • IS NULL, IS NOT NULL

    • 유실된 데이터 처리 → 사용하지 않을 때 주로 사용
      ※ 공백( )은 NULL이 아님
  • 연산자들은 동시에 사용 가능

    • (예) 날짜 데이터가 비어있지 않고 성별이 남자가 아니고 직업이 아나운서 또는 승무원 또는 화가이고 나이가 30세에서 40세 사이
      • 연산의 우선순위를 명시하기 위해, 각 조건에 괄호()를 작성하여 우선적으로 연산
        → 컴퓨터는 어떤 조건이 먼저인지 표시해주지 않으면 알 수 없음
      • 해당 조건들을 모두 만족해야 하므로, 각 조건들은 AND 연산자로 묶기
SELECT *
FROM basic.theglory
WHERE 	날짜 IS NOT NULL
		AND (성별!='M')
        AND 직업 IN('아나운서', '승무원', '화가')
        AND (나이 BETWEEN 30 AND 40) -- 30 이상, 40 이하
;



ORDER BY: 결과값 정렬

  • ORDER BY 구문은 SQL 구문의 가장 마지막에 수행됨
  • 특정 열(Column)을 기준으로 결과값을 출력할 때 사용(필수는 아님)
    • 오름 차순은 ASC, 내림 차순은 DESC
  • 기본값은 ASC(오름차순)
  • 여러 컬럼을 사용할 수도 있음
    • ORDER BY와 가까울 수록 그 우선순위가 높음(ORDER BY 바로 뒤에 나오는 구문이 정렬 우선순위)
/* 컬럼 번호 활용: MYSQL 환경에서는 날짜가 1번, 이름이 2번, 성별이 3번, 나이가 4번, 직업을 5번으로 인식*/
/*다중조건: 날짜를 내림차순으로 우선 정렬하고, 날짜가 같다면 나이를 기준으로 오름차순 정렬*/
select 날짜, 이름, 성별, 나이, 직업 
from basic.theglory 
order by 1 desc, 4 ASC;



과제

로그정의서

구분상세schema
logid로그idint
※로그는 행위에 대한 기록입니다.
※예를 들어, logid=100 은 서비스입장 입니다.
※해당 컬럼은 이번 과제에서 사용되지 않습니다.
ip_addrip주소string
first_login_date첫 접속일자, yyyy-mm-ddstring
game_account_id게임계정idstring
game_actor_id게임캐릭터idint
level현재레벨int
exp현재경험치int
serverno서버넘버int
zone_id지역넘버int
etc_num1파티idint
etc_num2파티원수int
etc_str1아이템 획득경로string
etc_num3아이템 획득량int
etc_str2아이템 이름string

문제 1: 조건절 where 구문의 활용

조건1) first_login_date 컬럼이 2023-01-01 초과인 날짜의

  • game_account_id, game_actor_id, serverno 를 추출

문제 2: 조건절 where 구문의 응용

조건1) level 컬럼이 10 초과이고
조건2) serverno 컬럼이 1이 아니며
조건3) 아이템 이름컬럼이 레벨업 패키지 또는 시즌패스이고
조건4) 아이템 획득 경로가 상점에서 구매한 경우의

  • first_login_date, ip_addr, exp, zone_id 를 추출하고 결과값을 first_login_date, ip_addr 기준 내림차순으로 정렬

문제 3: 조건절 case when 구문의 활용

조건1) case when 구문을 사용하여 레벨구간을 아래와 같이 구분해주시고, as 를 사용하여 컬럼이름을 ‘levelgroup’ 으로 설정해주세요.

<레벨구간>
◦ 1~10Lv 이하
◦ 11~20Lv 이하
◦ 21~30Lv 이하
◦ 31~40Lv 이하
◦ 41~50Lv 이하
◦ 51~60Lv 이하
◦ 61~70Lv 이하
◦ 71~80Lv 이하
◦ 81~90Lv 이하
◦ 91~100Lv

  • game_actor_id, level, levelgroup, first_login_date 컬럼을 추출해주시고, first_login_date를 기준으로 내림차순 정렬
profile
2 B R 0 2 B

0개의 댓글