5월 20일 목요일 (8일차) - 실습

@_@·2021년 5월 20일

Database

목록 보기
15/39

ㅇ 어떤 상황에서 어떤 연산자를 사용할 지 잘 선택해야 해

  • 사잇값을 찾을 때 -> BETWEEN
  • 여러개 값 찾을 때 -> IN
  • 값이 없을 때 -> IS NULL
  • 1개의 값을 찾을 때 -> 이큐연산자

(나중에 채워넣자)



ㅇ 실습 후 반성

  • 실수 하는 것 오히려 좋아. 실수해서 쌤께 설명 들은 부분은 절대 안 잊어버리게 됔ㅋㅋ
  • a를 제대로 알려면 ~a가 뭔지 알아야 해.
    ~a를 이해할 수 있는 가장 좋은 방법은 틀리는거야
  • 실수1 : 비트윈 쓰는 문법
    • WHERE 컬럼 연산자 값
    • WHERE 컬럼 BEWEEN ~ AND ~
  • 실수2 : 라이크 쓸 때 주의할 것들
    • '_o' 하면 글자 2글자 짜리 찾는거야
      '_o%' 해야지 두번째 글자가 o인 단어 모두 찾는 것



첫 날 복습은 그냥 안 보고 다시 풀어보는 걸로 하고
정리는 주말에 하자.

1번 : 연봉이 120000 이상. 사원 이름 및 연봉 출력
SELECT last_name, salary12
FROM employees
WHERE salary
12>=120000
문제 해결하는 과정 - 스크린샷

2번 : 사원 번호 176번인 사원 이름과 부서 번호 출력
SELECT last_name, department_id
FROM employees
WHERE employee_id = 176
(e-id in (176) in을 써도 똑같은 결과 나오지만,
여기는 사원번호 1개에 대해 찾는거니까 단일연산자가 더 좋아. 심지어 사원번호는 프라이머리키야)

+) sql+ 한 개 더 실행시켜서
여기에 desc 테이블 구조 띄워 넣고 보자.

3번 :  연봉 15만 ~ 20만 범위 이외인 사원들의 이름 및 연봉 출력.
단 연봉은 AnnSal로 출력
SELECT last_name, salary12 "AnnSal"
FROM employees
WHERE NOT BETWEEN 150000<salary
12<200000
(오류)
SQL> /
WHERE NOT BETWEEN 150000<salary12<200000

ERROR at line 3:
ORA-00936: missing expression
내 실수 : 비트윈 쓸 때는 [where 컬럼 between A and B]
다시 한번 : 웨어 조건식( = 컬럼 연산자 값★★★★★★★)

(답!!!!!!!!!!!!!!)
SELECT last_name, salary12 "AnnSal"
FROM employees
WHERE salary
12 NOT BETWEEN 150000 and 200000

만약 비트윈을 안 쓰면??

다시 한번 : 웨어 조건식( = 컬럼 연산자 값★★★★★★★)

오류1
컴마 150,000 쓰는 건 안돼. 있으려면 쌍따옴표 찍혀 있어야한대..??
오류2
WHERE NOT salary*12  BETWEEN 150000 and 200000
이러면 연봉 값을 부정한 게 되버려
연봉이 아닌거를 찾아라가 되버려.
낫은 연산자 앞에...

4번 :  2003/01/01 일부터 2005/05/30 일 사이에 고용된 사원들의 이름, 사번, 고용일자 출력
고용일자는 역순으로 정렬
SELECT last_name, employee_id, hire_date
FROM employees
WHERE hire_date BETWEEN 030101 and 050503
ORDER BY hire_date desc
SQL> /
WHERE hire_date BETWEEN 030101 and 050503
*
ERROR at line 3:
ORA-00932: inconsistent datatypes: expected DATE got NUMBER
오류 : 날짜와 문자는 따옴표가 붙어야 해

(답!!!!!!!!!!)
SELECT last_name, employee_id, hire_date
FROM employees
WHERE hire_date BETWEEN '030101' and '050503'
ORDER BY hire_date desc

(쌤 답)
SELECT last_name, employee_id, hire_date
FROM employees
WHERE hire_date BETWEEN '03/01/01' and '05/05/03'
ORDER BY hire_date desc

2005/01/01
2005-05-30
이것도 다 돼
날짜 포맷
숫자로 자동 변환
연 월 일이라는 포맷만 맞아주면 값이 비고 돼
근데 아까 like는 2006은 안됐었어. 이거는 포맷을 비교하는 것
그냥 편안하게 쓰여진 포맷대로 쓰는 게 좋을수도 있어

하이어데이트>~~ 앤드 하이어데이트<~~
이렇게 써도 실행은 되는데 연산자 2개 쓰는 거잖아. 비트윈이 왠만하면 좋지
앤드로 풀어 쓸 수 있고
오어는 인으로 풀어 쓸 수 있어

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

(오답!!!!!!)
SELECT last_name, department_id
FROM employees
WHERE department_id IN (20, 50)
ORDER BY department_id
알파벳 순이라고 했는데 뎊아이디는 숫자잖아~~~

