Day 57

dokiru·2023년 4월 18일
0

학원

목록 보기
38/51

퀴즈 피드백

  • 문제에서 요구하는 정보가 정확하게 뭔지 파악할 것 (도출 결과만 같다고 해서 맞는게 아니다!!)
  • 테이블을 조인할 때 조인하는 테이블들에 조건을 다 붙여줘야 함 (그렇지 않으면 크로스 조인이 되어서 가능한 모든 경우의 수가 같이 출력될 것)

ex. 학생의 이름과 학생의 학년, 학생의 지도교수 이름, 지도교수의 학과 번호, 지도교수가 속한 학과이름을 출력 => 지도교수가 속한 학과가 아니라 학생이 속한 학과를 조건으로 거는건 다른 문제 !!


조인

: 여러 테이블을 하나의 테이블처럼 사용하는 조인 (가로로 연결)

ANSI JOIN vs Oracle JOIN

: ansi (american national standards institute) => 미국 국립 표준 협회에서 제시한 sql에 대한 보편적인 문법
: Oracle JOIN => ansi join을 좀 더 편리하게 사용하기 위해 개발..

ex.
1. ANSI JOIN

SELECT a.col1, b.col1
FROM table1 a [INNER] JOIN table2 b
ON a.col2 = b.col2;
  1. Oracle JOIN
SELECT a.col1, b.col1
FROM table1 a, table2 b
WHERE a.col2 = b.col2;

카티션 곱

: 조건이 없을 경우 모든 경우의 수 출력

SELECT *
FROM student, professor;

등가조인과 비등가 조인

  1. EQUI Join (등가 Join)
    : 특정 열값이 일치한 출력 결과를 사용하는 방식
    + 여러 테이블의 열 이름이 같을 때는 테이블 별칭을 붙여서 구분해줘야함! (안그러면 오류 발생)

ex.

--ANSI
SELECT s.name stu_name, p.profno 교수번호,  p.name prof_name
FROM student S INNER JOIN professor P
ON s.profno = p.profno;

--Oracle
SELECT s.name stu_name,  p.name prof_name
FROM student S, professor P
WHERE s.profno = p.profno;
  1. Non-Equi Join (비등가 Join)
    : 값을 등가로 비교할 수 없을 때 (범위 안에 들어간다거나..)
    ex.
SELECT st.name, sc.total, ha.grade
FROM student st, score sc, hakjum ha
WHERE st.studno = sc.studno
      AND sc.total BETWEEN ha.min_point AND ha.max_point;

OUTER JOIN vs INNER JOIN

  • OUTER JOIN은 조인 기준 열의 어느 한쪽이 NULL이어도 강제로 출력하는 방식! (null값도 출력됨)
  • INNER JOIN은 매칭되는 것만 출력

ex.

-- ANSI
SELECT s.name "STU_NAME", p.name "PROF_NAME"
FROM student s LEFT OUTER JOIN professor p
ON s.profno = p.profno;

SELECT s.name "STU_NAME", p.name "PROF_NAME"
FROM student s RIGHT OUTER JOIN professor p
ON s.profno = p.profno;

-- Oracle
SELECT *
FROM student s, professor p
WHERE s.profno = p.profno(+); -- 왼쪽

SELECT *
FROM student s, professor p
WHERE s.profno(+) = p.profno; -- 오른쪽
  • SELF join
    : 하나의 테이블을 여러 개의 테이블처럼 활용하는 조인 방식처럼..
    : 하나의 테이블의 별칭을 다르게 설정

ex.

-- 사원의 상사 사번 조회
SELECT e1.empno, e1.ename, e1.mgr, e2.empno 상사사번, e2.ename 상사이름
FROM emp e1, emp e2
WHERE e1.mgr = e2.empno;

서브쿼리(Sub Query)

: SQL문을 실행하는 데 필요한 데이터를 추가로 조회하기 위해 SQL문 내부에서 사용하는 SELECT 문

  • 형식
SELECT select_list
FROM TABLE 또는 View
WHERE 조건 연산자 ( SELECT select_list
				  FROM TABLE
				  WHERE 조건 ) ;
  • 종류
  1. 단일 행

  2. 다중 행

연산자의미
IN서브 쿼리 결과와 같은 값을 찾음
EXISTS서브 쿼리의 값이 있을 경우 메인 쿼리를 수행
>ANY서브 쿼리 결과 중에서 최솟값을 반환
<ANY서브 쿼리 결과 중에서 최댓값을 반환
>ALL서브 쿼리 결과 중에서 최솟값을 반환
<ALL서브 쿼리 결과 중에서 최댓값을 반환
profile
안녕하세요!

0개의 댓글