쌓고 쌓다

[Oracle] WHERE, 비교 연산자, 논리연산자, SQL 연산자, NULL, 정렬 본문

프로그래밍/SQL

[Oracle] WHERE, 비교 연산자, 논리연산자, SQL 연산자, NULL, 정렬

승민아 2022. 10. 2. 01:35

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;
Comments