데이터 타입 글자별 크기
한글 2byte 정도
영어, 공백, 특문, 숫자 1byte
컬럼타입
구분 | 컬럼 타입 | 설명 |
숫자 | NUMBER | |
NUMBER(n) | ||
NUMBER(n, m) | n: 실수의 전체 자릿수 m: 소수점 자리수 ex. NUMBER(8, 2) : 정수 6자리와 소수2자리 |
|
문자 | VARCHAR2(n) | 가변길이 문자 데이터 컬럼타입 저장되는 데이터 크기에 맞춰 알맞은 공간 사용 최대크기 4000Byte (한글 2000자 정도, 영어 4000자) |
CHAR(n) | 고정길이 문자 데이터 컬럼타입 성능면에선 가변보다 좋지만 해당 컬럼의 성격에 따라 공간이 낭비됨 |
|
VARCHAR2(n CHAR) | byte가 아닌 글자수로 제한 가능 ex. VARCHAR2(10 CHAR) |
|
날짜 | DATE | 날짜 및 시간 데이터 컬럼타입 자바로 날짜 데이터 처리 후 DB로 집어넣을 때 java.sql.Date로 변환해서 넣어야 함. ( .toLocalDate(로컬데이트) 메서드로 자바 날짜 데이터를 오라클 Date형식에 맞게 바꿀 수 있다. ) |
java.util.Date 을 java.sql.Date 로 변환하는 법
java.sql.Date 에서 LocalDate로 : .toLocalDate() 메서드 이용
java.sql.Date 클래스 문서 참고
https://docs.oracle.com/javase/8/docs/api/java/sql/Date.html#valueOf-java.time.LocalDate-
LocalDate localDate = sqlDate.toLocalDate();
+) 걍 로컬데이트, 로컬타임, 로컬타임데이트 상기용
LocalDate today = LocalDate.now();
System.out.println(today); >> 2022-08-22
LocalTime time = LocalTime.now();
System.out.println(time); >> 10:41:22.105
LocalDateTime dateTime = LocalDateTime.now();
System.out.println(dateTime); >> 2022-08-22T10:43:55.603
LocalDate에서 java.sql.Date로 : java.sql.Date.valueOf()메서드 이용
java.sql.Date sqlDate = java.sql.Date.valueOf( todayLocalDate );
DESC
DESC 테이블명
해당 테이블의 컬럼정보를 자세히 볼 수 있음 (타입, 글자수 ...)
오라클 명령어라 끝에 세미콜론 안 붙여도 됨.
(SQL문은 끝에 세미콜론 빠지면 안 됨)
SELECT
SELECT 컬럼명1 [, 컬럼명2, 컬럼명3, .... ] FROM 테이블명;
컬럼명에 * 넣으면 모든 컬럼 조회
WHERE절
비교연산자 이용해서 조건 지정
= : 같음
!=, <>, ^= : 같지 않음
<, >, <=, >= : 비교
컬럼명 BETWEEN A AND B 로도 비교 가능
AND와 OR로 WHERE절에 조건 추가 가능
SELECT * FROM employees WHERE salary >= 2000 AND salary <= 3000;
--근데 이건 컬럼명 BETWEEN A AND B 로 더 간단히 풀 수 있지
SELECT * FROM employees WHERE salary BETWEEN 2000 AND 3000;
SELECT * FROM employees WHERE department_id = 30 OR department_id = 60;
문자타입으로도 크기 비교가 가능함
SELECT first_name FROM employees WHERE first_name > 'P'
날짜, 시간 타입도 쉽게 비교할 수 있다.
SELECT * FROM employees WHERE hire_date > '2008/01/01';
--2008년에 들어온 사람 조회 (08만 적으면 1908인지 2008인지 모를 수도 있으니까 2008다 적든가)
LIKE와 와일드카드 ( %, _ ) 로 조회
데이터의 일부분으로 원하는 내용 검색 가능
문자, 날짜, 시간 타입에 사용 가능
% : 길이 제한 없이 아무 문자나 와도 상관 없는 자리 (0개도 됨)
_ : 하나의 문자가 반드시 와야 하는 자리
Select * from employees where hire_date LIKE '%/08/%'; --08월의 모든 사람이 걸림
Select * from employees where hire_date LIKE '__/08/__'; -- __두개 해줘야됨 _하나 쓰면 안 나옴
Select * from employees where hire_date LIKE '08/%'; -- 08년의 모든 사람이 걸림
Select * from employees where hire_date LIKE '%/08'; -- 08일의 모든 사람이 걸림
||' '|| : 양 옆으 ㅣ두 문자열을 이어 붙이겠단 뜻
select first_name||' '||last_name as "full Name" from employees where first_name LIKE '%a__';
lower(), upper()
전달한 문자 값을 소문자, 대문자로 변환
select * from employees where lower(first_name) LIKE '%e%e%';
select * from employees where upper(first_name) LIKE '%E%E%';
nulll 은 크기비교가 불가능하다.
고로 어떤 비교 연산자도 사용할 수 없음!
= 도 안 되는 거! 그러면 null인 행은 어떻게 찾아?
null인 행을 조회하고 싶을 때는 IS NULL을 사용.
반대로 null이 아닌 행은 IS NOT NULL
SELECT * FROM employees WHERE commission_pct = null; -- 비문
SELECT * FROM employees WHERE commission_pct IS NULL; -- 이렇게 해야 됨!
SELECT * FROM employees WHERE commission_pct IS NOT NULL;
mod()
오라클에서는 % 말고 mod 함수 를 사용한다.
SELECT * FROM employees WHERE mod(employee_id, 2) = 0;
--사번이 짝수인 행 조회
집합
INTERSECT 교집합
교집합 SELECT문이 너무 길고 복잡해서 AND로 합치기 어려울 때 INTERSECT를 이용
SELECT first_name, salary FROM employees WHERE first_name LIKE 'J%n'
INTERSECT
SELECT first_name, salary FROM employee WHERE salary BETWEEN 3000 AND 5000;
UNION 합집합
SELECT employee_id, first_name, salary FROM employees WHERE first_name LIKE 'J%n'
UNION
SELECT employee_id, first_name, salary FROM employees WHERE salary BETWEEN 3000 AND 3500;
UNION ALL 합집합 (중복제거 x)
SELECT employee_id, first_id, salary FROM employees WHERE first_name LIKE 'J%n'
UNION ALl
SELECT employee_id, firsT_name, salary FROM employees WHERE salary BETWEEN 3000 AND 3500;
MINUS 차집합
SELECT department_id FROM employees WHERE department_id IN(10, 20, 30, 40)
MINUS
SELECT department_id FROM employees WHERE department_id = 30;
DECODE()
switch-case와 유사한 문법
SELECT
first_name,
job_id,
DECODE(
10, 'Administration',
20, 'Marcketing',
30, 'Purchasing',
40, 'Human Resources',
'Not yet implementd' -- 마지막은 default
) "DEPARTMENT_NAME" -- "큰 따옴표"로 감싸주면 AS 생략 가능
FROM
employees;
DECODE는 LIKE와 함께 쓸 수 없다. 그래서 일일이 알아서 추가해줘야 함
SELECT
first_name
|| ' '
|| last_name "NAME",
job_id,
salary AS before_salary,
decode(job_id,
'IT_PROG', salary * 1.1,
'FI_ACCOUNT', salary * 1.05,
'PU_CLERK', salary * 1.03,
'SH_CLERK', salary * 1.03,
'ST_CLERK', salary * 1.03,
salary
) AS after_salary
FROM
employees;
DECODE 안에 LIKE를 쓸 수 없는 단점은 UNION 으로 극복할 수 있음
예시.
%CLERK들만 3% 인상해주고 싶을 때,
JOB_ID LIKE '%CLERK'의 salary를 연송해주는 SELECT문을 UNION해주면 됨
SELECT
first_name|| ' '|| last_name "NAME",
job_id,
salary AS before_salary,
decode(job_id,
'IT_PROG', salary * 1.1,
'FI_ACCOUNT', salary * 1.05,
salary
) AS after_salary
FROM
employees
WHERE
JOB_ID NOT LIKE '%CLERK'
UNION
SELECT
first_name
|| ' '
|| last_name "NAME",
job_id,
salary AS before_salary,
salary * 1.03 AS after_salary
FROM
employees
WHERE
JOB_ID LIKE '%CLERK';
CASE
CASE WHEN 컬럼명 = 값 THEN 표시할 값 ELSE 디폴트값
DECODE는 해당 컬럼의 값과 정확히 일치하는 값만 사용할 수 있지만 CASE는 조건을 사용할 수 있다.
SElECT first_name ||''||last_name AS "FULL NAME",
job_id,
salary AS before_salary,
CASE
WHEN job_id = 'iT_PROG' THEN salary * 1.1
WHEN job_id = 'FI_ACCOUNT' THEN salary * 105,
WHEN job_id LIKE '%CLERK%' THEN salary * 1.03
ELSE salary
END As after_salary
FROM
employees;
'Database' 카테고리의 다른 글
SQLDeveloper에서 DDL Export 후 ERDCloud로 DDL Import 하는 법 (0) | 2022.10.01 |
---|---|
오라클 같은 컬럼에 조건 걸어서 update(ㅇㅇ여부가 1이면 '가능', ㅇㅇ여부가 0이면 '불가능') (펌) (0) | 2022.09.02 |
외부 DB접속하기 (펌) (0) | 2022.08.19 |
OjdbcConnectiton 클래스 만들기 (0) | 2022.07.26 |
자바에서 데이터베이스 커밋하는 법 (0) | 2022.07.04 |