ch0nny_log

[빅데이터분석]SQL_TIL2 본문

빅데이터 분석(with 아이티윌)/SQL

[빅데이터분석]SQL_TIL2

chonny 2024. 5. 10. 18:20

* 개인정보는 모자이크 처리했습니다.

** DAY 1_복습 

2024.05.10 - [sqld] - [빅데이터분석]SQL_TIL1

 

[빅데이터분석]SQL_TIL1

1. OT 진행2. database 소프트웨어 시장 점유율  ** 오라클설치1. c##scott 유저 생성 1) 명령프롬프트 창 열기 (작업표시줄에 cmd) 2) 명령프롬프트 창에 " sqlplus / as sysdba " 기입 3) 접속한 유저가 누군

chonny1210.tistory.com

 

SQL: 데이터베이스의 데이터를 검색하고 변경하는 데이터베이스 언어

  • 오라클 설치
  • SQL 의 종류
  • 특정 컬럼 선택하기
  • 모든 컬럼 선택하기
  • 컬럼별칭을 이용해서 컬럼명 변경하기

[TIL 2] 240510

- SQL을 배우는 궁극적인 목표?  → 데이터에서 insight를 발견하기 위해서

- SQL 로 데이터 검색 → 파이썬과 테블로를 이용해서 데이터 시각화 → 머신러닝(기계학습)을 이용해서 데이터를 분류& 예측  

 


 

예제 4. 연결 연산자 사용하기 (||)
→ 연결예산자: 데이터를 연결해서 출력하게 해주는 연산자 
# 이름과 월급 데이터를 연결지어 나타내기.
select ename || sal
 from emp;​
select  ename || ' 의 월급은  ' ||  sal
  from emp;

#오라클은 곧은 따옴표만 인식 (' ')

#싱글 쿼테이션 마크(' '): 문자임을 오라클에게 알려주는 것.
#더블 쿼테이션 마크(" "): 컬럼 별칭을 사용할 때 1) 대소문자 구분, 2) 특수문자, 3)공백문자 를 사용할 때만 사용​
문제 1. 다음과 같이 결과를 출력하는 SQL을 작성하시오. 
select ename || '의 직업은 ' || job || ' 입니다' 
  from emp;

 

문제 2. 다음과 같이 결과를 출력하는 SQL을 작성하시오.
select ename || '님은 ' || address|| ' 에서 거주하고 있습니다.'
    from emp19;

# 연결 연살자로 연결해서 문자열을 만들었을때의 컬럼 별칭은 맨 마지막에 as로 적고 작성.
select ename || '님은 ' || address|| ' 에서 거주하고 있습니다.' as "거주지 정보"
    from emp19;


예제 5. 중복된 데이터를 제거하여 출력하기. (distinct) 
 # 사업 테이블에는 직업의 종류가 몇개인가요?
select  job
   from  emp;​
 
 # 위의 결과를 다시 출력하는데 직업을 중복제거해서 출력하시오.
      select distinct job
	from emp;
문제1. 부서번를 출력하는데 중복을 제거해서 출력하시오.
select distinct deptno
	from emp;​
문제2.  우리반 테이블에서 나이를 출력하는데 중복을 제거해서 출력하시오.
select distinct age   
	from emp19;

# distinct다음에 age와 ename을 같이 쓴다면 어떻게 결과가 나올까?
select distinct age, ename
	from emp19;

 

문제 3. 우리반 테이블에서 학생들이 사용하는 통신사는 뭐가 있는지 출력하시오.
select distinct telecom
	from emp19;​
    
# 현업 tip!
# 중복제거를 해도 같은 값이 다른형식으로 나올 수 있다 -> 이때 사용하는 것이 SQL 전처리 과정

예제6. 데이터를 정렬해서 출력하기 (order by)
# 이름과 월급을 출력하시오. 이때 월급이 낮은 사원부터 높은 사원 순으로 출력하시오.

# asc: 오름차순 
select ename, sal
	from emp
    order by sal asc;​

# desc: 내림차순
select ename, sal
	from emp
    order by sal desc;​
오름차순
내림차순

 

문제1. 우리반 테이블에서 이름과 나이를 출력하는데 나이가 높은 학생부터 낮은 학생순으로 출력하시오.
select ename, age
	from emp19
    order by age desc;​

 

문제2. 위의 결과에서 생일도 같이 정렬해서 출력하시오.
select ename, age, birth
	from emp19
    order by age desc, birth asc;
    ​​
문제3. 사원 테이블에서 직업과 월급을 출력하시오.
 select job, sal 
    from emp;​
문제4. 직업과 월급을 출력하는데 직업을 abcd순으로 정렬해서 출력하시오.
 select job, sal 
    from emp
    order by job asc;​
