SELECT
Q. 연봉이 5000만원 이상인 사원들의 사원명, 급여, 연봉(별칭->연봉), 부서코드 조회
SELECT
emp_name,
salary,
salary * 12 AS "연봉",
dept_code
FROM
employee
WHERE
salary * 12 > 50000000;
* 실행순서 : FROM -> WHERE -> SELECT
Q. 직급코드가 'J3'가 아닌 사원들의 사번,사원명, 직급코드, 퇴사여부 조회
SELECT
emp_id,
emp_name,
job_code,
ent_yn
FROM
employee
WHERE
job_code != 'J3';
-Q. 급여가 350만원 이상 600만원 이하인 모든사원의 사원명, 사번, 급여조회
SELECT
emp_name,
emp_id,
salary
FROM
employee
WHERE
salary >= 3500000
AND salary <= 6000000;
Q. 급여가 350만원 미만, 600만원 초과인 모든 사원의 사원명, 사번, 급여조회
SELECT
emp_name,
emp_id,
salary
FROM
employee
WHERE
salary NOT BETWEEN 3500000 AND 6000000;
-- = WHERE SALARY < 3500000 OR SALARY > 6000000;
* NOT은 SALARY 앞 혹은 뒤 위치는 상관없다.
Q. 입사일이 '90/01/01' ~ '01/01/01' 사원들을 전체조회
SELECT
*
FROM
employee
WHERE
hire_date BETWEEN '90/01/01' AND '01/01/01';
-- = WHERE HIRE_DATE >= '90/01/01' AND HIRE_DATE <= '01/01/01';
Q. EMPLOYEE테이블에 DEPT_CODE가 D9이거나 D5인 사원 중 고용일이 02년 1월 1일보다 빠른 사원의 이름, 부서코드, 고용일 조회
SELECT
emp_name,
dept_code,
hire_date
FROM
employee
WHERE
hire_date < '02/01/01'
AND ( dept_code = 'D9'
OR dept_code = 'D5' );
Q.사원들중 성이 전씨인 사원의 사원명, 급여, 입사일 조회
SELECT
emp_name,
salary,
hire_date
FROM
employee
WHERE
emp_name LIKE '전%';
Q. 사원들 중 이름이 나라인 사원의 사원명, 급여, 입사일 조회
SELECT
emp_name,
salary,
hire_date
FROM
employee
WHERE
emp_name LIKE '%나라';
Q. 사원들 중에서 이름에 '하'라는 글자가 포함된 사원의 이름, 전화번호 출력
SELECT
emp_name,
phone
FROM
employee
WHERE
emp_name LIKE '%하%';
Q. 사원들 중에서 이름에 중간에 '하'라는 글자가 포함된 사원의 이름, 전화번호 출력
SELECT
emp_name,
phone
FROM
employee
WHERE
emp_name LIKE '_하_';
Q. 전화번호의 3번째자리가 1인 사원들의 사번, 사원명, 전화번호 조회
SELECT
emp_id,
emp_name,
phone
FROM
employee
WHERE
phone LIKE '__1%';
Q. 이메일 중 _앞글자가 3글자인 사원들의 사번, 이름, 이메일 조회
SELECT
emp_id,
emp_name,
email
FROM
employee
--WHERE EMAIL LIKE '____%'; -> 와일드카드 문자때문에 정상출력이 되지않는다.
--와일드카드문자와 일반문자를 구분해줘야한다.
--데이터값으로 취급하고싶은 와일드카드 문자앞에 나만의 탈출문자를 제시해서 탈출시켜주면된다.
--ESCAPE OPTION을 등록해서 사용
WHERE
email LIKE '___/_%' ESCAPE '/';
Q. 이름이 '연'으로 끝나는 사원들의 사원명, 입사일 조회
SELECT
emp_name,
hire_date
FROM
employee
WHERE
emp_name LIKE '%연';
Q. 전화번호 처음 3자리가 010이 아닌 사원들의 사원명, 전화번호 조회
SELECT
emp_name,
phone
FROM
employee
WHERE
NOT phone LIKE '010%';
Q. 이름에 '하'가 포함되어있고 급여가 240만원이상인 사원들의 사원명, 급여 조회
SELECT
emp_name,
salary
FROM
employee
WHERE
emp_name LIKE '%하%'
AND salary >= 2400000;
Q. EMPLOYEE테이블에서 사원명, 주민번호 조회 (단, 주민번호는 생년월일만 보이게 하고, '-'다음 값은 '*'로 바꾸기)
SELECT
emp_name,
rpad(substr(emp_no, 1, 7), 14, '*')
FROM
employee;
Q. EMPLOYEE테이블에서 사원명, 입사일-오늘, 오늘-입사일 조회
(단, 각 별칭은 근무일수1, 근무일수2가 되도록 하고 모두 정수(내림), 양수가 되도록 처리
SELECT
emp_name,
floor(abs(hire_date - sysdate)) AS "근무일수1",
floor(abs(sysdate - hire_date)) AS "근무일수2"
FROM
employee;
Q. 사수가 없고 부서배치도 받지않은 사원들의 사원명, 사번, 부서코드 조회
SELECT
emp_name,
emp_id,
dept_code
FROM
employee
WHERE
manager_id IS NULL
AND dept_code IS NULL;
Q 연봉(보너스 미포함)이 3천만원 이상이고 보너스를 받지 않는 사원들의 사번,사원명, 급여, 보너스 조회
SELECT
emp_id,
emp_name,
salary,
bonus
FROM
employee
WHERE
( salary * 12 ) >= 30000000
AND bonus IS NULL;
Q 입사일이 '95/01/01' 이상이고 부서배치를 받지않은 사원들의 사번, 사원명, 입사일, 부서코드 조회
SELECT
emp_id,
emp_name,
hire_date,
dept_code
FROM
employee
WHERE
hire_date >= '95/01/01'
AND dept_code IS NULL;
Q . 급여가 200만원 이상이고 500만원 이하인 사원 중에서 입사일이 '01/01/01'이상이고 보너스를 받지 않은 사원들의 사번, 사원명, 급여, 입사일, 보너스 조회
SELECT
emp_id,
emp_name,
salary,
hire_date,
bonus
FROM
employee
WHERE
salary BETWEEN 2000000 AND 5000000
AND ( hire_date >= '01/01/01' )
AND bonus IS NULL;
Q. 보너스를 포함 연봉이 NULL이 아니고 이름에 '하'가 포함된 사원들의 사번, 사원명, 급여, 보너스포함 연봉 조회
SELECT
emp_id,
emp_name,
salary,
( salary + ( salary * bonus ) ) * 12
FROM
employee
WHERE
( ( salary + ( salary * bonus ) ) * 12 ) IS NOT NULL
AND emp_name LIKE '%하%';
Q. EMPLOYEE테이블에서 사번이 홀수인 직원들의 정보 모두 조회
SELECT
*
FROM
employee
WHERE
mod(emp_id, 2) = 1; -- 자동형변환 해줌
--WHERE MOD(TO_NUMBER(EMP_ID), 2) = 1;
Q. EMPLOYEE테이블에서 근무 년수가 20년 이상인 직원 정보 조회
SELECT
*
FROM
employee
--WHERE MONTHS_BETWEEN(SYSDATE, HIRE_DATE) > 240;
WHERE
add_months(hire_date, 240) < sysdate;
Q. EMPLOYEE 테이블에서 사원명, 급여 조회 (단, 급여는 '\9,000,000' 형식으로 표시)
SELECT
emp_name,
to_char(salary, 'L99,999,999')
FROM
employee;
Q. EMPLOYEE테이블에서 직원 명, 부서코드, 생년월일, 나이(만) 조회
(단, 생년월일은 주민번호에서 추출해서 00년 00월 00일로 출력되게 하며 나이는 주민번호에서 출력해서 날짜데이터로 변환한 다음 계산)
SELECT
emp_name,
dept_code,
substr(emp_no, 1, 2)
|| '년'
|| substr(emp_no, 3, 2)
|| '월'
|| substr(emp_no, 5, 2)
|| '일' AS 생일,
EXTRACT(YEAR FROM sysdate) -
CASE
WHEN substr(emp_no, 1, 2) >= '50' THEN
1900 + to_number(substr(emp_no, 1, 2))
ELSE
2000 + to_number(substr(emp_no, 1, 2))
END
FROM
employee;
Q. EMPLOYEE테이블에서 부서코드가 D5, D6, D9인 사원만 조회하되 D5면 총무부, D6면 기획부, D9면 영업부로 처리
(단, 부서코드 오름차순으로 정렬)
SELECT
emp_id,
emp_name,
dept_code,
decode(dept_code, 'D5', '총무부', 'D6', '기획부',
'D9', '영업부')
FROM
employee
WHERE
dept_code IN ( 'D5', 'D6', 'D9' )
ORDER BY
dept_code;
Q. EMPLOYEE테이블에서 사번이 201번인 사원의 사원명, 주민번호 앞자리, 주민번호 뒷자리,
주민번호 앞자리와 뒷자리의 합 조회
SELECT
emp_name,
substr(emp_no, 1, 6) AS "앞자리",
substr(emp_no, 8) AS "뒷자리",
substr(emp_no, 1, 6) + substr(emp_no, 8)
FROM
employee
WHERE
emp_id = 201;
Q. EMPLOYEE테이블에서 직원들의 입사일로부터 년도만 가지고 각 년도별 입사 인원수 조회
--전체 직원 수, 2001년, 2002년, 2003년, 2004년
SELECT
COUNT(*) AS "전체직원수",
COUNT(decode(EXTRACT(YEAR FROM hire_date), 2001, 1, NULL)) AS "2001년",
COUNT(decode(EXTRACT(YEAR FROM hire_date), 2002, 1, NULL)) AS "2002년",
COUNT(decode(EXTRACT(YEAR FROM hire_date), 2003, 1, NULL)) AS "2003년",
COUNT(decode(EXTRACT(YEAR FROM hire_date), 2004, 1, NULL)) AS "2004년"
FROM
employee;