SQL LIKE, BETWEEN, IN 연산자
SET LINE ## 출력폭 지정 명령어
SET PAGES 100 >>> 50행마다 하나씩 나옴
COL job FORMAT A## >> 문자컬럼 (바이트수)
COL eno FORMAT A4
COL job FORMAT A10
COL ename FORMAT A15
COL sal FORMAT ## >> 숫자컬럼
-----------------------------------------------------------
C:\app\client\st01\product\19.0.0\client_1\sqlplus\admin ----> glogin 파일에 추가
관계 연산자와 LIKE 연산자
관계 연산자
SQL> SELECT * FROM emp
2 WHERE dno = 10 OR sal > 1600 AND comm > 600;
-----> 맞고 안맞고의 유무와 상관없이 괄호가 없어서 진위여부를 판단할 수 없다.
SQL> SELECT * FROM emp
2 WHERE (dno = 10 OR sal > 1600) AND comm > 600;
-----> 괄호를 써야한다.
or 조건중 하나만 참이면 참
AND
LIKE 연산자
패턴연산자
'%문자열'
'경%' ------- 경으로 시작하는 모든 문자열 ----- 경, 경제, 경범죄, 경영학과 등등
'%과" ------- 과로 끝나는 모든 문자열 -------- 과, 다과, 화학과, 물리학과 등등
'%김%'------- 김이란 글자가 들어간 모든 문자열 - 김, 김씨, 돌김, 되새김질 등등
'화_' ------- 화로 시작하는 두글자 단어 ------- 화학, 화약, 화상 등등
'__화'------- 화로 끝나는 세 글자 단어 ------- 무궁화, 운동화
'_동_' ------ 동이 가운데 들어간 세글자 단어 --- 원동기, 자동차
'%이#%%' ESCAPE '#' 으로 지정한 경우, '이%' 가 포함된 문자열
'_#%_' ESCAPE '#' 으로 지정한 경우, '%'가 포함된 세 글자 단어
. 김씨 성을 가진 사원
SQL> SELECT * FROM emp
2 WHERE ename LIKE '김%';
. 이름이 '하늘'인 사원
SQL> SELECT * FROM emp
2 WHERE ename LIKE '%하늘';
. 성과 이름이 각각 한 글자인 사원을 검색한다.
SQL> SELECT * FROM emp
2 WHERE ename LIKE '__';
선택된 레코드가 없습니다.
이름에 '%' 문자가 포함된 사원을 검색한다.
SQL> SELECT eno, ename
2 FROM emp
3 WHERE ename LIKE '%#%%' ESCAPE '#';
선택된 레코드가 없습니다.
실습
1. 화학과와 물리학과 학생을 검색한다.
select * from student where major = '물리' or major = '화학';
2. 화학과가 아닌 학생 중에 1학년 학생을 검색한다.
select * from student where major! = '화학' AND syear = '1';
3. 화학과 3학년 학생을 검색한다.
select * from student where major = '화학' AND syear = '3';
4. 평점이 2.0에서 3.0 사이인 학생 검색한다.
select * from student where avr >= '2.0' AND avr < '3.0';
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';
7. 화학과 정교수를 검색한다.
select * from professor where section = '화학' AND orders = '정교수';
8. 화학과 학생 중에 성이 권씨인 학생을 검색한다.
select * from student where sname LIKE '권%%' AND major = '화학';
9. 부임일이 1995년 이전인 정교수를 검색한다.
select * from professor where orders = '정교수' AND hiredate >= '1995/01/01';
10. 성과 이름이 각각 한글자인 교수를 검색한다.
select * from professor where pname LIKE '__';
BETWEEN와 IN 연산자
WHERE sal BETWEEN 1000 AND 2000 = (sal >= 1000 AND sal <= 2000)
SQL> SELECT * FROM emp
2 WHERE dno BETWEEN '10' AND '20';
이거보다 (dno = '10'
SQL> SELECT * FROM emp
2 WHERE hdate BETWEEN '1992/01/01' AND '1996/12/31' 3 ORDER BY hdate;
>>>> 시분초가 의미가 있는 데이터인지 확인하고 시분초까지 쓸지 말지 생각해봐야함
IN연산자
개발이나 관리 업무를 담당하는 사원.
select * from emp where job in ('개발','관리')
order by job;
10, 20번 부서 사원
select * from emp where dno in ('10','20')
order by dno;
실습
1. 평점이 3.0에서 4.0 사이의 학생을 검색한다.
select * from student where avr BETWEEN '3.0' AND '4.0' order by avr desc;
2. 1999년에서 2001년까지 부임한 교수의 명단을 검색한다.
select * from professor where hiredate BETWEEN '1999/01/01' AND '2001/12/31' order by hiredate;
3. 화학과와 물리학과, 생물학과 학생을 검색한다.
select * from student where major IN ('화학','물리','생물') order by major;
4. 정교수와 조교수를 검색한다.
select * from professor where orders IN ('정교수','조교수') order by orders;
5. 학점수가 1학점, 2학점인 과목을 검색한다.
select * from course where st_num IN ('1','2') order by st_num;
6. 1,2 학년 학생 중에 평점이 2.0에서 3.0사이인 학생을 검색한다.
select * from student where syear IN ('1','2') AND (avr >= '2.0' AND avr <= '3.0');
7. 화학, 물리학과 학생 중 1,2 학년 학생을 성적순으로 검색한다.
select * from student where major IN ('화학','물리') AND syear IN ('1','2') order by avr desc;
8. 물리, 화학과 학생 중 4.5 환산 평점이 3.5에서 4.0 사이인 학생을 검색한다.
select avr*4.5/4.0 환산평점, sname 이름, syear 학년, major 학과 from student where major IN('물리','화학') AND avr*4.5/4.0 BETWEEN '3.5' AND '4.0' order by syear desc;
9. 물리, 화학과 학생의 정보를 학년별 성적순으로 검색한다.
select * from student where major IN ('물리','화학') order by syear desc,avr desc;
10. 물리, 화학과 교수 중에 1999년에서 2000년 사이에 부임한 교수의 정보를 직위별로 검색한다.
select * from professor where section IN ('물리','화학') AND hiredate BETWEEN '1999/01/01' AND '2000/01/01' order by orders;
st01.emp.eno >>> 원래 컬럼 이름
조인 : 등가 조인(Equi join)과 비 등가 조인(Non Equi-join) = INNER JOIN
SQL> SELECT 테이블1.컬럼, ...테이블2.컬럼, ...
2 FROM 테이블1, 테이블2, ...
3 WHERE 조인_조건
4 AND 일반_조건
- 조인 조건은 두 테이블간의 관계를 수식으로 표현한 것이다.
- 조인 조건은 SELECT 문에 사용된 테이블의 개수에 따라 달라지지만 테이블 n개 라면 조인 조건의 개수는 항상 (n-1)개 이상이다.
- 조인 조건에 '='를 이용하는 조인을 등가 조인(Equi-join)이라고 하고 부등호가 포함된 조인 조건을 이용하는 경우 비 등가 조인(Non equi-join)이라고 한다.
예제 1. 각 사원의 근무 부서를 검색한다.
SQL> SELECT eno 사번, ename 이름, emp.dno 부서번호,
2 dept.dno 부서번호, dname 부서명
3 FROM dept, emp
4 WHERE dept.dno = emp.dno;
예제 2. 광주에서 근무하는 직원의 명단을 검색한다.(부서번호와 부서명도 검색한다.)
SQL> SELECT loc 근무처, d.dno 부서번호, dname 부서명,
2 eno 사번, ename 이름
3 FROM dept d, emp e
4 WHERE d.dno=e.dno
5 AND loc = '광주';
예제 3. 각 직원의 급여를 10% 인상한 경우 급여 등급을 검색한다.
SQL> SELECT eno 사번, ename 이름,
2 sal*1.1 인상된급여, grade 등급
3 FROM emp, salgrade
4 WHERE sal*1.1 BETWEEN losal AND hisal;
조인조건을 미리 관계도를 알고 작성해야 한다.
실습
1. 송강 교수가 강의하는 과목을 검색한다.
select p.pno 교수번호, p.pname 이름, p.orders 직위, c.cno 강의번호, c.cname 과목명, c.pno 교수번호
from professor p, course c
where p.pno = c.pno
AND p.pname = '송강';
2. 과목명에 화학이 포함된 과목을 강의하는 교수의 명단을 검색한다.
select p.pno 교수번호, p.pname 이름, p.orders 직위, c.cno 강의번호, c.cname 과목명, c.pno 교수번호
from professor p, course c
where p.pno = c.pno
AND c.cname like '%화학%';
3. 학점이 2학점인 과목과 이를 강의하는 교수를 검색한다.
select p.pno 교수번호, p.pname 이름, p.orders 직위, c.cno 강의번호, c.cname 과목명, c.st_num 학점수
from professor p, course c
where p.pno = c.pno
AND c.st_num = '2';
4. 화학과 교수가 강의하는 과목을 검색한다.
select p.pno 교수번호, p.pname 이름, p.orders 직위, c.cno 강의번호, c.cname 과목명, c.st_num 학점수
from professor p, course c
where p.pno = c.pno
AND p.section like '%화학%';
5. 화학과 1학년 학생의 기말고사 성적을 검색한다.
select s.sname 이름, s.sno 학번, s.syear 학년, s.sex 성별, s.major 학과, ss.cno 과목번호, ss.result 점수
from student s, score ss
where s.sno = ss.sno
AND s.major = '화학' AND s.syear = '1';
6. 일반화학 과목의 기말고사 점수를 검색한다.
select a.sno 학번, a.sname 이름, a.syear 학년, a.major 학과, b.cno 과목번호, b.cname 과목명, c.result 점수
from student a, course b, score c
where a.sno = c.sno AND b.cname = '일반화학' AND b.cno = c.cno;
7. 화학과 1학년 학생의 일반화학 기말 고사 점수를 검색한다.
select a.sno 학번, a.sname 이름, a.syear 학년, b.cno 과목번호, b.cname 과목명, c.result 점수
from student a, course b, score c
where a.sno = c.sno AND b.cno = c.cno
AND b.cname = '일반화학' AND a.syear = '1';
8. 화학과 1학년 학생이 수강하는 과목을 검색한다.
select a.sno 학번, a.sname 이름, a.syear 학년, a.major 학과, b.pno 교수번호, b.pname 교수이름, c.cno 과목번호, c.cname 과목명
from student a, professor b, course c
where a.major = b.section AND b.pno = c.pno
AND a.major = '화학' AND a.syear = '1';
9. 일반화학 과목에서 평가 점수가 A인 학생의 명단을 검색한다.
select a.sno 학번, a.sname 이름, a.syear 학년, a.major 학과, b.cno 과목번호, b.result 점수, c.grade 등급, d.cname 과목명
from student a, score b, scgrade c, course d
where a.sno = b.sno AND b.cno = d.cno AND b.result BETWEEN c.loscore AND c.hiscore AND d.cname = '일반화학' AND c.grade = 'A';
10. 송강 교수의 과목을 수강하는 학생의 기말고사 점수를 성적 순서로 검색한다.
select a.pno 교수번호, a.pname 교수이름, b.sno 학번, b.sname 학생이름, b.syear 학년, b.major 학과, c.cno 과목번호,
c.cname 과목명, d.result 점수 from professor a, student b, course c, score d
where b.sno = d.sno AND a.pno = c.pno AND a.pname = '송강' order by d.result desc;
11. 화학과 1학년 학생의 기말고사 성적을 학점(A,B,C,D,F)으로 검색한다.
select a.sno 학번, a.sname 이름, a.syear 학년, a.major 학과, b.result 점수, c.grade 등급
from student a, score b, scgrade c
where a.sno = b.sno AND b.result BETWEEN c.loscore AND c.hiscore AND a.major = '화학' AND a.syear = '1';
select major, syear, sname, a.sno, grade
from student a, score b, scgrade c
where a.sno = b.sno AND b.result BETWEEN c.loscore AND c.hiscore AND a.major = '화학' AND a.syear = '1';
12. 송강 교수가 강의하는 과목에서 평가 점수가 A인 학생의 명단을 과목명과 함께 검색한다.
select DISTINCT pname, cname, grade, sname
from student a, professor b, course c, scgrade d, score e
where result BETWEEN d.loscore AND d.hiscore AND d.grade = 'A'
AND pname = '송강' AND a.sno = e.sno AND e.cno = c.cno AND b.pno = c.pno;
13. 화학과 1학년 학생에게 강의하는 교수의 명단을 검색한다.
select DISTINCT b.pname 교수명, b.pno 교수번호, a.syear 학년, a.major 학과
from student a, professor b, course c, score d
where a.sno = d.sno AND c.pno = b.pno AND c.cno = d.cno AND a.major = '화학' AND a.syear = '1';