K_Digital_Step1_Oracle SQL_04_2

윤일권·2022년 8월 17일
0

Oracle SQL

목록 보기
5/7

예약어

rownum, rowid

  • rownum : 레코드 조회 순서, 1부터 읽을 수 있다.
    order by 구문 이전에 미리 설정.
    그룹함수에서 사용 불가.
  • rowid : 레코드를 구분할 수 있는 고유의 id
    rowid가 다른 경우는 다른 레코드임
select name, grade, rownum, rowid from student;

위 코드는 오라클에서만 제공하는 예약어를 사용한 코드로 rownum과 rowid는 실제로
존재하지않은 컬럼이지만 출력이 가능하다.

select * from student where rownum =< 5;

위 코드는 학생 정보를 5건만 조회하는 코드이다. 이처럼 rownum에 조건을 걸 수 있다.
하지만 여기서 rownum을 6이상인 레코드를 출력한다면 결과가 나타나지 않을 것이다.
이는 rownum은 조회될 때 결정이 되기 때문에 1~5가 조회되지 않기 때문에 6이 조회되지 않기 때문이다. rownum에 이러한 특징에 대해 유의하자.

select name, grade, rownum from student order by name;

위 코드에서도 감안할 rownum에 특징이 있다. order by 에서 name을 기준으로 정렬을 했지만 출력해보면 rownum은 순서대로 출력되지않는다. 이는 rownum이 order by 이전에 미리 설정되어 있기 때문에 order by 구문으로 값이 변경이 안된다.

select grade, count(*), rownum, from student group by grade;

위 코드를 실행한다면 에러가 발생한다. 그룹함수에서 rownum은 레코드 순서를 조회하는 것이기 때문에 이를 사용할 수 없다.

Join

여러개의 테이블을 연결하여 조회.

cross join (카티션곱)

  • 오라클 조인 방식
  • 거의 사용 x
  • 두개의 테이블의 모든 레코드의 곱의 갯수로 레코드 조회
  • 조회되는 레코드 갯수가 두 테이블의 레코드의 곱이므로 사용시 주의
-- 14건
select count(*) from emp;
-- 4건
select count(*) from dept;
select * from emp,dept; -- cross join 14*4 = 총 56

위 코드는 emp 테이블과 dept 테이블을 cross join하는 코드이다
emp는 14건 dept는 4건으로 두 테이블을 cross join한다면 총 56건이 된다.
이는 레코드의 곱이 되는 join으로 사용이 복잡하여 잘 사용하지 않고 사용시 주의해야한다.

select enaem, deptno, dname from emp e, dept;

위 코드는 cross join하여 몇몇 컬럼만 조회한다 하지만 이는 에러가 발생한다.
이유는 deptno라는 컬럼은 emp와 dept 테이블에 둘다 존재하므로 이를 올바르게 출력하기 위해 [테이블명.컬럼명]이와 같은 형식으로 작성해야한다. dept.deptno
더 간단하게는 컬럼의 별명을 지어주 듯 테이블의 별명을 만들어서 지정할 수도 있다.

Equi Join (등가 조인)

  • 두개의 테이블을 연결해주는 연결 컬럼으로 레코드 조회
  • 연결 컬럼의 값이 같은 경우 연결

위 사진은 두 테이블을 cross join할 경우이다. 그림과 같이 '홍길동'이라는 학생에게 총 3가지 studno가 부여된다.

하지만 등가 조인을 할 경우 위 테이블에서 노란색으로 칠해진 것들이 조인되는 것이다.

select s.studno, s.name, sc.kor from student s, score sc where s.studno = sc.studno;

위 코드는 등가조인 사진을 하는 코드이다.
아래 예시 코드 한가지 더 살펴보겠습니다.

select s.name, s.deptno1, d.dname from student s, department d where s.deptno1 = d.deptno;

위 코드는 학생테이블과 학과테이블을 사용하여 학생이름, 전공학과1, 전공학과이름 출력하는 코드이다. 이는 오라클 방식의 코드인데 where문을 사용하여 두 테이블의 컬럼이 같다라는 조건을 주어 등가 조인을 한다.
추가로 출력하는 컬럼중에서 d.deptno가 없지만 where문에서 join 할때 두 테이블의 공통 컬럼을 입력하여 이를 통해 join한다.

select s.name, s.deptno1, d.dname from student s join department d on s.deptno1 = d.deptno;

위 코드 또한 같은 조건의 코드이다. 하지만 그 전 코드와 달리 오라클 방식인 아닌 ANSI(정석)방식이다. 이때는 where조건문을 사용하지 않고 join on을 사용한다.

select s.name 학생이름, d.dname 학과이름, p.name 지도교수이름 from student s, professor p , department d
where s.deptno1 = d.deptno and d.deptno = p.deptno;

위 코드는 학생, 학과, 교수 3가지 테이블을 join하는 코드이다.
이때 where 조건문에서 and를 사용하여 총 3가지 테이블을 join할 수 있다.
이때 중요한건 deptno이나 deptno1에 컬럼 데이터가 동일한 기준이여야한다.
만약 학생테이블에서는 100번대를 학과테이블에서는 1000번대 교수테이블에서 10000번대라면 이는 성립하지 않는다.

profile
생각하는 개발자가 되겠습니다!!

0개의 댓글