개발자 끄적끄적

join, like, 정규화 본문

MySQL

join, like, 정규화

햏치 2023. 3. 8. 00:17

from 절 뒤에는 table명이 나온다
 

cmd창에서 상위디렉토리로 이동 : cd\


데몬 삭제 방법 : 작업관리자->프로세스->mysql.exe->제거
*데몬(Daemon)
- 사용자가 직접적으로 제어하지 않고, 백그라운드에서 돌면서 여러 작업을 하는 시스템
- 시스템 로그를 남기는 syslogd처럼 보통 데몬을 뜻하는 'd'를 이름 끝에 달고 있으며
  일반적으로 프로세스로 실행된다 


use databases명
ex->classicmodels, information_schema, mysql, performance_schema, sys

ex)show databases; - database를 보여달라
    use classicmodels; - database는 classicmodel
    show tables; - table로 보여달라
    desc employees; - employees를 내림차순으로



Null=No : Null을 허용하지 않는다(반드시 값이 존재해야한다)
Null=Yes : Null을 허용한다
*Null은 공백이 아니라 '공허'



select * => 편리하지만, 현업(실무)에서 금기된다
from employees; 
이유 : 1. 보안
        2. 불필요한 서버자원을 소모(시스템의 불필요한 과부화)

select e.lastname as "성명", e.EMAIL "이메일"
from EmploYees e; 
->from절이 두개 이상일 때 별칭(as)을 유용하게 쓸 수 있다




문자열
1. varchar : 가변길이 문자열
ex)varchar(10) : 메모리 공간이 최대가 10이다

2. char : 고정길이 문자열
ex)char(10) : 메모리 공간이 무조건 10자를 차지한다

Type : 날짜열(date)은 문자열(varchar, char)과 비교가 가능하다
ex) select * from payments
     where paymentDate = '2005-03-25'
     desc payments;




group by(~별)절에서 select절에 기술할 수 있는 컬럼의 유형들은
1. group by절에 사용된 컬럼
2. 사용되지 않았지만, 집계함수
ex) select customerNumber, count(customerNumber)
     from payments p
     group by customerNumber;




ex) 고객별 지불건수를 조회
select customerNumber, count(customerNumber),
sum(amount), avg(amount) "평균"
from payments p
group by customerNumber;
order by 평균;
*한글사용("평균")은 비추
이유->network에서 trouble이나 충돌이 일어날 가능성이 크다




ex)고객별(group by) 지불금액의 합계(sum)를 조회(합계순)
select customerNumber, sum(amount) as "amt"
from payments
group by customerNumber
order by amt desc;




ex)select절에서 case문 type1(case문 뒤에 컬럼명이 없을 때)
select officecode,
   case
      when officecode=1 then '샌프란시스코' ->officecode가 1일 때 '샌프란시스코' 대입
      when officecode=2 then '보스턴' ->officecode가 2일 때 '보스턴'을 대입
      else '기타지역' ->office코드가 1,2가 아닌 그 외에는 '기타지역'
   end 아무거나 ->'아무거나'라는 가상의 컬럼에
from offices;
- 범위 사용가능




ex)select절에서 case문 type2(case문 뒤에 컬럼명이 있을 때)
select officecode, city,
   case officecode
      when 1 then '샌프란시스코'->officecode가 1일 때 '샌프란시스코'대입
      when 2 then '보스턴'->officecode가 2일 때 '보스턴'대입
      else '그 외 지역'->officecode가 1,2가 아닐 때 '그 외 지역'
   end '도시' ->'도시'라는 가상의 컬럼에
from offices;



조건절에서의 like연산자
where name like '_' => name이 한 글자인 데이터
where name like '__' => name이 두 글자인 데이터
where phone like '0_0' => phone 010, 070, 011(X)
where name like '김%' => name이 '김'으로 시작하는->김, 김길, 김길동, 길(X)
where name like '%광%' => name에 앞뒤중간순서 상관없이 문자 '광'을 포함->광 or 광X or X광 or X광X
* '-' : 1자
* '%' : 0자 이상

-----------------------정리 및 복습-----------------------

