K-디지털 빅데이터 분석서비스 개발자과정 20.11.02~21.04.12/SQL

20.11.05. 오전 - 데이터베이스 where절 활용 및 연습문제

공부하는 모도리 2020. 11. 5. 12:49
728x90
반응형

어제 수업분은 비공개로 등록. 왠지.. 비밀번호도 있는 것 같아서 건너뛰어야할 것 같기에.

 

vol, p99

다른 비교 조건

 

p100

a는 항상 하한, b는 항상 상한. 그리고 항상 이상, 이하값을 가진다.

오타가 나지 않도록 항상 주의하자.

 

P101

MANAGER_ID = 나를 관리하는 사수 ID

너무 기니까 줄이자

줄여주는 것에 대해 설명하자면,

a는 문자와 날짜값을 줄여주는 역할.

9를 입력한 갯수만큼 줄여주는 역할.

근데 내가 잘못 입력해서 이걸 초기화하고 다시 설정하고 싶다?

column salary clear ← 바로 이 클리어를 이용해 줄여준다.

 

목록에 사용되는 문자 또는 날짜는 작은 따옴표로 꼭 묶어줘라 (교재 참고)

 

p102

'S%' 첫글자 S를 찾아라

'%S' 끝나는 S를 찾아라

'%S%' S가 포함된 문장을 찾아라

그럼 난 SS가 붙어있는 것을 찾고 싶은데? → '%SS%'

작년 실기에서 대부분의 사람들이 틀린 예제를 알려드릴게요

name = '이%' 

왜 틀렸을까요?

 - 이%라는 이름을 찾아버리니까 틀린다.

☆ like 연산자는 %와 _가 문장전체, 문자하나를 알려주는 옵션이지만, 다른 연산자에서는 %와 _가 그대로 문자로 인식이 되어버린다.

 

p104

null값 찾기

보너스 없는 사람을 찾아볼까요?

p105

논리조건.

우리는 여러 조건을 찾고 싶을때 어떡하죠? 이럴때 이 논리조건을 사용하면 된다.

AND  OR  NOT

 

p106

and라는 연산자는 조.건.식이 추가되는 연산자.

실제로 이런 실수를 많이 한다.

where sul > 2000

and > 3000

이것은 틀린 방법이다. and도 하나의 연산자이기 때문에 꼭 식으로 써주자.

 

그럼 아까 나온 의문중에, 중간에 S가 포함되고 끝에도 S가 포함되길 원한다면 '%S%S' 이렇게 찾으면 되나요?라는 질문이 있었습니다. 그렇게 표현하고 싶으면 AND연산자를 사용해주면 돼요!

 

우리 아까 배운 between 연산자도 and로 풀어쓸 수 있습니다.

between 1000 and 2000

sal >= 1000 and

sal <= 2000

하지만 좋지는 않은 방법이에요. 손도 아프고, 좋지 않아..

 

p107

 

in이라는 연산자는 or라는 연산자로 풀어쓸 수도 있습니다.

하지만 위에서 말한 것처럼 좋지 않은 방법이에요.

 

p108

 

단일연산자를 할때 사용해도 좋다.

not sal = 1000 이면 1000이 아닌 애를 찾아라가 되니까.

is not null과 not is null을 헷갈리는 사람이 많은데 is는 =과 같은 의미로 사용되므로 꼭! is not null로 찾으세요.

 

 

P112

ORDER BY절

앞으로 디폴트라는 소리를 하면 이것은 생략 가능하다는 뜻이다. 

ASC 오름차순은 기본(디폴트)값이 때문에 생략이 가능하지만 내림차순을 할땐 반드시 DESC를 사용해줘야한다.

 

오더바이절은 정렬할 때 컬럼 이름 대신에 숫자로 쓸 수 있다. 무슨 뜻이냐?

내가 셀렉한 컬럼 순서대로 번호가 매겨져서 가능하다.

그럼 어떻게 하냐고?

안 나올 것 같지?