(정답)
SELECT last_name, department_id
FROM employees
WHERE department_id IN (20, 50)
ORDER BY last_name ASC

did_id = 20 OR did_id=50 이건 조건식 2개니까 성능 떨어져
비트윈과 인을 기억을 잘 못해서 여러 조건절로 만드는 경우들 있어.

비트윈 20 and 50 하면

7번 : 2006년도에 고용된 모든 사람들의 이름 및 고용일 조회하기

(답!!!!!!!)
SELECT last_name, hire_date
FROM employees
WHERE hire_date LIKE '06%'

날짜니까 '   '
06으로 시작하니까 LIKE 06%

<4교시>

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

(답!!!!!!)
SELECT last_name, salary12
FROM employees
WHERE department_id IN (20, 50)
AND salary
12 BETWEEN 200000 AND 250000

조건 2개인 것  AND 연산자 사용 - 스크린 샷

no rows selected : 이렇게 나오는 거 맞아 ㅋㅋㅋ
직역 : 맞는 데이터가 없다
이 사항은 에러사항으로 간주해야 해
진짜로 데이터가 없거나, 코드가 잘못됐거나
대부분 코드가 잘못됐다고 생각해야 해
노로우셀렉티드라는 현상 자체가 - 코드가 잘못된 에러사항이라고 간주하고
고민해보아야 해잘 하고 있어!
결과가 실행되는 게 중요한 게 아냐. 데이터들에 대한 분석이 중요해

카톡질문)where 문장과 and 문장 순서가 바뀌어도 값은 똑같이 나오나요?? - 상관 없어. 앤드절은

카톡질문)where 에 department_id 입력할때 select 에 department_id 입력 안해줘도 되나요? - 안해줘도 돼
현업에서 사용하는 셀렉트 문장 보면 없는 경우 ㅁ낳아
현장에서는 SQL+를 통해 보는 게 아니라
인터페이스를 통해 보기 때문에
인터페이스 자체에 컬럼이름이나 명사가 지정되어 떨어지기 때문에
셀렉트 리스트 절이 없는 경우가 대부분이야.
현장에서는

8번 :  매니저가 없는 사람들의 이름 및 업무 출력

(!!!!!!!!)
SELECT last_name, job_id
FROM employees
WHERE manager_id IS NULL

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

(!!!!!!!!!)
SELECT last_name, job_id, manager_id
FROM employees
WHERE manager_id IS NOT NULL

10번 : 커미션을 받는 모든 사원들의 이름, 연봉 및 커미션을 출력하시오.
연봉을 역순으로 정렬하고, 연봉은 ANNSAL로 출력하시오.

(!!!!!!!!!)
SELECT last_name, salary*12 AS ANNSAL, commission_pct
FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY ANNSAL DESC
/

문제해결 스크린샷 -
쌤처럼 구분시켜보는 것도 좋은 방법이야
오더절에서는 알리아스 사용 가능. ~~에서는 사용 불가

실험) ANNSAL을 annsal로 해도 다 오케이
앞과 뒤에 것을 대대 소대 대소 소소 뭐든지 다 오케이
뭐가 제일 베스트? 선생님도 대대 쓰셨네

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

(오답)
SELECT last_name
FROM employees
WHERE last_name LIKE 'a'
오류 : '
a' 이렇게 찾으면 이름이 4글자인데 네번째가 a인 사람만 찾은 게 돼

(!!!!!!!!!)
SELECT last_name
FROM employees
WHERE last_name LIKE '__a%'
%를 붙여야 뒤에도 쭉 다른 이름들 나오지
% 문장 전체를 의미
문자 하나를 의미

---a
4번째 글자가 a인 것 맞지만, 이렇게 끝내버린 거야.

like 안에서만 허용 : %와 _

12번 : 이름에 a 및 e 글자가 있는 사원의 이름 조회

(!!!!!!!!)
SELECT last_name
FROM employees
WHERE last_name LIKE '%a%'
AND last_name LIKE '%e%'

앤드나 오아 연산자로 조건 추가할 때는 반드시 새로운 조건식으로 추가해야 해
'%a%e%'  : 순서가 a, e인 애들만 나와. e가 앞인 애들은 찾을 수 없어
LIKE는 쓰여진 포맷을 그대로 ~~ 한다는 걸 항상 생각해

13번 :  앞에서 푼거라서 시간상 넘어가

14번 : 30번 부서내의 모든 직업들을 유일한 값으로 출력
90번 부서 또한 포함하고, 직업을 오름차순으로 출력
(포함이라는 의미는 : 90번 부서 또한 유일한 값으로 출력하라는 말이야)

SELECT DISTINCT job_id
FROM employees
WHERE department_id in (30, 90)
ORDER BY job_id

유일하다는 중복이 없다.
하나의 연산자로 처리하기. and나 or쓰지 말고


여기까지 웨어절 관련된 내용 살펴봤어
실습 문제 나눠주니까 다시 풀어봐 ~~

내일은 셀렉트에서 가장 어려운 거 해
조인 ㅜㅠ

profile
STEP BY STEP

0개의 댓글