ㅇ 어떤 상황에서 어떤 연산자를 사용할 지 잘 선택해야 해
(나중에 채워넣자)
ㅇ 실습 후 반성
첫 날 복습은 그냥 안 보고 다시 풀어보는 걸로 하고
정리는 주말에 하자.
1번 : 연봉이 120000 이상. 사원 이름 및 연봉 출력
SELECT last_name, salary12
FROM employees
WHERE salary12>=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<salary12<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 salary12 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 salary12 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쓰지 말고
여기까지 웨어절 관련된 내용 살펴봤어
실습 문제 나눠주니까 다시 풀어봐 ~~
내일은 셀렉트에서 가장 어려운 거 해
조인 ㅜㅠ