1) 관계형(SQL) -> 비관계(NOSQL)
2) 고전 SQL의 한계
3) 빅데이터 처리 : NOSQL
< 용어 정리 >
< 데베 발전과정 >
파일 시스템 -> 데이터베이스 관리 시스템(DBMS)등장 ->
1세대: 네트워크 DBMS, 계층 DBMS ->
2세대: 관계 DBMS ->
3세대: 객체지향 DBMS, 객체관계 DBMS ->
4세대: NoSQL, NewSQL
a. DDL : 데이터 정의어 -> 설계/관리 단계
ALTER(테이블의 속성 내용 수정), CREATE, DROP, RENAME, TRUNCATE, COMMENT
객체를 생성, 수정, 삭제하는 명령으로 이런한 명령문을 통틀어 DDL.
객체 종류 : 테이블, 뷰, 시퀀스, 인덱스 등
b. DML : 데이터 조작어 -> 주요 읽기 - 빈도 가장 높음
UPDATE(TABLE 내용 수정), INSERT, DELETE, MERGE, CALL, EXPLAIN PLAN, LOCK TABLE
c. DCL : 데이터 제어 언어 -> 주요 쓰기 -빈도 낮음
GRANT, REVOKE
d. TCL : 트랜잭션 제어 언어 -> 튜닝/최적화 단계 -선택
DDL, DML, DCL, TCL 실무에 필요한 쿼리 문법들임.
1) 중복 제거 : GROUP BY, DISTINCT
1-1) GROUP BY
1-2) DISTINCT
2) 정렬 ORDER BY DESC, ORDER BY ASC
3) NULL값 검사 :
4) 패턴 검사
기존 유닉스와 유사한 정규패턴 사용
SELECT FROM pet WHERE name LIKE 'b%';
이름이 b로 시작하는 동물을 pet테이블에서 찾아라
SELECT FROM pet WHERE name LIKE '%fy';
이름이 fy로 끝나는 동물을 선택
SELECT FROM pet WHERE name LIKE '_ _ _ _ _';
이름이 5개 문자가 포함된 동물을 선택
< 정리 >
1) 중복제거 : GROUP BY, DISTINCT
2) ORDER BY DESC/ASC : DESC = 오름차순(숫자가 큰거부터), ASC = 내림차순(숫자가 작은거 부터)
3) NULL 체크는 IS NOT NULL로 한다.
4) 'a%', '%b', '_ _ _' == a부터 시작하는거, b로 끝나는거, 단어가 3개인거
1) 그룸 IDE -> 터미널 -> apt-get update
apt-cache search apache2
apt-get install apache2 -> Y
service apache2 start 시작
service apache2 stop 정지
service apache2 restart 재시작
2) MYSQL DB 설치 및 확인
apt-get search mysql
apt-get install msql-server
db 실행/정지/재시작
service mysql start/stop/restart
AUTO_INCREMENT 는 일반적으로 기본키를 생성하는 방법으로 삽입할 때마다 키를 1씩 증가 시키는 순차번호이다.
AUTO_INCREMENT는 "다중 데이터 베이스 (다중 DB)"에서 동기화 되지 않은 삽입으로 인해 데이터 일관성에 "문제"가 생길 수 있다.
AUTO_INCREMENT는 KEY를 예측할 수 있어 "SQL INJECTION"공격에 취약 할 수 있으므로, 사용에 주의해야한다.
다중 DB 환경에서는 "데이터 일관성"을 위해 128빝 숫자로 이루어진 식별자인 "UUID"를 키로 사용할 수 있다.
< 정리 >
AUTO_INCREMENT ?? ->
기본 키 고유 식별자 활용가능
순서 번호이다.
데이터 삽입하면 자동 증가
CREATE TABLE
animals
(
id
mediumint(9) NOT NULL,
name
char(30) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTOanimals
(id
,name
) VALUES
(1, 'dog'),
(2, 'cat'),
(3, 'penguin'),
(4, 'lax'),
(5, 'whale'),
(6, 'ostrich');
덤프된 테이블의 인덱스
테이블의 인덱스animals
ALTER TABLEanimals
ADD PRIMARY KEY (id
);
ALTER TABLEanimals
MODIFYid
mediumint(9) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=102;
<
이렇게 테이블 설정 했기 때문에
데이터 이렇게 넣으면
이런식으로 나옴.
1) service apaceh2 start
2) service mysql start
3) 현재 자신의 컨테이너
https://starkshn97.run.goorm.io/phpmyadmin으로 접속
4) root 계정 입력, password입력하면 접속 완료
시간
* (SYS)DATE, COUNT, MAX, MIN
* TIMESTAMPDIFF(YEAR, BIRTH, DATE)
개수
* COUNT(*) 뭐 이런식으로 씀
최대값
* MAX
최소값
* MIN
a2enmod rewrite
1) information_schema : DB 메타 정보(개념 스키마)
2) mysql
3) performance_schema
4) phpmyadmin
5) sys
SET @변수명 := 값;
사용자 계정 패스워드 -> 기본암호화
SHA1 또는 SHA2 해시 알고리즘 적용, password()함수
DB에 저장된 실제 암호는 암호화 (단방향) 문자열
보안상 완벽하지 않다! -> 왜?-> 패스워드 무작위 대입 -> 해시 값 추출 가능성
최근 8.0 최신 버전(보안 강화됨)
SHA1 -> SHA2 버젼으로 업그레이드
암호화 방식은 SHA2이다.
flush privileges;
1) MYSQL DB의 패스워드 정책 살펴보기
2) 정책 주요 내용( 버전 마다 상이 )
기본 패스워드 주기, 만료, 알고리즘 등
SHA2 자동 생성 및 관련 정보
3) 지금 패스워드 123123
-> 문제된다.
4) 기억하자
< 정리 >
쉬운 패스워드 앞으로는 생성 불가
8글자이상, 대소문자, 숫자, 특수문자 1개 이상 포함
SQL 제약조건 : NOT NULL, 기본키, 왜래키 등으로 모두 데이터 무결성을 지키기 위해 입력 값을 검사하는 규칙을 의미한다.
UPDATE : 테이블의 내용 수정(DML) 단순히 데이터를 수정 한다.
DELETE : 테이블의 내용을 삭제한다.
둘 다 내용을 수정한다는 "공통점" 존재
BUT "차이점"은
UPDATE -> 테이블의 내용 수정 : DML 데이터 조작어 -> 주요 읽기 - 빈도 가장 높음
즉, 단순히 데이터를 수정한다.
ALTER -> 테이블의 속정의 내용을 수정 : DDL : 데이터 정의어 -> 설계/관리 단계
죽, 필드, 데이터 유형, 키, 제약 조건 등을 수정한다.
<결론>
ALTER는 테이블의 구조도 변경한다. 훨씬 권한이 높다.
일반 사용자 계정의 필요성
Root 계정 로그인은 위험하다. 세션 보안!
1) 공통 : SQL 처리엔진 + 스토리지 엔진
2) INNODB 엔진 (default)
실시간 제어(기본)
용량 : 64TB, 외래키 지원, 클러스터 인덱스, 데이터 캐시 등
3) MYISAM 엔진
4) Memory 엔진
5) Archive 엔진
6) CSV 엔진
7) Federated 엔진
8) Blackhole 엔진
[ 내부 지원 엔진 확인하기 ]
SHOW engines;
MYSQL 메모리 구조와 할당
1) 글로벌 메모리 영역 + 세션(커넥션) 메모리 영역
글로벌 메모리 : OS에서 설정 할당, 모든 쓰레드 공유
로컬 메모리 : 쿼리 처리에 따라 할당, 쓰레드 공유 X, 클라 독립
2) 주요 변수
innodb_buffer_pool_size : 데이터 및 인덱스 캐싱
innodb_additional_mem_pool_size : 데이터 사전 및 구조 캐싱
innodb_log_buffer_size : 로그 버퍼 캐싱
정형 데이터 : 행과 열을 갖는 표준 데이터베이스와 같이 관계형 스키마로 구성된 데이터를 간단한 질의문을 통해 원라는 정보를 획득해 사용함 ex) 데이터 베이스, 스프레드 시트, 시트 등
반정형 데이터 : 고정된 스카미를 갖지 않는 정형 데이터로 데이터에 레코드 및 필드와 같은 구조를 갖기 위해 태그나 인덱스 사용 ex) 시스템 로그, 센서 데이터, HTML등
비정형 데이터 : 구조화 되지 않은 임의의 형식 ex) 이미지, 동영상, 이메일, 문서 등
복잡한 쿼리 및 스키마가 유연하지 못하다.
수평 확장이 불가능하고 수직 확장만 가능하다.
설계 후 정규화 어렵다.
관계형 데이터 베이스 이기때문에 그렇다.
관계형 DB의 특징이
2주차 PPT에서
이렇게 설명을 해주었었다.
꼭 확인해야됨!
GUI를 제공하지 않는 서버 기반 환경
그룸 IDE 하단 리눅스 터미널에서 확인 하는 방법
- mysqladmin version
접속하여 내부 상태 확인
- mysqladmin -uroot -p version
데이터 베이스만 확인
- mysqlshow -uroot -p
데이터 베이스 내 테이블까지 확인
- mysqlshow mysql -uroot -p
< 정리 >
이렇게 데이터 베이스 뭐 있는지 확인 가능
이거는 mysql이라는 DB의 테이블 확인한것임
1) MYSQL의 데이터 타입
CHAR, VARCHAR, TEXT, DATe, TIME 등
BLOB : 사진, 동영상, 문서등 대용량 이진 데이터 저장
2) MYSQL의 다양한 내장 함수
< 요약 >
"BLOB"
1) 현재 MYSQL에 존재하는 계정 확인
2) 일반 사용자 계정 필요성
3) 데이터 베이스마다 접속 계정을 생성해야 한다.
4) phpmyadmin -> sql -> 직접입력 DB생성!
5) 생성된 DB확인
Mysql DB의 -> user테이블 확인
6) phpmyadmin -> sql이동
7) 생성된 계정은 ㅇㄷ?
8) temp_db에는 user테이블이 없다.
JOIN을 사용하는 이유 : 서브쿼리 방식은 매우 느려질 수 있다.
5.0 이후 서브쿼리 성능 크게 개선 BUT 같은 기준으로 비교젹 INNER JOIN이
연산 효율성이 높아서.
SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species
FROM pet AS p1 INNER JOIN pet AS p2
ON p1.species = p2.species
AND p1.sex = 'f' AND p1.death IS NULL
AND p2.sex = 'm' AND p2.death IS NULL;
-> pet에 살아있는 종의 암컷, 수컷 쌍을 출력
INNER JOIN
LEFT JOIN
두개의 테이블이 있으면
쿼리 실행하면 화면 처럼 나오게된다.
1) 서버 내부 저장 경로
그룸 IDE 하단 터미널 창 : cd경로로 확인 가능
usr/share/mysql 뭐 이런식
2) 파일 구성
주요 실행 파일
/usr/bin/mysql 내에 대부분 존재
* Mysql(클라), mysqld(서비스용), mysqldump(백업) 등 다양한 파일 존재
!주요 설정 파일!
* /etc/mysql/my.cnf -> 다른 위치로 이동
3) 설정 파일 열어보기
4) 주요 환경 설정
tkdydwk, pid, 포트, 데이터, 임시 폴더 등
튜닝 관련 설정
* 키, 접속자, 쓰레드, 캐시 등
5) 생성된 DB는 ㅇㄷ?
6) Mysql 내부 살펴보기
7) 전체 INNODB 테이블 확인
phpmyadmin접속 후 확인
SEELCT tablespace_name, file_name, file_type from information_schema.files;
< 정리 >
SQL 주요 설정 파일 이름은
주요 설정 파일
/etc/mysql/my.cnf -> 다른 위치로 이동
/etc/mysql/mysql.conf.d -> mysqld.cnf (실제 설정 파일!)
mysqld.cnf (실제 설정 파일!)
1) 테이블에서 KEY란?
2) 고유 값 = 유일
3) 기본키와 외래키
기본키 : 대표 키, 고유 식별자, 다중 키 가능
* 참고 : NULL값 허용 안한다. 수정이 어렵ㅏ.
외래키 : 기본키를 참조, 테이블의 관계를 연결 할 때 사용!!
* 참고 : 다중 그룹 가능, 도메인 반드시 동일, NULL && 중복 허용
관계형 데이터 모델에서 "외래키" 는 참조 되는 관계의 기본키와 대응되어 참조 관계를 표현한다.
관계에 "외래키"가 존재한다면, "외래키"값 중 적어도 하나는 주 관계에 속한 튜플의 "기본키" 값과 같거나 완전한 NULL이어야 한다.
테이블 내에 "기본키"로 정의되는 속성은 NULL값을 허용하지 않으며, 모든 튜플에서 유일해야 하며, "외래키"로 참조될 수도 있다.
"제약 조건"은 NOT NULL, 기본키, 외래키 등으로 모두 "데이터 무결성"을 지키기 위해 입력 값을 검사하는 "규칙"을 의미한다.
"제약 조건"은
INSERT INTO parent (id) VALUES (1);
하면 parent의 기본키인 id에 1이 들어감
그런데
INSERT INTO child (id, parent id) VALUES(2, 2);
를 하게 되면 ERROR발생하는데
현재 child테이블을 parent의 기본키인 id를 참조하는데
parent의 id값이 1이기때문에 child에서 2, 2라는 값을 넣어줄 수 없다.
또한
DELETE FROM parent WHERE id = 1;이 안되는 이유는
"개체 무결성"을 유지해야 하기 때문이다.
1) "개체 무결성"이란?
하나의 테이블에는 적어도 하나의 키가 존재해야한다.
기본키는 절대 NULL일 수 없다.
2) "참조 무결성"이란?
3) 도메인 무결성
4) 기타
MYSQL 패스워드 보안 정책 적용 후 기본 보안 수준
보안정책 적용하면
보안 정책 적용 쉬운 패스워드 앞으로는 생성 불가
참고 : LOW - 8글자, HIGH – 사전 파일로 엄격한 검사
1) MYSQL의 주요 설정 파일 경로와 파일명 : 파일명은 mysqld.conf인가? mysqld.cnf이다.
SQL 주요 설정 파일 이름은
주요 설정 파일
/etc/mysql/my.cnf -> 다른 위치로 이동
/etc/mysql/mysql.conf.d -> mysqld.cnf (실제 설정 파일!)
mysqld.cnf (실제 설정 파일!)
2) Process id의 약자, 말 그대로 프로세스 아이디이다.
3) mysql의 default엔진은 : INNODB이다. mysql에 엔진이 7~8가지 종류가 있는데
INNODB의 특징은 "트랜잭션"을 지원하는데 최적화 되어있다.
4) SQL에서 특정 행의 중복제거 DISTINCT
5) ORDER BY DESC
6) DATETIME
7) IS NOT NULL로 검사를 한다.
1) NULL 체크를 할 때 "산술 연산자를 직접 사용할 수 없다"
2) '%'이다
'%a'일경우 a로 끝나는 문자
'a%'일경우 a로 시작하는 문자
'__' 일경우 단어가 두개인 문자
3) COUNT함수이다.
4) GROUP BY는 그룹으로 묶어 중복을 제거하고 정렬해준다.
GROUP BY는 특정 그룹에 대한 조건을 HAVING문으로 조건 추가가 가능하다.
DISTINCT는 그룹으로 묶지 않고, 정렬은 하지 않는다.
5) GROUP BY로 묶은 것을 SEELCT에서 명시하지 않은 경우 에러 발생
6) INNER JOIN의 특징 ? => "교집합"
SELECT pet.name, TIMESTAMPDIFF(YEAR, birth, date) AS age, remark
FROM pet INNER JOIN event
ON pet.name = event.name
WHERE event.type = 'born';
7) FROM 구문에서 두 테이블을 JOIN한다.
ON 구문으로 name일치 시킴
1) MAX, MIN
2) 서브쿼리와 조인의 차이점
조인과 서브쿼리는 때로 동이란 결과를 얻기도함.
상황에 따라 다름.
서브 쿼리는 복잡한 SQL 쿼리문에 사용이 많이 된다.
반면, 조인은 여러개의 쿼리를 필요로 하지않는다.
조인의 역할은 2개 혹은 그 이상의 테이블을 연결하고, 연결한 테이블로부터 필요한 열을 조회할 수 있도록 한다.
이둘의 데이터를 추출하기 위한 "접근 방식"이 다르다.
서브쿼리의 성능 개선으로 속도가 빨리지기는 했지만
동일한 조건일 경우 아직 조인이 속도가 더 빠르다.
왜?? =>
3) INNER JOIN은 교집합인 부분을 가져올 수 있고
LEFT조인은 차집합인 부분을 가져올 수 있다.
4) 사용자 정의 변수는
SELECT @min_price := MIN(price), @max_price := MAX(price)
FROM shop;
이렇게 사용이 가능하고
SELECT *
FROM shop
WHERE price = @min_price OR price = @max_price;
위와 동일한 결과를 출력한다.
조건식에 정의를 해준다(대입 X, 비교 O)
"사용자 정의 변수"는 현재 쿼리에서만 사용가능한 "세션" 또는 동적 변수이다.
따라서 SET @name := '홍길동';
5)
:= => SET, UPDATE, SELECT로 값 할당
= => SET, UPDATE 이외 비교연산자로 사용
6) "사용자 정의 변수"는 현재 쿼리에서만 사용가능한 "세션" 또는 동적 변수이다.
-> "참"
7) 관계를 생성한다 (부모 - 자식)
8) "제약 조건 해제"
"제약 조건 해제" 두가지 옵션 -> "참조 데이터 무결성"
ON UPDATE CASCADE, ON DELETE CASCADE
* 두 옵션으로 해제가능, SQL파일 다시 살펴보자!
“한국인이 운영하는 유대인 공부법 맛집”