관리 메뉴

Today is Present.

Head First SQL 본문

DBMS - 오라클(Oracle)

Head First SQL

MorningPhys 2022. 4. 7. 06:25

제1 정규형 즉, 1NF - 유일무이한 행!!

규칙 1: 열은 원자적 값만을 포함한다.

규칙 2: 같은 데이터가 여러 열에 반복되지 말아야 한다. 

 

두 개 이상의 열로 이루어진 키를 합성키라고 합니다. 

합성키는 여러 개의 열들로 구성되어 유일무이한 키를 만드는 기본키입니다.

 

열의 데이터가 변경될 때 다른 열의 데이터가 변경되어야 하면, 

변경되어야 하는 열은 변경되는 열에 함수적으로 종속하고 있습니다. 

함수 종속 관계를 명시하는 간단한 방법은 T.x → ; T.y 라고 표현합니다.

"T라는 테이블에서 열 y는 열 x에 함수적으로 종속된다" 기본적으로 오른쪽이 왼쪽에 종속된다고 읽습니다. 

 

부분적 함수 종속은 키가 아닌 열이 합성키의 전부가 아닌 일부에 종속되는 경우를 의미합니다. (name, power) - (Initial)

키가 아닌 열이 다른 열의 변경을 초래하면 이행적 종속 관계(transitive dependency) 에 있다고 합니다.

 

제2 정규형 즉, 2NF

규칙 1: 1NF여야 한다

규칙 2: 부분적 함수 의존이 없다.

 

제3 정규형 즉, 3NF

규칙 1: 2NF여야 한다

규칙 2: 이행적 종속이 없습니다. 

 

[정리]

제1정규형(1NF) 열이 원자적 값만을 포함하고 열에 데이터가 반복되지 않는 형태

이행적 함수 종속 키가 아닌 열이 키가 아닌 다른 열과 관련이 있다는 의미

제2정규형(2NF) 테이블이 1NF여야 하고, 부분적 함수 종속이 없으면 2NF 테이블입니다. 

제3정규형(3NF) 테이블이 2NF여야 하고, 이행적 종속 관계가 없어야 합니다. 

스키마: 관련 객체와 객체들 사이의 연결, 그리고 데이터베이스의 데이터에 대해 설명해 놓은 것

참조키: 테이블에서 다른 테이블의 기본키를 참보하는 열

합성키: 여러 열로 구성된 기본키로 유일무이한 값

 

interests = {first, second, third, fourth}
SUBSTRING_INDEX (interests, ',', 1); // first

interests1 = first;
UPDATE my_contacts
SET interests = SUBSTR(interests, LENGTH(interest1)+2); // second

카티젼 조인
SELECT t.toy, b.boy 
FROM toys AS t 
CROSS JOIN boys AS b;

= SELECT toys.toy, boys.boy FROM toys, boys;

크로스 조인은 한 테이블의 모든 행과 다른 테이블의 모든 행을 짝지워 반환합니다. 
toyes.toy 열에 5행이 존재하고 boys.boy열에 4행이 존재할 경우 5 x 4 = 20개 반환

내부 조인(Inner Join)은 쿼리의 조건에 따라 일부 결과 열이 제거된 크로스 조인입니다.

SELECT somecolumns FROM table1 
INNER JOIN
table2
ON somecondition; // 이 조건식은 비교 연산자를 아무거나 사용할 수 있습니다.

내부조인: 동등 조인
SELECT boys.boy, toys.toy
FROM boys
  INNER JOIN
  toys
ON boys.toy_id = toys.toy_id;

SELECT mc.email, p.profession FROM my_contacts mc
INNER JOIN profession p ON mc.prof_id = p.prof_id;

SELECT mc.first_name, mc.last_name, s.status FROM my_contacts mc
INNER JOIN status s ON mc.status_id = s.status_id;

SELECT mc.first_name, mc.last_name, z.state FROM my_contacts mc
INNER JOIN zip_code z ON mc.zip_code = z.zip_code;

