DataBase란?
- 연관된 데이터의 잡합을 나타내는 것이 Database이다.
- 데이터베이스를 구성하는 요소는 개체(Entity), 속성(Attribute), 관계(Relationship)이 있다
1. 개체 : 데이터베이스에서 표현하고자 하는 유형, Ex) Schema = 학생정보
2. 속성 : 데이터베이스에서 개체의 특성이나 상태, Ex) Schema의 Row = 학생의 이름
3. 관계 : 개체와 개체 혹은 속성과 속성의 관계 Ex) INNER JOIN
- 보통 우리가 사용하는 MySql은 관계형 데이터베이스(RDBMS)이다.
RDBMS(Relation DataBase Management System)
- RDBMS의 내부구조를 파헤치면 다음과 같은 구조로 되어 있다.

- Table = Schema : 1개 이상의 Column과 0개 이상의 Row로 구성되어 있다
- Row : 레코드라고 불리며, 기본키(Primary Key)에 의해 구분되고 PK는 Null이 될 수 없다
- Column : 각 레코드마다 구성되어 있는 정보들
- Field : Column이 나타낼 수 있는 필드값
- Primary Key : 각각의 Row를 유일하게 식별해주는 고유값
- Foreign Key : 같은 Table의 또 다른 Table의 Primary Key를 참조하는 단일 Column,
* Relation DB를 설계할 수 있는 핵심 요소!
명령어 정리
1. DDL(Data Definition Language) : 테이블이나 관계의 구조를 생성하는 명령어
Ex) CREATE, DROP, TRUNCATE, ALTER
2. DML(Data Manipulation Language) : 테이블에 데이터를 수정, 삽입, 삭제, 검색하는데 사용하는 명령어
Ex) INSERT, SELECT, UPDATE, DELETE
3. DCL(Data Control Language) : 데이터의 사용 권한을 관리하는데 사용하는 명령어
Ex) GRANT, REVOKE
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | -- SELECT 컬럼명, 컬럼명 -- [FROM 테이블명] -- [WHERE 조건] -- [GROUP BY 컬럼명] -- [HAVING 조건] -- [ORDER BY 컬럼명 표현] -- [LIMIT 행카운트] -- [AS 별칭] -- [IFNULL(값, 디폴트값)] -- [CONCAT(sal, '원')] 집어넣기 -- ; show databases; -- 데이터 베이스 목록 보여달라 show tables; -- 테이블 목록 조회 create database [name]; -- 데이터 베이스 만들기 drop database [name] -- 데이터 베이스 삭제 use [name] -- 데이터 베이스을 선택하여 이용 create table [name]([colum] [type(size)), type(sie) ]) -- 테이블 생성 create table mytable(name VARCHAR(10), price INT(10), local VARCHAR(10)); -- 테이블 생성 예시 desc [name] -- 테이블 구조 보기 insert into [name] ([colum], [colum], ...) values([val], [val], ...); -- 테이블에 데이터 삽입 select [colum], [colum], [colum] -- 열을 선택하고 from [name] -- 테이블에 해당하는 열에 대한 데이터 조회하고 where [condition]; -- 조건에 해당하는 데이터 출력 select empno as 사번, ename as 이름, concat(sal, '원') from emp; -- empno을 '사번'이라 별칭, sal끝에는 '원'을 붙이자 select ENAME from emp where ENAME like '_o%'; -- 두번째 글자가 o인 사람만 출력 _: 1글자, %: 0~n글자 select distinct deptno from emp; -- 중복을 제거하여 출력 select * from emp where COMM is null; -- 커미션이 null 인 사람 조회 select * from emp where deptno = 10 or deptno = 30; -- 파이썬 과 조건연산자는 동일 select * from emp where (job, deptno) in (('manager', 10) ,('salesman', 20)); -- 직책이 매니저 부서번호 10 | cs | 
- SELECT : 검색하고자 하는 데이터 Column
- AS : 별칭을 매기는 옵션 ( alias )
- FROM : Table을 선택하는 옵션
- ORDER BY : 정렬 순서를 지정하기 위한 구문 ( ASC : 증가, DESC : 감소 )
- WHERE : 조건을 넣기 위한 구문 ( OR, AND 등의 다양한 비교 연산자 가능! )
- IN : 해당 값에 있는 column이라면 포함한다!
- LIKE : 문자열의 검색을 위한 조건! ( 'A%' = A로 시작하는 모든 문자! )
- IS NULL : 해당 column의 값이 NULL을 찾는 조건!
함수 명령어
| 1 2 3 4 5 6 7 8 9 10 | select upper(ename) from emp; -- 대문자로 소문자는 LOWER select substr(ename,1,3) from emp; -- SUBSTRING 뽑아오기 Mysql은 1번지부터 시작 select concat(sal, '원') from emp; -- 맨 뒤에 문자를 붙여서 가져오기 select length() from emp; -- 문자의 길이 select round(sal) from emp; -- 반올림 select curdate(); -- 현재 날짜 select year(curdate()); -- 현재 년도 select sysdate(); -- 현재 날짜 + 시간 select to_days('2019-01-01'); -- 날짜로 바꾸기 select count(deptno) from emp where deptno = 20; -- 20번 부서의 총 인원 가져오기 | cs | 
- 문자형 함수 : UPPER, LOWER, INITCAP, SUBSTR, LENGTH
- 숫자형 함수 : ROUND, TRUNC, POWER
- 날짜형 함수 : SYSDATE, MONTHS_BETWEEN
- 변환형 함수 : TO_CHAR, TO_DATE, TO_NUMBER
- GROUP 함수 : COUNT, MAX, MIN, AVG, SUM
JOIN
- 하나 이상의 Table로부터 연관된 데이터를 검색해오는 방법
- 일반적으로 PK와 FK의 값을 가지고, JOIN을 하는 것이 보편적이다.
* 꼭 PK와 FK가 아니어도 JOIN은 가능하다.
- JOIN의 유형
1. Inner Join = Equi Join : 연산자를 사용하는 JOIN 방식이며, 조건에 만족하는 값만 출력한다.
select * from emp, dept where emp.DEPTNO = dept.DEPTNO;
2. Outer Join : JOIN조건을 만족하지 않아도 모든 행을 다 보는 방식
- (1) LEFT Outer Join : 왼쪽에 있는 테이블을 오른쪽에 매칭하여 값이 있으면 join 없으면 NULL을 부여한다.
- (2) RIGHT Outer Join : 오른쪽에 있는 테이블을 왼쪽에 매칭하여 "" .
- (3) FULL Outer Join : 양쪽에 조건이 일치하지 않아도 Join하여 나타낸다!
3. CROSS Join : 왼쪽 테이블을 오른쪽에 교차 시켜서 Join하는 방식, 모든 경우의 수 매핑과 유사
4. SELF Join : 자기 자신의 테이블을 Join하는 방식
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | -- INNER JOIN select * from emp inner join dept where emp.deptno = dept.deptno; -- RIGHT OUTER JOIN select * from emp right outer join dept on emp.DEPTNO = dept.DEPTNO; -- LEFT OUTER JOIN select * from emp left outer join dept on emp.DEPTNO = dept.DEPTNO; -- FULL OUTER JOIN select * from emp left outer join dept on emp.DEPTNO = dept.DEPTNO union select * from emp right outer join dept on emp.DEPTNO = dept.DEPTNO; -- CROSS JOIN select * from emp cross join dept; -- SELF JOIN select * from emp e1 inner join emp e2 where e1.deptno = e2.deptno; | cs | 
SubQuery
- 간단히 말해서, 하나의 Query문 안에 또 다른 Query문이 들어가 있는 Query를 SubQuery라 한다!
- DataBase에 조건을 넣어서 검색을 할 때, 다양한 조건을 주기 위해서 사용한다!
1. 단일행 SubQuery : SubQuery에서 넘어가는 Row 데이터가 1개일 때!
2. 다중행 SubQuery : SubQuery에서 넘어가는 Row 데이터가 2개 이상일 때!
* 다중행의 경우 조건을 추가해야 한다!
- ANY : Row 데이터의 '어떤' 값을 참조한다 // 경우의 수 문제 푸는것과 유사하다
- ALL : Row 데이터의 '모든' 값을 참조한다
- IN : Row데이터에 '속해' 있는 값을 참조한다!
| 1 2 3 4 5 6 7 8 | -- SubQuery select * from emp where deptno = ( select deptno from dept where loc like 'NEW YORK'); -- ANY 는 Subquery에 있는 '어떤' 하나의 값만 참조한다 select * from emp where sal >= any ( select sal from emp where deptno = 10); -- ALL 은 SubQuery에 있는 '모든' 값을 참조한다. select * from emp where sal >= all ( select sal from emp where deptno = 10); -- IN 은 SubQuery에 있는 값이면 해당 값을 참조한다. select * from emp where deptno in ( select deptno from dept where deptno <= 20 ); | cs | 
'Developer > Database' 카테고리의 다른 글
| Database - Mysql 기반으로 Index 에 대해 Deep Dive 해보자 (0) | 2022.06.26 | 
|---|---|
| Mysql Query Plan - Intellij 를 활용하여 Plan query 를 해보자 (0) | 2021.10.10 | 
| MySql - Master Slave Replication 구조 만들어보기 (0) | 2021.07.17 | 
| DataBase - 정규화 (0) | 2019.04.21 | 
| DataBase - Table, Object (0) | 2019.04.21 | 
