kh교육

(20250909048)sql

boangod 2025. 9. 12. 16:03

erd = 테이블관계를 나타낸 도표

 

주 식별자 → 중복되는 값이 나오면 안 됨.

 

 

조인문 작성의 어려움

• 프로세스화된 조인문작성 과정을 구축하기 어려움.

  • 조인문 작성과정
  • Step 1 검색 대상과 조건을 추출
      . SELECT, WHERE, ORDER BY절 구성
  • Step 2 SELECT절과 FROM 절에서 검색 테이블 추출
  • Step 3 테이블 간 관계 확인
      .관계 확인을 통해 테이블이 추가될 수 있다.
  • Step 4 조인 조건 기술
  • Step 5 문장을 완성한다.
      .SELECT 절에 내용이 추가된다.

 

 

 

자기참조 조인과 외부조인

 

모든 관계는 부모자식관계다.

부모역할만 하는 애는 슈퍼 타입 엔티티

ㄴ 그 조직에서 반드시 있어야 하는 거.

메모리를 복사해서 조인을 처리한다.

 

 

자기 참조 조인(Self join) → 테이블 두 번 읽는다. 메모리에 복사하기 때문.

 

SELECT 별명1.컬럼1, ... 별명2.컬럼1, ...

FROM 테이블 별명1, 테이블 별명2, ...

WHERE 조인_조건 AND 일반_조건;

 

‐ 동일 테이블을 자기 참조에 의해 조인한다.

‐ 별명1과 별명2는 동일 테이블에 대한 별명이지만 각 각 별도의 테이블처럼 사용한다.

‐ 하나의 테이블에 별명을 다르게 해서 마치 여러 개의 테이블 간 조인하는 것처럼 문장을 구현한다.

 

 

• 각 사원과 이를 관리하는 사원의 정보를 검색한다.

SQL> SELECT e1.eno, e1.ename, e1.mgr, e2.eno, e2.ename

2 FROM emp e1, emp e2

3 WHERE e1.mgr = e2.eno;

 

e1, e2 테이블 간 등가조인

‐ e1 : 사원 테이블, e2 : 관리자 테이블

 

 

외부(Outer) 조인

 

SELECT 컬럼, 컬럼, ...

FROM 테이블1, 테이블2, ...

WHERE 조인_조건(+)

AND 일반_조건

 

 

조인조건에 일치하는 않는 데이터를 출력해 준다.

‐ 조인 결과물을 해석할 때 오해를 방지하기 위한 방법이다.

    . 결과의 무결성을 보장한다.

'+' 기호는 데이터가 부족한쪽에 기술한다.

 

 

• 각 부서별로 사원의 명단을 검색한다.

 

SQL> SELECT d.dno 부서번호, dname 부서명, ename 사원명

2 FROM dept d, emp e

3 WHERE d.dno = e.dno

4 ORDER BY 1;

 

SQL> SELECT d.dno 부서번호, dname 부서명, ename 사원명

2 FROM dept d, emp e

3 WHERE d.dno = e.dno(+)

4 ORDER BY 1;

 

 

 

 

단일 행 서브쿼리

 

서브쿼리

 

•SQL 문에 완전한 SELECT문이 포함됨

‐ 원래 SQL문: 메인 쿼리

‐ 내부 SELECT문: 서브 쿼리

 

• 서브쿼리의 종류

‐ 단일행 서브쿼리

     . 서브쿼리가 하나의 컬럼에서 하나의 행 만 검색한다.

     . 즉 데이터 하나를 검색한다.

‐ 다중행 서브쿼리

     . 서브쿼리가 하나의 컬럼에서 여러 개의 행을 검색한다.

‐ 다중열 서브쿼리

     . 서브쿼리가 여러 컬럼에서 행을 검색한다.

• 서브쿼리는 응용프로그램으로 대치가능하지만 성능이나 비용면에서 월등하다.

 

단일 열 단일 행 서브 쿼리

단일 열 다중 행 서브 쿼리

다중 열

 

 

 

단일행 서브쿼리

 

SELECT 컬럼 ...

FROM 테이블

WHERE 컬럼 단일_행_연산자 (SELECT 문장 : Sub query문) ......;

 

 

‐ 단일 행 연산자가 사용됨으로 반드시 서브쿼리의 결과 값은 한 개만 검색 돼야 한다.

‐ 서브쿼리는 반드시 괄호로 묶는다.

‐ 서브쿼리는 메인쿼리실행 전에 실행된다.

‐ 서브쿼리의 검색된 결괏값은 메인쿼리에 사용된다.

단일행 연산자오른쪽에 기술한다. →단일 행 연산자는 값이 하나만 와야 한다.

     .=, <, >, <=, >=, !=

‐ WHERE절에 기술된 열의숫자와 타입은 SELECT절과 1:1 대응관계가 되어야 한다.

 

• 남궁연호 보다 급여를 많이 받는 사원을 검색한다.

• 문시현과부서가 다르고 동일한 업무를 하는 사원의 정보를 검색한다.

 

SQL> SELECT eno 사번, ename 이름

2 FROM emp

3 WHERE sal > (SELECT sal 4 FROM emp 5 WHERE ename = '남궁연호');

 

SQL> SELECT eno 사번, ename 이름, dno 부서번호, job 업무

2 FROM emp

3 WHERE dno != (SELECT dno FROM emp WHERE ename = '문시현')

4 AND job = (SELECT job FROM emp WHERE ename = '문시현');

 

 

단일행 서브쿼리의 문제

 

• 김선유보다 급여를 많이 받는 사원을 검색한다. → 지문이 잘못됨

 

SQL> SELECT eno 사번, ename 이름

2 FROM emp

3 WHERE sal > (SELECT sal 4 FROM emp 5 WHERE ename = '김선유');

 

RA-01427: 단일 행 하위 질의에 2개 이상의~'

‐ 서브쿼리에서 2개 이상의 행이 검색된 경우

 

 

• 예측이 어려운 단일행 서브쿼리수정방법

‐ '=' 연산자는 'IN' 연산자로 바꾼다.

‐ 부등호('<', '>', '<=', '>=')는 any, all 다중 행 연산자를 추가한다.

‐ Max(), Min()과 같은 그룹 함수를 사용한다.