개발자 끄적끄적
join, like, 정규화 본문
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 |