데이터 취업스쿨 스터디노트(8주차)

김다희·2024년 5월 20일

5.20

  • 오늘 수강한 분량: SQL 3~5

SQL

Table 변경

table 이름 변경

alter table mytable(기존테이블) rename person(바꿀 테이블명);

table에 열(column) 추가

alter table person(테이블) add column agee(열) double(열 형태/double, int 등)

열(column) 형태 바꾸기

alter table person modify column agee int(바꿀 형태);

열(column) 이름 바꾸기

alter table person change column agee age int;

열(column) 삭제

alter table person drop column age;

table 삭제

drop animal(테이블명)

insert: 값 추가

추가 전 table 만들기

values 추가

  • insert into person(id, name, age, sex)
    -> values (1, '이효리', 43, 'F');
  • insert into person
    -> values (2, '이상순', 48, 'M');

모든 values 값 보기(* 사용하면 모든 것!)

selcet * from person

특정 열만 가져오기

select name, age, sex from person: name, age, sex 열의 values 만 가져온다.

조건 명령어: where

  • ex. 성별이 여자인 값만 가져오기
    -> select * from person where sex = 'F';

value 값 변경

update person set

  • ex. 나이 변경
    -> update person set age = 23 where name = '이효리';

value 값 삭제

delete from person where

order by: 정렬

  • order by 열(column), order by 열(column) ASC : 열 기준으로 오름차순 정렬
  • order by 열(column) DESC : 열 기준으로 내림차순 정렬

기본 table

예제

예제1
  • name, age 열을 age 기준 오름차순 정렬
예제2
  • name, age, job_title, agency 열을 agency 기준 오름차순, age 기준 내림차순 정렬

비교 연산자

  • where 조건문에 비교 연산자를 활용하는 방식으로 사용!

예제

예제1
  • age = 29를 만족하는 값의 name, age
예제2
  • age < 29를 만족하는 값의 name, age
예제3
  • age가 29세가 아닌 값의 name, age, birthday, agency

논리 연산자

1. AND: 조건을 모두 만족하는 경우 TRUE

  • ex. 나이가 29세이고 성별이 여성인 데이터 검색

2. OR: 두 가지 이상 조건이 있을 때, 둘 중 하나만 해당하면 TRUE

  • ex. 나이가 25세보다 작거나, 30세보다 큰 데이터 검색

  • ex. 나이가 29세보다 작고 여자이거나, 나이가 30세보다 크고 남자인 데이터 검색

  • and 조건문 끼리 ()를 해주기! (보기 편하게) / 안해도 정상 작동하긴 함

  • ex. YG 소속이거나 나무엑터스 소속인 30세 이상 연예인

  • 위의 방법처럼 하면 내가 원하는 값을 찾을 수 없음

  • 꼭 괄호를 잘 해줘야 내가 원하는 값을 얻을 수 있다!

5.21

  • 오늘 수강한 분량: SQL 6~9

3. NOT: 조건을 만족하지 않는 경우 TRUE

  • 기본 문법

    select *
    from tablename
    where not condition
    where not age<30;

  • ex. 생일이 1990년 이후이면서 여자가 아닌 데이터

    - 생일이 n년 이후는 'brithday > 19891231' 의 형식으로 작성해야 함

  • 아이디가 홀수인 데이터
    - (id % 2) = 1

4. BETWEEN: 조건값이 범위 사이에 있으면 TRUE

  • 기본 문법

    select *
    from tablename
    where column1 BETWEEN value1 AND value2;

  • 나이가 20살에서 40살 사이인 데이터

5. IN: 목록 안에 조건값이 존재하는 경우 TRUE

  • 기본 문법

    select *
    from tablename
    where column IN (value1, value2 ...)

  • 나이가 28세, 48세 중 하나인 데이터 검색

    - where age = 28 or age = 48 이라고 써도 결과값 같음!

6. LIKE: 조건값이 패턴에 맞으면 TRUE

  • 기본 문법

    select *
    from tablename
    where column LIKE pattern;

  • n으로 시작하는~ : 'n%'
  • n으로 끝나는~ : '%n'
  • n을 포함하는~ : '%n%'
  • 2번째 글자가 G인~ : '_G%' / 언더바 사용
  • 첫번째 글자가 '가'로 시작하면서 최소 2글자 이상인~ : '가_%'
  • 첫번째 글자가 '가'로 시작하면서 최소 5글자 이상인~ : '가_%'
  • 첫번째 글자가 '영'으로 시작하면서 모델로 끝나는~ : '영%모델'
  • 소속사 이름이 'YG엔터테이먼트'인 데이터 검색

  • 'YG'로 시작하는 소속사 이름을 가진 데이터 검색

    - where column LIKE 'YG%';

  • 직업명이 2가지 이상인 데이터 중에 영화배우나 탤런트가 아닌 데이터 검색

    - not (job_title LIKE '%영화배우%' or job_title LIKE '%탤런트%');
    - 맨 앞에 not 을 쓰고 괄호로 묶어서 작성해주기!

  • 아이유, 이미주, 송강, 이수현 중에 가수만 직업으로 가졌거나, 가수를 병행하지 않고 텔런트를 하는 데이터 검색

