조인보다 서브쿼리가 좀 익숙하지 않아서 다시 공부해서 포스팅 해보려고 합니다
서브쿼리(=자식쿼리, 내부쿼리) - 메인쿼리 컬럼 사용 불가
메인쿼리(=부모쿼리, 외부쿼리) - 서브쿼리 컬럼 사용불가
Q. 부서코드가 D9 인 사원의 ID/이름/부서명을 출력 하라는 쿼리를 급조해서 작성해 보았다.
SELECT [컬럼], (SELECT [컬럼] FROM [테이블] WHERE 조건)
FROM [테이블]
WHERE 조건;
select e.emp_id, e.emp_name, (select dept_title from department d where d.dept_id = e.dept_code) DTITLE
FROM employee e where e.dept_code = 'D9';
select e.emp_id, e.emp_name, d.dept_title from employee e inner join department d
on e.dept_code = d.dept_id where e.dept_code = 'D9';
동일한 데이터가 나오는데 역시 조인이 더 익숙하다..
SELECT [컬럼]
FROM (SELECT [컬럼] FROM [테이블] WHERE [조건]) AS [별명]
WHERE 조건;
Q. 사원테이블과 부서테이블에서 '부서별' 부서명, 월급 총합, 평균, 부서별 인원수를 출력하세요.
SELECT E.DEPT_CODE, D.DEPT_TITLE, 합계, 평균, 인원수
FROM (SELECT DEPT_CODE,SUM(SALARY) 합계, AVG(SALARY) 평균, COUNT(*) 인원수 FROM EMPLOYEE GROUP BY DEPT_CODE) E, department d
where E.DEPT_CODE = D.DEPT_ID
ORDER BY E.DEPT_CODE;
SELECT E.DEPT_CODE, D.DEPT_TITLE, SUM(E.SALARY) AS 합계, AVG(E.SALARY) AS 평균, COUNT(*) AS 인원수
FROM EMPLOYEE E
INNER JOIN DEPARTMENT D ON E.DEPT_CODE = D.DEPT_ID
GROUP BY E.DEPT_CODE, D.DEPT_TITLE
ORDER BY E.DEPT_CODE;
SELECT [컬럼]
FROM [테이블]
WHERE [컬럼][연산자](SELECT [컬럼] FROM [테이블] WHERE 조건);
Q. 이름이 심봉선인 사람의 급여보다 높은 사람들을 구하세요
SELECT * FROM EMPLOYEE
WHERE SALARY > (
SELECT SALARY FROM EMPLOYEE WHERE EMP_NAME IN ('심봉선'));
SELECT * FROM EMPLOYEE
WHERE SALARY > (
SELECT SALARY FROM EMPLOYEE WHERE EMP_NAME = '심봉선');
Q. DEPT_CODE가 D9인 사람들을 구하시오
SELECT * FROM EMPLOYEE
WHERE SALARY IN(
SELECT SALARY FROM EMPLOYEE WHERE DEPT_CODE IN ('D9'));
SELECT * FROM EMPLOYEE
WHERE SALARY = ANY(
SELECT SALARY FROM EMPLOYEE WHERE DEPT_CODE IN ('D9'));
IN 가 ANY는 동일한 의미이다.
추가로 INSERT 문 DELET문 UPDATE문에도 사용이 가능하다
간략하게 정리를 하면서 효율성이 떨어지는거 같지만서도 여러가지 상황이 있으니 좀더 문제를 풀면서 학습을 해야될거 같습니다.