Daily coding

Oracle day 2 - DML : Select & Where 본문

DB/Oracle

Oracle day 2 - DML : Select & Where

sunnnkim 2019. 12. 12. 17:12

SELECT2 : WHERE 절

 
WHERE : 자바의 IF문과 같음 ( 조건절)

 

표현식

 1.  비교연산자 ( >, <, >=, <=, =, !=, <> ) 
    - = : 자바와 다르게 1개로 사용 ( 자바 : == )
    - <> : 같지 않다 ( != )
    
2. NULL, = NULL, IS NULL, IS NOT NULL
    

3. ( ) (우선순위연산), NOT, AND ( &&없음 ), OR( || 다른기능 )
  
    

 

구조

    SELECT 
    FROM 
   ( WHERE 조건 ) -- > 생략가능

 

 

 

1. = 연산자

 
SELECT first_name, last_name, salary 

FROM employees 

WHERE first_name = 'Julia';

 


-- 대소문자 구문없으면 다른 결과 나온다

 

SELECT first_name, last_name, salary 

FROM employees 

WHERE first_name = 'julia';  --> 이 코드는 결과가 나오지 않음

 

 

 

2. > 연산자

 

-- 급여가 $9000 이상인 사원 찾기

SELECT first_name, salary
FROM employees
WHERE salary >= 9000;

 

 

* 문자열에도 크기 비교 연산자를 사용할 수 있다 (>, <)


-- 이름이 Shanta 보다 큰 이름 ( 글자의 아스키코드 값이 큰 것 )
SELECT first_name, salary
FROM EMPLOYEES
WHERE first_name >= 'Shanta'; 

-- 모든 철자를 다 비교해서 Shanta보다 스펠이 뒤에 있는 값이 나온다

SELECT first_name, salary
FROM employees
WHERE   first_name >= 'a';
-- 소문자 a는 아무것도 안나옴

   ( 테이블에 들어있는 값들은 모두 대문자로 시작하고 a의 아스키 값은 알파벳 중 가장 큼)

 


SELECT first_name, salary
FROM employees
WHERE manager_id = ' ';  ----> ' ' : 빈 문자열을 찾음, NULL 이 아님

 

 

 

3. IS NULL / IS NOT NULL

 

 

SELECT first_name, salary
FROM employees
WHERE manager_id IS NULL; ---->  : NULL 값을 찾음 

SELECT first_name, salary
FROM employees
WHERE manager_id IS NOT NULL;  ----> NULL이 아닌 값을 찾음

 

 


4. AND / OR

 

* AND


SELECT *
FROM employees
WHERE first_name = 'Shanta'
                AND first_name = 'John';
-- 아무 것도 안나온다 (이름이 2개인 데이터가 없기 때문에)

* OR

SELECT *
FROM employees
WHERE first_name = 'Shanta'
                OR first_name = 'John';
-- 이름이 John 이거나 Shanta 인 사람을 찾아줌

 


-- 이름이 John, 월급이 5000 이상인 사람 찾기
SELECT first_name, salary
FROM employees
WHERE first_name = 'John' 
                AND salary >=5000;

 


-- 2007년 12월 31일 이후에 입사한 사원 찾기


-- 방법1
SELECT first_name, hire_date
FROM employees
WHERE hire_date > '07/12/31';

-- 방법2 : TO_DATE 사용
SELECT first_name, hire_date
FROM employees
WHERE hire_date > TO_DATE('20071231','YYYYMMDD'); 
--> 이 방법은 자바에서 데이터 가져왔을 때 그 형식에 맞추어 데이터 산출가능

 

 

5. ALL / ANY


* ALL(=AND)

-- ALL( A, B) : A AND B

 

SELECT *
FROM employees
WHERE first_name = ALL('Julia', 'John');

 = WHERE first_name ='Julia' AND first_name ='John' ; 

 


* ANY( A, B) : A OR B


SELECT *
FROM employees
WHERE first_name = ANY('Julia', 'John');

 

 

 


< ANY의 사용법 예시 >


-- 연봉이 8000, 3200, 6000인 사람만 뽑기
SELECT first_name, salary
FROM employees
WHERE salary = ANY(8000,3200,6000);
-- 여러 값을 넣어둔 컬럼에 다양한 값을 한번에 가져올 때 사용

 

 


6. IN / NOT IN



-- IN : OR과 쓰임새가 비슷하다 
SELECT first_name, salary
FROM employees
WHERE salary IN (8000, 3200, 6000);

----> salary 의 값이 8000, 3200, 6000 중 하나인 데이터들

 


-- NOT IN
SELECT first_name, salary
FROM employees
WHERE salary NOT IN (8000, 3200, 6000);
----> salary 의 값이 8000, 3200, 6000 이 아닌 데이터들

 

 

7. EXISTS / NOT EXIST 

 


* EXISTS

SELECT first_name, job_id
FROM  employees e -- 테이블에도 alias (별칭)을 붙일 수 있음
WHERE NOT EXISTS  SELECT 1
                                FROM dual
                                WHERE e.job_id = 'IT_PROG' ); 

-- exists 는 1과 0 밖에 없다 (있다/없다)
-- 1이 있을 때만 출력이 되고 0은 출력이 되지 않는다
-- exists 는 Sub Query (쿼리문 안에 쿼리문) 으로 작성해야 함

* NOT EXISTS
SELECT first_name, job_id
FROM  employees e -- 테이블에도 alias (별칭)을 붙일 수 있음
WHERE NOT EXISTSSELECT 1
                                FROM dual
                                WHERE e.job_id = 'IT_PROG' ); 
-- Sub Query문이 false인 경우면 출력한다.

 

 

 

8. BETWEEN / NOT BETWEEN : 범위 연산자

 


-- salary >= 3200 AND salary <= 9000
-- salary BETWEEN 3200 AND 9000
-- 위 두개의 코드는 같은 결과를 출력한다.

* BETWEEN
SELECT first_name, salary
FROM employees
WHERE salary BETWEEN 3200 AND 9000;

SELECT first_name, salary
FROM employees
WHERE salary > 3200 AND salary < 9000;

 


* NOT BETWEEN
SELECT first_name, salary
FROM employees
WHERE salary NOT BETWEEN 3200 AND 9000;


-- 아래의 결과와 같다


SELECT first_name, salary
FROM employees
WHERE salary < 3200 OR salary > 9000;



 

9. LIKE / NOT LIKE

 


SELECT first_name, last_name
FROM employees
WHERE first_name LIKE 'G_ra_d'; --> _ 는 한 개의 문자를 의미한다


SELECT first_name, last_name
FROM employees
WHERE first_name LIKE 'K%y'; --> %는 글자의 제한이 없다. 중간에 들어가는 모든 글자 + 

 


SELECT first_name, last_name
FROM employees
WHERE first_name LIKE '%Al%'; 

  --> %가 앞에 붙어도 맨 앞글자가 Al인 데이터와 중간에 Al이 붙은 글자를 같이 불러온다

 


SELECT first_name, last_name
FROM employees
WHERE first_name LIKE '%e%'; --> 데이터에 e(소문자) 가 들어간 모든 데이터를 불러온다

-- 위의 코드는 문자열 검색에 유용하다.

 

 


 -- %, _ 는 날짜에도 적용이 된다.

 SELECT first_name,hire_date
 FROM employees
 WHERE hire_date LIKE '0_/12%'; ---> 00~09년도 사이의 12월 입사자를 모두 찾아준다.