문제5. 위의 결과를 다시 출력하는데 직업을 abcd 순으로 정렬해 놓은 것을 기준으로 월급이 높은 사원 순으로 출력되게 하시오.
 select job, sal 
    from emp
    order by job asc, sal desc;​

 

문제6. 우리반 테이블에서 이름과 나이를 출력하는데 성씨가 ㄱㄴㄷㄹ.. 순으로 출력되게 하시오.
select ename, age
	from emp19
    order by ename asc;​
    
# order by 절에 컬럼명 대신 숫자(컬럼순서)를 적어도 된다.
select ename, age
	from emp19
    order by 1 asc;​
문제7. 위의 결과를 이름을 ㄱㄴㄷㄹ...순으로 출력하고 나이를 높은 학생부터 출력하게 하시오.
select ename, age
	from emp19
    order by ename asc, age desc;

# 위와 같음
select ename, age
	from emp19
    order by 1 asc, 2 desc;​

예제7. where 절 배우기( 숫자 데이터 검색)
→ where 절은 테이블에서 특정행들만 선택하게 하는 절
#월급이 3000인 사원들의 이름과 월급을 출력하시오

select ename, sal
	from emp
    where sal=3000;​
    
# where절에 '검색조건'을 주고 특정 행들만 선택할 수 있다.
# 코딩순서: select→ from→ where→ order by
# 실행순서: from→ where→ select→ order by

예제 7-1. 직업이 SALESMAN 인 사원들의 이름과 월급과 직업을 출력하시오.

select ename, sal, job
	from emp
    where job='SALESMAN';
    
# 문자인 경우 꼭 '' 를 감싸준다.

 

문제1. 부서번호가 20번인 사원들의 이름과 월급과 부서번호를 출력하시오.
select ename, sal, deptno
	from emp
    where deptno=20;​
문제2. 우리반 테이블에서 나이가 28살인 학생들의 이름과 나이와 주소를 출력하시오.
select ename, age, address
	from emp19
    where age=28;​
문제3. 위의 결과를 이름의 성씨가 ㄱㄴㄷㄹ..순으로 출력하시오.
select ename, age, address
	from emp19
    where age=28
    order by ename asc;​
    
    # as로 명칭을 변경했을 경우 order by절에 변경명칭을 사용해도 괜찮다.
select ename as 이름, age, address
	from emp19
    where age=28
    order by 이름 asc;​

예제8. where절 배우기2 (문자와 날짜 검색)
→ 문자와 날짜는 양쪽에 싱글 쿼테이션 마크를 둘러줘야 한다. (싱글 쿼테이션 안에 있는 데이터가 문자 또는 날짜라고  오라클에게 알려주는 것)

 

문제1. 직업이 ANALYST인 사원들의 이름과 월급과 직업을 출력하시오.
select ename, sal, job
	from emp
    where job= 'ANALYST';
문제2. 직업이  SALESMAN 인 사원들의 이름과 월급과 직업을 출력하는데 월급이 높은 사원 부터 낮은 사원순으로 출력하면서 컬럼명이 한글로 출력되게하시오.
select ename as 이름, sal as 월급, job as 직업
	from emp
    where job= 'SALESMAN'
    order by sal desc;
문제3. 우리반 테이블에서 생일이 96년 4월 17일인 학생의 이름고하 생일을 출력하시오.
select ename, birth
	from emp19
    where birth= '96/4/17';​
문제4(복습문제). 지금까지 배운내용으로 우리반에 생일이 같은 학생이 있는지 검색하세요.
select ename, birth
	from emp19
     order by birth asc;
     
# 30명이니 눈으로 확인
문제5 (복습문제) . 직업이 SALESMAN인 사원들의 부서번호를 출력하는데 중복을 제거하고 출력하시오.
select distinct deptno
    from emp
    where job='SALESMAN';​
문제6(복습문제). 나이가 27살인 학생들의 통신사를 출력하는데 중복을 제거하여 출력하시
select distinct telecom
    from emp19
    where age=27;​

예제9. 산술 연산자 배우기(*, /, +, -)
결측치를 오라클에서는 null 값이라고 한다. 
→ null 값? (1. 데이터가 없는 상태 2. 알 수 없는 값 unkown)
→ 산술 연산자 사용시 nvl 함수 고려 꼭 하기
select ename, sal,comm,sal+comm 
	from emp​

# 알수없는 값 null 발생
# 이 경우는 null 값을 0으로 변경해 줘야 됨 -> "NVL함수" 사용

 

문제1. 이름, 월급, 커미션,  월급+ 커미션을 출력
select ename, sal,comm,NVL(comm,0) 
	from emp​
    
