데이터베이스#6
- using
- SELECT table.column, table2.column FROM table1 JOIN table2 USING (column);
- on
- SELECT table.column, table2.column FROM table1 JOIN table2 ON table1.column = table2.column;
- cross join
- 카티션 곱
- 두 개 이상의 테이블에 대해 연결 가능한 행을 모두 결합
- 대용량에 테이블에서 발생할 경우 처리속도 저하
- 곱이기때문에 두 테이블의 행 x 행 한 처리 결과가 나온다
- 중복되는 컬럼의 경우 모호하기때문에 테이블(table1)에 대한 칼럼 이라고 명시 해준다
SELECT table.column, table2.column FROM [table, table2 | table1 CROSS JOIN table2];
- OUTER JOIN
- 오늘의 키워드
-
--LOCALHOST SAMPLE
--using, on 아래 두개는 같은 결과
-- join은 from의 다음절
select studno, name, deptno, dname
from student
natural inner join department;
-- natural join department; inner join을 생략할 수 도 있다.
select studno, name, deptno, dname
from student
join department using(deptno)
where name='전인하';
--필터링할 조건과
select studno, name, student.deptno, dname
from student
join department on student.deptno = department.deptno
where name = '전인하';
--카티션 곱
select studno, student.deptno, name, dname
from student
Cross join department;
-- EQUI JOIN =비교를 하면 EQUI JOIN이라 하고 =비교를 하지 않는 모든걸 NON-EQUI JOIN이라고 한다(AND 등등)
-- 학생 테이블과 부서 테이블을 EQUI JOIN하여 학번, 이름, 학과번호, 소속 학과 이름, 학과 위치를 출력하여라
SELECT S.STUDNO, S.NAME, S.DEPTNO, D.DNAME, D.LOC
FROM STUDENT S, DEPARTMENT D
WHERE S.DEPTNO = D.DEPTNO;
--달력할때 사용
with a as(
select 1 as A, 2 as B, 5 as C, 6 as D from dual
union
select 3 ,4 ,7 ,8 from dual
)
select *
from a
cross join a;
select * from all_objects;
select * from dict;
select rownum from dict WHERE ROWNUM<=31;
-- 공통되는 곳에는 식별자를 붙이면 오류난다(ORA-25155: column used in NATURAL join cannot have qualifier) deptno
select s.studno, deptno
from student s
natural join department d;
-- NATURAL JOIN을 이용하여 교수 번호, 이름, 학과 번호, 학과 이름을 출력하여라.
select p.profno, p.name, deptno, d.dname
from professor p
natural join department d;
-- NATURAL JOIN을 이용하여 4학년 학생의 이름, 학과 번호, 학과 이름을 출력하여라.
select s.grade, s.name, deptno, d.dname
from student s
natural join department d
where s.grade>=4;
-- JOIN ~ USING 젃을 이용하여 학번, 이름, 학과번호, 학과이름,학과위치를 츨력하여라.
select s.studno, s.name, deptno, d.name, d.loc
from student s
join department d
using(deptno);
-- EQUI JOIN의 3가지 방법을 이용하여 성이 '김'씨인 학생들의 이름, 학과이름, 학과위치를 출력하여라.
select name, dname, loc
from student s, department d
where s.deptno = d.deptno
and name like '김%';
select s.name, dname, d.loc
from student s
natural join department d
where name like '김%';
select name, dname, loc
from student join department
using(deptno)
where name like '김%';
-- 교수 테이블과 급여 등급 테이블을 NON-EQUI JOIN하여 교수별로 급여 등급을 출력하여라
select p.* ,name as 이름, grade as 등급, sal as 급여
from professor p
join salgrade s on p.sal between losal and hisal;
-- 학과 번호를 가지고 profno를 조회
select
--distinct(profno)
profno
from student join professor
using(profno);
select distinct(profno)
from student join professor
using(profno);
select profno from student
UNION
select profno from professor;
-- 행제거
DELETE FROM STUDENT WHERE STUDNO IN(33333,33334);
COMMIT;
--outer join (NULL대상 칼럼도 출력하고자 할때)
SELECT S.STUDNO, S.NAME, PROFNO, P.NAME
FROM STUDENT S
LEFT JOIN PROFESSOR P USING(PROFNO)
ORDER BY 1, 3;
SELECT *
FROM PROFESSOR P, STUDENT S
WHERE P.PROFNO = S.PROFNO(+);
SELECT * FROM DEPARTMENT;
SELECT D1.DEPTNO, D1.DNAME ||'의 상의 학과는 '|| NVL(D2.DNAME,'없습니다')
FROM DEPARTMENT D1 LEFT JOIN DEPARTMENT D2
ON D1.COLLEGE = D2.DEPTNO;
--LOCALHOST HR
-- SELECT * EMPLOYEES;
-- 사용자 아이디가 'jun123'인 학생과 같은 학년인 학생의 학번, 이름, 학년을 출력하여라
SELECT STUDNO, NAME, GRADE, USERID
FROM STUDENT
where grade = (
SELECT grade
FROM STUDENT
WHERE USERID = 'jun123'
);
SELECT STUDNO, NAME, DEPTNO,
(SELECT DNAME FROM DEPARTMENT WHERE DEPARTMENT.DEPTNO = STUDENT.DEPTNO) DNAME
FROM STUDENT;
SELECT STUDNO, NAME, DEPTNO, DNAME
FROM STUDENT NATURAL JOIN DEPARTMENT;
-- 101번 학과 학생들의 평균 몸무게보다 몸무게가 적은 학생의 이름, 학과번호, 몸무게를 출력하여라
SELECT * FROM STUDENT;
SELECT NAME, DEPTNO, WEIGHT
FROM STUDENT
WHERE WEIGHT <
(SELECT AVG(WEIGHT)
FROM STUDENT
WHERE DEPTNO = 101
)
ORDER BY DEPTNO;
--20101번 학생과 학년이 같고, 키는 20101번 학생보다 큰 학생의 이름, 학년, 키를 출력하여라
SELECT NAME, GRADE, HEIGHT
FROM STUDENT
WHERE GRADE = (SELECT GRADE
FROM STUDENT
WHERE STUDNO = 20101)
AND HEIGHT > (SELECT HEIGHT
FROM STUDENT
WHERE STUDNO = 20101);