JOIN
- "데이터를 정규화"에 의해 필연적으로 하나의 테이블이 두 개 이상의 테이블로 분리되었을 때,
1. 중복 데이터 제거
2. 2가지 이상의 개념이 한 컬럼에 있을 떄
3. NULL값이 제거가 됐을 때
SELECT문을 사용하여 마치 하나의 테이블에서 데이터가 조회되는 것 처럼 만들 수 있는 문장
- 조인을 실행하면 일반적으로 카디션 곱으로 나타난다
ex)카디션 곱
A  join  B
a         1
b         2
c
A의 테이블 데이터 3행과 
B의 테이블 데이터가 2행이 있을 때, 이를 조인하면
=> a1, a2, b1, b2, c1, c2 -> 3X2=6행이 나타난다


- Join : 열 병합
- Merge : 행 병합

ex)Merge
우리은행
1. 부산
- a,b,c
2. 대구
- a,b,c
3. 서울
- a,b,c(구조가 동일) 가 있다고 가정 할 때
"부산, 대구, 서울"을 병합할 때에는 Merge를 사용

ex)Join
A(number, name)
B(number, address)라는 데이터가 있을 때
-> C(number, name, address)




JOIN의 종류
- cross join : mXn
- equi join : 기준값이 동일한
- non-equi join : 기준값이 동일하지 않은
- inner join(self join) : 자기가 자기 자신과 join
- outer join : 어느 한 쪽의 데이터는 모두 조회

   - left outer join : join하는 테이블의 왼쪽이 기준
ex) A Left outer join B -> A테이블의 데이터 무조건 다 조회

   - right outer join : join하는 테이블의 오른쪽이 기준
ex) A right outer join B -> B테이블의 데이터 무조건 다 조회

   - full outer join(비추)
ex) A full outer join B -> A, B테이블의 데이터가 모두 다 조회



cross join
- 두 개 이상의 테이블이 아무런 기준키 없이 연결되는 join
- 연결된 테이블의 연관 관계는 없다
ex)offices테이블과 employees테이블을 cross join
SELECT * FROM offices JOIN employees
or
SELECT * FROM offices, employees


equi join
- 일반적인 join을 의미한다
- on절에 두 테이블의 공통조건을 기술하여 조건이 같은 것만 조회

ex)사번이 1002인 직원의 사무실 도시 이름을 조회
SELECT city FROM employees e JOIN offices o
ON e.officeCode = o.officeCode
WHERE employeeNumber = 1002;

*WHERE : SELECT절의 조건절
*ON : JOIN의 조건절(두 테이블의 공통조건)
*JOIN보다 WHERE절이 먼저 실행

ex)사무실의 위치(City)가 Paris인 직원들의 이름 조회
SELECT lastName, firstName
FROM offices o JOIN employees e
ON o.officeCode = e.officeCode
WHERE o.city = 'Paris';




non-equi join
- 서로 다른 값을 찾아 조회할 때 사용한다
- on절에서 비교 대상을 같지 않은것으로 설정하면 equi join과 사용 방법이 동일




inner join(self join)
- 하나의 테이블을 마치 서로 다른 테이블인것처럼 설정하여 자신과 조인하여 결과를 조회

ex)Patternson William과 같은 부서 직원의 이름을 조회
SELECT e2.* FROM employees e1 JOIN employees e2
ON e1.officeCode = e2.officeCode
WHERE e1.lastName = 'Patternson' AND e1.firstName = 'William';


ex.1) select e1.* from employees e1
where last name = 'Patterson' and firstname='William';

ex.2) select * from employees
where officeCode = 6; 일 때

inner join => 1+2

select e2.* from employees e1 join employees e2
on e1.officeCode = e2.officeCode
where e1.lastname = 'Patterson' and e1.firstname = 'William';
----------------------

ex)주문번호가 10424번인 주문과 같은 날짜(orderDate)에 주문된 정보를 조회

ex.1) select * from orders where orderNumber = 10424;
ex.2) select * from orders where orderDate = '2005-05-31'; 일 때

inner join => 1+2

select o2.*  from orders o1 join orders o2
on o1.orderDate  = o2.orderDate  
where o1.orderNumber = 10424;
----------------------