UNION

  • 여러 개의 SQL 문을 합쳐서 하나의 SQL 문으로 만들어주는 방법
  • 주의: 컬럼의 갯수가 같아야 한다

UNION 문법

  • UNION: 중복된 값을 제거하여 알려준다
  • UNION ALL: 중복된 값도 포함하여 모두 보여준다

select column1, column2, ... from test1
UNION | UNION ALL
select column1, column2, ... from test2

  • 예제 전 데이터 테이블 2개

  • 예제1 UNION ALL: '이수현' 값이 두 번 나타남

  • 예제2 UNION: '이수현' 값이 한 번만 나타난 모습

  • 예제3 UNION: 열의 갯수를 단순히 맞춰준다고 해서 UNION이 제대로 작동하는 것은 아님

    - 첫번째 UNION이 에러가 난 건 열의 갯수가 다르기 때문
    - 두번째 쿼리의 열을 하나 지우고 실행했더니, '강동원'의 생년월일이 job_title에 들어감
    -> 단순히 열의 갯수만 조정하면 안되고, 내가 원하는 값의 열을 잘 맞춰서 쿼리를 작성해야 함!

  • 문제1
    : 직업이 가수인 (가수를 포함하는) 데이터를 검색하는 쿼리와
    직업이 텔런트인 (텔런트를 포함하는) 데이터를 검색하는 쿼리를
    중복을 제거하여 합쳐서 실행

  • 문제2
    : 성이 이씨인 데이터를 검색하는 쿼리와 1970년대생을 검색하는 쿼리를
    중복을 포함하여 합쳐서 실행

5.22

  • 오늘 수강한 분량: SQL 10~12

JOIN

UNION과 JOIN의 차이

  • UNION은 수직 결합, JOIN은 수평 결합

INNER JOIN

두 개의 테이블에서 공통된 요소들을 통해 결합하는 조인방식(교집합)

INNER JOIN 문법

select column1, column2 ...
from tableA
INNER JOIN tableB
ON tableA.column = tableB.column
where conditions;

-예제: snl_show에 호스트에 출연한 celeb을 기준으로 celeb 테이블과 snl_show 테이블을 inner join 하기

LEFT JOIN

두 개의 테이블에서 공통영역을 포함해 왼쪽 테이블의 다른 데이터를 포함하는 조인 방식

LEFT JOIN 문법

select column1, column2 ...
from tableA
LEFT JOIN tableB
ON tableA.column = tableB.column
where conditions;

  • 예제: snl_show 호스트로 출연한 celeb을 기준으로 celeb 테이블과 snl_show 테이블을 left join 하기

RIGHT JOIN

두 개의 테이블에서 공통영역을 포함해 오른쪽 테이블의 다른 데이터를 포함하는 조인 방식

RIGHT JOIN 문법

select column1, column2 ...
from tableA
RIGHT JOIN tableB
ON tableA.column = tableB.column
where conditions;

  • 예제: snl_show 호스트로 출연한 celeb을 기준으로 celeb 테이블과 snl_show 테이블을 right join 하기

FULL OUTER JOIN

두 개의 테이블에서 공통영역을 포함해 양쪽 테이블의 다른 영역을 모두 포함하는 조인 방식(합집합)

FULL OUTER JOIN 문법
  • LEFT JOIN & RIGHT JOIN 을 UNION으로 합쳐줘야 함
    SELECT column1, column2 ...
    FROM table A
    LEFT JOIN table B
    ON tableA.column = tableB column
    UNION
    SELECT column1, column2 ...
    FROM table A
    RIGHT JOIN table B
    ON tableA.column = tableB column
  • 기존에 배웠던 대로 사용하면 오류가 나타남
    select column1, column2 ...
    from tableA
    GULL OUTER JOIN tableB
    ON tableA.column = tableB.column
    where conditions;
    -> MYSQL 에서는 FULL JOIN를 지원하지 않고 있기 때문
  • 오류
  • 예제: snl_show 호스트로 출연한 celeb을 기준으로 celeb 테이블과 snl_show 테이블을 full outer join 하기

SELF JOIN

SELF JOIN 문법

