3대 RDBMS - MySQL, Oracle DB, MSSQL
Oracle은 무겁고 비싸지만, 아주 안정적이므로 관공서나 은행에서 쓴다.
공통점 - SQL 표준을 공유한다. Data type은 조금씩 다르다.
<-> MongoDB (비정형(비구조화)데이터, Document Store Model)
테이블 자체가 정형화된 데이터이다.
양 많아지면 CSV 많이 쓴다. (엑셀은 무거움)
Database == Schema
클라이언트 - DOS, Program. GL 라이브러리
bin은 표준 폴더 이름이다. 여기 실행 파일 경로가 다 있다.
2 Tier 구조(클라이언트 - DB 서버)는 DBA, 개발자들은 보통 3 Tier(클라이언트(web, 모바일, 태블릿 등등) - 서버 - DB 서버) 구조가 된다.
중간 Middle 서버를 분리 할 수도 있다.
메인프레임(대용량 메모리, 고속처리하는 대형 컴퓨터)에서는 MySQL이 제일 많이 쓰인다.
DBMS 특징 4가지
1. 데이터의 무결성 - PK
2. 데이터의 독립성
3. 보안
4. 데이터 중복 최소화
DBMS가 열심히 발전해서 RDBMS까지 왔다.
행 = row = record
열 = column
교차 지점 = data = field
MySQL FK는 MUL로 표기한다.
MySQL에는 curdate()
라는 함수가 있다. 현재 날짜 반환해줌
INSERT INTO customer(name, birthday) VALUES ('이정찬', curdate());
VARCHAR(N)
은 한글, 영어 상관 없이 N자리수 초과로는 못넣는다고 생각하자.
INSERT INTO customer VALUES (DEFAULT, '와', curdate());
DEFAULT
를 넣으면 컬럼 지정 필요없다. 근데 그다지 안쓸듯
INSERT INTO customer(name, birthday) VALUES ('아이유', date_format(now(), '%Y-%m-%d'));
MySQL date_format 사용법
원래 커밋을 해야 한다. MySQL서버는 자동 커밋 지원
@@autocommit
은 기본값 1, 자동커밋이 된다. 원하지 않는다면 0으로 바꾸면 된다.
SELECT @@autocommit
util - 유틸 관련된 모든 파일은 여기에 들어간다.
SOURCE C:\${파일 경로}\emp.sql
SQL 파일로 DB 만들때는 이렇게 한다.
workbench -> 쿼리 전부 실행은 첫번쨰 번개 버튼
한줄씩 실행은 ctrl + enter
여러 줄 실행은 드래그 하고, ctrl + shift + enter
-- 한 줄 주석
/*
여러 줄 주석
*/
Filter Rows:
칸에 뭐 넣으면, 필터링 기능도 된다. 대소문자 구분 X
export, import 기능도 지원한다. -> 2차원 구조가 보장 되는 csv, json 등으로 저장 가능
csv는 엑셀로 열면 그냥 엑셀로 열린다. 메모장으로 열어야 콤마로 구분된 csv 파일의 형태를 지님
import하면 csv 읽어서 자동으로 테이블도 만들어준다.
SELECTION: 전체 혹은 원하는 행을 가져오는 쿼리문 (WHERE 구문)
PROJECTION: 컬럼명을 지정해서 데이터를 가져오는 쿼리문 (의외로 시간 많이걸림)
SELECT * FROM emp; -- SELECTION, 절대 이렇게 쓰지 말자.
SELECT empno, ename, job, deptno FROM emp; -- PROJECTION
절대 불필요한 컬럼은 사용하지 않는다.
전체를 불러와서 사용하면, 노출되지 않아야 할 정보들이 노출된다.
쿼리문 실행순서: FROM 뒤의 테이블 탐색 -> 조건에 해당하는 행 탐색(WHERE) -> 조건에 해당하는 열 탐색(SELECT)
ORDER BY ASC | DESC (오름차순(기본) | 내림차순)
SELECT ename, sal, job, deptno FROM emp WHERE job = 'SALESMAN' ORDER BY sal DESC;
SELECT ename, sal, job, deptno FROM emp WHERE job = 'SALESMAN' ORDER BY 2 DESC;
ORDER BY 2
가 두번째 컬럼 기준으로 정렬 해달라는 뜻이다. 제로베이스가 아니라는 것에 주의.column에 연산이 들어가면, 무조건 AS
써준다.
SELECT ename, sal AS s, job, deptno FROM emp WHERE job = 'SALESMAN' ORDER BY s DESC;
SELECT ename, sal s, job, deptno FROM emp WHERE job = 'SALESMAN' ORDER BY s DESC;
-- AS 없어도 작동은 된다. 실제로 많이들 쓰신다.
SELECT ename, sal 기본 급여, job, deptno FROM emp WHERE job = 'SALESMAN' ORDER BY sal DESC;
-- 이건 안된다. 기본_급여라고 쓰던가 "기본 급여" 라고 쓰자. 근데 이건 정렬은 안됨.
이것도 역시 동일하게 작동한다. AS
로 바꿔준 column name으로도 ORDER BY
가능 FROM
, WHERE
, SELECT
순으로 실행하고 맨 마지막에 ORDER BY
를 하므로 실행이 되는 것이다.
AS
로 소문자, 특수문자, 공백 등을 구분하고 싶을 때는 반드시 큰따옴표로 묶어주자. 그러나, ORDER BY
뒤에는 못온다.
SELECT DISTINCT(deptno) FROM emp ORDER BY 1;
DISTINCT
는 SELECT
바로 뒤에 와야 한다. 중복제거에 쓰임SQL에서 NULL
은 자격없음, 미확정(Unknown)을 의미한다. 0이나 공백을 의미하는 것이 아닌 일종의 값
NULL
은 연산, 비교가 불가능하다.
Oracle DB에서 NULL
은 가장 큰 값이다. MySQL은 가장 작은 값.
NULL
값을 연산하기 위해서는 ifnull()
함수를 이용해야 한다. is null
과 is not null
로 구분한다.
SELECT ename, (sal + 100) * 2 AS 증가급여 FROM emp ORDER BY 증가급여 DESC;
SELECT ename, (sal + 100) * 2 AS 증가급여, (sal + 100) * 24 AS "AnnualSalary" FROM emp;
NULL
이 아니라면 이런 연산이 가능하다.SELECT ename, sal * 12 + IFNULL(comm, 0) AS "AnnualSalary" FROM emp;
SELECT ename, sal * 12 + ifnull(comm, 0) AS "AnnualSalary", comm FROM emp
WHERE comm IS NOT NULL ORDER BY comm DESC;
NULL
이 있다면, 이런식으로 NULL일시 0으로 바꿔주고 연산하면 된다.IS NOT
, !=
, <>
은 모두 같지만, NULL
은 비교가 안되기 때문에 비교연산자를 못 쓴다.