230613 DB (SELECT, oracle developer 사용, 포트번호확인)
엔터티 타입 = 테이블 (TABLE)
엔터티 = 행 (ROW)
어트리뷰드(속석) = 열(COLUMN)
첨부파일 HR스키마.pdf 참고!
EMPLOYEES에서 JOB_HISTORY, DEPARTMENTS, JOBS가 파생
앞에 이름 0으로 시작하려면 문자형으로 해야한다!
정확한 이름은char로 사용!
이름 or 이메일 같은 경우 사람마다 길이가 다르니 VARCHAR2 가변길이용으로 사용!
commission_PCT (2,2) (PCT는 퍼센테이지 줄인말), (2, 2) ---> 0.XX을 나타냄 (ex 0.99)
(자릿수, 소숫점몇번째자리수까지)
NOT NULL = 제약 조건 --> null이면 안된다. 값이 없으면 안된다. 값이 반드시 있어야 한다!
first_name(이름) 에는 not null 조건 있음
last_name(성) 에는 조건 없음
(FK) = 참조한다 ㅡㅡ>(FK)있는곳에서 없는곳의 COLUME을 참조한다
부모 엔터티 = 먼저 자료가 저장되어야 있어야 할곳 (참조되어야 할곳)
자식 엔터티 = 참조 하는곳
★★관계선★★
비식별자 관계 (점선) : 부모엔터티의 PK(주식별자)를 자식 엔터티의 일반컬럼으로 참조
주식별자(PK) : 각 TABLE에 있는 굵은 글씨들이 주식별자(PK)이다.
Primary Key = 엔티티(행)을 구분하는 주식별자
주식별자 관계 (실선) :
Primary Key 컬럼 = 엔티티(행)을 구분하는 주식별자용 컬럼
Foreign Key 컬럼 = 자식엔터티에서 부모엔터티(PK)를 참조하는 컬럼
ex) Employees JOBS
employee_id first_name job_id
테이블관계종류
-비식별자관계 : 부모엔터티(PK)를 자식엔터티의 일반컬럼으로 참조하는 관계 - 점선표기
-주식별자관계 : 부모엔터티(PK)를 자식엔터티의 PK컬럼으로 참조하는 관계 - 실선표기
참여자수(관계차수) = cardinality 카디널리티
cardinality 카디널리티 : 관계 데이터베이스에서 하나의 릴레이션을 구성하는 튜플의 개수 (행수), 또는 하나의 데이터 타입으로 정의되는 데이터 레코드의 개수. ⇒규범 표기는 미확정이다.
1:1 관계
한 고객은 하나의 포인트를 갖는다. 한 포인트는 한 고객정보만 참조한다. = 1대1의 관계
1:M관계
한 사원의 경력은 여러 정보를 참조한다. (경력쪽에 다리 3개 그림이 그려짐)
M:N관
다대 다 관계
필수선택참여여부 : NULL
동그라미 있으면 선택참여!
동그라미 없으면 필수참여! (그림 맨 위에 표시), 그리고 작대기 1개면 한명을 뜻함
ex) 양쪽이 작대기 표시이면 = 한 사원은 반드시 하나의 직무를 담당한다.
ORACLE SLQ DEVELOPER
안될때 PORT NUMBER확인
SQL (Structured Query Language) 종류
- SELECT (쿼리) : 조회
- DML (데이터 조작어) : 추가 - INSERT, 수정 - UPDATE, 삭제 - DELETE
- DDL (데이터 정의어) : 객체생성 - CREAT, 객체구조변경 - ALTER, 객체제거 - DROP(테이블자체를 제거함)
- DTL (데이터트랜잭션) : 트랜잭션 완료 - COMMIT/복구 - ROLLBACK
- DCL (데이터제어) : 계정생성 - CREAT USER, 변경 - ALTER USER, 제거 - DROP USER /
권한부여 - GRANT, 권한취소 - REBOKE
SELECT
SELECT 컬럼명1, 컬럼명2 ...
FROM 테이블 :
(생략가능한)
[WHERE
GROUP BY
HAVING
ORDER BY
(필수)
ex) SELECT * FROM employees;
SELECT employee_id, first_name FROM employees;
처리순서
SELECTION : 조건에 맞는 행검색
PROJECTION : 조건에 맞는 행의 컬럼을 선택출
<ㅡㅡㅡㅡㅡㅡㅡSELECTION(절차)ㅡㅡㅡㅡㅡㅡㅡ> <ㅡㅡPROJECTIONㅡㅡ>
FROM ㅡ> WHERE ㅡ> GROUP BY ㅡ> HAVING ㅡ> SELECT ㅡ> ORDER BY
SELECT절에 사용 가능한 연산자
자료형 : 숫자 NUMBER, 문자 CHAR/VARCHAR2, 날짜 DATE
문자형리터럴은 ' '표기한다 ex) 'HELLO'
산술연산자 : +,-,*,/
결합연산자 ||
SELECT employee_id,
salary, salary+100, salary+salary*commission_pct,
first_name, last_name, first_name || last_name
FROM employees;
헤딩 : 컬럼들 (ex employees, salary, first_name, last_name 이 적힌곳)
--HEADING 변경방법 : 별칭주기 ---> 사번, 실급여,성명 이라고 적힌것
SELECT employee_id 사번,
salary sal,
salary+100, salary+salary*commission_pct 실급여,
first_name, last_name, first_name || last_name 성명
FROM employees;
""사용하면 안에들어가 있는 구문은 소문자로 출력, 공백허용
SELECT employee_id 사번,
salary "sal", ㅡㅡㅡㅡㅡㅡㅡㅡ>" " 큰따옴표 없을때는 대문자로 출력됨!!!!
salary+100 salary더하기100, salary+salary*commission_pct 실급여,
first_name, last_name,
first_name || '~' || last_name 성명
FROM employees;
잘못된 예시
WHERE절 : 조건식
ex) SELECT * FROM employees WHERE salary >= 15000;
WHERE절에서 사용가능한 연산자
산술연산자 : WHERE salary + salary*commission_pct 100 >= 15000; (덧셈,뺄셈,곱셈,나눗셈)
비교연산자 : > , < , <= , >= , = (같다 java는 == 사용), <> (같지않다 java는 != 사용)
※주의점 : NULL값 비교불가※
논리연산자 : AND, OR NOT ex)WHERE salary >= 15000 AND hire_date < '20/01/01'
AND, OR 가 같이 있으면 AND연산자가 먼저 처리됨!
NULL 연산자 : IS NULL, IS NOT NULL
BETWEEN연산자 : 같은컬럼명>= AND 같은컬럼명<= 대신 사용가능!
ex) WHERE salary >= 10000 AND salary <=20000;
BETWEEN으로 변경시 ㅡㅡ> WHERE salary BETWEEN 10000 AND 20000; 으로 사용가능
IN연산자 : 같은컬럼명 = OR 같은컬럼명 = or연산자 대신한다.
ex) WHERE department_id = 50 OR department_id = 90;
IN으로 변경시 ㅡㅡ> WHERE department_id IN (50,90); 으로 사용가능
WHERE NOT (department_id = 50 OR department_id = 90);
ㅡㅡ> WHERE department NOT IN (50,90); 으로 사용가능
--ORDER BY 절 : 정렬
ASC - 오름차순
DESC - 내림차순
ㅡㅡ사원의 사번, 급여를 출력하시오.
SELECT employee_id, salary
FROM employees;
ㅡㅡ부서번호(department_id컬럼)가 90번인 부서의 사원들의 사번, 급여를 출력하시오.
SELECT employee_id, salary, department_id
FROM employees
WHERE department_id = 90;
ㅡㅡ90번 부서를 제외한 사원들 사번, 급여를 출력하시오
SELECT employee_id, salary, department_id
FROM employees
WHERE department_id <> 90; (NULL인것이 있으면 비교연산자를 쓰면 90번인 사람들과 같이 빠진다!)
ㅡㅡ부서배치를 받은 사원들 사번, 급여, 부서번호를 출력하시오
SELECT employee_id, salary, department_id
FROM employees
WHERE department_id = NULL; 이렇게하면 안뜬다!!!
SELECT employee_id, salary, department_id
FROM employees
WHERE department_id IS NOT NULL; 이렇게해야한다!
ㅡㅡ부서배치못받은 사원 사번, 급여, 부서번호를 출력하시오
SELECT employee_id, salary, department_id
FROM employees
WHERE department_id IS NULL; 오류없이 출력된다!
ㅡㅡ90번 부서를 제외한 사원들과 부서배치 못받은 사원의 사번, 급여 부서번호를 출력하시오.
SELECT employee_id, salary, department_id
FROM employees
WHERE department_id <> 90 OR department_id IS NULL;
ㅡㅡ90번 부서이고 급여가 20000이상인 사원들의 사번, 급여 부서번호를 출력하시오.
SELECT employee_id, salary, department_id
FROM employees
WHERE department_id = 90 AND salary >= 20000;
ㅡㅡ급여가 10000이상 20000이하인 사원들의 사번, 급여, 부서번호를 출력하시오.
SELECT employee_id, salary, department_id
FROM employees
WHERE salary>=10000 AND salary <= 20000; 기준인 얘가 앞으로 가는게좋다 (여기서는 salary가 기준)
안좋은예시
ㅡㅡ부서번호가 10, 50, 90인 사원들의 사번, 급여, 부서번호를 출력하시오.
SELECT employee_id, salary, department_id
FROM employees
WHERE department_id = 10 OR department_id =50 OR department_id = 90;
★IN으로 변경시★
SELECT employee_id, salary, department_id
FROM employees
WHERE department_id IN (10, 50, 90);
ㅡㅡ부서번호가 10, 50, 90인 사원들을 제외하여 사번, 급여, 부서번호를 출력하시오.
SELECT employee_id, salary, department_id
FROM employees
WHERE department_id <> 10 AND department_id <> 50 AND department_id <> 90;
SELECT employee_id, salary, department_id
FROM employees
WHERE NOT(department_id <> 10 OR department_id <> 50 OR department_id <> 90);
★IN으로 변경시★
SELECT employee_id, salary, department_id
FROM employees
WHERE department_id NOT IN (10, 50, 90);
ㅡㅡ급여가 10000이상 20000이하이면서 부서번호가 10, 50, 90인 사원들의 사번, 급여, 부서번호를 출력하시오
SELECT employee_id, salary, department_id
FROM employees
WHERE (salary >= 10000 AND salary <= 20000) AND
(department_id = 10 OR department_id =50 OR department_id = 90);
★BETWEEN, IN연산자로 변경시★
SELECT employee_id, salary, department_id
FROM employees
WHERE (salary BETWEEN 10000 AND 20000) AND department_id IN (10, 50, 90);
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
--ORDER BY 절 : 정렬
모든사원의 사번, 급여, 부서번호를 적은급여를 받는 사원부터 출력해라 (오른차순)
SELECT employee_id, salary, department_id
FROM employees
ORDER BY salary;
SELECT employee_id, salary, department_id
FROM employees
ORDER BY salary ASC;
모든사원의 사번, 급여, 부서번호를 많은급여를 받는 사원부터 출력해라 (내림차순)
SELECT employee_id, salary, department_id
FROM employees
ORDER BY salary DESC;
ㅡㅡ모든사원의 사번, 급여, 부서번호를 많은급여를 받는 사원부터 출력한다, 급여가 같은경우 작은사번부터 출력하시오.
SELECT employee_id, salary, department_id
FROM employees
ORDER BY salary DESC, employee_id, salary ASC;
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
SELECT employee_id, salary 급여
FROM employees
WHERE 급여 >= 15000 SELECT에서 사용한 별칭은 사용 못한다.
SELECT employee_id, salary 급여
FROM employees
ORDER BY 급여; ORDER BY 절에서만 !! SELECT에서 사용한 별칭사용 가능하다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
SELECT employee_id, salary
FROM employees
ORDER BY hire_date; (o) SELECT안하는 컬럼도 오름,내림차순 가능!