집합 연산자

집합 연산자의 종류

 

SELECT ...
[UNION ALL | UNION | INTERSECT | MINUS]
SELECT ...

 

* 카디널리티 (튜플 수 : 열)

* 데이터베이스 성능 : 마지막 데이터를 읽는 시간

 

※ 데이터 검색시 데이터 타입이 다를 경우 NULL을 검색조건에 넣어준다.

SELECT eno, ename, NULL hiredate, comm, sal
FROM emp
UNION
SELECT pno, pname, hiredate, NULL,NULL
FROM professor
ORDER BY hiredate;

ENO     ENAME      HIREDATE         COMM        SAL
------- ---------- ---------- ---------- ----------
1030    김동평     2002/02/15
1001    송강       2002/08/12
1006    장청아     2003/05/20
1038    하영진     2004/03/02
1008    문규식     2005/02/11
1033    박삭광     2005/07/14
1029    주동평     2006/01/26

ENO     ENAME      HIREDATE         COMM        SAL
------- ---------- ---------- ---------- ----------
1016    호연작     2009/10/21
1007    이초아     2010/07/06
1017    최무송     2011/01/24
0001    안영희                         0       4800
0120    김경현                      2500       4000
0201    안영숙                      2000       3900
0202    손하늘                       980       3510

 

예제 1. 2000년 이후에 입사한 사원과 부임한 교수의 명단을 검색한다.

union all - 중복 포함

SELECT pno 번호, pname 이름, hiredate 입사일_부임일
FROM professor
WHERE hiredate >= '2000/01/01'
UNION ALL
SELECT eno, ename, hdate
FROM emp
WHERE hdate >= '2000/01/01';

번호             이름       입사일_부
---------------- ---------- ----------
1001             송강       2002/08/12
1006             장청아     2003/05/20
1007             이초아     2010/07/06
1008             문규식     2005/02/11
1012             이영준     2000/05/18
1016             호연작     2009/10/21
1027             임충원     2001/06/03

 

union - 중복 제거

SELECT pno 번호, pname 이름, hiredate 입사일_부임일
FROM professor
WHERE hiredate > '2000/01/01'
UNION
SELECT eno, ename, hdate
FROM emp
WHERE hdate > '2000/01/01';

번호             이름       입사일_부
---------------- ---------- ----------
0269             권나현     2015/05/21
0309             김선유     2011/01/03
0401             김진성     2008/03/13
0702             김민지     2017/01/09
0801             천유정     2000/10/09
1001             송강       2002/08/12
1006             장청아     2003/05/20

 

예제 2. 제갈씨 성을 가진 사원 중에 지원 업무를 하지 않는 사원을 검색한다.

SELECT eno, ename, job
FROM emp
WHERE ename LIKE '제갈%'
MINUS
SELECT eno, ename, job
FROM emp
WHERE job = '지원';

ENO     ENAME      JOB
------- ---------- -------
2002    제갈민     개발

 

예제 3. 화학, 물리학과 학생들 중에 학점이 3.0 이상인 학생을 검색한다.

SELECT sno 학번, sname 이름, major 학과, avr 성적 
FROM student
WHERE major IN ('화학','물리')
INTERSECT
SELECT sno, sname, major, avr FROM student
WHERE avr >= 3;

학번    이름       학과          성적
------- ---------- ------- ----------
905301  유태지     화학          3.28
914502  문수보     물리          3.33
914504  심빈경     물리          3.33
924501  권석복     물리             4
924505  서찬호     물리             3
925301  김환       화학          3.58
934504  갑서진     물리          3.22

 

실습

1. 화학과 학생과 교수를 검색한다. (집합 연산자를 이용한다.)

SELECT sno 번호, sname 이름, major 학과
FROM student
WHERE major = '화학'
UNION
SELECT pno, pname, section
FROM professor
WHERE section = '화학';

번호    이름       학과
------- ---------- -------
1001    송강       화학
1004    시진영     화학
1006    장청아     화학
1007    이초아     화학
1008    문규식     화학
905301  유태지     화학
905302  정욱상     화학


2. 정교수의 명단과 모델링이 업무인 직원의 이름, 입사일(부임일)을 검색한다.

SELECT pno 번호, pname 이름, hiredate 입사일, orders 직위_업무
FROM professor
WHERE orders = '정교수'
UNION
SELECT  eno, ename, hdate, job
FROM emp
WHERE job = '모델링';

번호    이름       입사일     직위_업무
------- ---------- ---------- ---------
1001    문시현     1991/02/01 모델링
1001    송강       2002/08/12 정교수
1002    김주란     1992/03/03 모델링
1003    양선호     1995/02/21 모델링
1009    이준영     1991/10/04 정교수
1010    이규진     1998/10/07 정교수
1021    왕사진     1997/02/17 정교수

번호    이름       입사일     직위_업무
------- ---------- ---------- ---------
1029    주동평     2006/01/26 정교수
1030    김동평     2002/02/15 정교수
1033    박삭광     2005/07/14 정교수
1035    장관용     1985/07/28 정교수

다중 행 서브 쿼리

SELECT [DISTINCT | ALL] 컬럼, 컬럼 ...
FROM 테이블
WHERE 컬럼 다중_행_연산자 (SELECT 문장 : Sub query문)

- 다중 행 연산자
. IN : 나열된(검색된) 값 중에 하나만 일치하면 참이다.
. ANY : 나열된(검색된) 값 중에 조건에 맞는 것이 하나 이

 

예제 1. 20번 부서원들과 동일한 관리자로부터 관리 받는 사원을 검색한다.

SELECT eno 사번, ename 이름
FROM emp
WHERE mgr IN (SELECT mgr
		FROM emp
		WHERE dno = '20')
AND dno != '20'; // 20번 부서원이 검색되는 것을 막기 위한 조건

사번    이름
------- ----------
1001    문시현
1003    양선호
2001    남궁연호
2003    정의찬

 

예제 2. 10번 부서원들보다 급여가 낮은 사원을 검색한다.

SELECT eno 사번, ename 이름, dno 부서번호
FROM emp
WHERE sal < ALL (SELECT sal
		FROM emp
		WHERE dno = '10');

사번    이름       부서번호
------- ---------- ---------
2008    윤고은     40
2007    이초록     30
2002    제갈민     20
0702    김민지     02
0309    김선유     02

 

SELECT eno 사번, ename 이름, dno 부서번호
FROM emp
WHERE sal < ALL (SELECT MIN(sal)
		FROM emp
		WHERE dno = '10');

사번    이름       부서번호
------- ---------- ---------
2002    제갈민     20
2007    이초록     30
2008    윤고은     40
0309    김선유     02
0702    김민지     02

 

* 다중 행 연산자와 그룹함수
다중 행 연산자인 ALL이나 ANY는 다음과 같이 그룹 함수를 이용 표현할 수 있다. 그룹 함수는 [19장
그룹 함수]에서 자세히 설명한다.
* 컬럼 > ALL → 컬럼 > MAX() : 가장 큰 값보다 크다
* 컬럼 < ALL → 컬럼 < MIN() : 가장 작은 값보다 작다.
* 컬럼 > ANY → 컬럼 > MIN() : 가장 작은 값보다 크다.
* 컬럼 < ANY → 컬럼 < MAX() : 가장 큰 값보다 작다.

 

다중 열 서브 쿼리

SELECT [DISTINCT | ALL] 컬럼, 컬럼 ...
FROM 테이블
WHERE (컬럼1, 컬럼2, ... ) IN (SELECT 문장 : Sub query문)

 

예제 3. 손하늘과 동일한 관리자의 관리를 받으면서 업무도 같은 사원을 검색한다.

SELECT eno 사번, ename 이름, mgr 관리자, job 업무
FROM emp
WHERE (mgr, job) IN (SELECT mgr, job
			FROM emp
			WHERE ename = '손하늘')
AND ename != '손하늘';

사번    이름       관리자   업무
------- ---------- -------- -------
0201    안영숙     0001     지원

손하늘이 두 명 이상이라면 수정이 불가능하다.

 

SELECT eno 사번, ename 이름, mgr 관리자, job 업무
FROM emp
WHERE mgr = (SELECT mgr FROM emp WHERE ename = '손하늘')
AND job = (SELECT job FROM emp WHERE ename = '손하늘')
AND ename != '손하늘';

사번    이름       관리자   업무
------- ---------- -------- -------
0201    안영숙     0001     지원

 

예제 4. 김선유와 부서 및 업무가 동일한 사원을 검색한다.

SELECT eno 사번, ename 이름, dno 부서번호, job 업무
FROM emp
WHERE (dno, job) IN (SELECT dno, job
			FROM emp
			WHERE ename = '김선유')
AND ename != '김선유';

사번    이름       부서번호  업무
------- ---------- --------- -------
0301    이승철     02        회계
0302    박선경     02        회계
0702    김민지     02        회계
0269    권나현     10        분석

 

SELECT eno 사번, ename 이름, dno 부서번호, job 업무
FROM emp
WHERE dno in (SELECT dno FROM emp WHERE ename = '김선유')
AND job in (SELECT job FROM emp WHERE ename = '김선유')
AND ename != '김선유';

사번    이름       부서번호  업무
------- ---------- --------- -------
0301    이승철     02        회계
0302    박선경     02        회계
0702    김민지     02        회계
0801    천유정     02        분석
0401    김진성     10        회계
0269    권나현     10        분석

 

SELECT ename, dno, job
FROM emp
WHERE ename = '김선유';

ENAME      DNO     JOB
---------- ------- -------
김선유     02      회계
김선유     10      분석

실습

1. 화학과 학생과 평점이 동일한 학생들을 검색한다.

SELECT sno 학번, sname 이름, major 전공
FROM student
WHERE avr IN (SELECT avr FROM student WHERE major = '화학')
AND major != '화학';

학번    이름       전공
------- ---------- -------
948209  유태지     식영
924505  서찬호     물리
913904  이호란     생물
933903  정승동     생물
915605  강은혜     유공
924502  은정현     물리
935604  권석현     유공

학번    이름       전공
------- ---------- -------
945605  오경운     유공
943905  유태지     생물
943903  유지아     생물
944512  서동조     물리
945603  정백영     유공

 


2. 화학과 교수와 부임일이 같은 직원을 검색한다.

SELECT eno 학번, ename 이름, hdate 부임일자
FROM emp
WHERE hdate IN (SELECT hiredate FROM professor WHERE section = '화학');

학번    이름       부임일자
------- ---------- ----------
0201    안영숙     1991/02/01
1001    문시현     1991/02/01


3. 화학과 학생과 같은 학년에서 평점이 동일한 학생들을 검색한다. (다중열 서브쿼리)

