수업/DB

230613 DB (SELECT, oracle developer 사용, 포트번호확인)

보더96 2023. 6. 13. 17:13

HR스키마.pdf
0.22MB

엔터티 타입 = 테이블 (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(성) 에는 조건 없음

 

SELECT * FROM REGIONS;
DESC EMPLOYEES;

 

(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컬럼으로 참조하는 관계 - 실선표기

 

JOB_HISTORY = 복합기 (KEY가 2개)

 

 

참여자수(관계차수)  =  cardinality 카디널리티

cardinality 카디널리티 : 관계 데이터베이스에서 하나의 릴레이션 구성하는 튜플 개수 (행수)또는 하나의 데이터 타입으로 정의되는 데이터 레코드의 개수. ⇒규범 표기는 미확정이다.

 

1:1 관계

실선표시

한 고객은 하나의 포인트를 갖는다. 한 포인트는 한 고객정보만 참조한다.    =    1대1의 관계

 

1:M관계

한 사원의 경력은 여러 정보를 참조한다. (경력쪽에 다리 3개 그림이 그려짐)

M:N관

다대 다 관계

 

 

 

필수선택참여여부 : NULL

동그라미 있으면 선택참여!

동그라미 없으면 필수참여! (그림 맨 위에 표시), 그리고 작대기 1개면 한명을 뜻함

ex) 양쪽이 작대기 표시이면  =  한 사원은 반드시 하나의 직무를 담당한다.

선택참여이니 직무를 참여하는 사람은 0명이거나 여러명일수도 있다. (빨간선)
한 사원은 여러경력을 가질수있다.  (빨간선)
한 대륙에는 여러 국가 정보를 가질수 있다.    한 국가에는 대륙정보를 참조할수도 있다.
한 국가에는 여러 도시를 가질수 있다.   한 도시는 여러 국가정보를 참조할수도 있다.
(FK)가 있는곳이 없는 곳을 참조한다.    한 사원의 직무(JOBS)는 반드시 하나이다.
(FK)가 있는곳이 없는 곳을 참조한다.    경력은 반드시 한 사원을 참조하여야 한다.

 

 

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 employee_id, first_name, salary FROM employees WHERE salary >= 10000; 적용했을때

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;

 

 

잘못된 예시

salary 더하기 100&nbsp; &nbsp; 별칭을 띄어주면 오류발생&nbsp; "&nbsp; &nbsp;"큰따움표로 막아주기 ㅡ> 맞는것 "salary 더하기 100"

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에서 사용한 별칭사용 가능하다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

ORDER BY구문에서 INDEX, 별칭, SELECT안한 컬럼사용 가능!!!&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SELECT에서는 불가능!!

SELECT employee_id, salary

FROM employees

ORDER BY hire_date;   (o)                   SELECT안하는 컬럼도 오름,내림차순 가능!