나온다. 하지만 우린 지금 스탠다드를 먼저 배워야지?? 하지마.

 

p114

우리가 어제 배운 알리아스(별칭 매기기).  where절에서는 where절이 먼저 실행되다보니 알리아스를 인식하지 않은 상태라 사용할 수가 없었지만 지금 배우는 오더바이절은 절 순서대로 진행되다보니 알리아스를 사용해도 인식된다.

 

 

sql은 대소문자를 인식하지 않고 있기 때문에 소문자로 입력해도 기본적으로 대문자로 인식하고 출력해버린다.

그렇기 때문에 지금처럼 하면 오류가 난다.

 

 

그럼 이런 상황을 해결하기 위해서는 어떻게 해야하느냐? 똑같이 ""를 아래에도 넣어주면 된다.

 

 

p115

이건 꼬이겠죠? 해봅시다.

 

 

우린 어제 해봤습니다. 그룹화현상. 먼저 입력한 것이 그 줄을 그룹화시킵니다.

첫번째 컬럼을 기준으로 그룹 정리가 되고, 두번째 컬럼은 그 그룹내에서 정렬이 이루어진다.

 

 

 


 

 

 

연습문제 들어갑시다.

 

1. 연봉이 120000 이상 되는 사원들의 이름 및 연봉을 출력하시오.

 

 

 

2. 사원번호가 176인 사원의 이름과 부서 번호를 출력하시오.

 

 

아 지지리 제대로 써놓고... 잘못 쓴줄 알고 ㅜㅜ 다시!

 

3. 연봉이 150,000 에서 200,000의 범위 이외인 사원들의 이름 및 연봉을 출력하시오. 단 연봉은 AnnSal로 출력하시오.

계속 틀린 오답만 내는중..

이것은 between 함수를 이용하는 것이었다!!!

이제 정상적인 결과 도출 완료... (사실은 방금것이 답지 ㅜㅜ)

 

4. 2003/01/01 일부터 2005/05/30일 사이에 고용된 사원들의 이름, 사번, 고용일자를 출력하시오. 고용일자 순으로 정렬하시오.

 

계속 틀리고 있던 답

 

연구원님이 해답을 가르쳐주셨다!! 일단 표부터 꺼내와보세요.

 

아!??!??! 나 이제 할 수 있어!

 

 

연월일이냐 일월연이냐 이 포맷만 정확히 맞춰주면 자동으로 찾아준다. 다만 이것만 기억해라 2자리 2자리 2자리. 03-01-01 이라는 것!!!

 

5. 20번 및 50번 부서에서 근무하는 모든 사원들의 이름 및 부서 번호를 알파벳 순으로 출력하시오.

 

or를 사용해서 푼 나..

in이라는 복수 연산자를 사용하면 한 번의 조건식으로 복수개의 결과값을 찾아낼 수 있다.

문제를 보고 다른 연산자를 사용해서 풀 수는 없는지 한 번 더 고민을 해봅시다. 그렇다면 좀 더 빠른 답을 찾을 수 있어요.

 

답 :

select last_name, department_id

from employees

where department_id in (20, 50)

order by last_name asc;

 

우리가 asc는 디폴트값이다고 배웠다보니 안 넣고 그냥 편하게 쓰고 있었다.

하지만 일단 실습하는 입장에서는 전부 넣어서 해봐야지!! 다시 써보자.

 

6. 20번 및 50번 부서에 근무하며, 연봉이 200,000 ~ 250,000 사이인 사원들의 이름 및 연봉을 출력하시오.

 

??????? 왜....???

 - 여러분, no row selected로 나오는게 맞아요. 일부러 함정 숨긴 문제입니다.

놀랬잖아요ㅜㅜㅜㅜㅋㅋㅋㅋㅋㅋㅋㅋ

이런 부서에서 일하지 마세요 !ㅋㅋㅋㅋ

 

7. 2006년도에 고용된 모든 사람들의 이름 및 고용일을 조회한다.

 

뒤죽박죽이다.. 뭐가 이상한데?