# 0은 null을 대체하는 값
문제2. 이름과 커미션, 커미션+200을 출력하시오.
select ename, comm, 200+nvl(comm,0) 
	from emp;

** 데이터 분석가들이 데이터를 구하는 방법

1. 본인 회사에 있는 데이터를 분석

2. 직접 웹 스크롤링을 해서 데이터 수집(파이썬)

3. 공공 데이터를 수집하는 사이트 (공공데이터 포털 etc)

 

* sqldeveloper을 이용해서 엑셀 데이터를 오라클 데이터베이스에 입력하기

1. CREATE TABLE  테이블명 +내용

2. 테이블(필터링 됨) + 클릭 하여 신규 생성된 테이블 확인

3. 생성된 테이블 오른쪽 마우스누르고 데이터 임포트

4. 소스 아래 파일 찾아보기로 csv 파일 넣고 완료까지 다음 누르기.


문제3. 2022년도 서울시 소상공인 테이블의 상권업종대분류명을 출력하는데 중복을 제거해서 출력하시오.
select distinct 상권업종대분류명
    from market_2022;​

 

문제4. 상권업종 대 분류명이 음식인 데이터의 모든 컬럼과 데이터를 검색하시오
 select * 
    from market_2022
    where 상권업종대분류명='음식';​

 

문제5. market_2017년 테이블을 생성하고 market_2017.csv 데이터를 테이블에 입력하시오.
1. CREATE TABLE  테이블명 +내용
2. 테이블(필터링 됨) + 클릭 하여 신규 생성된 테이블 확인
3. 생성된 테이블 오른쪽 마우스누르고 데이터 임포트
4. 소스 아래 파일 찾아보기로 csv 파일 넣고 완료까지 다음 누르기.

예제10번. 비교 연산자 배우기 1.(>, <, >=, <=, =, !=, <>, ^=)
→ 같지 않다(!=, <>, ^=)
#월급이 2000 이상인 사원들의 이름과 월급을 출력하시오.
select ename, sal 
    from emp
    where sal>=2000;​

 

문제1. 우리반 테이블에서 나이가 30살 이상인 학생들의 이름과 나이와 주소를 출력하시오.
select ename, age, address
    from emp19
    where age>=30;​​

 

문제2. 위 문제에서 나이가 높은 학생 부터 출력하시오.
select ename, age, address
    from emp19
    where age>=30;​​​

 

문제3. 직업이 SALESMAN이 아닌 사원들의 이름과직업을 출력하시오.
   select ename,job
    from emp
    where job<>'SALESMAN';​
    
    #비교연산자는 검색 조건을 줄 수 있는 절에 사용 할 수 있다.

예제11번. 비교 연산자 배우기 2. (Between.. and)
* 오라클의 비교 연산자 4가지
1. between...and
2. like
3. in
4. is null
# 월급이 1000이상인 사원들의 이름과 월급을 출력하시오.
select ename, sal 
	from emp
    where sal>=1000;
    
# 월급이 3000이하인 사원들의 이름과 월급을 출력하시오.
select ename, sal 
	from emp
    where sal<=3000;
    
# 월급이 1000이상 3000이하인 사원들의 이름과 월급을 출력하시오.(숫자연산자)
select ename, sal
	from emp
    where sal>=1000 and sal<= 3000;​
    
# 월급이 1000이상 3000이하인 사원들의 이름과 월급을 출력하시오.(비교연산자)
select ename, sal
	from emp
    where sal between 1000 and 3000;
    
# ★ 중요 내용: where 컬럼명 between 낮은값 and 높은값 
#               between... and...는 낮은값과 높은값을 포함(>= and <= 과 동일)
문제1. 우리반 테이블에서 나이대가 20대인 학생들을 출력하시오.
select ename, age
	from emp19
	where age between 20 and 29;​
문제2. 81년도에 입사한 사원들의 이름과 입사일을 출력하시오.
select ename, hiredate
	from emp
	where hiredate between '81/01/01' and '81/12/31';​
문제3. 81년도에 입사하지 않은 사원들의 이름과 입사일을 출력하시오.
select ename, hiredate
	from emp
	where hiredate not between '81/01/01' and '81/12/31';​
    
# 사이 간격에 포함하지 않을 경우 between 앞에 not을 기입한다.
문제4. (난이도 상) 위의 결과를 not between을 쓰지 말고 출력하시오.
select ename, hiredate
	from emp
	where hiredate <= '81/01/01' or hiredate>='81/12/31';
    
# 논리 연산자 or을 사용하여 not between 을 대체할 수 있다.
*연산자 총 정리
1. 산술연산자: +, - ,* ,/
2. 비교연산자: >, <, >=, <=, =, !=, <>, ^=
2.1. 기타 비교 연산자: between...and, like, in, is null
3. 논리연산자: and, or, not

