[SQL] 서브쿼리

SeonJin·2023년 9월 10일
0

SQL

목록 보기
4/4
post-custom-banner

서브쿼리

<서브쿼리>

  • Java 객제지향의 상속과 똑같은 개념이다
  • 상속당한 자식 객체는 부모 객체의 인스턴스를 사용할 수 있고, 부모는 자식객체의 인스턴스를 사용할수 없다

<장점>

  • 서브쿼리는 쿼리를 구조화시키므로, 쿼리의 각 부분을 명확히 구분할 수 있게 해준다
  • 서브쿼리는 복잡한 JOIN이나 UNION과 같은 동작을 수행할 수 있는 또 다른 방법을 제공한다
  • 서브쿼리는 복잡한 JOIN이나 UNION 보다 가독성이 좋다

<특징>
서브쿼리는 SELECT문으로만 작성 할 수 있다
반드시 괄호()안에 존재하여야 한다
괄호가 끝나고 끝에 세미콜론을 쓰지 않는다
ORDER BY를 사용 할 수 없다


스칼라 서브쿼리

  • SELECT, ORDER BY 등 컬럼이 오는 위치에서 반드시 하나의 값만 반환한다
SELECT *, (SELECT comm FROM emp WHERE ename = '홍길동')
FROM department;

인라인 뷰

  • FROM절에서 사용
  • View
    • 재사용이 가능하도록 저장한 객체
    • 가상테이블이므로 DB에 저장되지 않음
  • 인라인 뷰를 사용하는 경우 무조건 alias 지정해 주어야 한다.
SELECT profno, p.name
FROM (SELECT DISTINCT profno FROM student) e 
	JOIN professor p 
    	USING(profno);

중첩 서브쿼리

단일행

  • 1건 이하의 데이터를 반환한다
  • = < > <= >= <> 연산자 사용
SELECT ename, comm 
FROM emp 
WHERE comm < (SELECT comm FROM emp WHERE ename = 'WARD');

SELECT NAME, weight
FROM student
WHERE weight > (SELECT AVG(weight) FROM student WHERE deptno1 = 201);

-- 서브쿼리 내 join 가능
SELECT NAME, weight
FROM student
WHERE weight > (SELECT AVG(s.weight) 
				FROM student s JOIN department d ON s.deptno1 = d.deptno 
				WHERE d.dname = '전자공학과')
                
SELECT s.studno, s.name, e.total
FROM student s JOIN exam_01 e USING (studno)
WHERE e.total BETWEEN (SELECT min_point FROM hakjum WHERE grade = 'A0')
			  AND (SELECT max_point FROM hakjum WHERE grade = 'A0');

다중행

  • 여러 행의 데이터를 반환한다
  • In, Any, All, Some, Exists 조건 사용
-- In
SELECT e.EMPNO, e.NAME, e.position, d.DNAME
FROM emp2 e JOIN dept2 d ON E.deptno = d.dcode 
WHERE e.DEPTNO IN (SELECT dcode FROM dept2 WHERE AREA = '포항본사');

-- Any : True 결과값이 하나 이상일 때 (||)
SELECT empno, NAME, POSITION, pay FROM emp2
WHERE pay > ANY (SELECT pay FROM emp2 WHERE POSITION = '과장');

-- All : 모든 결과값이 True일 때 (&&)
SELECT NAME, grade, weight FROM student
WHERE weight < ALL (SELECT weight FROM student WHERE grade = 2);

-- Exists : 결과가 하나라도 존재하면 조회
SELECT profno, name
FROM professor p
WHERE EXISTS (SELECT * FROM student WHERE profno = p.profno);

다중컬럼

  • 여러 컬럼의 데이터를 반환한다
  • 비교 컬럼의 개수와 위치가 동일해야 한다
SELECT NAME, grade, height FROM student
WHERE (grade, height) IN (SELECT grade, max(height) 
						  FROM student GROUP BY grade)
ORDER BY 2;
profile
study notebook
post-custom-banner

0개의 댓글