ex)생산코드(productCode)가 S10_4757인 제품을 생산한 생산라인(productLine)과 같은 라인에서 생성된 제품 목록을 조회

ex.1) select p1.* from products p1 where p1.productCode = 'S10_4757'
ex.2) select p2.* from products p2 where p2.productCode = 'Classic Cars'; 일 때

inner join => 1+2

select p2.* from products p1 join products p2
on p1.productLine = p2.productLine 
where p1.productCode ='S10_4757';
----------------------

outer join
- 어느 한쪽의 테이블 자료는 무조건 조회되도록 만드는 것
*join은 키 값이 서로 같거나 다른 값을 연결하여 조회한다
 따라서 비교되는 키에 누락되는 데이터는 조회되지 않는다

ex) outer join의 목적 
학생
NO 1 Name H
NO 2 Name K
NO 3 Name L

성적
NO 1  Score 100
NO 2  Score 100
NO 1  Score 50
-> NO=1,2학생은 조회되지만, NO=3번학생은 누락이된다


left outer join : 무조건 출력되어야 하는 테이블이 join왼쪽에 있는 테이블이 된다


right outer join : 무조건 출력되어야 하는 테이블이 join오른쪽에 있는 테이블이 된다


full outer join : join양쪽에 있는 테이블이 키와 연결되는 것과 관계없이 무조건 조회된다(비추)




ex)주문 정보가 없는 고객번호가 조회O
SELECT c.customerNumber, o.orderNumber
FROM customers c LEFT OUTER JOIN orders o
ON c.customerNumber = o.customerNumber
ORDER BY c.customerNumber;

ex)주문 정보가 없는 고객번호가 조회X
SELECT c.customerNumber, o.orderNumber
FROM customers c JOIN orders o
ON c.customerNumber = o.customerNumber
ORDER BY c.customerNumber;



정규화(Normalization) : 관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스

전제 : 관계형 데이터베이스의 테이블에는 하나의 셀에 하나의 값만 저장할 수 있다

제1정규형(1NF = First Normal Form) 
- 테이블의 컬럼 원자값(Atomic Value)을 갖도록 테이블을 분해하는 것

제2정규형(2NF = Second Normal Form)
- 제1정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것
*완전 함수 종속 : 기본키의 부분집합이 결정자가 되어서는 안된다는 것

제3정규형(3NF = Third Normal Form)
- 제2정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것
*이행적 종속 : A->B, B->C가 성립할 때, A->C가 성립되는 것을 의미


PK(Primary Key)와 FK(Foreign Key)
- 테이블의 필수 요소로써 모든 테이블은 이들 둘 중 하나 이상을 반드시 포함

PK(Primary Key) - 기본키
- Unique(유일값)
- Not Null
- 테이블당 하나만 정의 가능
- 각 행을 고유하게 식별하는 역할
- 고유 인덱스(Unique Index)가 자동으로 생성

FK(Foreign Key) - 외래키
- 테이블을 생성할 때 FK를 정의
- FK가 정의된 테이블이 자식 테이블이고, 
  참조되는 테이블은 부모 테이블이며 참조되는 컬럼은 PK이거나 UK(Unique Key)만 가능
- 부모 테이블은 FK로 인해 삭제가 불가능
  부모 테이블은 미리 생성되어 있어야 한다
*자식 테이블의 FK컬럼은 부모 테이블의 참조하는 컬럼과 같은 이름을 사용
(다른 이름을 사용해도 무관)되도록 같은 이름을 사용하는 것이 
테이블 간의 관계를 한 번에 알아볼 수 있기 때문에 좋다


제약조건(Constraint) : 데이터의 무결성을 지키기 위해, 데이터를 입력받을 때 실행되는 검사 규칙


FOREIGN KEY제약조건
- 두 테이블간의 관계를 선언하여 데이터간의 무결성을 보장해주는 역할
- 외래키의 관계를 설정하면 하나의 테이블이 다른 테이블에 의존하는 형태

'MySQL' 카테고리의 다른 글

sub query, index, view, 내장함수  (0) 2023.03.08
SQL 테이블, 무결성 제약, case  (0) 2023.03.08
SQL 기본 구조, rollup  (0) 2023.03.08