- 막대한 데이터를 관리하기 위하여 체계적으로 만든 것 , 컴퓨터가 다룰수 있는 용어로 변환시킨것
- 체계화된 데이터의 모임
- 방대한 데이터를 효율적으로 관리!!
- 여러 응용 시스템들의 통합된 정보를 저장하여, 운영할 수 있는 공용 데이터의 묶음
- DBMS: 데이터베이스를 관리하는 시스템 Realtional(관계형) Database Management System)
- 장점
- 데이터 중복 최소화
- 데이터 공유
- 일관성,무결성,보안성 유지
- 최신의 데이터 유지
- 데이터의 표준화 불가능
- 데이터의 논리적, 물리적 독립성
- 용이한 데이터 접근
- 데이터 저장 공간 절약
- 단점
- 데이베이스 전문가 필요
- 많은 비용 부담
- 시스템의 복잡함
- 관계형 데이터 베이스를 다루기 위해 알아야 함
- 관계형 데이터베이스 관리 시스템에서 데이터를 관리하기 위해 사용되는 표준 프로그래밍 언어
- 데이터 정의 언어(DDL, Data Definition Language) : 데이터 구조 정의
- 테이블, 인덱스 등의 개체를 만들고 관리하는데 사용되는 명령
- 데이터 처리 언어 (DML)
- 데이터 CRUD(create생성,read읽기,update갱신,delete삭제)
- 데이터 제어 언어 (DCL)
테이블 (Table) = 관계(Relation)
컬럼(column) =필드 (Field) = 속성 (attribute)
* 로우(Row) = 레코드(Record) = 튜플(tuple)
* sechema 데이터베이스 구조와 구성을 정의하는 설계도
* date : 년,월,일,('YYYY-MM-DD')
* timestamp : 시간과 날짜
* time : 시간정보만
* MONTH,YEAR : 월만, 년도만
* TEXT,VARCHAR : 길이가 길면 text, 짧으면 varchar
* ROUND(컬럼,num) 반올림 : num 소수점 -num 정수 0이 첫번째자리에서 반올림임
* CEIL(): 올림
* FLOOR : 내림
* ABS () : 절대값
* GREAST (): 괄호안에서 제일 큰값
* LEAST() : 괄호안에서 가장 작은값
* TRUNCATE(1234.5677, x) : x의 소수점에서 짤라냄
* UCASE,UPPER : 모두 대문자로
* LCASE,LOWER : 모두 소문자로
* CONCAT('','+','') 문자열 신경안쓰고 하나의 문자열로
* CONCAT_WS('x','','+',') : x 사이의 기준으로 하느이 문자열로 ,ex) SELECT CONCAT_WS(' ',FirstName,LastName) AS FullName FROM employees
* SUBSTR (문자열,시작,끝) 시작점이 3이면 3번째 부터 읽는단 소리임
* TRUNCATE(1234.5677, x) : x의 소수점에서 짤라냄
* LEFT(문자열,4) 왼쪽에서 4개
* RIGHT(문자열,4) 오른쪽에서 4
* LENGHT(문자열,x) 문자열의 바이트 길이
* CHAR_LENGHT(문자열,x) 문자열의 길이 : 주로이거 쓸듯
* LPAD('abc',5','-') abc 의 글자가 5글자가 될댸까지 마지막 글자를 붙여씀 왼쪽에
* RPAD('abc',5','-') 오른쪽에
* REPLACE ( 'abc db abc','db','ac') db 가 ac 로 나옴 안에있는 db 전부 , 쉼표를 and 로 바꿀때 이럴때 사용
* TO_DATE() : 문자열을 date 타입으로 전환
* TO_CHAR() : date 타입을 문자열로 전환
* CRURRENT_DATE,CURDATE() : 현재 날짜 반환
* CURTIME() :현재시간
* NOW,CURRENT_TIMESTAMP : 현재 시간과 날짜 반환
* DATE,TIME : 문자열에 따라 생성
* DATE_ADD,DATE_SUB
* DATEDIFF(테이블,NOW())m,TIMEDIFF
* RANK() : RANK() OVER (PARTITION BY [컬럼] ORDER BY [정렬 기준]) as ranking
- SQL의 윈도우 함수 중 하나로, 각 그룹 내에서 순위를 매김
- 동일한 값에 대해 같은 순위를 부여
- 동일 순위가 존재하면 다음순위는 건너뜀 (1,1,3)
- 윈도우 함수이기에 값을 바로 반환시켜서 사용하지 못함 그래서 서브쿼리 나 with 절을 사용해서 밖에서 새로운 테이블을 생성하여 사용해야함
* OVER(...) : rank 절과 같이 사용됨 over 없이 랭크 사용 불가
- 윈도우 함수의 동작 범위를 지정
- 그룹화(PAARTITION BY) 와 정렬기준(ORDER BY) 를 정의
* PARTITION BY 컬럼
- 데이터를 컬럼별로 그룹화
- 각 컬럼의 데이터가 독립적인 그룹으로 나뉨
* PRIMARY KEY : 한 테이블의 각 로우를 유일하게 식별해주는 용어
- 각 테이블마다 PRIMARY KEY 는 꼭 존재해야하고, NULL 값을 허용하지 않고 ,ROW(행,레코드)마다 유일한 값이어야한다.
* FOREIGN KEY : 한 테이블의 컬럼 중 다른 테이블의 로우를 식별할수있는 키
- FOREGIN KEY (칼럼명) REFERENCES 호출될테이블명 (그테이블의칼럼명)
- 데이터의 중복성을 최소화 , 물건을 살거야 근데 사는 사람은 같고 그사람 정보는 같자나 근데 매버 다른 물품을 사는거지 그럴때마다 사는사람 정보는 동일한대 적을필요가 없다는거지 그래서 userid 를 foreign 키로 넣고 그 키를 통해 그 사람의 인적사항을 불러들일수 잇는거지,
- FOREIGN KEY 가 설정되 있는값에 INSERT INTO 로 넣을려면 FOREIGN KEY 로 연결되어 있는 테이블에 그사람의 정보가 있어야 더 추가해서 넣을수 있다 삿는데 그사람이 등록이 안돼있대? 그럼 이상하자나 먼저 등록을 하고 추가하는거지 부모에 먼저 넣는다 생각해
- 데이터 무결성(이론적으론 두테이블간 관계에 있어서 데이터 정확성을 보장하는 제약 조건을 넣는거임)
- DELETE FROM userTbl WHERE userID = --- 이렇게 삭제할라는 개 만약 FOREIGN KEY 와 연결되어 있는 칼럼이면 삭제가 안된다 연결되어있는걸 먼저 삭제 시켜야 삭제가됨 연결되어있는 곳에서 FOREGIN KEY 가 연결되어있는 id 를 먼저 삭제해야함
* DECIMAL(정수부 길이,소수점 자릿수)
* TINYINT -128~ 127 이 보통인데 0~+255 쓰려면 id TINYINT UNSIGHNED 옵션을 넣어주자
* NOT NULL : 반드시 값이 있어야대 라는 제약조건 옵션을 달아주는 것 , 칼럼 데이터에 값이 할당되지 않으면 실행안됨
* AUT0_INCREMENT : 프라이머리 키에 모든것을 확인 하기 어려워서 보통 프라이머리 키에 옵션을 추가해줌 PRIMARY KEY(id) 레코드,로우를 넣을때마다
지금까지 넣은 AUTO_INCREMENT 가 지정된 컬럼에 지금까지 사용된 최대값을 찾고 자동으로 그다음 숫자를 넣어줌
* CHAR(n) : 고정 길이 데이터 타입, 정확히 사용 3글자만 적어도 n만큼 낭비가 되버림
* VARCHAR(n) : 정해주는건 똑같지만 실제 데이터엔 적은 글자만큼만 적어짐 그래서 실제 데이터 낭비가 안나옴
# 저장이 되고 난후에 데이터를 바꾸는데 저장해논 글자보다 큰경우 굉장히 난해해짐 수정할일이 없는 데이터에 이 데이터 유형을 쓰면됨
* CREATE SCHEMA 데이터베이스명 = CREATE DATABASE 데이트베이스명
* CREATE TABLE : 테이블 명을 만들때 안에 객체 넣어줄때 모든 값은 타입을 넣어줘야한다
* SHOW TABLES,DATABASES : 생선된 테이블명 데이터베이스 명 보기
* DESC 테이블명 : 테이블 안의 설정 보기
* DROP 테이블명 : 테이블 삭제
* GROUP BY : 특정 칼럼값을 기반으로 그룹핑하기 , 무슨 각 등급별, 각 시간별 이런느낌이면 그룹핑?
* HAVING 절은 집계함수를 가지고 조건비교를 할 때 사용
- HAVING 절은 GROUP BY절과 함께 사용
- SELECT 컬럼명 FROM 테이블명 GROUP BY 컬렴명 HAVING COUNT(*) >,=,<... 숫자;
이런식으로 사용
원래 조건은 WHERE COUNT(*) 쓰는건데 집계함수를 GROUP BY 랑 같이 쓰지를 못한다 그래서 HAVING 절을 쓰는것
HAVING 절은 무조건 GROUP BY 뒤에 걍 쓰면됨 WHERER 절이랑 카운터를 같이 못써서 그럼
* 테이블 변경 명령 -> ALTEAR TABLE 테이블명 MODIFY,ADD,CHANGE,DROP COLUMN ~~
* ALTER TABLE [원본 테이블] RENAME TO [바꾸려는 테이블명]
문법: ALTER TABLE [테이블명] ADD COLUMN [추가할 컬럼명][추가할 컬럼 데이터형]
mysql> ALTER TABLE mytable ADD COLUMN model_type varchar(10) NOT NULL;
문법: ALTER TABLE [테이블명] MODIFY COLUMN [칼럼명][변경할 컬럼 타입]
mysql>ALTER TABLE mytable CHANGE COLUMN modelnumber model_num varchar(10) NOT NULL;
- 테이블 컬럼 이름 변경
```sql
문법: ALTER TABLE [테이블명] CHANGE COLUMN [기존 컬럼 명][변경할 컬럼 명][변경할 컬럼 타입]
mysql>ALTER TABLE mytable CHANGE COLUMN modelnumber model_num varchar(10) NOT NULL;
문법: ALTER TABLE [테이블명] DROP COLUMN [삭제할 컬럼 명]
mysql>ALTER TABLE mytable DROP COLUMN series;
* Create,Read,Update,Delete
* INSERT
```sql
* 테이블 전체 칼럼에 대응하는 값을 모두 넣기
* INSERT INTO 테이블명 VALUES(값 1,값2....) -> 컬럼에 해당하는 것들전부 넣어야되지만
* 테이블 특정 컬럼에 대응하는 값만 넣기
* INSERT INTO 테이블명(col1,col2,...) VALUES (값1,값2,...) col1 값 1 대응, 값을 추가할때 추가하고 싶은 컬럼에만 넣으면댐
데이터 읽기(검색) SELECT
* 테이블 전체 컬럼의 데이터 모두 읽기
- SELECT * FROM 테이블명 ;
* 테이블 특정 컬럼의 데이터만 읽기
- SELECT 컬럼1,컬럼2 FROM 테이블명;
조건문 WHERE
* SELECT * FROM students WHERE age = 16; 16살 인사람만
* !=,<,>,<=,>= 비교연산자,파이썬이랑 다른점은 같다 ==가 아니라 = .
* 논리연산자도 사용가능 WHERE age >=15 AND grade='10학년' 이런식으로 가능 ,NOT 가능
* LIKE 문자열 데이터 검색기능
* % : 0개이상의 문자를 대체 WHERE name LIKE '박%'; ->박으로 시작하는 문자열,'%민%'--> 민이라는 문자열이 있으면 출력
* _ : 단일 문자를 대체 WHERE name LIKE '_민_'; 민 앞뒤로 한글자만 있으면 출력 _는 앞에
하나만있으며언~ 인듯 ,'___' 이렇게 있으면 3글자단어 전부출력\
데이터 수정 UPDATE
* UPDATE 테이블명 SET 컬럼명 ='새로운값' WHERE 조건;
- 조건을 안쓰면 모든 컬럼명이 바꾸는데 이렇게 쓰는경우는 보통없음, 조건에 보통 PRIMARY KEY 을 넣고 사용함
* UPDATE 테이블명 SET 컬럼명1 = '값1', 컬렴명2 ='값2' WHERE 조건; 여러 칼럼이 틀린경우 한줄로 저렇게 작성 가능 대응 주의해서 사용
CASCADE : 부모 자식 테이블에 연결된 것을 지우는것 ( 제약조건 마지막에 적으면 된다.)
* [삭제] ON DELETE 옵션
ON DELETE CASCADE; : 부모 테이블의 특정 레코드가 삭제될 때, 해당 레코드를 외래 키로 참조하는 모든 자식 테이블의 관련 레코드도 함께 삭제함.
ON DELETE SET NULL; : 부모 테이블에서 레코드가 삭제되면, 자식 테이블에서 해당 외래 키를 참조하던 열의 값을 NULL로 설정함.
ON DELETE SET DEFAULT; : 부모 테이블에서 레코드가 삭제되면, 자식 테이블에서 해당 외래 키를 참조하던 열의 값을 기본값으로 설정함.
ON DELETE NO ACTION; / ON DELETE RESTRICT; : 부모 테이블에서 레코드가 삭제되지 않도록 방지함. 즉, 참조 키를 가진 레코드가 있으면 삭제를 허용하지 않음
* [수정] ON UPDATE 옵션
ON UPDATE CASCADE; : 부모 테이블의 기본 키 값이 변경될 때, 해당 값을 외래 키로 참조하는 모든 자식 테이블의 관련 레코드도 함께 업데이트함.
ON UPDATE SET NULL; : 부모 테이블에서 기본 키 값이 업데이트되면, 자식 테이블에서 해당 외래 키를 참조하던 열의 값을 NULL로 설정
ON UPDATE SET DEFAULT; : 부모 테이블에서 기본 키 값이 업데이트되면, 자식 테이블에서 해당 외래 키를 참조하던 열의 값을 기본값으로 설정
ON UPDATE NO ACTION; / ON UPDATE RESTRICT; : 부모 테이블에서 기본 키 값이 업데이트되지 않도록 방지함. 즉, 참조 키를 가진 레코드가 있으면 업데이트를 허용하지 않음
* 일부 데이터만 가져오는 기능 (현업에서 너무 낳은 데이터를 가져오면 시간이 너어어무 걸림)
- SELECT * FROM 테이블명 LIMIT 10 : 테이블 데이트 중 __최상위에 있는 10개의 데이터만 가져오기__
- SELECT * FROM 테이블명 WHERE 조건문 LIMIT 1: 특정 조건에 맞는 데이터 중 최상위에 있는 1개의 데이터 가져오기
* 결과 수 세기
- SELECT COUNT(*) FROM 테이블이름 : 테이블 전체 데이터 수 세기
- SELECT COUNT(*) FROM 테이블이름 WHERE 조건문 : 조건에 맞는 테이블 데이터 수 세기
* 특정 컬럼값 출력시 중복된 값을 출력하지 않음 ( 범주형 데이터에서 그 종류가 무엇이 있는지 파악할때 사용,
한칼럼에서 쓰인 값들이 뭔지 파악할수 있음 )
- SELECT DISTINCT 컬럼명 FROM 테이블이름 : 특정 컬럼에 들어가 있는 컬럼 종류 확인하기
- SELECT DISTINCT 컬럼명 FROM 테이블이름 조건문 : 특정 조건에 맞는 특정 컬럼에 들어가 있는 종류 확인하기)
* SELECT SUM(컬럼명) FROM 테이블이름
* SELECT AVG(컬럼명) FROM 테이블이름 WHERE 조건
- SELECT SUM(),AVG(),MAX() FROM 테이블명 이렇게 한번에 구할수도있음
* 특정 칼럼값을 기반으로 그룹핑하기 , 무슨 각 등급별, 각 시간별 이런느낌이면 그룹핑?
- SELECT rating FROM film GROUP BY rating (필름 테이블의 rating 값을 그룹핑해라, 즉 rating 값별로 출력하므로,
rating 값 종류를 확인 할 수 있음,각각의 그룹별로 레이팅값을 영화에서 보여달라)
- SELECT COUNT(*) FROM film GROUP BY rating (각 rating 값 종류별로 몇개의 데이터가 있는지 확인)
- SELECT COUNT(*) FROM film WHERE 조건 GROUP BY rating (조건에 맞는 데이터 중 rating 값 종류별로,
몇개의 데이터가 있는지 확인)
- ex SELECT rating,COUNT(*),AVG(rental_rate) FROM film GROUP BY rating <br> rating 별로 묶인
레이팅의 종류,몇개,평균은 몇인가를 구하는 것
* 특정 칼럼값을 기준으로 데이터 정렬하기
- ORDER BY 정렬할 기준 컬럼명 DESC또는ASC
- SELECT * FROM film ORDER BY rating DESC : rating 값을 기준으로 내림차순으로 정렬해라
- SELECT * FROM film ODRER BY rating ASC : 오름차순으로 정렬해라
- SELECT * FROM film WHERE 조건문 ORDER BY rating ASC 조건에 맞는 데이터를 rating 값을 기준으로 올림차순으로 정렬해라
- SELECT COUNT(*) FROM film WHERE 조건문 GROUP BY 컬럼 ORDER BY COUNT(*) ASC
<br> 조건에 맞는 데이터를 특정 칼럼값을 기준으로 그룹핑하되, rating 값을 기준으로 올림차순으로 정렬해라
- 오더바이 뒤에가 또 조건이라 생각 평균값을 기준으로~ 주로 숫자에쓰일듯?
- DESC ASC 명시 안하면 ASC 로 정렬
* 표시할 칼럼명도 다르게 하기
- SELECT COUNT(*) AS total FROM film (AS 빼도 됨 근데 가독성!!)
* 2개 이상의 테이블로부터 필요한 데이터를 연결해 하나의 포괄적인 구조로 결합시키는 연산
* 세분화 될 수 있지만 보통은 INNER JOIN 을 많이 사용함
- INNER JOIN(일반적인 JOIN) : 두 테이블에 해당 필드값이 매칭되는 (두 테이블의 모든
필드로 구성 된) 레코드만 가져옴
- OUTER JOIN
+ LEFT OUTER JOIN : 왼쪽 테이블에서 모든 레코드와 함께, 오른쪽 테이블에 왼쪽 테이블
레코드와 매칭되는 레코드를 붙여서 가져옴
+ RIGHT OUTER JOIN : 오른쪽 테이블에서 모든 레코드와 함계, 왼쪽 테이블에 왼쪽 테이블
레코드와 매칭되는 레코드를 붙여서 가져옴
* SELCET * FROM 1번테이블 INNER JOIN 2번테이블 ON 왼테이블.컬럼=오른테이블,컬럼(조건) :
매칭되는 것만 합쳐지고 나머진 안합쳐짐,조건이 맞는 양쪽꺼
이렇게 합친 테이블을 가지고 뒤에 WHERE 이나 조건을 써서 찾는 것 (조건을 쓸때 어느 테이블인지 쓰려면 테이블.컬럼명 이렇게 사용)
- ```sql
SELECT * FROM items INNER JOIN ranking ON ranking.item_code = items.item_code WHERE ranking.main_category = "ALL"
```
- ```sql
SELECT * FROM items a INNER JOIN ranking b ON a.item_code = b.item_code WHERE b.main_category = "ALL"
```
AS 구문처럼 a 로 짧게 바꿔서 쓸 수 있음, 뒤에 짧게 짧게 쓸수있음, 가독성을 위해 각글자의 대문자를따보자 같으면 2번째글짜까지
* SQL 문 안에 포함되어 있는 SQL 문 : SQL 문 안에서 ()를 사용해서 서브쿼리문을 쓸수있음
* 테이블과 테이블간의 검색시 검색범위(테이블 중 필요한 부분만 먼저 가져오도록)를 줄이는 기능에 주로 사용 , JOIN 이랑 비슷한 기능인데 다른방법 주로JOIN씀
ex)
```sql
SELECT title
FROM items
INNER JOIN ranking ON items.item_code = ranking.item_code
WHERE ranking.sub_category =
'여성신발'
같음
SELECT title
FROM items
WHERE item_code IN
(SELECT item_code FROM ranking WHERE sub_category =
'여성신발')
* 같은 조건이 있어야만 쓸 수 있다
```
SELECT 을 빠르게, 성능을 개선하기 위해 사용, 특정 범위로 특정하려고
WHERE retnal_rate > (SELECT AVG(rental_rate) FROM film)