컴퓨터에서 일을 하는 프로세서(CPU, GPU)는 데이터를 메인 메모리에서만 가져올 수 있지만, 메인메모리는 가격이 비싸며 휘발성이라는 문제가 존재한다.
이에 대한 대안은?
휘발성 -> 보조기억장치(Auxiliary Memory), 좋긴 하지만 메인메모리가 가져오고 그걸 프로세서가 쓰는거라서 속도가 엄청 빠르진 않다.
Flat File(txt,csv)로 저장(보조기억)
파일은 무조건 위에서부터 순서대로 읽어야 합니다.(조금 느리다. 인덱스를 설정할 수 없기 때문이다.)
-> 그럼 데이터에다 인덱스를 설정해서 좀 해보면 어떨까?
--> index를 설정한 파일을 만들자.
---> 단순히 인덱스만 두지 말고 구조를 분리시켜보자.(검색이 뛰어난)
-----> 이게 Database이다.
(근데 인덱스는 결국 포인터이기때문에 비용이 발생한다.)
(근데 이런 db를 엑셀처럼 해보면 편하지 않을까 해서 rdbms(table구조, SQL)을 만들었음
-> 내 컴퓨터를 포맷하면 데이터가 날아가는데??
---> 데이터를 다른 곳에 두자.
-----> 네트워크를 사용하자(local 말고 network)
NoSQL (SQL이 아닌 function 베이스인)을 만들었다.
-> db를 따로 만들었더니 개발자들이 너무 힘들어, 질의를 던지는 것을 function 형태로 만들어보자. SQL은 모델링이 매우 강하지만 NoSQL은 그게 아니다.
네트워크를 타면서 "분산파일시스템" 이 생겨남(하지만 나눠서 저장하는건 아님), 컴퓨터 한대에다 다 떄려박기가 힘들다.
-> 데이터를 분산 저장하는 것을 배웠음
-> 분산 : 처리를 생각해야해 -> 이때 나온 것이 hadoop입니다.
아니 rdbms, nosql싹 공부하니 hadoop이 나왔네// 언제하냐.. 했는데 하둡 에코시스템은 db에 옮겨서 할 수 있게 했다.
(hive->NoSQL로 보내고 RDBMS로 보내는 것도 있다.)
아마존 RDS라는 서비스도 존재한다. 설치도와주는 친구
백업 자체도 말이 안된다-> IDC(data center)를 이용하자.
이제 시간이 지나서 mainmemory램의 가격이 이전 대비 떨어진다. 이제 여기에도 db를 두자. -> in memory db(ex : radis)
-> 약간 비싸긴 하고, 많은 양의 데이터를 넣기엔 부담이긴 하지만, 변수를 쓰듯이 빠르게 쓸 수 있다.
-> 부담을 제거하기 위해서 programming으로 인메모리db처럼 해보겠어 한 것이 ORM 이다.
-> python 웹프밍 방식 (2가지면, 프레임워크 이용 or 직접짜기)
-> 프레임워크 (플라스크, 장고) 고르기
-> 플라스크는 자유도가 높다. 하지만 다 따로 설치를 해야한다.
-> 장고는 orm 설치되어있다. 자유도가 낮다. 편하다.
우리가 flat file은 해봤으니 Db를 해봐야겠지. RDBMS가 먼저 나와서 대중화 되어있으니 얘를 해보자. MySQL!
MySQL설치? : 데이터 저장소 하나를 마련한 것이다.
-> 여기에 실제로 sql을 보내서 작업해야함
-> db 접속도구 혹은 application을 개발해서 해야 함.
-> db 접속도구는 ui 손댈 수 없고
-> 개발한거면 ui를 마음대로 할 수 있다.
-> 접속 도구 중 사용할 것은 dbeaver이다.
-> 금융은 오렌지나 토드, 오라클은 sqldeveloper, ..
-> 우린 db 2,3가지 써봐야 하기에 다 가능한 dbeaver를 쓰는거야!
data store랑 접속도구 간 해석(interface)을 도와주는 것이 필요한다.
Driver : application 과 databse의 인터페이스
4가지 정보가 필요함
정보 : db 종류, URL(위치), 계정(account, id), 비밀번호(pwd) 총 4 가지 정보가 필요한 것이다.
db는 mysql, 내컴퓨터(localhost), db이름 user 이름, user비밀번호
모든 db는 시스템 계정이 존재하며, 관리자는 local에서만 접속해야 한다.(외부 접근 금지, 보안을 위해서)
authentication(인증) - 신원검증
autherization(인가) - 어떤 권한까지?
db종류
db: mysql
포트번호 : 컴퓨터 안에서 프로그램을 구분해준다.
뒤에mysql : mysql 자체 포트번호
앞에mysql : 외부에서 사용할 때 쓰는 번호
sample 데이터 설치해봐야겠다!
-> 일반적인 개발에서는 5개를 본다.
DDL, DML, DCL
(definition) 정의 : create, alter, drop, (rename, truncate)
--> 설계의 영역
(manpulation) 조작
-> insert, update, delete
-> select (조회, 데이터의 변경을 가하지 않음, 분리를 시키자 : DQL)
-> 이 부분이 개발자나 사용자의 영역이다.
(Control) 제어
-> grant, revoke(권한 부여, 회수) : 전통적, 관리의 영역
-> commit, rollback(작업 완료, 처리 : TCL(트랜잭션 제어, 관리의 영역이 아닌 개발의 영역이다.))
CQRS : 조회랑 조작은 따로 있어야 하니 개발 때 부터 아예 따로 만들어라. (분리시키자.)
docker run --name mysql -dit -e MYSQL_ROOT_PASSWORD= 관리자비밀번호 -e MYSQL_DATABASE=데이터베이스이름 -e MYSQL_USER= 사용자이름 -e MYSQL_PASSWORD= 사용자비밀번호 -p 3306:3306 mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
코드상 \n을 한 것은 다 없애주자.
collation-server : 정렬순서
--character-set-server=utf8mb4 : 한국어도 가능하게 utf8하고 mb4는 이모지 사용 가능하도록
--default-authentication-plugin=mysql_native_password 이중화가 아닌 이전 버전처럼 비밀번호 입력하면 되되록 하자.
만들어진 Connection을 선택하고 마우스 우클릭으로 연결을 누르자.
show databases;
create database 이름;
drop database 이름;
use db이름;
show tables;
MySQL의 작업단위는 Database>Table 이다.
Oracle은 SID(Service Name)>User>Table 이다.
Oracle은 user별 데이터 공유가 안된다.
DESC 테이블이름;
- EMPNO - 사원번호, 정수 4자리, Primary Key
- Primary Key : Not Null, Unique, 테이블에 1개씩만 존재- ENAME - 이름, 문자
- JOB - 직무, 문자
- MGR - 관리자 사원번호, 정수 4자리
- HIREDATE - 입사일, DATE
- SQL - 급여, 실수이고 소수 2자리
- COMM - 상여금, 실수이고 소수 2자리(NULL 포함)
- DEPTNO - 부서번호, 정수 2자리, DEPT 테이블의 DEPTNO를 참조
- Foreign Key
- DEPTNO - 부서번호, 정수 2자리, Primary Key
- DNAME - 부서이름, 문자
- LOC - 위치, 문자
EMP, DEPT 테이블은 DEPTNO로 연결되어있다.
- GRADE - 호봉, 숫자, Primary Key
- LOSAL - 호봉의 최소 급여, 정수
- HISAL - 호봉의 최대 급여, 정수
- NAME - 도시이름, 문자, Primary Key
- AREA - 면적, 정수
- POPU - 인구, 정수
- METRO - 대도시 여부, 문자
- REGION - 도, 문자
- NAME - 이름, 문자, Primary Key
- DEPART - 부서이름, 문자
- GENDER - 성별, 문자
- JOINDATE - 입사일, 날짜
- GRADE - 직무, 문자열
- SALARY - 급여, 정수
- SCORE - 고과 점수, 실수, 소수 2자리
5select 1from 2where 3group by 4having 6order by
앞에 순서가 작동 순서이다.
실행순서와 작동순서가 다르다.(비 절차적)
- from : 조회할 테이블 이름 나열(필수)
- where : 검색 조건 - 행을 분할
- group by : 그룹화
- having : 그룹화 한 이후의 조건
- select : 조회할 열 - 열을 분할(필수)
- order by : 정렬 조건
mysql(maria db에도 존재) 같은 경우에는 마지막에 limit을 사용하는 것이 가능
sql 튜닝 : 먼저 걸러내라
select * from 테이블이름;
select 컬럼 이름 나열(, 로 구분하면서 나열) from 테이블 이름
- MySQL의 경우는 테이블 이름은 대소문자를 구분하고 컬럼 이름은 대소문자를 구분하지 않음
- Oracle의 경우는 테이블이름 과 컬럼 이름 모두 대소문자를 구분하지 않음
" "
로 감싸줘야 합니다.+,-,*,/
를 이용해서 컬럼에 연산을 수행한 후, 출력이 가능합니다.concat
함수 이용distinct
함수를 이용함group by
를 이용해서도 작성이 가능함 -- tCity 에서 region값을 조회하고 싶어 // 중복없이 보고싶어 select DISTINCT region from tCity; select region from tCity group by region; -- group by 는 동일한거 묶는거여서 되는거야 -- 해당 결과의 CARDINALITY 는 5, DEGREE 는 1이다. -- 두 개 이상을 검색하려면 둘 다 같아야지 중복으로 본다. select DISTINCT region, name from tCity;
ORDER BY 컬럼이름 (ASC)|DESC
ORDER BY
를 해주는 것이 좋다.-- tCity 에서 region, name, area, popu 조회하는데, -- region 오름차순 조회 select region, name, area, popu from tCity order by region; -- tCity 에서 region, name, area, popu 조회하는데, -- region 오름차순 조회이지만 동일한 값이면 area가 큰 것이 먼저 select region, name, area, popu from tCity order by region asc, area DESC ; select region as "지역", name as "이름", area, popu from tCity order by 지역 asc, 3 DESC ;
오른차순 asc는 생략 가능합니다. 내림차순은 desc 붙여야 합니다. 그리고 컬럼 순서를 별명, 이름 대신해서 쓸 수 있따.
>, >=, <, <= ,=, != ,<>, ^=, not 컬럼이름 연산자 값
varchar
대신 varbinary
를 이용(만들기 전)varchar
를 이용하면 뒤에 binary
를 추가해서 생성(위에보단 이것을 권장, 만들기전)COLLATE utf8_bin
을 추가(만든 후)binary
로 감싸서 조회(만든 후)=null
이나 !=null
은 사용할 수 없음is NULL
is not NULL
을 사용합니다.-- tStaff 테이블에서 score null인모든 컬럼 조회 select * from tStaff where score is null;
-- tCity 테이플에서 popu가 100이상이고 area가 700 이상인 데이터 조회 -- and나 or에서 조건의 순서는 결과에 영향을 미치지 않고, 과정에 영향을 미친다. select * from tCity where POPU>=100; -- 2개 데이터 select * from tCity where AREA>=700;-- 5개 데이터 select * from tCity where POPU>=100 and AREA>=700; -- 2개 데이터 고르고 뒤의 조건 확인 -- tStaff 테이블에서 salary 가 300미만이거나 score가 60이상인 직원의 모든 컬럼 조회 select * from tStaff where salary <300; -- 5개 데이터 select * from tStaff where score >=60; -- 10개 데이터 select * from tStaff where score >=60 or salary <300; -- 10개 데이터 고른 뒤 5개 데이터 보기
DON'T CARE 조건을 여기서도 생각 할 수 있다.
%a
: aaa, bba, a, ba
도 가능함 즉, a로 끝나는_a
: ba,ca
는 가능하지만 aaa, bba
불가능[글자열]
: 나열된 글자 중 하나 (표준 x)[^글자열]
: 나열된 글자가 아닌 (표준x)-- tCity 테이블에서 name에 천이 포한됨 모든 데이터 조회 select * from tCity where name like'%천%'; -- EMP 테이블에서 ename에 L이 2개 포함된 데이터를 조회 select * from EMP where ENAME like '%L%L%'; -- sale에 30%가 포함된 데이터를 조회 -- select * from ~~ where sale like '%30#%%' ESCAPE '#' ; #뒤에 나오는 것은 일반 문자로 취급 -- tStaff 테이블에서 joindate(입사일)가 10월인 사원을 조회 select * from tStaff where joindate like '%-10-%';
>=A AND <=B
의미를 가지고 있다.between A and B
로 사용하며, 순서를 바꾸면 안된다.-- tCity table에서 popu가 50에서 100사이인 데이터 조회
select * from tCity where popu >=50 and popu<= 100;
select * from tCity where popu BETWEEN 50 and 100;
-- tStaff table에서 joindate 가 2018인 데이터 조회
select * from tStaff where joindate like '2018-%';
select * from tStaff where joindate BETWEEN
'2018-01-01' and '2018-12-31';
in(데이터 나열)
형태로 작성하는데, 데이터에 포함된 데이터를 조회NOT IN(데이터 나열)
은 데이터에 포함되지 않은 데이터 조회ROWNUM
이나 INLINE VIEW
또는 FETCH~OFFSET
TOP
을 이용LIMIT
으로 제한LIMIT [건너뛸 개수,] 조회할 개수
LIMIT 조회할 개수 OFFSET 건너뛸 개수
형태로 입력 가능(권장)ORDER BY
와 같이 사용됨
- 수치 함수
ABS
ROUND(데이터, 반올림할 자릿수 설정) : 음수 이용하면 0자리부터 위로감
TRUNCATE
CEILING, FLOOR
MOD(나머지)
- 문자열 함수
ASCII(문자), CHAR(숫자) : 문자와 코드 값 변환
BIT_LENGTH, CHAR_LENGTH, LENGTH : 길이
select CHAR_LENGTH("문자열"), LENGTH("문자열");
char_length : 진짜 길이
length : 바이트 단위 길이 (한글은 3, 영어는 1)
bit : 8bits -> 1byte 그러니 *8하면 되겠지
UPPER, LOWER : 영문 대소문자 변환
LTRIM, RTRIM : 좌, 우 공백 제거
TRIM : 양쪽 공백 제거
REPLACE(문자열, 원래 문자열, 변경할 문자열) : 문자열 변경
SUBSTRING(문자열, 시작위치, 자를 개수) : 문자열 자르기
CONCAT(문자열 나열) : 문자열을 하나로 결합
-- EMP table에서 HIREDATE가 1981년인 데이터 조회 select * from EMP where HIREDATE like '1981%'; select * from EMP where SUBSTRING(HIREDATE,1,4)='1981'; -- EMP table에서 ENAME이 E로 끝나는 사원 정보를 조회 select * from EMP where ENAME like '%E'; select * from EMP where SUBSTRING(ENAME, -1, 1) ='E'; select * from EMP where SUBSTRING(ENAME, CHAR_LENGTH(ENAME),1) ='E'; -- 만약 ENAME에 한글이름이 있었따면 char_length이용, 영어면 같으니 length 가능 select LENGTH(ENAME) from EMP; select CHAR_LENGTH(ENAME) from EMP;
- 날짜 관련 함수
- DB에서는 날짜를 숫자로 취급합니다.
- 날짜와 날짜 그리고 날짜와 정수 사이 연산이 가능합니다.
- 하루를 1로 간주합니다.
- 현재 날짜 및 시간
- CURRENT_DATE(), CURDATE() : 현재 날짜
- CURRENT_TIME(), CURTIME() : 현재 시간
- NOW(), LOCALTIME(), LOCALTIMESTAMP(), CURRENT_TIMESTAMP() : 현재 날짜 및 시간 (timestamp가 들어간 것이 더 정확함 1/1000초, 1/1000000초였나..)
- 날짜 및 시간 추출 함수
- YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, MICROSECOND
- 날짜 및 시간 계산 함수
- ADDDATE(날짜, 차이), SUBDATE(날짜, 차이)
- ADDTIME(날짜, 차이), SUBTIME(날짜, 차이)
- DATEDIFF(날짜1, 날짜2), TIMEDIFF(날짜1, 날짜2)
- 특정 날짜 생성
- STR_TO_DATE(날짜 문자열, 서식)- 날짜에 특정 기간을 추가
- 날짜 + INTERVAL 값 단위
저도 개발자인데 같이 교류 많이 해봐요 ㅎㅎ! 서로 화이팅합시다!