2019. 12. 4. 10:08ㆍSecurity/sql
관계 연산자
SELECT [DISTINCT | ALL] 컬럼, 컬럼...
FROM 테이블 WHERE [관계 연산자 조건]
ORDER BY 컬럼 ASC, 컬럼 ASC..
[예제]
#SQL > SELECT * FROM emp WHERE dno = '20' AND sal >= 2000 AND job = '모델링';
-> 20번 부서 사원중에 급여가 2000이상이고, 모델링 업무를 담당하는 사원 검색
#SQL > SELECT * FROM emp WHERE (dno = 10 OR sal > 1600) AND comm > 600;
-> AND와 OR 연산자를 같이 사용할때는 연산순서상 문제가 없더라도 괄호를 반드시 사용
LIKE 연산자
SELECT [DISTINCT | ALL] 컬럼, 컬럼...
FROM 테이블 WHERE 컬럼
LIKE '비교 문자열'
ORDER BY 컬럼 ASC, 컬럼 ASC..
와일드 문자의 종류
% : 문자열을 의미. 리눅스의 *와 의미가 같음.
ex) '경%' : '경'으로 시작하는 모든 문자열
'%과' : '과'로 끝나는 모든 문자열
'%김%' : '김'이란 글자가 들어간 모든 문자열
_ : 글자수를 제한한 검색
ex) '화_' : '화'로 시작하는 두 글자 단어
'__화' : '화'로 끝나는 세 글자 단어
'_동_' : '동'이 가운데 들어간 세 글자 단어
[예제]
#SQL > SELECT * FROM emp WHERE ename LIKE '김%';
-> 김씨 성을 가진 사원
#SQL > SELECT * FROM emp WHERE ename LIKE '%하늘';
-> 이름이 '하늘'인 사원
#SQL > SELECT * FROM emp WHERE ename LIKE '__';
-> 이름이 두 글자인 사원 검색
이름을 검색할때 정확하게 하려면 성과 이름을 구분해서 DB를 입력해야 한다.
[실습]
1. 화학과와 물리학과 학생을 검색
#SQL > SELECT * FROM student WHERE major='화학' OR major='물리';
2. 화학과가 아닌 학생 중에 1학년 학생을 검색
#SQL > SELECT * FROM student WHERE major!='화학' AND syear=1;
3. 화학과 3학년 학생을 검색
#SQL > SELECT * FROM student WHERE major='화학' AND syear=3;
4. 평점이 2.0에서 3.0사이인 학생 검색
#SQL > SELECT * FROM student WHERE AVR > 2.0 AND AVR < 3.0;
5. 교수가 지정되지 않은 과목중에 학점이 3학점인 과목을 검색
#SQL > SELECT * FROM course WHERE PNO is NULL AND ST_NUM = 3;
6. 화학 관련 된 과목중(과목명에 화학이 포함) 평점이 2학점 이하인 과목을 검색
#SQL > SELECT * FROM course WHERE CNAME LIKE '%화학%' AND ST_NUM < 3;
7. 화학과 정교수를 검색
#SQL > SELECT * FROM professor WHERE ORDERS = '정교수';
8. 화학과 학생 중에 성이 권씨인 학생을 검색
#SQL > SELECT * FROM student WHERE major = '화학' AND SNAME LIKE '권%';
9. 부임일이 1995년 이전인 정교수를 검색
#SQL > SELECT * FROM professor WHERE HIREDATE < '1996/01/01' AND ORDERS = '정교수';
10. 성과 이름이 각각 한글자인 교수를 검색
#SQL > SELECT * FROM professor WHERE PNAME LIKE '__';
* BETWEEN..AND 연산자
SELECT [DISTINCT | ALL] 컬럼, 컬럼 ...
FROM 테이블
WHERE 컬럼
BETWEEN 값1 AND 값2 ORDER BY 컬럼 [ASC], ...
- 반드시 값1 보다 값2가 커야한다.
[예제]
#SQL > SELECT * FROM emp WHERE sal BETWEEN 1000 AND 2000;
-> 급여가 1000에서 2000이내인 사원을 검색
#SQL > SELECT * FROM emp WHERE hdate BETWEEN '1992/01/01' AND '1996/12/31' ORDER BY hdate;
-> 1992년에서 1996년 사이에 입사한 사원을 검색
* IN 연산자
SELECT [DISTINCT | ALL] 컬럼, 컬럼 ...
FROM 테이블
WHERE 컬럼
IN (값1, 값2 ...)
ORDER BY 컬럼 [ASC], ...
- IN 연산자는 100% OR 연산자로 바꿀 수 있지만 OR 연산자는 IN 연산자로 100% 바꿀수는 없다.
- 가독성이 훨씬 좋기 때문에 BETWEEN and 연산자나 OR 연산자를 IN 연산자로 바꿔서 사용하는 경우가 많다.
[예제]
#SQL > SELECT * FROM emp WHERE job IN ('개발', '관리') ORDER BY job;
-> 개발이나 관리 업무를 담당하는 사원을 검색
#SQL > SELECT * FROM emp WHERE dno IN ('10', '20') ORDER BY dno;
-> 10번, 20번 부서 사원 검색
[실습]
1. 평점이 3.0에서 4.0사이의 학생을 검색
#SQL > SELECT * FROM student WHERE AVR BETWEEN 3.0 AND 4.0 ORDER BY AVR desc;
2. 1999년에서 2001년까지 부임한 교수의 명단 검색
#SQL > SELECT * FROM professor WHERE HIREDATE BETWEEN '1999/01/01' AND '2001/12/31' ORDER BY HIREDATE;
3. 화학과, 물리학과, 생물학과 학생을 검색
#SQL > SELECT * FROM student WHERE MAJOR IN ('화학', '물리', '생물');
4. 정교수와 조교수 검색
#SQL > SELECT * FROM professor WHERE ORDERS IN ('정교수', '부교수');
5. 학점수가 1, 2인 과목을 검색
#SQL > SELECT * FROM course WHERE ST_NUM IN(1, 2) ORDER BY ST_NUM desc;
6. 1,2학년 학생중 평점이 2.0에서 3.0사이인 학생을 검색
#SQL > SELECT * FROM student WHERE SYEAR IN(1, 2) AND AVR BETWEEN 2.0 AND 3.0 ORDER BY SYEAR desc, AVR desc;
7. 화학, 물리학과 학생 중 1, 2학년 학생을 성적순으로 검색
#SQL > SELECT * FROM student WHERE MAJOR IN('화학', '물리') AND SYEAR IN (1, 2) ORDER BY AVR desc;
8. 물리, 화학과 학생 중 4.5 환산 평점이 3.5에서 4.0사이인 학생을 검색
#SQL > SELECT * FROM student WHERE MAJOR IN ('화학', '물리') AND ((AVR*4.5/4) BETWEEN 3.5 AND 4.0);
9. 물리, 화학과 학생의 정보를 학년별 성적순으로 검색
#SQL > SELECT * FROM student WHERE MAJOR IN ('화학', '물리') ORDER BY SYEAR DESC, AVR DESC;
10. 물리, 화학과 교수 중에 1999년에서 2000년 사이에 부임한 교수의 정보를 직위별로 검색
#SQL > SELECT * FROM professor WHERE SECTION IN ('화학', '물리') AND HIREDATE BETWEEN '1999/01/01' AND '2000/12/31' ORDER BY ORDERS;
* 용어 및 개념 정리
#SQL > ALTER SESSION SET nls_date_format='YYYY/MM/DD';
// 날짜 세팅
'Security > sql' 카테고리의 다른 글
SQL-서브쿼리 (0) | 2019.12.06 |
---|---|
SQL-모델링, join (0) | 2019.12.05 |
SQL-WHERE (0) | 2019.12.03 |
SQL-SELECT(2) (0) | 2019.12.03 |
RDB & SQL-SELECT (0) | 2019.12.02 |