자세히 보니 년월일이 정상으로 되어있다? 다시 출력하자.

 

네, 이것도 답입니다. 하지만 이왕이면 코드가 짧은게 더 낫겠죠?

between a and b 보다는 like라는 함수를 쓰는것이 나중에 더 긴 코드를 짤 때 좋겠죠?

성능도 그렇고.

 

 

8. 매니저가 없는 사람들의 이름 및 업무를 출력하시오.

 

매니저가 없는..?????

 

select last_name, job_id

from employees

where manager_id is null;

 

아, 그냥 단순하게 받아들여도 됐구나ㅜㅜㅋㅋ

 

9. 매니저가 있는 사람들의 이름 및 업무, 매니저번호를 조회한다.

 

10. 커미션을 받는 모든 사원들의 이름, 연봉 및 커미션을 출력하시오.

 - 연봉을 역순으로 정렬하고, 연봉은 ANNSAL로 출력하시오.

 

나는 알리아스를 쓸 때 as를 안 쓰고 했지만 써주는 것도 좋다.

 

11. 이름의 네번째 글자가 a인 사원의 이름을 조회하시오.

 

이 문제를 풀려고 교재 p103을 참고했다.

 

12. 이름에 a 및 e 글자가 있는 사원의 이름을 조회하시오.

 

혹시 당신, 오타 내놓고 응? 하고 있지는 않았나?

잘못 썼잖아 ㅋㅋㅋ 오타가 &이게 들어가 있다고!! ㅋㅋ

뭔가 이상할땐 코드를 자세히 봐, 의외로 오타 때문에 안되는 경우가 많다.

이렇게 쓰는 사람도 있다 '%a%e%'

이렇게 결과가 나온다. 다만, 쓴 순서대로 나오기 때문에 a 다음에 e가 나오는 순서로 찾는다.

그러므로 우리가 원하는 정확한 결과가 나오질 않는거지.

 

13. 급여가 2500, 3500, 7000이 아니며, 직업이 SA_REP나 ST_CLERK인 사원의 이름과 급여, 직업을 출력하시오.

 

아.. 밑에 것도 IN 연산자로 쓸 수 있었는데 왜 OR만 생각했지?

 

같은 결과인데 정렬이 약간 다르게 나오는군. 확실히..

 

 


 

3장은 건너 뛰겠습니다. 4장으로 바로 넘어갑시다!

 

p189

 

4장. 여러 테이블의 데이터 표시.

 

Q. 회사에 근무하는 사원들의 이름과 그 사원이 근무하는 부서 이름을 출력하시오.

from절도 위처럼 여러개를 쓸 수 있다.

예상해봅시다. 사원들이 근무하는 부서 이름을 요구했으니 총 107개가 나와야겠죠?

 

???? 뭔가 이상하다. 우리 회사 이렇게 컸어????

 

우리는 join이라는 기능을 사용합니다. '만났다.'

정규화 - 중복을 제거하기 위해 테이블을 잘게잘게 쪼갠다.

정규화가 잘 되었다는건 테이블의 갯수가 많아졌다는 소리가 되죠.

그렇다보니 조인이 필수, 꽃이라고 불립니다만 악의 축이기도 해요.

안 쓸 수 있으면 안 쓰는게 성능에 좋아요.

하지만 무결성 때문에 안 쓸 수가 없는 것이 조인입니다.

그러니 쓰더라도 성능적인 측면을 고려하면서 써야하는게 조인입니다.

 

카티션 프로덕트 - 오류사항. 조인이 잘못 수행됐을때 일어나는 현상.

조인은 두개의 테이블을 하나로 합치는 작업을 한다고?

자 봅시다.

dept와 emp 테이블이 있죠?

dept
did dname
10 a
20 b
emp
eid did
100 10
101 20
102 10

이걸 합치면 하나의 테이블로 만듭니다.

empdept
eid did did dname
100 10 10 a
101 20 20 b
102 10 10 a

그럼 아래의 결과를 입력할 수 있을까요?

