쌓고 쌓다
[Oracle] WHERE, 비교 연산자, 논리연산자, SQL 연산자, NULL, 정렬 본문
WHERE을 이용한 조건 검색
- 문자와 날짜 타입의 상수 값은 작은 따옴표('')로 묶어서 사용한다.
- 숫자는 그대로 사용함
- 그런데 Oracle에서 자동으로 숫자는 문자로(1->'1') 문자는 숫자로('1'->1)로 검색을 지원함
1) 학생 테이블에서 1학년 학생 출력
SELECT studno, name, deptno
FROM student
WHERE grade = '1';
-> grade 칼럼이 CHAR이긴하나 1로 검색해도 '1'로 검색해도 동일한 결과가 나옴
비교 연산자를 이용한 조건 검색
: WHERE 절에 숫자, 문자, 날짜의 크기나 순서를 비교
연산자 | 의미 |
= | 같다. |
!=, <> | 같지 않다. |
> | 크다 |
>= | 크거나 같다 |
< | 작다 |
<= | 작거나 같다 |
1) 학생 테이블에서 몸무게가 70 이하인 학생 출력
SELECT studno, name, grade, deptno
FROM student
WHERE weight <= 70;
2) 학생 테이블에서 지도교수번호가 9905인 학생의 정보를 출력
SELECT *
FROM student
WHERE profno=9905;
3) 학생 테이블에서 2학년 이상인 학생
SELECT studno, name, grade, deptno, height, weight
FROM student
WHERE grade >= '2';
논리 연산자를 이용한 조건 검색
: WHERE절에 여러개의 조건을 결합할때 사용
연산자 | 의미 |
AND | 모든 조건이 참일때, 참을 반환 |
OR | 모든 조건중 하나라도 참일때, 참을 반환 |
NOT | 조건과 반대되는 결과를 반환 |
1) 학생 테이블에서 1학년이면서 몸무게가 70이상인 학생
SELECT name, grade, weight, deptno
FROM student
WHERE grade='1' AND weight >= 70;
2) 위와 동일하게 1학년이거나 몸무게가 70이상인 학생을 대상화.
SELECT name, studno, grade, weight, deptno
FROM student
WHERE grade = '1' OR weight >= 70;
3) 학생 테이블에서 지도교수번호가 9905이거나, 학과번호가 201인 학생 출력
SELECT *
FROM student
WHERE profno = 9905 OR deptno = 201;
4) 학생 테이블에서 2학년 이상인 학생중에서 키가 170이상인 학생
SELECT studno, name, grade, deptno, height, weight
FROM student
WHERE grade >= '2' AND height >= 170;
SQL 연산자를 이용한 조건 검색
: SQL 연산자는 모든 데이터 타입에 대해 사용 가능
연산자 | 의미 |
BETWEEN a AND b | a와 b 사이의 값 ( a, b도 포함 ) |
IN(a, b, c, ..., n) | a, b, ... n중에 하나라도 일치하면 참을 반환 |
LIKE | 문자와 일치(%, _)하면 참 |
IS NULL | NULL이면 참 |
BETWEEN 연산자: AND 논리 연산자를 사용한 것과 같은 결과 집합
IN 연산자: OR 논리 연산자를 사용한 것과 같은 결과
BETWEEN 연산자
1) BETWEEN 연산자를 이용해 몸무게가 50에서 70사이인 학생
SELECT studno, name, weight
FROM student
WHERE weight BETWEEN 50 AND 70;
2) 학생 테이블에서 키가 165이상 175이하인 학생
SELECT name, grade, height
FROM student
WHERE height BETWEEN 165 AND 175;
3) (2)의 문제를 비교연산자를 이용해 표현
SELECT name, grade, height
FROM student
WHERE height >= 165 AND height <= 175;
IN 연산자
1) IN 연산자를 이용해 102번 학과와 201번 학과 학생
SELECT name, grade, deptno
FROM student
WHERE deptno IN(102, 201);
2) IN 연산자를 이용해 교수 테이블에서 직급이 조교수 또는 전임강사인 교수
SELECT profno, name, position, deptno
FROM professor
WHERE position IN('조교수', '전임강사');
+ OR 논리 연산자 이용
SELECT profno, name, position, deptno
FROM professor
WHERE position = '조교수' OR position = '전임강사';
3) 교수테이블에서 201과 202 학과에 속하는 교수
SELECT profno, position, sal, deptno
FROM professor
WHERE deptno IN(201, 202);
4) 부서테이블에서 학과 위치가 1호관과 3호관인 학과
SELECT *
FROM department
WHERE loc IN('1호관', '2호관');
LIKE 연산자
: %는 뭐가 와도 괜찮음을 뜻, _는 자리수를 뜻함
1) 학생 테이블에서 성이 '김' 씨인 학생
SELECT name, grade, deptno
FROM student
WHERE name LIKE '김%';
2) 학생 테이블에서 이름이 3글자, 성은 '김'이고 마지막 글자는 '영'인 학생
SELECT name, grade, deptno
FROM student
WHERE name LIKE '김_영';
3) 교수 테이블에서 성이 "이"씨인 교수
SELECT name, position, deptno
FROM professor
WHERE name LIKE '이%';
4) 학생테이블에서 81년생인 학생
SELECT name, grade, idnum, deptno
FROM student
WHERE idnum LIKE '81%';
5) 학생 테이블에서 거주지가 부산인 학생
SELECT name, grade, tel, deptno
FROM student
WHERE tel LIKE '051%';
-> 이게 뭔 문제인지 싶었는데 지역 칼럼이 없는데 전화번호로 찾아야했었다...?
ESCAPE 옵션
LIKE 연산자에서 사용하는 와일드 문자(%, _) 자체를 포함(사용)하는 문자열을 검색할때 사용함 즉, 와일드 문자를
일반 문자로 취급하여 검색할때
1) 학생 테이블에서 이름이 '황보_'로 시작하는 학생
SELECT name
FROM student
WHERE name LIKE '황보\_%' ESCAPE '\';
-> 이름이 황보_안녕이라면 검색되어 나옴
NULL의 의미
미확인 값이거나 입력되지 않은 값을 의미 -> 0과 NULL은 의미가 다르다.
만약 몸무게가 0이면 몸무게가 0인거지 입력되지 않거나 모른다는 의미인 NULL과 다름.
1) 교수 테이블에서 이름, 직급, 보직수당을 출력
SELECT name, position, comm
FROM professor
여기서 comm이 NULL인 값이 나오는데
이것은 보직 수당이 없다는, 0이라는 의미가 아니다.
아직 입력되지 않아 모른다는것이다.
NULL 연산자를 이용한 조건 검색
1. IS NULL 연산자
IS NULL 연산자는 칼럼 값중에서 NULL인 행을 검색하기위해 사용
2. IS NOT NULL 연산자
IS NOT NULL 연산자는 NULL이 아닌 행을 검색하기 위해 사용
1) 교수 테이블에서 보직 수당이 없는 교수
SELECT name, position, comm
FROM professor
WHERE comm IS NULL;
+ 주의! 아래처럼 comm = NULL은 comm 값에 "문자열" NULL 이 있는지 검색한다.
SELECT name, position, comm
FROM professor
WHERE comm = NULL;
2) 교수 테이블에서 보직 수당을 받고 있는 교수의 이름과 급여를 출력
SELECT name, sal
FROM professor
WHERE comm IS NOT NULL AND comm > 0;
-> IS NOT NULL만하면 보직 수당이 0인 교수도 출력이 되므로 AND로 comm > 0 을 연결하자.
3) 학생 테이블에서 지도교수가 아직 없는 학생
SELECT name, grade, deptno, profno
FROM student
WHERE profno IS NULL;
4) 학생 테이블에서 지도교수가 배정된 학생
SELECT name, grade, deptno, profno
FROM student
WHERE profno IS NOT NULL;
산술식에서 NULL 처리
NULL에 산술식이나 함수를 적용하면 연산 결과도 NULL이다.
교수 테이블에서 급여에 보직 수당을 더한 값을 출력해보자.
SELECT name, sal, comm, sal+comm "sal+comm"
FROM professor;
sal과 comm을 더한 값을 출력하는데
하나라도 NULL이 포함되어있으면 연산 결과 또한 NULL이 나온다.
1) 교수테이블에서 101번 학과 교수에 대한 연봉(급여*12 +커미션) 출력
SELECT name, sal, comm, (sal*12)+comm "연봉"
FROM professor
WHERE deptno=101;
comm이 NULL이면 결과도 NULL이 나온다.
연산자 우선순위
우선순위 | 연산자 |
1 | 비교 연산자(=, !=, ^=, <>, >=, <, <=) SQL 연산자(BETWEEN a AND b, IN, LIKE, IS NULL) |
2 | NOT |
3 | AND |
4 | OR |
1) 102번 학과의 학생 중에서 1학년 또는 4학년 학생
SELECT name, grade, deptno
FROM student
WHERE deptno = 102 AND (grade = '1' OR grade = '4');
2) 102번 학과의 학생 중에서 4학년 학생이거나 소속학과에 상관없이 1학년 학생
SELECT name, grade, deptno
FROM student
WHERE deptno = 102 AND grade = '4' OR grade = '1';
3) 학생테이블에서 101번 학과 학생중에서, 키가 175이상이거나 몸무게가 70 이상인 학생
SELECT studno, name
FROM student
WHERE deptno=101 AND (height >= 175 OR weight >= 70);
4) 교수 테이블에서 급여가 300이상이면서 보직수당을 받거나, 급여가 450 이상인 교수
SELECT name, sal, comm
FROM professor
WHERE (sal >= 300 AND comm > 0) OR sal >= 450;
ORDER BY 절
SELECT [DISTINCT] { *|column [alias] ...}
FROM table
[ WHERE condition ]
[ ORDER BY {column, expression} [ASC|DESC] ]
ASC : 오름차순으로 정렬 (기본값)
DESC : 내림차순 정렬
1) 학생 테이블에서 이름을 가나다순으로 정렬 - 단일칼럼
SELECT name, grade, tel
FROM student
ORDER BY name;
2) 학생 테이블에서 학년을 내림차순 정렬
SELECT name, grade, idnum
FROM student
ORDER BY grade DESC;
3) 학생 테이블에서 101번 학과에 소속된 학생을 생년월일이 빠른 순으로 출력하라.
SELECT name, grade, deptno, birthdate
FROM student
WHERE deptno=101
ORDER BY birthdate ASC;
4) 학생 테이블에서 80년대 출생한 학생만 나이가 어린순으로 정렬
SELECT grade, studno, name, idnum
FROM student
WHERE idnum LIKE '8%'
ORDER BY birthdate DESC;
또는
SELECT grade, studno, name, idnum
FROM student
WHERE idnum LIKE '8%'
ORDER BY idnum DESC;
NULL의 정렬
정렬할때 NULL 값은 제일 큰 값으로 여겨져
오름차순에선 맨 마지막, 내림차순에선 맨 처음에 출력된다.
1) 교수 테이블에서 보직수당을 내림차순으로 출력
SELECT name, sal, comm
FROM professor
ORDER BY comm ASC;
다중 칼럼의 정렬
1) 학생 테이블에서 모든 학생에 대해 학과 번호를 오름차순으로 정렬하고, 같은 학과 학생들은
학년이 높은순으로 다시 정렬하여 출력
SELECT studno, name, grade, deptno, userid
FROM student
ORDER BY deptno ASC, grade DESC;
2) 학생 테이블에서 키와 몸무게가 모두 작은순으로 정렬
SELECT name, height, weight
FROM student
ORDER BY height ASC, weight ASC;
칼럼의 위치를 이용한 정렬
1) 학생 테이블에서 SELECT 절의 2번째 칼럼인 userid를 오름차순으로 정렬
SELECT name, userid
FROM student
ORDER BY 2;
'프로그래밍 > SQL' 카테고리의 다른 글
[Oracle] Drop table후 휴지통 비우기 (0) | 2022.10.02 |
---|---|
[Oracle] 집합 연사자 (UNION, UNION ALL, MINUS, INTERSECT) (0) | 2022.10.02 |
[Oracle] SELECT, 합성 연산자(||), DISTINCT, 산술연산, 별명, 정렬, 테이블 구조 (0) | 2022.09.26 |
[Oracle] 데이터 타입 (1) | 2022.09.25 |
[SQL] 인덱스 생성 및 제거 (0) | 2022.08.02 |