---------------------------------
SELECT 컬럼리스트,...
FROM 테이블,...
WHERE 조건식
GROUP BY 기준컬럼, ...
HAVING 조건식
ORDER BY 기준컬럼,...
------------------------------------
WHERE 조건식
SELECT 컬럼리스트
FROM 테이블
WHERE 조건식;
조건식은 참,거짓 결과를 얻을 수 있는 수식. 관계연산자, 논리연산자 사용.
관계연산자 =, <, >, <=, >=, !=, <>
-- Java에서는 ==, Oracle에서는 =
논리연산자 AND, OR, NOT
-- Java에서는 &&, ||, !
-- Oracle에서 ||는 문자열 결합 연산자
부서번호 90인 직원들의 정보 출력
SELECT first_name, last_name, email, department_id
FROM employees
WHERE department_id=90;
문제) 직위번호(job_id)가 'IT_PROG'인 직원들의 정보 출력
--> 5명
SELECT first_name, last_name, email, job_id
FROM employees
WHERE ........;
문제) employees 테이블에서 급여(salary)가 5000~10000 범위인 경우 출력. 논리연산자 AND 필요.
--> 43명
SELECT *
FROM employees
WHERE salary>=5000 AND salary<=10000; --43
문제) employees 테이블에서 manager_id가 147이고, department_id가 80인 경우 출력. 논리연산자 AND 필요.
-->6
문제) jobs 테이블에서 job_title이 'President'이거나, 'Sales Manager'인 경우 출력. 논리연산자 OR 필요.
-->2
숫자 데이터 비교시 비교연산자 사용.
문자 데이터 비교시 대소문자 주의.
날짜 데이터 비교시 형식 주의.
날짜를 서식에 맞춰서 문자열로 변환 -> TO_CHAR(날짜데이터, 형식)
TO_CHAR(날짜, '서식') -> 서식에 맞는 문자열 반환
--날짜 데이터를 원본 그대로 출력
SELECT hire_date
FROM employees; --03/06/17 , 년/월/일
SELECT TO_CHAR(hire_date, 'YYYY-MM-DD') AS hire_date
FROM employees; --2003-06-17 , 년도-월-일
SELECT TO_CHAR(hire_date, 'YYYY') AS hire_date
FROM employees; --2003 , 년도
SELECT TO_CHAR(hire_date, 'MM') AS hire_date
FROM employees; --06 , 월
SELECT TO_CHAR(hire_date, 'DD') AS hire_date
FROM employees; --17 , 일
employees 테이블에서 입사년도(hire_date)가 2003년도인 경우만 출력.
SELECT *
FROM employees
WHERE TO_CHAR(hire_date, 'YYYY')='2003'; --문자열=문자열
SELECT *
FROM employees
WHERE TO_CHAR(hire_date, 'YYYY')=2003; -- 문자열=숫자
문제) employees 테이블에서 입사월(hire_date)이 1월 또는 2월인 경우 출력.논리연산자 OR 필요.
TO_CHAR(hire_date, 'MM') AS tomonth
--> 27명
WHERE 월 = '01' OR 월 = '02';
WHERE 월 = 1 OR 월 = 2;
------------------------------------
[4] SQL 연산자
IN(값, 값, ...) : 피연산자가 식 목록 중 하나와 동일한 경우 TRUE
BETWEEN ~ AND: 피연산자가 범위 안에 있는 경우 TRUE
LIKE : 피연산자가 패턴( _ , % )과 일치하는 경우 TRUE
jobs 테이블에서 job_title이 'President'이거나, 'Sales Manager'인 경우 출력. 논리연산자 OR 필요.
SELECT * FROM jobs
WHERE job_title='President' OR job_title='Sales Manager';
--> IN 연산자로 변경
SELECT * FROM jobs
WHERE job_title IN ('President','Sales Manager');
SELECT *
FROM jobs
WHERE job_id IN ('AD_PRES', 'SA_MAN');
문제) employees 테이블에서 입사월(hire_date)이 1월 또는 2월인 경우 출력. IN 연산자 사용할 것.
--27명
SELECT *
FROM employees
WHERE TO_CHAR(hire_date, 'MM')='01' OR
TO_CHAR(hire_date, 'MM')='02';
-->IN 연산자로 변경
SELECT *
FROM employees
WHERE TO_CHAR(hire_date, 'MM') IN ('01', '02');
SELECT *
FROM employees
WHERE TO_CHAR(hire_date, 'MM') IN (1, 2);
employees 테이블에서 급여(salary)가 5000~10000 범위인 경우 출력. 논리연산자 AND 필요.
SELECT * FROM employees
WHERE salary>=5000 AND salary<=10000;
--> BETWEEN~AND 연산자로 변경
SELECT * FROM employees
WHERE salary BETWEEN 5000 AND 10000;
문제) employees 테이블에서 입사년도(hire_date)가 2000~2005년도인 경우 출력.
-->53명
BETWEEN~AND 연산자 사용할 것.
TO_CHAR(hire_date, 'YYYY') AS toYEAR
--> BETWEEN ~ AND 연산자로 변경
-----------------------------------
LIKE 연산자 사용은 패턴문자와 같이 사용하는 경우만 가능합니다.
employees 테이블에서 first_name이 특정 문자(S)로 시작하는 경우를 출력.
--SUBSTR() 함수 이용하는 경우
SELECT * FROM employees
WHERE SUBSTR(first_name, 1, 1)='S'; --대소문자 주의
SELECT * FROM employees
WHERE SUBSTR(first_name, 1, 2)='St';
--LIKE 연산자 이용하는 경우
SELECT * FROM employees
WHERE first_name LIKE 'S%'; --'S'로 시작하는 경우에 해당
SELECT * FROM employees
WHERE first_name LIKE 'St%'; --'St'로 시작하는 경우에 해당
문제) employees 테이블에서 전화번호(phone_number)가 '4567'로 끝나는 경우 출력. LIKE 연산자 이용할 것.
--3명
SELECT *
FROM employees
WHERE phone_number LIKE '%4567';
문제) employees 테이블에서 job_id가 'CLERK'로 끝나는 경우 출력. LIKE 연산자 이용할 것.
employees 테이블에서 전화번호(phone_number)에서 중간 국번이 '123'인 경우 출력. 예를 들어, XXX.123.XXXX 인 경우.
SELECT * FROM employees
WHERE phone_number LIKE '%123%'; --123이 포함된 경우
--> 원치 않는 데이터 포함됨.
SELECT * FROM employees
WHERE phone_number LIKE '%.123.%'; --.123.이 포함된 경우
--> 이 경우도 원치 않는 데이터가 포함될 수 있음.
SELECT * FROM employees
WHERE phone_number LIKE '___.123.____';
--> _ 패턴문자를 글자수에 맞게 표기할 것.
--> 자릿수 지정까지 포함했기 때문에 좀 더 정확한 데이터 검색 가능
------------------------------------------------
[6] NULL 비교 연산
NULL 은 아무 데이터도 없는 상태로 오라클에서는 ''과 같다.
IS NULL : NULL 이면 참
IS NOT NULL : NULL 이 아니면 참
자바에서는
if (항목 == null) {
//처리문;
}
SELECT * FROM employees
WHERE commission_pct = NULL; -- 검색 불가
employees 테이블에서 commission_pct의 값에 NULL 값이 있는 경우만 출력
SELECT * FROM employees
WHERE commission_pct IS NULL;
employees 테이블에서 commission_pct의 값에 NULL 값이 아닌 경우만 출력
SELECT * FROM employees
WHERE commission_pct IS NOT NULL;
문제) employees 테이블에서 manager_id가 할당되지 않은 경우(null 데이터) 출력.
-->1명
-----------------------------------------------
ORDER BY 구문
[6] ORDER BY
자료를 크기 순서대로 정렬하여 출력하며 오름차순으로 출력은 『ORDER BY 필드명 ASC』, 내림차순은『ORDER BY 필드명 DESC』형식으로 사용되며, 오름차순을 의미하는 ASC 는 생략 가능하다.또한 필드명 대신 위치 숫자를 사용할 수 있다.
--정렬 전
SELECT * FROM employees;
--정렬 후
--employees 테이블에서 first_name을 알파벳순으로 정렬해서 출력
SELECT * FROM employees
ORDER BY first_name ASC;
employees 테이블에서 부서(department_id)를 기준으로 정렬(1차 정렬)해서 출력하되, 같은 부서 내에서는 급여(salary)를 정렬(2차 정렬)해서 출력.
SELECT * FROM employees
ORDER BY department_id ASC, salary DESC;
문제) employees 테이블에서 입사일(hire_date)가 빠른 순으로 출력.
SELECT * FROM employees
ORDER BY hire_date ASC;
문제) employees 테이블에서 부서(department_id)를 기준으로 정렬해서 출력하되
, 같은 부서 내에서는 입사일(hire_date)이 빠른 순으로 정렬해서 출력.
문제) employees 테이블에서 입사년도 순으로 출력하되, 같은 년도면 급여가 많은 순으로 출력.
문제) employees 테이블에서 입사월이 7월인 경우 출력하되, 입사일이 빠른 순으로 출력.
입사월 -> TO_CHAR(hire_date, 'MM')
SELECT *
FROM employees
WHERE ~
ORDER BY ~
문제) employees 테이블에서 급여(salary)가 5000~10000 범위인 경우 출력하되, 급여가 많은 순으로 출력.
SELECT *
FROM employees
WHERE ~
ORDER BY ~
-------------------------------------------------------
'Oracle' 카테고리의 다른 글
5일차_Sub Query, RANK() OVER(), AVG() OVER() (0) | 2015.06.21 |
---|---|
4일차_HAVING, INSA 테이블 생성 및 관련 문제 (0) | 2015.06.21 |
3일차_내장함수, GROUP BY (0) | 2015.06.21 |
1일차_오라클 설치, SELECT (0) | 2015.06.21 |
Oracle 계정등록 / 암호화 (0) | 2015.05.12 |