SELECT syear 학년, sno 학번, sname 이름, major 전공, avr 평점
FROM student
WHERE (syear, avr) IN (SELECT syear, avr FROM student WHERE major = '화학')
AND major != '화학';

      학년 학번    이름       전공          평점
---------- ------- ---------- ------- ----------
         1 945605  오경운     유공          2.99


4. 10번 부서 사원들보다 년봉을 많이 받는 사원을 검색한다.

SELECT eno 사번, ename 이름, sal*12+NVL(comm,0) 연봉, dno 부서번호
FROM emp
WHERE (sal*12+NVL(comm,0)) > (SELECT MAX(sal*12+NVL(comm,0)) FROM emp WHERE dno = 10)
AND dno != 10;

사번    이름             연봉 부서번호
------- ---------- ---------- ---------
0001    안영희          57600 01


5. 10번 부서 사원들과 업무와 성별이 동시에 일치하는 사원을 검색한다.

SELECT eno 사번, ename 이름, job 업무, sex 성별
FROM emp
WHERE (job, sex) IN (SELECT job, sex FROM emp WHERE dno = 10)
AND dno != 10;

사번    이름       업무    성
------- ---------- ------- ---
1003    양선호     모델링  남
2002    제갈민     개발    남
2003    정의찬     개발    남
2007    이초록     개발    남
3002    권아현     분석    여
0801    천유정     분석    여
0301    이승철     회계    남

사번    이름       업무    성
------- ---------- ------- ---
0309    김선유     회계    남
0702    김민지     회계    남

 

서브 쿼리 : 단일 행 서브 쿼리

* 서브 쿼리란?
단일 행 서브 쿼리 :
- 서브 쿼리가 하나의 컬럼에서 하나의 행을 검색한다.
다중 행 서브 쿼리
- 서브 쿼리가 하나의 컬럼에서 여러 개의 행을 검색한다.
다중 열 서브 쿼리 (IN)
- 서브 쿼리가 여러 개의 컬럼을 검색한다.

 

서브 쿼리는 WHERE절, HAVING절과 같이 조건 절에 주로 쓰이고 FROM절에 쓰이는 경우도 있다. 특
히 FROM절에 쓰인 서브 쿼리는 인라인 뷰(Inline View)라고 부른다.

 

단일 행 서브 쿼리

SELECT [DISTINCT | ALL] 컬럼, 컬럼 ...
FROM 테이블
WHERE 컬럼 단일_행_연산자 (SELECT 문장 : Sub query문)

- 단일 행 연산자가 사용됨으로 반드시 서브 쿼리의 결과 값은 한 개만 검색돼야 한다.
- 단일 행 연산자 오른쪽에 기술한다.
   (=, <, >, <=, >=, !=)
- WHERE절에 기술된 열의 숫자와 타입은 SELECT절과 1:1 대응 관계가 되어야 한다.

 

 

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

SELECT eno 사번, ename 이름
FROM emp
WHERE sal > (SELECT sal
		FROM emp
		WHERE ename = '남궁연호');

사번    이름
------- ----------
0001    안영희
1001    문시현
1002    김주란
1003    양선호
2003    정의찬
0120    김경현

 

예제 2. 김선유보다 급여를 많이 받는 사원을 검색한다.

SELECT eno 사번, ename 이름
FROM emp
WHERE sal > (SELECT sal
		FROM emp
		WHERE ename = '김선유');