SELECT column1, column2 ...
FROM tableA, tableB ...
WHERE condition;

  • 예제1: snl_show 호스트로 출연한 celeb을 기준으로 celeb 테이블과 snl_show 테이블을 self join

  • 예제2: celeb 테이블의 연예인 중, snl_show 에 host로 출연했고, 소속사가 안테나인 사람의 이름과 직업을 검색
    - step1: celeb 테이블 중 소속사가 안테나인 사람 검색
    - step2: celeb 테이블 중 snl_show에 host로 출연한 사람 검색
    - step3: 위의 step1,2를 합쳐서 최종 데이터 검색

  • 예제3: celeb 테이블의 연예인 중, snl_show에 host로 출연했고, 영화배우는 아니면서 YG엔터테이먼트 소속이거나, 40세 이상이면서 YG엔터테이먼트 소속이 아닌 연예인의 나이, 직업, 소속사, 시즌, 에피소드 정보를 검색

  • 예제4: snl_show에 출연한 연예인의 snl_show 아이디, 시즌, 에피소드, 이름, 직업정보 검색

  • 참고: 동일한 컬럼명이 존재하는 경우에만 테이블명 명시(안그럼 오류남)

  • 예제5: 답안이 이상한 것 같아 스킵

  • 문제1: snl_show 에 출연한 celeb 테이블의 연예인 중, 영화배우나 텔런트가 아닌 연예인의
    아이디, 이름, 직업, 시즌, 에피소드 정보 검색

  • 문제2: snl_show 에 출연한 celeb 중, 작년 9월 15일 이후에 출연했거나
    소속사 이름이 ‘엔터테이먼트’ 로 끝나지 않으면서 영화배우나 개그맨이 아닌 연예인의
    celeb 아이디, 이름, 직업, 소속사 검색

5.25

  • 오늘 수강한 분량: SQL 13~14

CONCAT

여러 문자열을 하나로 합치거나 연결

CONCAT 문법

SELECT CONCAT('str1', 'str2', ...);

  • 예제1: 문자 + 문자 연결

  • 예제2: 문자 + table 안의 열 값과 연결

ALIAS

컬럼이나 테이블에 이름 별칭 생성

  • import pandas as pd 에서 as가 alias 임!!

ALIAS 문법

  • column

    select column as alias
    from tablename

  • table

    select *
    from tablename as alias;

  • 예제1: name 을 이름으로 별칭을 만들어 검색
    : select name as '이름' from celeb;

  • 예제2: name은 이름으로, agency는 소속사로 별칭을 만들어 검색
    : select name as '이름', agency as '소속사' from celeb;

  • 예제3: name과 job_title 합쳐서 profile 이라는 별칭 만들어 검색
    : concat (name, ' : ', job_title) as profile from celeb;

  • 예제4: snl_show에 출연한 celeb을 기준으로 두 테이블을 조인하여 테이블은 c, snl_show 테이블은 s라는 별칭을 만들어서 출연한 시즌과 에피소드, 이름, 직업 검색
    : select s.season, s.episode, c.name, c.job_title
    from celeb as c, snl_show as s
    where c.name = s.host;

  • 예제5: snl_show에 출연한 celeb을 기준으로 두 테이블을 조인하여 다음과 같이 별칭을 사용하여 검색
    - 시즌, 에피소드, 방송일을 합쳐서 '방송정보'
    - 이름, 직업을 합쳐서 '출연자정보'
    : select concat(s.season, '-', s.episode, '(', s.broadcast_date, ')') as '방송정보',
    concat(c.name, '(', c.job_title, ')') as '출연자정보',
    from celeb as c, snl_show as s
    where c.name = s.host;

  • as 는 꼭 넣지 않아도 문법만 잘 지켜주면 알아서 인식 함!

문제1: 이름이 3글자인 연예인 정보 다음과 같이 검색

문제2: 앞을자가 2글자이고, '엔터테이먼트'로 끝나는 소속사 연예인 중 SNL에 출연한 연예인의 신상정보(나이, 성별)와 출연정보(시즌-에피소드, 방송날짜), 소속사 정보를 방송날짜 최신순으로 정렬하여 다음과 같이 검색
: select agency as '소속사 정보',concat('나이 : ', c.age, '(', c.sex, ')') as '신상정보',concat(s.season, '-', s.episode, ', ', '방송날짜 :', s.broadcast_date)as '출연정보'
from celeb as c, snl_show as s
where c.name = s.host and c.agency like '__엔 터테이먼트'
order by s.broadcast_date DESC;

DISTINCT

검색한 결과의 중복 제거

DISTINCT 문법

SELECT DISTINCT column1, column2 ...
FROM tablename;

예제: 연예인 소속사 종류를 검색-중복 제거
: select distinct agency from celeb ;

LIMIT

: 검색 결과를 정렬된 순으로 주어진 숫자만큼만 조회

LIMIT 문법

SELECT column1, column2 ...
FROM tablename
WHERE condition
LIMIT number;

  • 예제1: 나이순으로 2개만 검색

  • 예제2: snl에 출연한 연예인의 정보를 나이순으로 2개만 검색

5.26

  • 오늘 수강한 분량: SQL 심화 1~2

AWS RDS

MYSQL RDS 생성

  • aws -> 서비스 -> 데이터베이스 -> RDS -> 데이터베이스 생성

anaconda로 AWS RDS 접속하기

mysql -h <엔드포인트> -P <포트> -u <마스터 사용자 이름> -p

AWS RDS 중지 & 시작

  • 중지: 데이터베이스 -> 작업 -> 중지
  • 시작: 데이터베이스 이름 선택 -> 작업 -> 시작
profile
안녕하세요

0개의 댓글