* 기타 비교 연산자 4가지
1. between...and--------> not between...and
2. like----------------------> not like
3. in------------------------> not in
4. is null------------------>is not null
문제5(복습문제). 월급이 1000에서 3000사이인 사원들의 이름과 월급을 출력하는데 월급 높은 사원들 부터 출력하시오.
select ename, sal
	from emp    
    where sal between 1000 and 3000 
    order by sal desc;​
    
    
 # order by는 코딩도 제일 마지막, 실행도 제일 마지막에 진행한다.

예제 12번. 비교 연산자 배우기 3(Like)
★ like 연산자와 짝꿍인 키워드 
1. % 와일드카드 : % 앞뒤 자리에 뭐가 와도 관계 없고, 갯수도 관계없음.
2. _ 언더바 : 이자리에 뭐가 와도 관례없는데, 그 갯수는 한개여야됨
3. escape: %와 _를 특수문자인 %와 _로 검색하게 하는 키워드
이름의 첫글자가 S로 시작하는 사원들의 이름과 월급을 출력하시오.

select ename, sal
	from emp
    where ename like 'S%';
    
# % 는 와일드카드(WILD CARD)라고 한다. 
# 카드의 의미는 이 자리에 뭐가 와도 관계가 없고 그 갯수 또한몇개가 되든 관계가 없다는 뜻이다. 
# 그런데 이 % 가 특수문자 %가 아니라 와일드 카드가 되려면 반드시 like 가 함께 사용되야한다​
문제 1번. 우리반에서 성씨가 김씨인 학생들의 이름과 나이를 출력하시오
select ename, age
	from emp19
    where ename like '김%';​
문제 2번(데이터 검색). 서울에서 사는 학생들 이름과 주소를 출력하시오.
select ename, address
	from emp19
    where address like '서울%';​
문제 3번.우리반 학생들 중에서 통신사가 sk인 학생들의 이름과 통신사를 출력하시오.
select ename, telecom
	from emp19
    where telecom like 'sk%' or telecom like 'SK%';​
문제4. 이름의 끝 글자가 T로 끝나는 사원들의 이름을 출력하시오.
select ename
	from emp
    where ename like '%T';​
문제5. 우리반 학생중에서 이메일 .net으로 끝나느 학생의 이름과 이메일을 출력하시오.
 select ename, email
	from emp19
    where email like '%.net';​
문제6. 사원 테이블에서 이름의 두번째 철자가 M인 사원들의 이름을 출력하시오.
select ename
	from emp
    where ename like '%M_';​
문제7. 이름의 3번째 철자가 L인 사원들의 이름을 출력하시오.
 select ename
	from emp
    where ename like '__L%';​
문제8. 우리반에서 네이버 이메일을 사용하는 학생의 이름과 이메을 출력하시오
문제9. 우리반에서 naver 를 포함하는 이메일을 사용하는 학생의 이름과 이메을 출력하시오
 select ename, email
	from emp19
    where email like '%naver%';​
문제10. 송파구에 거주하는 학생들의 이름과 주소를 출력하시오.
 select ename, address
	from emp19
    where address like '%송파구%';​
문제11. 이름의 두번째 철자가 %인 사원의 이름을 출력하시오.
select ename
	from emp
    where ename like '_m%%' escape 'm';​
# m(다른문자도 상관없음)다음에 나오는 %는 와일드 카드가 아니라 특수문자%이다.
문제12. 아래의 데이터를 입력하고 이름의 두번째와 세번째 철자가 %인 사원들의 이름을 출력하시오.
insert into emp(empno, ename, sal)
	values(2345, 'A%%B', 4500);

COMMIT;​
select ename
	from emp
    where ename like '_M%M%%' escape 'M';
문제13(복습문제). market_2022 테이블에서 상호명에 스타벅스를 포함하는 데이터의 모든 컬럼을 출력하시오.
select 상호명 
	from market_2022 
	where 상호명 like '%스타벅스%';​
문제 14(복습문제). 2022년도 기준으로 서울 시내에 동대문 엽기 떡볶이 매장이 몇개가 있는지 출력하시오
select count(상호명) 
    from market_2022 
    where 상호명 like '%동대문엽기%';​
문제15(마지막 문제). 서울 시내에는 GS편의점이 더 많은지 CU 편의점이 더 많은지 2022년도를 기준으로 알아내시오.
select count(*)
 from market_2022
 where (상호명 like 'GS%' or 상호명 like 'gs%') and 상권업종소분류코드 = 'D03A01';

결과 : 2076개



select count(*)
 from market_2022
 where (상호명 like 'CU%' or 상호명 like 'cu%') and 상권업종소분류코드 = 'D03A01';

결과 : 1929개