WHERE sal > (SELECT sal
                 *
3행에 오류:
ORA-01427: 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다.

동명이인이 있을 수 있기 때문에 검색이 안된다.

 

* 예측하기 힘든 단일 행 서브 쿼리를 수정하는 방법
① '=' 연산자는 'IN' 연산자로 바꾼다.
② 부등호 ('<', '>', '<=', '>=')는 any, all 연산자를 추가한다.

  (< 일때, any는 항목에 가장 큰값보다 작으면 가능, all은 가장 작은값보다 작으면 가능)
③ Max(), Min()과 같은 그룹 함수를 사용 한다.

 

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

SELECT eno 사번, ename 이름, dno 부서번호, job 업무
FROM emp
WHERE dno != (SELECT dno FROM emp WHERE ename = '문시현')
AND job = (SELECT job FROM emp WHERE ename = '문시현');

사번    이름       부서번호  업무
------- ---------- --------- -------
1002    김주란     20        모델링
1003    양선호     30        모델링

 

예제 4. 부산에서 근무하는 사원의 정보를 검색한다.

SELECT eno 사번, ename 이름
FROM emp
WHERE dno = (SELECT dno
		FROM dept
		WHERE loc = '부산');

사번    이름
------- ----------
1002    김주란
2002    제갈민
3002    권아현
0120    김경현

 

SELECT eno 사번, ename 이름
FROM emp e, dept d
WHERE e.dno = d.dno
AND loc = '부산';

사번    이름
------- ----------
1002    김주란
2002    제갈민
3002    권아현
0120    김경현

 

 

실습

1. 김혁윤 보다 평점이 우수한 학생의 학번과 이름을 검색한다.

SELECT sno 학번, sname 이름, avr 평점
FROM student
WHERE avr > (SELECT avr
		FROM student
		WHERE sname = '김혁윤');

학번    이름             평점
------- ---------- ----------
933904  임영현           3.98
924501  권석복              4
915601  강태용            3.9
925603  최지현           3.89
945601  심정용            3.9
918203  장운영           3.89
918205  독고낭도         3.99

학번    이름             평점
------- ---------- ----------
938202  신섭인           3.93
938204  최현             3.92


2. 권현와 동일한 학년 학생 중에 평점이 강은혜와 동일한 학생을 검색한다.

SELECT syear 학년, sno 학번, sname 이름, avr 평점
FROM student
WHERE syear = (SELECT syear FROM student WHERE sname = '권현')
AND avr = (SELECT avr FROM student WHERE sname = '강은혜');

      학년 학번    이름             평점
---------- ------- ---------- ----------
         1 925309  오우재           2.99
         1 945605  오경운           2.99


3. 이학수학 과목과 동일한 학점수인 과목을 검색한다.

SELECT st_num 학점, cno 과목번호, cname 과목명
FROM course
WHERE st_num = (SELECT st_num FROM course WHERE cname = '이학수학');

      학점 과목번호  과목명
---------- --------- ------------
         2 1211      일반화학실험
         2 1214      무기화학
         2 1216      환경화학
         2 1218      생화학
         2 1227      이학수학
         2 1228      위상수학
         2 2365      전자기학

      학점 과목번호  과목명
---------- --------- ------------
         2 2366      물리실험
         2 2369      무기화학실험
         2 1711      유전학실험
         2 1245      실험물리학
         2 2112      영양학실험
         2 2313      분류학실험


4. 타 학과에 송강 교수와 동일한 지위의 교수 명단을 검색한다.

SELECT pno 교수번호, pname 교수이름, orders 지위, section 학과
FROM professor
WHERE section != (SELECT section FROM professor WHERE pname = '송강')
AND orders = (SELECT orders FROM professor WHERE pname = '송강');

교수번호  교수이름   지위    학과
--------- ---------- ------- -------
1010      이규진     정교수  물리
1009      이준영     정교수  물리
1021      왕사진     정교수  생물
1029      주동평     정교수  생물
1030      김동평     정교수  유공
1033      박삭광     정교수  유공
1035      장관용     정교수  식영


5. 제갈민의 입사일보다 나중에 부임한 교수의 명단을 검색한다.

SELECT pno 교수번호, pname 교수이름, hiredate 부임일자
FROM professor
WHERE hiredate > (SELECT hdate FROM emp WHERE ename = '제갈민');

교수번호  교수이름   부임일자
--------- ---------- ----------
1001      송강       2002/08/12
1006      장청아     2003/05/20
1007      이초아     2010/07/06
1008      문규식     2005/02/11
1010      이규진     1998/10/07
1013      하영진     1999/04/19
1012      이영준     2000/05/18

교수번호  교수이름   부임일자
--------- ---------- ----------
1016      호연작     2009/10/21
1018      김응전     1999/02/18
1021      왕사진     1997/02/17
1027      임충원     2001/06/03
1029      주동평     2006/01/26
1030      김동평     2002/02/15
1017      최무송     2011/01/24

교수번호  교수이름   부임일자
--------- ---------- ----------
1033      박삭광     2005/07/14
1034      최해연     1998/07/02
1038      하영진     2004/03/02


6. 강태용보다 일반 화학 과목의 학점이 더 낮은 학생의 명단을 학점과 검색한다.

// 성적으로 검색
SELECT s.sno 학번, sname 이름, result 성적, cname 과목이름
FROM student s, course c, score r
WHERE s.sno = r.sno 
AND r.cno = c.cno
AND cname = '일반화학'
AND result < (SELECT result 
FROM student s, score r, course c
WHERE s.sno = r.sno 
AND r.cno = c.cno
AND sname='강태용'
AND cname='일반화학');

학번    이름             성적 과목이름
------- ---------- ---------- ------------
913902  황진혜             70 일반화학
913903  정도정             57 일반화학
913904  이호란             27 일반화학
914502  문수보             60 일반화학
915301  정동상             44 일반화학
915305  최정희             53 일반화학
915604  정성현             54 일반화학

// 학점으로 검색
SELECT s.sno 학번, s.sname 이름, result 성적, sc.grade 학점, cname 과목이름
FROM student s, score r, course c, scgrade sc
WHERE s.sno=r.sno
AND r.cno=c.cno
AND result between loscore and hiscore
AND grade > (SELECT grade
FROM student s, score r, course c, scgrade sc
WHERE s.sno=r.sno
AND r.cno=c.cno
AND result between loscore and hiscore
AND sname='강태용'
AND cname='일반화학')
AND cname='일반화학';

학번    이름             성적 학점  과목이름
------- ---------- ---------- ----- ------------
913903  정도정             57 C     일반화학
913904  이호란             27 F     일반화학
914502  문수보             60 C     일반화학
915301  정동상             44 D     일반화학
915305  최정희             53 D     일반화학
915604  정성현             54 D     일반화학
918201  이경철             62 C     일반화학


SELECT s.sno, sname, cname, grade
FROM student s, course c, score r, scgrade g
WHERE s.sno=r.sno AND r.cno=c.cno AND result BETWEEN loscore AND hiscore
AND cname = '일반화학'
AND grade > ( SELECT grade 
                FROM student s, course c, score r, scgrade g
                WHERE s.sno=r.sno AND r.cno=c.cno 
                AND result BETWEEN loscore AND hiscore
                AND sname = '강태용'
                AND cname = '일반화학');   
                
SNO     SNAME      CNAME        GRADE
------- ---------- ------------ -------
913903  정도정     일반화학     C
913904  이호란     일반화학     F
914502  문수보     일반화학     C
915301  정동상     일반화학     D
915305  최정희     일반화학     D
915604  정성현     일반화학     D
918201  이경철     일반화학     C

 

조인 : 자기 참조 조인(Self join)과 외부조인(Outer join)

조인 문을 생성하는 과정
step 1. 지문에서 검색 대상과 조건을 구분한다.
- 이를 통해 일단 SELECT 절, WHERE 절, ORDER BY 절을 구성한다.
- SELECT 절은 step 5에서 작성자의 의도에 따라 추가될 수 있다.
step 2. SELECT 절과 WHERE 절의 내용에 따라 정보를 검색할 테이블을 찾는다.
step 3. 테이블간의 관계를 확인한다.
- 관계를 확인하는 단계에서 테이블이 추가될 수 있다.
step 4. 조인 조건을 기술한다.
step 5. 전체 문장을 다듬는다.

 

 

예제 1. 위에 제시한 단계별로 지문으로부터 SQL문을 만들어 보자.
- 화학과 학생의 일반화학 기말고사 점수를 검색한다.

step 1. 지문에서 검색 대상과 조건을 찾는다.

step 2. SELECT 절과 WHERE 절의 내용에 따라 정보를 검색할 테이블을 찾는다.

step 3. 테이블간의 관계를 확인한다.

step 4. 조인 조건을 기술한다.

step 5. 전체 문장을 다듬는다.

 

- 4학년 학생이 수강하는 과목을 강의하는 교수의 명단을 검색한다.

step 1. 지문에서 검색 대상과 조건을 찾는다.

step 2. SELECT 절과 WHERE 절의 내용에 따라 정보를 검색할 테이블을 찾는다.

step 3. 테이블간의 관계를 확인한다.

step 4. 조인 조건을 기술한다.

step 5. 전체 문장을 다듬는다.

 

자기 참조 조인 (Self Join)

: 같은 TABLE 조인 (TABLE 하나 더 생성하고 조인)

별명을 이용한 조인

SELECT 별명1.컬럼1, ... 별명2.컬럼1, ...
FROM 테이블 별명1, 테이블 별명2, ...
WHERE 조인_조건
AND 일반_조건

 

예제 2. 각 사원을 관리하는 사수의 이름을 검색한다. (mgr : 사수 사번)

SELECT e1.eno, e1.ename, e1.mgr, e2.eno, e2.ename
FROM emp e1, emp e2
WHERE e1.mgr = e2.eno;

ENO     ENAME      MGR      ENO     ENAME
------- ---------- -------- ------- ----------
0201    안영숙     0001     0001    안영희
0202    손하늘     0001     0001    안영희
0301    이승철     0001     0001    안영희
2007    이초록     0001     0001    안영희
2008    윤고은     0001     0001    안영희
1001    문시현     0201     0201    안영숙
1002    김주란     0201     0201    안영숙

 

외부 조인(Outer join)

SELECT 테이블1.컬럼, ..테이블2.컬럼, ...
FROM 테이블1, 테이블2, ...
WHERE 조인_조건(+)
AND 일반_조건

데이터 없는 쪽에 (+) 붙이기

 

예제 3. 각 부서별로 사원를 검색한다. (외부 조인과 일반 조인 결과물의 비교)

- 일반 조인 

SELECT d.dno 부서번호, dname 부서명, ename 사원명
FROM dept d, emp e
WHERE d.dno = e.dno
ORDER BY 1;

부서번호  부서명  사원명
--------- ------- ----------
01        총무    안영숙
01        총무    안영희
01        총무    손하늘
02        회계    박선경
02        회계    이승철
02        회계    천유정
02        회계    김민지

SQL문은 맞으나 데이터가 틀림. 

 

- 외부 조인

SELECT d.dno 부서번호, dname 부서명, ename 사원명
FROM dept d, emp e
WHERE d.dno = e.dno(+)
ORDER BY 1;

부서번호  부서명  사원명
--------- ------- ----------
01        총무    안영희
01        총무    안영숙
01        총무    손하늘
02        회계    이승철
02        회계    박선경
02        회계    천유정
02        회계    김선유
...
부서번호  부서명  사원명
--------- ------- ----------
50        POS

데이터 없는 emp 테이블에 (+) 기호를 붙인다.

 

 

실습

1. 학생 중에 동명이인을 검색한다.

SELECT DISTINCT s1.sname 이름, s1.sno 학번
FROM student s1, student s2
WHERE s1.sname = s2.sname
AND s1.sno != s2.sno 
ORDER BY s1.sname;

이름       학번
---------- -------
유태지     905301
유태지     943905
유태지     948209
황진혜     913902
황진혜     913908


2. 전체 교수 명단과 교수가 담당하는 과목의 이름을 학과 순으로 검색한다.

SELECT p.pno 교수번호, pname 교수이름, section 학과, cno 과목번호, cname 과목이름
FROM professor p, course c
WHERE p.pno = c.pno(+)
ORDER BY section;

교수번호  교수이름   학과    과목번호  과목이름
--------- ---------- ------- --------- ------------
1018      김응전     물리    1290      열역학
1016      호연작     물리    1287      전산물리
1013      하영진     물리    1245      실험물리학
1012      이영준     물리    1233      역학
1013      하영진     물리    1223      자기학
1009      이준영     물리
1016      호연작     물리    1226      양자물리학
...


3. 이번 학기 등록된 모든 과목과 담당 교수를 학점 순으로 검색한다.

SELECT st_num 학점, cno 과목번호, cname 과목명, c.pno 교수번호, pname 교수이름
FROM course c, professor p
WHERE c.pno = p.pno(+)
ORDER BY st_num;

      학점 과목번호  과목명       교수번호  교수이름
---------- --------- ------------ --------- ----------
         2 1228      위상수학     1018      김응전
         2 2365      전자기학     1029      주동평
         2 2112      영양학실험   1034      최해연
         2 2313      분류학실험   1027      임충원
         2 1211      일반화학실험 1001      송강
         2 1218      생화학       1008      문규식
         2 2366      물리실험     1030      김동평

      학점 과목번호  과목명       교수번호  교수이름
---------- --------- ------------ --------- ----------
         2 1214      무기화학     1004      시진영
         2 1245      실험물리학   1013      하영진
         2 1216      환경화학     1006      장청아
         2 1227      이학수학     1017      최무송
         2 2369      무기화학실험
         2 1711      유전학실험   1036      성현수
         3 2312      생리학       1022      이준
         ...


4. 직원 중에 자신의 관리자 보다 급여가 높은 사람의 급여 정보를 관리자 급여 정보와 같이 검색한다.

SELECT e1.eno 사번, e1.ename 이름, e1.sal 급여, e1.mgr 관리자번호, e2.eno 사번, e2.ename 이름, e2.sal 급여
FROM emp e1, emp e2
WHERE e1.mgr = e2.eno
AND e1.sal > e2.sal;

사번    이름             급여 관리자번호   사번    이름             급여
------- ---------- ---------- ------------ ------- ---------- ----------
1001    문시현           4500 0201         0201    안영숙           3900
1002    김주란           4100 0201         0201    안영숙           3900
1003    양선호           4300 0201         0201    안영숙           3900
2001    남궁연호         3950 0202         0202    손하늘           3510
2003    정의찬           4350 0202         0202    손하늘           3510


5. 교수의 정보와 교수가 담당하는 과목명을 검색한다.

SELECT p.pno 교수번호, pname 교수이름, cno 과목번호, cname 과목이름
FROM professor p, course c
WHERE p.pno = c.pno(+);

교수번호  교수이름   과목번호  과목이름
--------- ---------- --------- ------------
1001      송강       1211      일반화학실험
1004      시진영     1212      일반화학
1006      장청아     1213      유기화학
1004      시진영     1214      무기화학
1006      장청아     1216      환경화학
1007      이초아     1217      고분자화학
1008      문규식     1218      생화학
...
교수번호  교수이름   과목번호  과목이름
--------- ---------- --------- ------------
1021      왕사진     2322      생물정보학
1027      임충원     2313      분류학실험
1029      주동평     2329      발생생물학
1033      박삭광
1009      이준영


6. 직원과 사수의 명단을 검색한다. 단 직원 명단은 모든 직원 명단이 출력되어야 한다.

SELECT e1.eno 사번, e1.ename 이름, e1.mgr 관리자번호, e2.eno 사번, e2.ename 이름
FROM emp e1, emp e2
WHERE e1.mgr = e2.eno(+);

사번    이름       관리자번호   사번    이름
------- ---------- ------------ ------- ----------
0201    안영숙     0001         0001    안영희
0202    손하늘     0001         0001    안영희
0301    이승철     0001         0001    안영희
2007    이초록     0001         0001    안영희
2008    윤고은     0001         0001    안영희
1001    문시현     0201         0201    안영숙
1002    김주란     0201         0201    안영숙
...
사번    이름       관리자번호   사번    이름
------- ---------- ------------ ------- ----------
0309    김선유     0302         0302    박선경
3001    김선유     1001         1001    문시현
0401    김진성     1001         1001    문시현
0801    천유정     1001         1001    문시현
3002    권아현     1002         1002    김주란
0120    김경현     1002         1002    김주란
0001    안영희


7. 화학과 학생 중에 학점이 동일한 학생을 검색한다.

SELECT s1.sno 학번, s1.sname 이름, s1.major 학과, s1.avr 평점
FROM student s1, student s2
WHERE s1.sno != s2.sno
AND s1.avr = s2.avr
AND s1.major = s2.major
AND s1.major = '화학';

학번    이름       학과          평점
------- ---------- ------- ----------
915303  정욱주     화학           .95
915301  정동상     화학           .95

 

등가 조인과 비 등가 조인(Equi join, Nequi join : INNER JOIN)

SELECT 테이블1.컬럼, ...테이블2.컬럼, ...
FROM 테이블1, 테이블2, ...
WHERE 조인_조건
AND 일반_조건

- 조인 조건은 두 테이블간의 관계를 수식으로 표현
- 조인 조건은 SELECT 문에 사용된 테이블의 개수에 따라 달라진다.

- 테이블 n개 라면 조인 조건의 개수는 항상 (n-1)개 이상이다.


등가 조인(Equi-join)

: 조인 조건에 '='를 이용하는 조인

 

비 등가 조인(Non equi-join)

: 부등호가 포함된 조인 조건

 

예제 1. 각 사원의 근무 부서를 검색한다.

SELECT eno 사번, ename 이름, emp.dno 부서번호,
	dept.dno 부서번호, dname 부서명
FROM dept, emp
WHERE dept.dno = emp.dno;

사번    이름       부서번호  부서번호  부서명
------- ---------- --------- --------- -------
0001    안영희     01        01        총무
0201    안영숙     01        01        총무
0202    손하늘     01        01        총무
0301    이승철     02        02        회계
0302    박선경     02        02        회계
1001    문시현     10        10        ERP
1002    김주란     20        20        ISP

 

예제 2. 광주에서 근무하는 직원의 명단을 검색한다.(부서번호와 부서명도 검색한다.)

SELECT loc 근무처, d.dno 부서번호, dname 부서명,
	eno 사번, ename 이름
FROM dept d, emp e
WHERE d.dno=e.dno
AND loc = '광주';

근무  부서번호  부서명  사번    이름
----- --------- ------- ------- ----------
광주  30        ITEA    1003    양선호
광주  30        ITEA    2003    정의찬
광주  30        ITEA    2007    이초록

 

예제 3. 각 직원의 급여를 10% 인상한 경우 급여 등급을 검색한다.

SELECT eno 사번, ename 이름, 
	sal*1.1 인상된급여, grade 등급
FROM emp, salgrade
WHERE sal*1.1 BETWEEN losal AND hisal;

사번    이름       인상된급여       등급
------- ---------- ---------- ----------
0309    김선유            990          5
0702    김민지           1210          4
2002    제갈민           1672          4
2007    이초록         2187.9          3
2008    윤고은           2310          3
0269    권나현           2860          3
0801    천유정           3190          2

 

예제 4. 조인 조건이 없는 잘못된 조인문장의 결과를 확인해 보자.

SELECT d.dno, dname, e.dno, ename
FROM dept d, emp e;

DNO     DNAME   DNO     ENAME
------- ------- ------- ----------
01      총무    01      안영희
01      총무    01      안영숙
01      총무    01      손하늘
01      총무    02      이승철
01      총무    02      박선경
01      총무    10      문시현
01      총무    20      김주란

 

(예제 4)와 같은 조인을 Cross join(교차 조인)이라고 하는데 이런 조인은 특별한 경우 사용된다. 

cross join은 잘못된 결과값(Cartesian product)을 생성한다.

 

 

테이블과 관계

* 부모 테이블과 자식 테이블

 

실습

1. 송강 교수가 강의하는 과목을 검색한다.

SELECT p.pno 교수번호, pname 이름, cno 과목번호, cname 과목이름
FROM professor p, course c
WHERE pname = '송강'
AND p.pno = c.pno;

교수번호  이름       과목번호  과목이름
--------- ---------- --------- ------------
1001      송강       1211      일반화학실험


2. 과목명에 화학이 포함된 과목을 강의하는 교수의 명단을 검색한다.

SELECT p.pno 교수번호, pname 이름, cno 과목번호, cname 과목명
FROM professor p, course c
WHERE cname LIKE '%화학%'
AND p.pno = c.pno;

교수번호  이름       과목번호  과목명
--------- ---------- --------- ------------
1001      송강       1211      일반화학실험
1004      시진영     1212      일반화학
1004      시진영     1214      무기화학
1006      장청아     1213      유기화학
1006      장청아     1216      환경화학
1007      이초아     1217      고분자화학
1008      문규식     1218      생화학


3. 학점이 2학점인 과목과 이를 강의하는 교수를 검색한다.

SELECT cno 과목번호, cname 과목이름, st_num 학점, p.pno 교수번호, pname 교수이름
FROM professor p, course c
WHERE st_num = 2
AND p.pno = c.pno;

과목번호  과목이름           학점 교수번호  교수이름
--------- ------------ ---------- --------- ----------
1211      일반화학실험          2 1001      송강
1214      무기화학              2 1004      시진영
1216      환경화학              2 1006      장청아
1218      생화학                2 1008      문규식
1245      실험물리학            2 1013      하영진
1228      위상수학              2 1018      김응전
2313      분류학실험            2 1027      임충원


4. 화학과 교수가 강의하는 과목을 검색한다.

SELECT p.pno 교수번호, pname 이름, section 학과, cno 과목번호, cname 과목이름
FROM professor p, course c
WHERE section = '화학'
AND p.pno = c.pno;

교수번호  이름       학과    과목번호  과목이름
--------- ---------- ------- --------- ------------
1001      송강       화학    1211      일반화학실험
1004      시진영     화학    1212      일반화학
1006      장청아     화학    1213      유기화학
1004      시진영     화학    1214      무기화학
1006      장청아     화학    1216      환경화학
1007      이초아     화학    1217      고분자화학
1008      문규식     화학    1218      생화학


5. 화학과 1학년 학생의 기말고사 성적을 검색한다.

SELECT major 전공, syear 학년, s.sno 학번, sname 이름, c.cno 과목번호, cname 과목명, result 성적
FROM student s, score r, course c
WHERE major = '화학' 
AND syear = 1
AND s.sno = r.sno
AND c.cno = r.cno;

전공          학년 학번    이름       과목번호  과목명             성적
------- ---------- ------- ---------- --------- ------------ ----------
화학             1 925309  오우재     1211      일반화학실험         71
화학             1 945302  김람석     1212      일반화학             85
화학             1 945303  남궁경아   1212      일반화학             44
화학             1 945314  이철윤     1212      일반화학             47
화학             1 925309  오우재     1213      유기화학             83
화학             1 925309  오우재     1214      무기화학             63
화학             1 945302  김람석     1214      무기화학             93


6. 일반화학 과목의 기말고사 점수를 검색한다.

SELECT c.cno 과목번호, cname 과목이름, s.sno 학번, sname 이름, result 성적
FROM student s, course c, score r
WHERE cname = '일반화학'
AND c.cno = r.cno
AND s.sno = r.sno;

과목번호  과목이름     학번    이름             성적
--------- ------------ ------- ---------- ----------
1212      일반화학     894501  장봉철             84
1212      일반화학     905301  유태지             87
1212      일반화학     905302  정욱상             82
1212      일반화학     905603  정용정             84
1212      일반화학     913901  황수현             97
1212      일반화학     913902  황진혜             70
1212      일반화학     913903  정도정             57


7. 화학과 1학년 학생의 일반화학 기말 고사 점수를 검색한다.

SELECT major 전공, syear 학년, s.sno 학번, sname 이름, cname 과목이름, result 성적
FROM student s, course c, score r
WHERE major ='화학' 
AND syear = 1
AND cname = '일반화학'
AND s.sno = r.sno
AND r.cno = c.cno;

전공          학년 학번    이름       과목이름           성적
------- ---------- ------- ---------- ------------ ----------
화학             1 945302  김람석     일반화학             85
화학             1 945303  남궁경아   일반화학             44
화학             1 945314  이철윤     일반화학             47


8. 화학과 1학년 학생이 수강하는 과목을 검색한다.

SELECT major 전공, syear 학년, s.sno 학번, sname 이름, c.cno 과목번호, cname 과목이름
FROM student s, course c, score r
WHERE syear = 1
AND major = '화학'
AND s.sno = r.sno
AND r.cno = c.cno;

전공          학년 학번    이름       과목번호  과목이름
------- ---------- ------- ---------- --------- ------------
화학             1 925309  오우재     1211      일반화학실험
화학             1 945302  김람석     1212      일반화학
화학             1 945303  남궁경아   1212      일반화학
화학             1 945314  이철윤     1212      일반화학
화학             1 925309  오우재     1213      유기화학
화학             1 925309  오우재     1214      무기화학
화학             1 945302  김람석     1214      무기화학


9. 일반화학 과목에서 평가 점수가 A인 학생의 명단을 검색한다.

select * from scgrade;

GRADE      HISCORE    LOSCORE
------- ---------- ----------
A              100         85
B               84         70
C               69         55
D               54         40
F               39          0

 

SELECT c.cno 과목번호, cname 과목이름, s.sno 학번, sname 이름, result 성적, grade 평가점수
FROM student s, course c, score r, scgrade
WHERE cname = '일반화학'
AND result BETWEEN loscore AND hiscore
AND grade = 'A'
AND s.sno = r.sno
AND r.cno = c.cno;

과목번호  과목이름     학번    이름             성적 평가점수
--------- ------------ ------- ---------- ---------- ---------
1212      일반화학     905301  유태지             87 A
1212      일반화학     913901  황수현             97 A
1212      일반화학     913908  황진혜             98 A
1212      일반화학     914504  심빈경             88 A
1212      일반화학     915303  정욱주             93 A
1212      일반화학     915602  임주영             96 A
1212      일반화학     918205  독고낭도           94 A


10. 송강 교수의 과목을 수강하는 학생의 기말고사 점수를 성적 순서로 검색한다.

SELECT p.pno 교수번호, pname 교수이름, cname 과목명, s.sno 학번, sname 이름, result 성적
FROM student s, professor p, course c, score r
WHERE pname = '송강'
AND s.sno = r.sno
AND r.cno = c.cno
AND c.pno = p.pno
ORDER BY result DESC;

교수번호  교수이름   과목명       학번    이름             성적
--------- ---------- ------------ ------- ---------- ----------
1001      송강       일반화학실험 924505  서찬호             98
1001      송강       일반화학실험 894501  장봉철             97
1001      송강       일반화학실험 913901  황수현             94
1001      송강       일반화학실험 925602  강아영             94
1001      송강       일반화학실험 915602  임주영             93
1001      송강       일반화학실험 923902  김호야             93
1001      송강       일반화학실험 924502  은정현             91


11. 화학과 1학년 학생의 기말고사 성적을 학점(A,B,C,D,F)으로 검색한다.

SELECT major 전공, syear 학년, s.sno 학번, sname 이름, c.cno 과목번호, cname 과목명, 
	result 학점, grade 평가점수
FROM student s, course c, score r, scgrade
WHERE major = '화학'
AND syear = 1
AND result BETWEEN loscore AND hiscore
AND s.sno = r.sno
AND r.cno = c.cno;

전공          학년 학번    이름       과목번호  과목명             학점 평가점수
------- ---------- ------- ---------- --------- ------------ ---------- ---------
화학             1 945303  남궁경아   1216      환경화학             99 A
화학             1 925309  오우재     2363      화학실험             99 A
화학             1 945314  이철윤     2370      고생물학             99 A
화학             1 945303  남궁경아   2368      핵화학               99 A
화학             1 945303  남궁경아   2366      물리실험             99 A
화학             1 945303  남궁경아   2365      전자기학             98 A
화학             1 925309  오우재     1228      위상수학             96 A


12. 송강 교수가 강의하는 과목에서 평가 점수가 A인 학생의 명단을 과목명과 함께 검색한다.

SELECT p.pno 교수번호, pname 교수이름, c.cno 과목번호, cname 과목명, s.sno 학번, sname 이름, 
	result 학점, grade 평가점수
FROM student s, professor p, course c, score r, scgrade
WHERE pname = '송강' 
AND result BETWEEN loscore AND hiscore
AND grade = 'A'
AND s.sno = r.sno
AND r.cno = c.cno
AND p.pno = c.pno;

교수번호  교수이름   과목번호  과목명       학번    이름             학점 평가점수
--------- ---------- --------- ------------ ------- ---------- ---------- ---------
1001      송강       1211      일반화학실험 894501  장봉철             97 A
1001      송강       1211      일반화학실험 905302  정욱상             89 A
1001      송강       1211      일반화학실험 913901  황수현             94 A
1001      송강       1211      일반화학실험 915303  정욱주             86 A
1001      송강       1211      일반화학실험 915601  강태용             87 A
1001      송강       1211      일반화학실험 915602  임주영             93 A
1001      송강       1211      일반화학실험 923902  김호야             93 A


13. 화학과 1학년 학생에게 강의하는 교수의 명단을 검색한다.

SELECT major 전공, syear 학년, s.sno 학번, sname 이름, p.pno 교수번호, pname 교수이름
FROM student s, professor p, course c, score r
WHERE major = '화학'
AND syear = 1
AND s.sno = r.sno
AND r.cno = c.cno
AND c.pno = p.pno;

전공          학년 학번    이름       교수번호  교수이름
------- ---------- ------- ---------- --------- ----------
화학             1 925309  오우재     1001      송강
화학             1 945302  김람석     1004      시진영
화학             1 945303  남궁경아   1004      시진영
화학             1 945314  이철윤     1004      시진영
화학             1 925309  오우재     1004      시진영
화학             1 945302  김람석     1004      시진영
화학             1 945303  남궁경아   1004      시진영

 

 

BETWEEN..AND 연산자

SELECT [DISTINCT | ALL] 컬럼, 컬럼 ... 
FROM 테이블 WHERE 컬럼 BETWEEN 값1 AND 값2 (컬럼 >= 값1 AND 컬럼 <= 값2) 
ORDER BY 컬럼 [ASC/DESC], 컬럼 [ASC/DESC].......


예제 1. 다음 조건에 맞는 사원을 검색한다.
- 급여가 1000에서 2000 이내인 사원

SELECT * FROM emp 
WHERE sal BETWEEN 1000 AND 2000; 

ENO     ENAME      SEX JOB     MGR      HDATE             SAL       COMM DNO
------- ---------- --- ------- -------- ---------- ---------- ---------- ----
2002    제갈민     남  개발    0202     1996/04/30       1520       2000 20
2007    이초록     남  개발    0001     1992/09/05       1989       2300 30
0702    김민지     남  회계    0301     2017/01/09       1100         60 02

- 10, 20번 부서 사원

SELECT * FROM emp 
WHERE dno BETWEEN '10' AND '20'; #between을 문자에 쓰지 않기 > 좋지 않음 

ENO     ENAME      SEX JOB     MGR      HDATE             SAL       COMM DNO
------- ---------- --- ------- -------- ---------- ---------- ---------- ----
1001    문시현     남  모델링  0201     1991/02/01       4500        520 10
1002    김주란     여  모델링  0201     1992/03/03       4100        330 20
2001    남궁연호   남  개발    0202     1993/12/13       3950        200 10
2002    제갈민     남  개발    0202     1996/04/30       1520       2000 20
3002    권아현     여  분석    1002     2001/01/29       2900            20
3001    김선유     남  분석    1001     1998/10/17       3200        300 10
0269    권나현     여  분석    0301     2015/05/21       2600       1900 10

BETWEEN을 문자열에 사용하면 답은 나오지만 좋지 않다. (IN 사용)

예제 2. 1992년에서 1996년 사이에 입사한 사원을 검색한다.

SELECT * FROM emp 
WHERE hdate BETWEEN '1992/01/01' AND '1996/12/31' 
ORDER BY hdate;

ENO     ENAME      SEX JOB     MGR      HDATE             SAL       COMM DNO
------- ---------- --- ------- -------- ---------- ---------- ---------- ----
0301    이승철     남  회계    0001     1992/02/01       3400          0 02
1002    김주란     여  모델링  0201     1992/03/03       4100        330 20
2008    윤고은     여  개발    0001     1992/03/03       2100            40
2003    정의찬     남  개발    0202     1992/03/03       4350            30
2007    이초록     남  개발    0001     1992/09/05       1989       2300 30
2001    남궁연호   남  개발    0202     1993/12/13       3950        200 10
1003    양선호     남  모델링  0201     1995/02/21       4300            30


예제 3. 급여가 2000에서 1000 사이인 사원을 검색한다.

SELECT * FROM emp 
WHERE sal BETWEEN 2000 AND 1000; 

선택된 레코드가 없습니다.

BETWEEN은 앞에 오는 값이 뒤에 값보다 작아야 한다.

 

 

IN 연산자

SELECT [DISTINCT | ALL] 컬럼, 컬럼 ... 
FROM 테이블 
WHERE 컬럼 IN (값1, 값2 ...) (컬럼=값1 OR 컬럼=값2 OR ....) 
ORDER BY 컬럼 [ASC/DESC], 컬럼 [ASC/DESC].......

= 값이 여러개 있을 경우에 사용

값 여러개 중에 하나만 맞아도 사용 가능


예제 4. 다음 조건에 맞는 사원을 검색한다.
- 개발이나 관리 업무를 담당하는 사원

SELECT * FROM emp 
WHERE job IN ('개발', '관리') 
ORDER BY job; 

ENO     ENAME      SEX JOB     MGR      HDATE             SAL       COMM DNO
------- ---------- --- ------- -------- ---------- ---------- ---------- ----
2001    남궁연호   남  개발    0202     1993/12/13       3950        200 10
2002    제갈민     남  개발    0202     1996/04/30       1520       2000 20
2008    윤고은     여  개발    0001     1992/03/03       2100            40
2007    이초록     남  개발    0001     1992/09/05       1989       2300 30
2003    정의찬     남  개발    0202     1992/03/03       4350            30

- 10, 20번 부서 사원

SELECT * FROM emp 
WHERE dno IN ('10', '20') 
ORDER BY dno; 

ENO     ENAME      SEX JOB     MGR      HDATE             SAL       COMM DNO
------- ---------- --- ------- -------- ---------- ---------- ---------- ----
0401    김진성     남  회계    1001     2008/03/13       3200       1000 10
0269    권나현     여  분석    0301     2015/05/21       2600       1900 10
3001    김선유     남  분석    1001     1998/10/17       3200        300 10
1001    문시현     남  모델링  0201     1991/02/01       4500        520 10
2001    남궁연호   남  개발    0202     1993/12/13       3950        200 10
0120    김경현     남  지원    1002     1999/09/05       4000       2500 20
2002    제갈민     남  개발    0202     1996/04/30       1520       2000 20


예제 5. 결과가 동일한 두 개의 SQL문을 비교해 보자

SELECT * FROM emp 
WHERE dno BETWEEN '10' AND '20' AND job = '개발'; 

ENO     ENAME      SEX JOB     MGR      HDATE             SAL       COMM DNO
------- ---------- --- ------- -------- ---------- ---------- ---------- ----
2001    남궁연호   남  개발    0202     1993/12/13       3950        200 10
2002    제갈민     남  개발    0202     1996/04/30       1520       2000 20

 

실습

1. 평점이 3.0에서 4.0 사이의 학생을 검색한다.

SELECT * FROM student 
WHERE avr BETWEEN 3.0 AND 4.0;

SNO     SNAME      SEX      SYEAR MAJOR          AVR
------- ---------- --- ---------- ------- ----------
905301  유태지     남           4 화학          3.28
923903  정남윤     남           3 생물          3.23
948204  서창동     남           1 식영          3.21
945302  김람석     남           1 화학          3.56
913902  황진혜     여           4 생물          3.15
933904  임영현     여           2 생물          3.98
915604  정성현     남           4 유공          3.34


2. 1999년에서 2001년까지 부임한 교수의 명단을 검색한다.

SELECT * FROM professor 
WHERE hiredate BETWEEN '1999/01/01' AND '2001/12/31' 
ORDER BY hiredate; 

PNO     PNAME      SECTION ORDERS  HIREDATE
------- ---------- ------- ------- ----------
1018    김응전     물리    조교수  1999/02/18
1013    하영진     물리    부교수  1999/04/19
1012    이영준     물리    부교수  2000/05/18
1027    임충원     생물    조교수  2001/06/03


3. 화학과와 물리학과, 생물학과 학생을 검색한다.

SELECT * FROM student 
WHERE major IN ('화학', '물리', '생물');

SNO     SNAME      SEX      SYEAR MAJOR          AVR
------- ---------- --- ---------- ------- ----------
915301  정동상     남           4 화학           .95
905301  유태지     남           4 화학          3.28
905302  정욱상     남           4 화학          1.44
915303  정욱주     남           4 화학           .95
923903  정남윤     남           3 생물          3.23
923904  한현석     남           3 생물          2.45
933901  김용서     남           2 생물          1.48


4. 정교수와 조교수를 검색한다.

SELECT * FROM professor 
WHERE orders IN ('정교수', '조교수'); 

PNO     PNAME      SECTION ORDERS  HIREDATE
------- ---------- ------- ------- ----------
1001    송강       화학    정교수  2002/08/12
1007    이초아     화학    조교수  2010/07/06
1008    문규식     화학    조교수  2005/02/11
1010    이규진     물리    정교수  1998/10/07
1009    이준영     물리    정교수  1991/10/04
1016    호연작     물리    조교수  2009/10/21
1018    김응전     물리    조교수  1999/02/18


5. 학점수가 1학점, 2학점인 과목을 검색한다.

SELECT * FROM course 
WHERE st_num IN (1, 2); 

CNO     CNAME            ST_NUM PNO
------- ------------ ---------- -------
1211    일반화학실험          2 1001
1214    무기화학              2 1004
1216    환경화학              2 1006
1218    생화학                2 1008
1227    이학수학              2 1017
1228    위상수학              2 1018
2365    전자기학              2 1029


6. 1, 2 학년 학생 중에 평점이 2.0에서 3.0 사이인 학생을 검색한다.

SELECT * FROM student 
WHERE syear IN (1, 2) AND (avr BETWEEN 2.0 AND 3.0) 
ORDER BY syear; 

SNO     SNAME      SEX      SYEAR MAJOR          AVR
------- ---------- --- ---------- ------- ----------
948203  황보우리   여           1 식영          2.83
945605  오경운     남           1 유공          2.99
945604  권현       남           1 유공          2.89
945602  차정혜     여           1 유공          2.73
943901  최혜원     여           1 생물          2.54
948201  이창지     남           1 식영           2.9
945303  남궁경아   여           1 화학          2.36


7. 화학, 물리학과 학생 중 1, 2 학년 학생을 성적순으로 검색한다.

SELECT * FROM student 
WHERE major IN ('화학', '물리') AND syear IN (1, 2) 
ORDER BY avr DESC;

SNO     SNAME      SEX      SYEAR MAJOR          AVR
------- ---------- --- ---------- ------- ----------
945302  김람석     남           1 화학          3.56
934504  갑서진     여           2 물리          3.22
944503  곽득용     남           1 물리           3.2
935304  최홍승     남           2 화학             3
925309  오우재     여           1 화학          2.99
925306  김재백     남           2 화학          2.78
944511  김형진     여           1 물리          2.76


8. 물리, 화학과 학생 중 4.5 환산 평점이 3.5에서 4.0 사이인 학생을 검색한다.

SELECT * FROM student 
WHERE major IN ('물리', '화학') AND ((avr*4.5/4) BETWEEN 3.5 AND 4.0);

SNO     SNAME      SEX      SYEAR MAJOR          AVR
------- ---------- --- ---------- ------- ----------
905301  유태지     남           4 화학          3.28
914502  문수보     남           4 물리          3.33
944503  곽득용     남           1 물리           3.2
934504  갑서진     여           2 물리          3.22
914504  심빈경     남           4 물리          3.33


9. 물리, 화학과 학생의 정보를 학년별 성적순으로 검색한다.

SELECT * FROM student 
WHERE major IN ('물리', '화학') 
ORDER BY syear, avr DESC;

SNO     SNAME      SEX      SYEAR MAJOR          AVR
------- ---------- --- ---------- ------- ----------
945302  김람석     남           1 화학          3.56
944503  곽득용     남           1 물리           3.2
925309  오우재     여           1 화학          2.99
944511  김형진     여           1 물리          2.76
945303  남궁경아   여           1 화학          2.36
945314  이철윤     남           1 화학          2.22
944512  서동조     남           1 물리          1.99


10. 물리, 화학과 교수 중에 1999년에서 2000년 사이에 부임한 교수의 정보를 직위별로 검색한다.

SELECT * FROM professor 
WHERE section IN ('물리', '화학') AND (hiredate BETWEEN '1999/01/01' AND '2000/12/31') 
ORDER BY orders;

PNO     PNAME      SECTION ORDERS  HIREDATE
------- ---------- ------- ------- ----------
1013    하영진     물리    부교수  1999/04/19
1012    이영준     물리    부교수  2000/05/18
1018    김응전     물리    조교수  1999/02/18

 

관계 연산자

SELECT [DISTINCT | ALL] 컬럼, 컬럼 ...
FROM  테이블  
WHERE 조건 [관계 연산자 조건 ...]
ORDER BY 컬럼 [ASC/DESC], 컬럼 [ASC/DESC].......

 

예제 1. 다음 각 조건에 맞는 데이터를 검색한다. 

- 20번 부서 사원 중에 급여가 2000 이상인 사원을 검색한다.

SELECT * FROM emp
WHERE dno = '20'
AND sal >= 2000; 

ENO     ENAME      SEX JOB     MGR      HDATE             SAL       COMM DNO
------- ---------- --- ------- -------- ---------- ---------- ---------- ----
1002    김주란     여  모델링  0201     1992/03/03       4100        330 20
3002    권아현     여  분석    1002     2001/01/29       2900            20
0120    김경현     남  지원    1002     1999/09/05       4000       2500 20

- 20번 부서 사원 중에 급여가 2000 이상이고 모델링 업무를 담당하는 사원을 검색한다.

SELECT * FROM emp
WHERE dno = '20'
AND sal >= 2000
AND job = '모델링';  

ENO     ENAME      SEX JOB     MGR      HDATE             SAL       COMM DNO
------- ---------- --- ------- -------- ---------- ---------- ---------- ----
1002    김주란     여  모델링  0201     1992/03/03       4100        330 20

 

예제 2. 다음 두 문장을 실행하고 결과를 해석해 보자.

SELECT * FROM emp
WHERE dno = 10 OR sal > 1600 AND comm > 600;

ENO     ENAME      SEX JOB     MGR      HDATE             SAL       COMM DNO
------- ---------- --- ------- -------- ---------- ---------- ---------- ----
0201    안영숙     여  지원    0001     1991/02/01       3900       2000 01
0202    손하늘     여  지원    0001     1991/12/01       3510        980 01
1001    문시현     남  모델링  0201     1991/02/01       4500        520 10
2001    남궁연호   남  개발    0202     1993/12/13       3950        200 10
2007    이초록     남  개발    0001     1992/09/05       1989       2300 30
3001    김선유     남  분석    1001     1998/10/17       3200        300 10
0269    권나현     여  분석    0301     2015/05/21       2600       1900 10

우선순위가 AND가 OR보다 높기 때문에 답이 맞는지 확인이 어렵다.

괄호를 포함시켜 우선순위를 표시해준다.

SELECT * FROM emp
WHERE (dno = 10 OR sal > 1600) AND comm > 600;

ENO     ENAME      SEX JOB     MGR      HDATE             SAL       COMM DNO
------- ---------- --- ------- -------- ---------- ---------- ---------- ----
0201    안영숙     여  지원    0001     1991/02/01       3900       2000 01
0202    손하늘     여  지원    0001     1991/12/01       3510        980 01
2007    이초록     남  개발    0001     1992/09/05       1989       2300 30
0269    권나현     여  분석    0301     2015/05/21       2600       1900 10
0401    김진성     남  회계    1001     2008/03/13       3200       1000 10
0120    김경현     남  지원    1002     1999/09/05       4000       2500 20

 

 

LIKE 연산자

SELECT [DISTINCT | ALL] 컬럼, 컬럼 ...
FROM  테이블
WHERE 컬럼 LIKE '비교 문자열' 
ORDER BY 컬럼 [ASC/DESC], 컬럼 [ASC/DESC].......;

 

 

예제 3. 다음 조건에 맞는 사원을 검색한다.

- 김씨 성을 가진 사원

SELECT * FROM emp
WHERE ename LIKE '김%'; 

ENO     ENAME      SEX JOB     MGR      HDATE             SAL       COMM DNO
------- ---------- --- ------- -------- ---------- ---------- ---------- ----
1002    김주란     여  모델링  0201     1992/03/03       4100        330 20
0309    김선유     남  회계    0302     2011/01/03        900         90 02
3001    김선유     남  분석    1001     1998/10/17       3200        300 10
0702    김민지     남  회계    0301     2017/01/09       1100         60 02
0401    김진성     남  회계    1001     2008/03/13       3200       1000 10
0120    김경현     남  지원    1002     1999/09/05       4000       2500 20

- 이름이 '하늘'인 사원

SELECT * FROM emp
WHERE ename LIKE '%하늘';

ENO     ENAME      SEX JOB     MGR      HDATE             SAL       COMM DNO
------- ---------- --- ------- -------- ---------- ---------- ---------- ----
0202    손하늘     여  지원    0001     1991/12/01       3510        980 01

- 성과 이름이 각각 한 글자인 사원을 검색한다.

SELECT * FROM emp
WHERE ename LIKE '__';

선택된 레코드가 없습니다.

 

예제 4. 이름에 '%' 문자가 포함된 사원을 검색한다.

SELECT eno, ename
FROM emp
WHERE ename LIKE '%#%%' ESCAPE '#'; 

선택된 레코드가 없습니다.

 

실습

1. 화학과와 물리학과 학생을 검색한다. 

SELECT *
FROM student
WHERE major = '화학' OR major = '물리';

SNO     SNAME      SEX      SYEAR MAJOR          AVR
------- ---------- --- ---------- ------- ----------
915301  정동상     남           4 화학           .95
905301  유태지     남           4 화학          3.28
905302  정욱상     남           4 화학          1.44
915303  정욱주     남           4 화학           .95
915304  권보수     남           4 화학          2.32
915305  최정희     여           3 화학           .58
925306  김재백     남           2 화학          2.78

 

2. 화학과가 아닌 학생 중에 1학년 학생을 검색한다. 

SELECT *
FROM student
WHERE major != '화학' AND syear = 1;

SNO     SNAME      SEX      SYEAR MAJOR          AVR
------- ---------- --- ---------- ------- ----------
948203  황보우리   여           1 식영          2.83
948204  서창동     남           1 식영          3.21
943901  최혜원     여           1 생물          2.54
943902  하정자     남           1 생물          3.25
943903  유지아     여           1 생물          1.99
943905  유태지     남           1 생물          2.98
944511  김형진     여           1 물리          2.76

 

3. 화학과 3학년 학생을 검색한다. 

SELECT *
FROM student
WHERE major = '화학' AND syear = 3;

SNO     SNAME      SEX      SYEAR MAJOR          AVR
------- ---------- --- ---------- ------- ----------
915305  최정희     여           3 화학           .58
925302  이지영     여           3 화학          1.68
925301  김환       여           3 화학          3.58
925305  황현정     여           3 화학          2.98

 

4. 평점이 2.0에서 3.0 사이인 학생 검색한다. 

SELECT *
FROM student
WHERE avr > 2.0 AND avr < 3.0;

SNO     SNAME      SEX      SYEAR MAJOR          AVR
------- ---------- --- ---------- ------- ----------
923904  한현석     남           3 생물          2.45
915304  권보수     남           4 화학          2.32
948203  황보우리   여           1 식영          2.83
925306  김재백     남           2 화학          2.78
933902  김현수     남           2 생물          2.48
933903  정승동     남           2 생물          2.99
945303  남궁경아   여           1 화학          2.36

 

5. 교수가 지정되지 않은 과목 중에 학점이 3학점인 과목을 검색한다. 

SELECT *
FROM course
WHERE pno IS NULL AND st_num = 3;

선택된 레코드가 없습니다.

 

6. 화학 관련된 과목 중 학점수가 2학점 이하인 과목을 검색한다.

   (화학 관련 과목은 과목명에 화학이 들어간 과목을 의미한다.) 

SELECT *
FROM course
WHERE cname LIKE '%화학%' AND st_num <= 2;

CNO     CNAME            ST_NUM PNO
------- ------------ ---------- -------
1211    일반화학실험          2 1001
1214    무기화학              2 1004
1216    환경화학              2 1006
1218    생화학                2 1008
2369    무기화학실험          2

 

7. 화학과 정교수를 검색한다. 

SELECT *
FROM professor
WHERE section LIKE '화학' AND orders LIKE '정교수';

PNO     PNAME      SECTION ORDERS  HIREDATE
------- ---------- ------- ------- ----------
1001    송강       화학    정교수  2002/08/12

 

8. 화학과 학생 중에 성이 권씨인 학생을 검색한다.  

SELECT *
FROM student
WHERE sname LIKE '권%';

SNO     SNAME      SEX      SYEAR MAJOR          AVR
------- ---------- --- ---------- ------- ----------
915304  권보수     남           4 화학          2.32
925601  권운각     남           3 유공           2.9
924501  권석복     여           3 물리             4
935604  권석현     여           2 유공          2.99
945604  권현       남           1 유공          2.89

 

9. 부임일이 1995년 이전인 정교수를 검색한다. 

SELECT *
FROM professor
WHERE hiredate < '1995/01/01' AND orders LIKE '정교수';

PNO     PNAME      SECTION ORDERS  HIREDATE
------- ---------- ------- ------- ----------
1009    이준영     물리    정교수  1991/10/04
1035    장관용     식영    정교수  1985/07/28

 

10. 성과 이름이 각각 한글자인 교수를 검색한다. 

SELECT *
FROM professor
WHERE pname LIKE '__';

PNO     PNAME      SECTION ORDERS  HIREDATE
------- ---------- ------- ------- ----------
1001    송강       화학    정교수  2002/08/12
1022    이준       생물    부교수  1989/05/05

조건 검색

SQL> SELECT [DISTINCT | ALL] 컬럼, 컬럼 ...
     FROM  테이블
     WHERE 조건
     ORDER BY 컬럼 [ASC/DESC], 컬럼 [ASC/DESC].......

 

예제 1. 다음 각 조건에 맞는 정보를 검색

- 사원 중에 급여가 4000 이상인 사원의 명단

SELECT eno 사번, ename 이름, sal 급여
FROM emp
WHERE sal >= 4000;

사번    이름             급여
------- ---------- ----------
0001    안영희           4800
1001    문시현           4500
1002    김주란           4100
1003    양선호           4300
2003    정의찬           4350
0120    김경현           4000

- 이름이 '문시현'인 사원의 정보

SELECT *
FROM emp
WHERE ename = '문시현';

ENO     ENAME      SEX JOB     MGR      HDATE           SAL       COMM DNO
------- ---------- --- ------- -------- -------- ---------- ---------- ----
1001    문시현     남  모델링  0201     91/02/01       4500        520 10

- 10번 부서 이외 부서 사원의 명단

SELECT * FROM emp
WHERE dno != 10;

ENO     ENAME      SEX JOB     MGR      HDATE           SAL       COMM DNO
------- ---------- --- ------- -------- -------- ---------- ---------- ----
0001    안영희     여  경영             91/01/01       4800          0 01
0201    안영숙     여  지원    0001     91/02/01       3900       2000 01
0202    손하늘     여  지원    0001     91/12/01       3510        980 01
0301    이승철     남  회계    0001     92/02/01       3400          0 02
0302    박선경     여  회계    0301     91/03/02       3300          0 02
1002    김주란     여  모델링  0201     92/03/03       4100        330 20
1003    양선호     남  모델링  0201     95/02/21       4300            30

 

예제 2. 잘못된 조건 검색 (문자타입인데 숫자타입으로 검색)

SELECT * FROM emp
WHERE dno=10; #dno 칼럼음 문자타입

ENO     ENAME      SEX JOB     MGR      HDATE           SAL       COMM DNO
------- ---------- --- ------- -------- -------- ---------- ---------- ----
1001    문시현     남  모델링  0201     91/02/01       4500        520 10
2001    남궁연호   남  개발    0202     93/12/13       3950        200 10
3001    김선유     남  분석    1001     98/10/17       3200        300 10
0269    권나현     여  분석    0301     15/05/21       2600       1900 10
0401    김진성     남  회계    1001     08/03/13       3200       1000 10

 

예제 3. 연봉이 30,000 이상인 사원의 이름을 검색한다 검색

SELECT eno 사번, ename 이름, sal*12+NVL(comm,0) 연봉
FROM emp
WHERE sal*12+NVL(comm,0) >= 30000;

사번    이름             연봉
------- ---------- ----------
0001    안영희          57600
0201    안영숙          48800
0202    손하늘          43100
0301    이승철          40800
0302    박선경          39600
1001    문시현          54520
1002    김주란          49530

 

예제 4. 보너스가 200 이하인 사원을 검색

SELECT eno 사번, ename 이름, comm 보너스
FROM emp
WHERE comm <= 200;

사번    이름           보너스
------- ---------- ----------
0001    안영희              0
0301    이승철              0
0302    박선경              0
2001    남궁연호          200
0309    김선유             90
0702    김민지             60

보너스가 없는 사람은 NVL을 사용해 0으로 변경해 보너스가 NULL인 사람도 검색하도록 다음과 같이 검색한다.

SELECT eno 사번, ename 이름, comm 보너스
FROM emp
WHERE NVL(comm,0) <= 200;

사번    이름           보너스
------- ---------- ----------
0001    안영희              0
0301    이승철              0
0302    박선경              0
1003    양선호
2001    남궁연호          200
2003    정의찬
2008    윤고은

 

예제 5. 입사일이 1996년 이후인 사원의 정보를 검색

SELECT * FROM emp
WHERE hdate >= '1996/01/01';

ENO     ENAME      SEX JOB     MGR      HDATE             SAL       COMM DNO
------- ---------- --- ------- -------- ---------- ---------- ---------- ----
2002    제갈민     남  개발    0202     1996/04/30       1520       2000 20
3002    권아현     여  분석    1002     2001/01/29       2900            20
0309    김선유     남  회계    0302     2011/01/03        900         90 02
3001    김선유     남  분석    1001     1998/10/17       3200        300 10
0702    김민지     남  회계    0301     2017/01/09       1100         60 02
0269    권나현     여  분석    0301     2015/05/21       2600       1900 10
0401    김진성     남  회계    1001     2008/03/13       3200       1000 10

 

널과 비교 연산
 - 널은 결정된 값이 아님으로 '=', '<' 등의 비교 연산자를 사용할 수 없다. 

 - 널에 대한 직접적인 검색은 다음과 같이 특별한 연산자를 이용한다.

  IS NULL : 널을 검색한다.

  IS NOT NULL : 널이 아닌 값를 검색한다.

 

예제 6. 보너스 컬럼이 널인 사원를 검색

SELECT *  FROM emp
WHERE comm IS NULL;  # comm = NULL 절대 안됨!!!

ENO     ENAME      SEX JOB     MGR      HDATE           SAL       COMM DNO
------- ---------- --- ------- -------- -------- ---------- ---------- ----
1003    양선호     남  모델링  0201     95/02/21       4300            30
2003    정의찬     남  개발    0202     92/03/03       4350            30
2008    윤고은     여  개발    0001     92/03/03       2100            40
3002    권아현     여  분석    1002     01/01/29       2900            20

 

실습

1. 화학과 학생을 검색한다. 

SELECT * FROM student
WHERE major = '화학';

SNO     SNAME      SEX      SYEAR MAJOR          AVR
------- ---------- --- ---------- ------- ----------
915301  정동상     남           4 화학           .95
905301  유태지     남           4 화학          3.28
905302  정욱상     남           4 화학          1.44
915303  정욱주     남           4 화학           .95
915304  권보수     남           4 화학          2.32
915305  최정희     여           3 화학           .58
925306  김재백     남           2 화학          2.78

 

2. 평점이 2.0 미만인 학생을 검색한다. 

SELECT * FROM student
WHERE avr < 2.0;

SNO     SNAME      SEX      SYEAR MAJOR          AVR
------- ---------- --- ---------- ------- ----------
915301  정동상     남           4 화학           .95
905302  정욱상     남           4 화학          1.44
915303  정욱주     남           4 화학           .95
933901  김용서     남           2 생물          1.48
915305  최정희     여           3 화학           .58
935303  김완창     남           2 화학           .34
913903  정도정     남           4 생물           .15

 

3. 권현 학생의 평점을 검색한다. 

SELECT sno 학번, sname 이름, avr 평점
FROM student
WHERE sname = '권현';

학번    이름             평점
------- ---------- ----------
945604  권현             2.89

 

4. 정교수의 명단을 검색한다. 

SELECT * FROM professor
WHERE orders = '정교수';

PNO     PNAME      SECTION ORDERS  HIREDATE
------- ---------- ------- ------- ----------
1001    송강       화학    정교수  2002/08/12
1010    이규진     물리    정교수  1998/10/07
1009    이준영     물리    정교수  1991/10/04
1021    왕사진     생물    정교수  1997/02/17
1029    주동평     생물    정교수  2006/01/26
1030    김동평     유공    정교수  2002/02/15
1033    박삭광     유공    정교수  2005/07/14

 

5. 화학과 소속 교수의 명단을 검색한다. 

SELECT * FROM professor
WHERE section = '화학';

PNO     PNAME      SECTION ORDERS  HIREDATE
------- ---------- ------- ------- ----------
1001    송강       화학    정교수  2002/08/12
1004    시진영     화학    부교수  1991/02/01
1006    장청아     화학    부교수  2003/05/20
1007    이초아     화학    조교수  2010/07/06
1008    문규식     화학    조교수  2005/02/11

 

6. 송강 교수의 정보를 검색한다. 

SELECT * FROM professor
WHERE pname = '송강';

PNO     PNAME      SECTION ORDERS  HIREDATE
------- ---------- ------- ------- ----------
1001    송강       화학    정교수  2002/08/12

 

7. 학년별로 화학과 학생의 성적을 검색한다. 

SELECT major 학과, syear 학년, sno 학번, sname 이름, avr 성적
FROM student
WHERE major = '화학' 
ORDER BY syear;

학과          학년 학번    이름             성적
------- ---------- ------- ---------- ----------
화학             1 945302  김람석           3.56
화학             1 925309  오우재           2.99
화학             1 945314  이철윤           2.22
화학             1 945303  남궁경아         2.36
화학             2 935304  최홍승              3
화학             2 935301  이준혜           1.99
화학             2 925306  김재백           2.78

 

8. 2000년 이전에 부임한 교수의 정보를 부임일순으로 검색한다. 

SELECT * FROM professor
WHERE hiredate < '2000/01/01'
ORDER BY hiredate ASC;

PNO     PNAME      SECTION ORDERS  HIREDATE
------- ---------- ------- ------- ----------
1035    장관용     식영    정교수  1985/07/28
1032    이유당     유공    부교수  1988/11/01
1022    이준       생물    부교수  1989/05/05
1004    시진영     화학    부교수  1991/02/01
1009    이준영     물리    정교수  1991/10/04
1031    김서령     식영    부교수  1991/10/09
1036    성현수     유공    부교수  1993/07/13

 

9. 담당 교수가 없는 과목의 정보를 검색한다. 

SELECT * FROM course
WHERE pno IS NULL;

CNO     CNAME            ST_NUM PNO
------- ------------ ---------- -------
2369    무기화학실험          2

 

10. 보너스가 급여의 10% 이상인 사원을 검색한다.

SELECT * FROM emp
WHERE comm >= sal*1.1;

ENO     ENAME      SEX JOB     MGR      HDATE             SAL       COMM DNO
------- ---------- --- ------- -------- ---------- ---------- ---------- ----
2002    제갈민     남  개발    0202     1996/04/30       1520       2000 20
2007    이초록     남  개발    0001     1992/09/05       1989       2300 30

 

정렬된 데이터 검색

SQL> SELECT [DISTINCT | ALL] 컬럼, 컬럼 ...  
    FROM  테이블
    ORDER BY 컬럼 [ASC/DESC], 컬럼 [ASC/DESC].......

ASC      :  오름차순 (1, 2, 3, ...)

DESC   :  내림차순 (10, 9, 8, ...)

 

예제 1.  사원의 이름을 급여 순으로 검색한다.

SELECT eno 사번, ename 이름, sal 급여
FROM emp
ORDER BY sal DESC;

사번    이름             급여
------- ---------- ----------
0001    안영희           4800
1001    문시현           4500
2003    정의찬           4350
1003    양선호           4300
1002    김주란           4100
0120    김경현           4000
2001    남궁연호         3950

 

예제 2. 사원의 사번과 이름을 연봉 순으로 검색한다.

SELECT eno 사번, ename 이름, sal*12+NVL(comm,0) 연봉
FROM emp
ORDER BY 연봉 DESC;

사번    이름             연봉
------- ---------- ----------
0001    안영희          57600
1001    문시현          54520
2003    정의찬          52200
1003    양선호          51600
0120    김경현          50500
1002    김주란          49530
0201    안영숙          48800

 

정렬을 이용한 그룹 검색

예제 3. 업무 별로 사원의 급여를 검색한다.

SELECT job 업무, eno 사번, ename 이름, sal 급여
FROM emp
ORDER BY 업무;

업무    사번    이름             급여
------- ------- ---------- ----------
개발    2002    제갈민           1520
개발    2001    남궁연호         3950
개발    2003    정의찬           4350
개발    2007    이초록           1989
개발    2008    윤고은           2100
경영    0001    안영희           4800
모델링  1002    김주란           4100

 

예제 4. 각 부서별로 사원의 급여를 검색한다. 단 급여를 많이 받는 사람부터 검색한다.

SELECT dno 부서번호, eno 사번, ename 이름, sal 급여
FROM emp
ORDER BY 부서번호, 급여 DESC;

부서 사번    이름             급여
---- ------- ---------- ----------
01   0001    안영희           4800
01   0201    안영숙           3900
01   0202    손하늘           3510
02   0301    이승철           3400
02   0302    박선경           3300
02   0801    천유정           2900
02   0702    김민지           1100

 

실습

1. 성적순으로 학생의 이름을 검색한다. 

SELECT sno 학번, avr 성적, sname 이름
FROM student
ORDER BY avr DESC;

학번          성적 이름
------- ---------- ----------
924501           4 권석복
918205        3.99 독고낭도
933904        3.98 임영현
938202        3.93 신섭인
938204        3.92 최현
945601         3.9 심정용
915601         3.9 강태용

 

2. 학과별 성적순으로 학생의 정보를 검색한다. 

SELECT major 학과, avr 성적, sno 학번, sname 이름
FROM student
ORDER BY major, avr DESC;

학과          성적 학번    이름
------- ---------- ------- ----------
물리             4 924501  권석복
물리          3.33 914504  심빈경
물리          3.33 914502  문수보
물리          3.22 934504  갑서진
물리           3.2 944503  곽득용
물리             3 924505  서찬호
물리          2.99 924502  은정현

 

3. 학년별 성적순으로 학생의 정보를 검색한다. 

SELECT syear 학년, avr 성적, sno 학번, sname 이름
FROM student
ORDER BY 학년, avr DESC;

      학년       성적 학번    이름
---------- ---------- ------- ----------
         1        3.9 945601  심정용
         1       3.71 948202  김성지
         1       3.56 945302  김람석
         1       3.25 943902  하정자
         1       3.23 948205  신형일
         1       3.21 948204  서창동
         1        3.2 944503  곽득용

 

4. 학과별 학년별로 학생의 정보를  성적순으로 검색한다. 

SELECT major 학과, avr 성적, syear 학년, sno 학번, sname 이름
FROM student
ORDER BY 학과, 학년, avr DESC;

학과          성적       학년 학번    이름
------- ---------- ---------- ------- ----------
물리           3.2          1 944503  곽득용
물리          2.76          1 944511  김형진
물리          1.99          1 944512  서동조
물리           .96          1 944501  최현각
물리          3.22          2 934504  갑서진
물리          2.33          2 934503  최모각
물리          2.16          2 934501  김아진

 

5. 학점 순으로 과목 이름을 검색한다. 

SELECT st_num 학점, cno 과목번호, cname 과목이름
FROM course
ORDER BY 학점 DESC;

      학점 과목번호  과목이름
---------- --------- ------------
         3 1217      고분자화학
         3 1782      세포배양학
         3 2312      생리학
         3 2119      영양생리학
         3 2115      식품분석실험
         3 1213      유기화학
         3 2111      식품화학

 

6. 각 학과별로 교수의 정보를 검색한다. 

SELECT section 학과, pno 교수번호, pname 이름, orders 지위, hiredate 부임일자
FROM professor
ORDER BY 학과;

학과    교수번  이름       지위    부임일자
------- ------- ---------- ------- --------
물리    1018    김응전     조교수  99/02/18
물리    1012    이영준     부교수  00/05/18
물리    1013    하영진     부교수  99/04/19
물리    1009    이준영     정교수  91/10/04
물리    1016    호연작     조교수  09/10/21
물리    1010    이규진     정교수  98/10/07
생물    1021    왕사진     정교수  97/02/17

 

7. 지위별로 교수의 정보를 검색한다. 

SELECT orders 지위, pno 교수번호, pname 이름, section 학과, hiredate 부임일자
FROM professor
ORDER BY 지위;

지위    교수번  이름       학과    부임일자
------- ------- ---------- ------- --------
부교수  1022    이준       생물    89/05/05
부교수  1032    이유당     유공    88/11/01
부교수  1036    성현수     유공    93/07/13
부교수  1034    최해연     식영    98/07/02
부교수  1012    이영준     물리    00/05/18
부교수  1004    시진영     화학    91/02/01
부교수  1006    장청아     화학    03/05/20

 

8. 각 학과별로 교수의 정보를 부임일자 순으로 검색한다. 

SELECT section 학과, hiredate 부임일자, pno 교수번호, pname 이름, orders 지위
FROM professor
ORDER BY 학과, 부임일자;

학과    부임일자 교수번  이름       지위
------- -------- ------- ---------- -------
물리    91/10/04 1009    이준영     정교수
물리    98/10/07 1010    이규진     정교수
물리    99/02/18 1018    김응전     조교수
물리    99/04/19 1013    하영진     부교수
물리    00/05/18 1012    이영준     부교수
물리    09/10/21 1016    호연작     조교수
생물    89/05/05 1022    이준       부교수

 

9. 급여가 10% 인상된 경우 부서별로 각 사원의 연봉을 연봉순으로 검색한다. 

SELECT job 부서, eno 사번, ename 이름, sal*1.1*12+NVL(comm,0) 연봉
FROM emp
ORDER BY 부서, 연봉 DESC;

부서    사번    이름             연봉
------- ------- ---------- ----------
개발    2003    정의찬          57420
개발    2001    남궁연호        52340
개발    2007    이초록        28554.8
개발    2008    윤고은          27720
개발    2002    제갈민          22064
경영    0001    안영희          63360
모델링  1001    문시현          59920

 

10. 보너스가 100% 인상된 경우 업무별로 각 사원의 연봉을 연봉순으로 검색한다.

SELECT eno 사번, ename 이름, sal*12+NVL(2*comm,0) 연봉
FROM emp
ORDER BY 연봉 DESC;

사번    이름             연봉
------- ---------- ----------
0001    안영희          57600
1001    문시현          55040
0120    김경현          53000
2003    정의찬          52200
1003    양선호          51600
0201    안영숙          50800
1002    김주란          49860

SQL 페이지, 글자 포멧 설정

SET LINE ##
COL 컬럼 [FORMAT A## | CLEAR | ...]
SET PAGES ##

ex)

set line 100

col ename format a10 : ename 글자 포멧 10글자 지정 (문자 컬럼만 지정

col sal clear : 글자 포멧 지정한 것을 원래로 돌리기

set pages 10 : 한 페이지 열줄 지정

 

메모장을 열고 다음과 같이 인코딩 값을 변경시켜 login.sql을 만든다.

 

인코딩을 ANSI (euc) 로 저장한다.

 

sql 을 실행해 다음과 같이 두개 중 하나를 입력한다. sql을 실행할 때마다 입력한다.

sql> @login.sql

sql> @login

 

잘 적용된 것을 확인할 수 있다.

 

login.sql

SET LINE 100
SET PAGES 10
ALTER SESSION SET nls_date_format='YYYY/MM/DD';


COL grade FORMAT A7
COL 평가점수 FORMAT A9
COL sno FORMAT A7
COL 학번 FORMAT A7
COL sname FORMAT A10
COL 이름 FORMAT A10
COL major FORMAT A7
COL 전공 FORMAT A7
COL pno FORMAT A7
COL 교수번호 FORMAT A9
COL pname FORMAT A10
COL 교수이름 FORMAT A10
COL section FORMAT A7
COL 학과 FORMAT A7
COL orders FORMAT A7
COL 지위 FORMAT A7
COL cno FORMAT A7
COL 과목번호 FORMAT A9
COL cname FORMAT A12
COL 과목이름 FORMAT A12
COL 과목명 FORMAT A12
COL eno FORMAT A7
COL 사번 FORMAT A7
COL ename FORMAT A10
COL sex FORMAT A3
COL 성별 FORMAT A3
COL job FORMAT A7
COL 부서 FORMAT A7
COL 업무 FORMAT A7
COL dname FORMAT A7
COL 부서명 FORMAT A7
COL loc FORMAT A5
COL 근무처 FORMAT A5
COL dno FORMAT A7
COL 부서번호 FORMAT A9

 

+ Recent posts