내부조인: 비동등 조인
// 같지 않은 모든 행들을 반환합니다. 
// 비동등 조인을 사용하여 각 아이가 어느 장난감이 없는지 알 수 있습니다.
SELECT boys.boy, toys.toy 
FROM boys
INNER JOIN
toys
ON boys.toy_id <> toys.toy_id
ORDER BY boys.boy;

자연조인: 두 테이블에 같은 이름의 열이 있을 때에만 동작합니다. 
자연조인은 일치하는 열 이름을 사용하는 내부조인입니다. 
SELECT boys.boy, toys.toy
FROM boys
NATURAL JOIN
toys;

SELECT mc.email, p.profession FROM my_contacts mc
NATURAL JOIN profession p;

자연조인: 열 이름을 공유하는 두 테이블을 조인합니다.
동등조인: 테이블의 한 열이 다른 테이블의 열과 일치하는 모든 행을 반환하고 키워드는 ON을 사용합니다. 
크로스조인: 두 테이블 행의 곱집합과 같은 행들을 반환할 수 있습니다.
외부조인: 테이블을 조인하는 순서가 나에게는 중요합니다. 
비동등조인: 나는 테이블의 한 열이 다른 테이블의 열과 일치하지 않는 모든 행을 반환합니다. 
카티젼 조인: 두 테이블 행의 곱집합과 같은 행들을 반환할 수 있습니다. 
크로스 프로덕트: 나는 모든 가능한 행들을 반환하고 조건도 없습니다. 

내부 조인에서 두 테이블의 행들을 비교하지만, 두 테이블 사이의 순서는 중요하지 않습니다. 

왼쪽 외부 조인은 왼쪽 테이블의 모든 행을 가져다 오른쪽 테이블의 행과 비교합니다. 
왼쪽 외부 조인에서는 FROM 뒤에 그리고 조인 전에 나오는 테이블이 왼쪽 테이블이고 조인 뒤에 나오는 테이블이 오른쪽 테이블 입니다. 
어떤 조인이든 그 앞에 나오는 테이블이 왼쪽 테이블이고 뒤가 오른쪽 테이블입니다. 
왼쪽 외부 조인은 왼쪽 테이블의 모든 행과 오른쪽 테이블의 행을 비교합니다. 

SELECT g.girl, t.toy
FROM girls g
LEFT OUTER JOIN toys t
ON g.toy_id = t.toy_id;

girls 3행 x toys 8행 → 결과값 3행

외부 조인은 다른 테이블과 일차하는 것이 있는가에 상관없이 행을 반환한다는 차이가 있습니다. 
일치하는 것이 없을 경우 NULL값으로 표시합니다. 
왼쪽 외부 조인의 결과가 NULL 값이면 오른쪽 테이블에 왼쪽 테이블에 상응하는 값이 없다는 의미입니다. 

SELECT g.girl, t.toy
FROM toys t
LEFT OUTER JOIN girls g
ON g.toy_id = t.toy_id;

girls 3행 x toys 8행 → 결과값 8행

= SELECT g.girl, t.toy
FROM toys t
RIGHT OUTER JOIN girls g
ON g.toy_id = t.toy_id;

왼쪽 외부 조인을 오른쪽 외부 조인 대신 사용하는 이유가 있나요?
LEFT를 RIGHT로 변경하는 것이 쿼리에서 테이블의 순서를 변경하는 것보다 쉽습니다. 
두 테이블 이름과 별명을 바꾸는 것이 아니고 단어 하나만 바꾸면 되니까요

유니온으로 합치는 SELECT 문에서 열의 수는 같아야 합니다. 
SELECT title FROM job_current
UNION 
SELECT title FROM job_desired
UNION
SELECT title FROM job_listings
ORDER BY title;

UNION ALL은 모든 열을 반환한다는 점(중복값 허용)을 빼고는 UNION과 같은 방식으로 동작합니다.

728x90
반응형