Infra & Security Eng/Database Engineering
다양한 조건 검색(NULL, BETWWN, IN, LIKE 기능)
엔지니어 E
2026. 1. 28. 13:17
반응형
NULL과 비교연산
| NULL = 값이 없는 것, 연산이 불가능 하므로 비교 연산(=,<,>)을 할 수가 없음 = 데이터 테이블에 NULL 값이 되도록 없는 게 좋음 NULL에 대한 직접 검색은 아래 연산자를 이용 * 컬럼 IS NULL (컬럼이 NULL이니? 라고 물어보는 것) * 컬럼 IS NOT NULL(컬럼이 NULL이 아니니? 라고 물어보는 것) 보너스가 결정되지 않은 사원을 검색 SQL > SELECT * FROM emp 2 WHERE comm IS NULL; * NULL 은 값의 크기를 비교를 할 수 없으므로 정렬을 할 수 가 없음 (인덱스에 못 들어감) |
BETWEEN..AND 연산자
| SELECT * 컬럼명 FROM 테이블명 ; WHERE 컬럼명 BETWEEN 값1 AND 값2 ORDER BY 컬럼명 *BETWNND AND 연산자를 AND 연산자로 바꿀 수 있다 * 컬럼의 값이 값1 에서 값 2 사이의 값을 검색한다 (컬럼 값은 값 1과 값 2 도 포함 시키는게 일반적) * WHERE 컬럼 BETWEEN 값 1 AND 값2 = 값1 보다 같거나 크고, 값2보다 작거나 같다 라는 뜻 * 값 1보다 값2이 반드시 커야한다 급여가 1000에서 2000 이내인 사원을 검색 SQL> SELECT * FROM emp 2 WHERE sal BETWEEN 1000 AND 2000; (혹은 sal >= 1000 AND <= 2000) * SAL이 1000보다 같거나 크고, 2000보다 같거나 작다 * BETWEEN 연산자 입력시 작은 값(1000)을 먼저 입력해야 함 1992년에서 1996년 사이에 입사한 사원을 검색 SQL> SELECT * FROM emp 2 WHERE hdate BETWEEN '1992/01/01' AND '1996/12/31' 3 ORDER BY hdate; ---> 이 검색 방식은 조건에 안 나오는 사람도 있을 수도 있으므로 주의가 필요함 * 오라클 같은 DB에서 날짜 데이터는 시/분/초 정보를 포함하고 있으므로 1996년 12월 31일 오전 0시 0분 0초보다 같거나 크다 의 값이 된다면 12월 31일을 포함 하지 않을 수 있으므로 범위 수정이 필요하다 ---> 2 WHERE hdae >='1992/01/01 AND hdate < '1997/01/01' |
IN 연산자
| SELECT * 컬럼명 FROM 테이블명 ; WHERE 컬럼 IN (값1, 값2 ...) ORDER BY 컬럼명 *IN 연산자는 OR 검색이라고 생각 하면 쉬우며 값 중에 일치하는 값이 하나라도 있으면 검색 된다 *OR 연산자와 = 연산자로 교환 가능 하다 개발이나 분석 업무를 담당하는 사원을 검색 SQL> SELECT * FROM emp 2 WHERE job IN ('개발', '분석') 혹은 2 WHERE job='개발' OR job='분석' 3 ORDER BY JOB; 10, 20 번 부서 사원을 검색 SQL> SELECT * FROM emp 2 WHERE dno IN ('10', '20') 3 ORDER BY dno; |
LIKE 연산자
| SELECT * 컬럼명 FROM 테이블명 WHERE 컬럼명 LIKE 찾을 패턴 ORDER BY 컬럼명 *LIKE 연산자는 정확한 전체 글자를 모를 때, 글자의 일부분(패턴)만으로 데이터를 찾는 기능 *와일드 문자가 반드시 따라 붙음 [와일드 문자] %: 문자열 공백을 포함 _: 문자 김씨 성을 가진 사원을 검색 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. %(글자수 제한 없는 검색) | 김%: 첫 글자가 '김'이기만 하면 됨 (김, 김밥천국, 김수로 등) %김: 마지막 글자가 '김' 이기만 하면 됨 (김, 돌김, 파래김 등) %김%: 어느 위치든 김이 들어 있으면 됨 | %는 이 자리에 글자가 없거나, 한 글자 이거나, 아주 많거나 상관 없음 |
| 2. _(한 글자 자리 채우기) | 김_: '김'으로 시작하는 무조건 2글자 단어만 찾음 (김씨, 김구) - 김철수(x) __김: 앞에 아무 글자나 2글자가 오고 마지막이 '김'인 무조건 3글자 단어만 찾음 (파래김) - 돌김(x) | _는 이 자리에 반드시 아무 글자나 딱 1글자가 있어야 한다는 뜻 |
| * ESCAPE(#) 기능 만약 퍼센트 찾는 문자열에 %(퍼센트) 기호가 들어간 경우(할인율 10%) LIKE %% 라고 쓰면 컴퓨터는 아무 글자나 다 찾으라고 오해를 한다. 기능을 정지시키고 싶은 글자(%, _) 앞에 #를 불여 # 뒤에 오는 기호는 기능이 아니라 그냥 일반 글자라고 알려주는 기능 EX) 1. %이#%% %앞에 #이 왔으므로 %는 기능이 아닌 일반 문자 %로 온다. 이 앞에 %와 % 뒤에 %는 [아무글자]라고 생각 하면 되므로 ---> [아무글자] 이% [아무글자] 가 온다고 생각하면 된다 2. _#%_ % 앞에 #가 왔으므로 %는 일반 문자%가 된다. 그래서 _%_ 가 되는 것이고, %가 중간에 있고 1번째와 3번째 단어가 포함된 세 글자 단어가 온다고 생각하면 된다 | ||

| 문제 1. 1999년에서 2001년까지 부임한 교수의 명단을 검색한다. SELECT * FROM professor WHERE hiredate >= '1999/01/01' AND hiredate < '2002/01/01' ORDER BY hiredate; 2. 정교수와 조교수를 검색한다. SELECT * FROM professor WHERE orders IN ('정교수', '조교수'); 3. 학점수가 1학점, 2학점인 과목을 검색한다. SELECT * FROM course WHERE st_num IN (1, 2); 4. 1,2 학년 학생 중에 평점이 2.0에서 3.0사이인 학생을 검색한다. SELECT * FROM student WHERE syear IN (1, 2) AND avr BETWEEN 2.0 AND 3.0; 5. 물리, 화학과 학생 중 4.5 환산 평점이 3.5에서 4.0 사이인 학생을 검색한다. SELECT * FROM student WHERE major IN ('물리', '화학') AND (avr * 4.5 / 4.0) BETWEEN 3.5 AND 4.0; 6. 물리, 화학과 학생의 정보를 학년별 성적순으로 검색한다. SELECT * FROM student WHERE major IN ('물리', '화학') ORDER BY syear , avr DESC; 7. 물리, 화학과 교수 중에 1999년에서 2000년 사이에 부임한 교수의 정보를 직위별로 검색한다. SELECT * FROM professor WHERE section IN ('물리', '화학') AND hiredate >= '1999/01/01' AND hiredate < '2001/01/01' ORDER BY orders; 8. 교수가 지정되지 않은 과목 중에 학점이 3학점인 과목을 검색한다. SELECT * FROM course WHERE pno IS NULL AND st_num = 3; 9. 화학 관련된 과목 중 학점이 2학점 이하인 과목을 검색한다. : 화학 관련 과목은 과목 명에 화학이 들어간 과목을 의미한다. SELECT * FROM course WHERE cname LIKE '%화학%' AND st_num <= 2; 10. 화학과 학생 중에 성이 권씨인 학생을 검색한다 SELECT * FROM student WHERE major = '화학' AND sname LIKE '권%'; |