▶▶▶ employee 테이블에서 입사 달 별로 인원수를 조회하시오
SELECT
TO_CHAR(hire_date,'MM')||'월' AS 월,
COUNT(*) 직원수
FROM employees
GROUP BY TO_CHAR(hire_date,'MM')
ORDER BY 월;
|| 숫자에다가 글 붙이는?
알리아스로 정렬 가능.
▶▶▶각 부서별로 가장 많은 급여를 받는 직원의 부서명, 이름, 급여정보를 출력하시오.
SELECT
d.department_name 부서이름,
e.first_name 사원이름,
e.salary 급여
FROM employees e,departments d
WHERE e.department_id=d.department_id
AND (e.salary,d.department_name) IN (SELECT
MAX(e1.SALARY),d1.department_name
FROM employees e1,departments d1
WHERE e1.department_id=d1.department_id
GROUP BY d1.department_name);
▶▶▶ 부서별 직원들의 최대, 최소, 평균급여를 조회하되
평균급여가 IT부서의 평균급여보다 많고 Sales 평균보다 적은 부서 정보만 출력하시오.
SELECT
d.department_name,
MAX(e.salary),
MIN(e.salary),
AVG(e.salary)
FROM employees e,departments d
WHERE e.department_id=d.department_id
GROUP BY d.department_name
HAVING AVG(e.salary)>(SELECT
AVG(e1.salary)
FROM employees e1,departments d1
WHERE e1.department_id=d1.department_id
AND d1.department_name='IT')
AND AVG(e.salary)<(SELECT
AVG(e2.salary)
FROM employees e2,departments d2
WHERE e2.department_id=d2.department_id
AND d2.department_name='Sales');
▶▶▶ 각 부서별로 직원이 한명만 있는 부서만 조회.
단 직원이 없는 부서에 대해서는 '<신생부서>' 라는 문자열 출력되도록 하고
출력결과는 내림차순으로 정렬.
SELECT
NVL(d.department_name,'<신생부서>') 부서명,
count(*) 직원수
FROM employees e,departments d
WHERE e.department_id=d.department_id(+)
GROUP BY d.department_name
HAVING count(*)=1
ORDER BY d.department_name DESC NULLS LAST;
▶▶▶ 부서별 입사월별 직원수를 출력하시오.
직원수가 5명 이상인 부서만 출력.
출력결과는 부서이름 순
SELECT
d.department_name 부서명,
TO_CHAR(hire_date,'MM') 입사월,
count(*) 직원수
FROM employees e,departments d
WHERE e.department_id=d.department_id
GROUP BY d.department_name,TO_CHAR(hire_date,'MM')
HAVING count(*)>=5
ORDER BY d.department_name;
▶▶▶ 국가별 도시별 직원수 조회
부서정보가 없는 직원은 국가명과 도시명 대신에 '<부서없음>'으로 출력되도록 해라.
SELECT
NVL(c.country_name,'<부서없음>') 국가명,
NVL(l.city ,'<부서없음>') 도시명,
count(*) 직원수
FROM countries c,locations l,departments d,employees e
WHERE c.country_id(+)=l.country_id
AND d.location_id=l.location_id(+)
AND d.department_id(+)=e.department_id
GROUP BY c.country_name,l.city
ORDER BY c.country_name;
▶▶▶ 각 부서별 최대 급여자의 아이디, 이름, 급여를 출력하시오
단, 최대 급여자가 속한 부서의 평균급여를 마지막으로 출력하여
평균급여와 비교할수 있도록 하세요
SELECT
e.employee_id,
e.first_name,
vt.maxsalary,
vt.avgsalary
FROM employees e,(SELECT
ROUND(MAX(e1.salary),0) maxsalary,
ROUND(AVG(e1.salary),0) avgsalary,
e1.department_id di
FROM employees e1
GROUP BY e1.department_id) vt
WHERE e.salary=vt.maxsalary
AND e.department_id=vt.di;
▶▶▶ 테이블생성
CREATE TABLE SALGRADE(
GRADE NUMBER(2) PRIMARY KEY,
LOSAL NUMBER(5) NOT NULL,
HISAL NUMBER(5) NOT NULL);
INSERT INTO SALGRADE(GRADE,LOSAL,HISAL)
VALUES(1,1000,5000);
INSERT INTO SALGRADE(GRADE,LOSAL,HISAL)
VALUES(2,5001,10000);
INSERT INTO SALGRADE(GRADE,LOSAL,HISAL)
VALUES(3,10001,20000);
INSERT INTO SALGRADE(GRADE,LOSAL,HISAL)
VALUES(4,20001,30000);
SELECT
CONCAT(s.grade,'등급') 급여등급,
COUNT(*) 직원수
FROM employees e,salgrade s
WHERE e.salary BETWEEN LOSAL AND HISAL
GROUP BY s.grade
ORDER BY COUNT(*) DESC;
//문자 붙이기 concat.
SELECT
NVL(TO_CHAR(TRUNC(e.commission_pct,1)),'<커미션없음>') 커미션,
count(*) 직원수
FROM employees e
GROUP BY TRUNC(e.commission_pct,1);
//TRUNC 소수점 버리는거
SELECT
d.department_name 부서명,
e.first_name 직원명,
e.salary 급여,
e.commission_pct 커미션
FROM employees e, departments d
WHERE e.department_id=d.department_id
AND (e.commission_pct=.4 OR e.commission_pct=.35);
========================jdbc======================
SELECT
l.city,
d.department_name,
e.first_name,
e.salary
FROM employees e,departments d,locations l
WHERE e.department_id=d.department_id
AND d.location_id=l.location_id
AND l.city LIKE '?'
AND d.department_name LIKE '?';
길% => 길vv ,길XXX ,길OOOO 길로시작하는 모든 애를 출력
%갈 => 길로 끝나는것
%길%=> 길 이 들어가있으면 뽑는것
_길 => 저길 ,이길, 가길 처럼... 앞 한 글자만
길_ => 길1, 길2, 길3 처럼... 뒤에 한 글자만
'Database > SQL' 카테고리의 다른 글
[SQL] 공부 Review (0) | 2015.01.25 |
---|---|
[SQL] 공부 Review (2) | 2015.01.25 |
[SQL] 공부 Reiview (0) | 2015.01.25 |