101 20 10 a

이게 잘못된 것이라고 인식하는건 did가 서로 다르다는것을 알아채서 그런거지.

무결성 보장을 받으려면 emp의 did와 dept의 did가 같다라는게 보장되어야죠.

2개의 테이블을 합치기 위해 무결성을 보장할 조건을 우리가 제시해줘야한다. => 조인조건

그래야 정확한 데이터가 들어가겠죠? 안그럼 위처럼 무결성이 깨지는 데이터가 들어갑니다.

 

2개의 테이블을 합친다는 것은 특정조건을 하나의 행으로 합쳐주는건데, 우리가 그 조건을 주지 않으면

 

조인조건이 생략되거나 그랬을 시, 카티션프로덕트 현상이 발생된다 - 조인이 잘못 수행됐다.

 

p193

카티시안 프로덕트.... 카티션 프로덕트..

 

p194

두가지가 있으나 우리는 수업시간에 오라클 전용만 보겠습니다.

오라클을 이해하면 표준 조인은 쉽게 이해할 수 있을만한 내용이므로.

 

p197

이게 조인입니다. 눈 돌아가죠...

 

아까전에 입력한 것에 department_id를 추가해봅시다.

방금까지 잘 됐던게 왜?

우리는 파싱을 먼저 합니다. 아시죠?

두개의 테이블에 똑같은 이름의 컬럼이 있다보니 어디서 가져와야할지 몰라서 에러가 나버린다.

(배 째!!!!!!!!!)

 

 

조인을 사용할 때 반드시 지켜야할 사항 2가지.

1. n-1

 n은 조인을 시킬 대상 테이블의 개수.

 where절에 조인조건이 n-1개만큼 반.드.시 들어가있어야 한다.

2. 조인을 시킬 테이블에 같은 이름의 컬럼이 존재할시에는 반.드.시 해당 컬럼의 소유주인 테이블 이름을 명시해야한다.

 반드시 접두어로 명시해줘야 한다.

 

악의 축이라고 했죠? 성능이 떨어질 수밖에 없어.

그럼 이걸 최대한 성능 떨어지지 않게 하려면?

 

우리가 입력한 코드를 첫줄부터 전부 검증단계를 거친다. 검증을 많이 하면 할수록 성능이 떨어지겠죠?

그러니 성능에 도움을 주기 위해 모두 접두어를 붙여주는게 좋습니다.

실제로는 30자까지밖에 쓸 수 없다. 근데 두 개 다 30자씩? 그럼 한 번에 60자씩 써야하고 심하면 최대 1200자까지 쓰는거다. 그럼 손 너무 아파. 우리가 편해야지!!

 

from절에서도 알리아스를 사용할 수 있습니다. 이것을 사용하는 내내 난 이 별칭을 쓰겠다!~ 지정할 수가 있는거죠.

 

실제로는 from절이 가장 먼저 실행되는 것, 알고 계시죠? 그 테이블을 먼저 가져와서 진행하니까요.

그 후 where절이나 select절을 실행합니다. 메모리에 불러들였던 where절을 필터링하고 그 안에서 selectlist절을 실행하는 것이 우리가 보기 편하게 실행되는 거죠.

그래서 from절에서 약칭을 적용했으면 그것이 다른 곳에도 모두 적용이 되는겁니다.

현업에 있는 사람들도 다 이렇게 알리아스를 적용해서 수행합니다.

 - 여기서 주의할 것. 한 번 풀네임을 썼으면 풀네임, 약칭을 썼으면 약칭을 써야합니다.

 - 근데.. 이렇게 해도 되긴 해요..↓ 하지만 이것은 버그입니다. 우린 모르는 거에요. 버그는 안 쓰는게 맞겠죠?

내일 할 셀프조인. 어려워서 절망할 수 있어요. 하지만 희망을 주자면 현업에서도 안 씁니다.

where절 연습 꼭! 이해 안된 사람은 실습문제도 꼭 다시 복습!

728x90
반응형