2023. 3. 16. 16:31ㆍ학습일지
*Data: 자료
*DataBase: 자료를 통합하여 관리하는 집합체, 저장소
*DBMS(Database Management System, 데이터베이스 관리 시스템)
: 데이터베이스를 관리해주는 소프트웨어
DBMS 종류 예 -> Oracls, MySQL 등
Database Model에 Relational라고 적힌 경우 SQL(언어)를 사용하는 데이터베이스임
MongoDB는 Database Model에 Document라고 적혀있는데 Relational에 비해 안정성은 떨어지더라도 속도가 훨씬 빠르다
MariaDB의 경우 MySQL과 거의 같음. 마리아만든 사람들이 MySQL 만든 사람들이래
DBMS의 사용 이유
- 중복된 데이터를 제거하거나 관리할 수 있음
- 효율적인 데이터를 처리
- 자료를 구조화시킬 수 있음
- 다양한 프로그램을 사용하는 사용자들과 데이터를 공유할 수 있다
MySQL서버 다운로드
1. https://dev.mysql.com/downloads/mysql/
2. Windows(x86, 32 & 64-bit), MSI Installer
기존에 사용하던 방식으로 사용
MySQL root password: 1234
정보를 요청하는쪽 정보를 제공하는 쪽
Client ---------> Server
관계형 데이터베이스(RDBMS)
- DataBase -> Talbe(엑셀과 비슷)
- 행(로우, 레코드), 열(필드, 컬럼)
- SQL 언어를 사용
SQL(Structured Query Language)
- 데이터베이스에서 데이터를 정의, 조작, 제어하기 위해 사용하는 언어
- 대소문자를 구별하지 않음
- 문자열을 저장할 때 싱글쿼트(' ') 만 사용한다
sql = select*from tb_member where userid='apple'
주석문
한 줄 주석문: # 또는 --
Schema -> 구조
워크벤치에서는 끝에 세미콜론을 넣어줘야 함
실행 -> Ctrl+Enter
주석문
한 줄 주석문: # 또는 --
# 데이터베이스 확인하기
show databases;
# 데이터베이스 생성하기
# creat database 데이터베이스명;
create database kdt;
# 데이터 베이스 삭제하기
# drop database 데이터베이스명;
drop database kdt;
테이블(table)
데이터를 행과 열로 스키마에 따라 저장할 수 있는 구조
✔스키마
데이터베이스의 구조와 제약조건에 관한 명세를 기술한 집합의 의미
create table 테이블명(
필드명1 데이터타입 제약조건,
필드명2 데이터타입 제약조건,
필드명3 데이터타입 제약조건,
...
필드명n 데이터타입 제약조건
)
데이터 타입(Data Type)
1. 숫자형 타입
tinyint: 정수형 데이터 타입 ( 1byte), -128~127 표현
smallint: 정수형 데이터 타입( 2byte ), -32768~32767 표현
mediumint: 정수형 데이터 타입( 3byte), -8388608~8388607 표현
int: 정수형 데이터 타입( 4byte )-21억~21억
bigintP: 정수형 데이터 타입( 8byte ), 무제한 표현
float : 부동 소수형 데이터 타입(4byte)
decimal: 고정 소수형 데이터 타입( 길이 + 1byte )
double: 부동 소수형 데이터 타입( 8byte )
2. 문자형 타입
char: 고정 길이 데이터 타입( 최대 255byte ). 지정된 길이보다 짧은 데이터를 입력할 때 나머지 공간을 공백으로 채움
varchar: 가변 길이 데이터 타입(최대 655535byte). 지정된 길이보다 잛은 데이터를 입력할 때 나머지 공간은 채우지 않음
text: 문자열 데이터 타입 (최대 655535byte)
longtext: 무제한 문자열 데이터 타입
3. 이진 데이터 타입
binary 또는 byte: char의 형태의 이진 데이터 타입( 최대 255byte )
varbinary: varchar의 형태의 이진 데이터 타입( 최대 65535byte )
4. 날짜 데이터 타입
date: 날짜(년도, 월, 일) 형태의 데이터 타입( 3byte )
datetime: 날짜와 시간 형태의 데이터 타입( 8byte )
timestamp: 1970년 1월 1일 0시 0분 0초부터 시작한 ms 타입의 시간이 저장( 4byte )
제약 조건(constraint)
데이터의 무결성을 지키기 위해 데이터를 입력 받을 때 실행되는 검사 규칙을 의미
not null
- null 값을 허용하지 않음
- 중복값을 허용
unique
- 중복값을 허용하지 않음
- null값을 허용
primary key
- null값을 허용하지 않음
- 중복값을 허용하지 않음
- 테이블에 단 하나만 사용
- 테이블의 대표
foreign key
-primary key를 가진 테이블과 연결하는 역할
default
- null 값을 삽입할 때 기본이 되는 값을 저장할 수 있게 함
enum
- 원하는 범위를 설정하고 해당 범위의 값만 저장 # 권장하지않음
# 데이터베이스 선택
# use 데이터 베이스명
use kdt;
# 테이블 만들기
create table member(
userid varchar(20) primary key,
userpw varchar(200) not null,
username varchar(20) not null,
hp varchar(20) not null,
email varchar(50) not null,
gender varchar(10) not null,
ssn1 varchar(6) not null,
ssn2 varchar(7) not null,
zipcode varchar(100),
address1 varchar(100),
address2 varchar(100),
address3 varchar(100),
regdate datetime default now(),
point int default 0
);
#테이블 확인하기
#desc 테이블명
desc member;
# 테이블 삭제하기
# drop table 테이블명
drop table member;
#테이블 필드 추가
#alter table 테이블명 add 컬렴명 데이터타입 제약조건
alter table member add mbti varchar(10);
# 테이블 필드 수정하기
#alter table 테이블명 mdify column 컬럼명 데이터타입 제약조건
alter table member modify column mbti varchar(20);
# 테이블 필드 삭제
#alter table 테이블명 drop 컬럼명
alter table member drop mbti;
# 데이터 삽입하기
#insert into 테이블명 values (값1, 값2, 값3..)
#insert into 테이블명 (필드명1, 필드명2, 필드명3 ..) values(값1, 값2, 값3..)
create table word(
eng varchar(50) primary key,
kor varchar(50) not null,
lev int
);
desc word;
insert into word values('apple','사과','1');
select * from word;
insert into word value('banana', '바나나'); #Error Code: 1136. Column count doesn't match value count at row 1
insert into word value('orange', null,null); #Error Code: 1048. Column 'kor' cannot be null
insert into word (eng, kor, lev) values('melon','메론',1);
insert into word (eng, kor, lev) values('orange', '오렌지');
insert into word (eng) values('grapes'); #Error Code: 1364. Field 'kor' doesn't have a default value
desc member;
select*from member;
insert into member (userid, userpw, username, hp, email, gender, ssn1, ssn2) values('apple', '1234','사과','010-1111-1111', 'apple@apple', '여', '000000','0000000');
insert into member (userid, userpw, username, hp, email, gender, ssn1, ssn2) values('banana', '1234','바나나','010-1111-1111', 'banana@banana', '여', '000000','0000000');
insert into member (userid, userpw, username, hp, email, gender, ssn1, ssn2) values('orange', '1234','오렌지','010-1111-1111', 'orange@orange', '여', '000000','0000000');
insert into member (userid, userpw, username, hp, email, gender, ssn1, ssn2) values('melon', '1234','멜론','010-1111-1111', 'melon@melon', '여', '000000','0000000');
insert into member (userid, userpw, username, hp, email, gender, ssn1, ssn2) values('grapes', '1234','포도','010-1111-1111', 'grapes@grapes', '여', '000000','0000000');
select*from member;
# 데이터 삭제하기
# delete from 테이블명;
# delete from 테이블명 where 조건절;
delete from member; #Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect.
# 조건절의 예)
delete from member where userid = 'apple'; # userid가 apple인 사용자를 삭제
delete from member where gender = '남자';
# 데이터 수정하기
# update 테이블명 set 필드명1 = 값1, 필드명2 = 값2...
# update 테이블명 set 필드명1 = 값1, 필드명2 = 값2... where 조건절;
update member set point=100;
update member set point=point+50;
update member set point=point+300 where gender ='여';
#banana 회원의 이메일을 banana@naver.com 변경
update member set email='banana@naver.com'where userid ='banana';
#오렌지 회원의 우편번호를 '12345',주소1은 '서울시 서초구',주소2는'양재동', 주소3은 '아파트 101동 101호'로 변경
update member set zipcode='12345', address1='서울시 서초구', address2='양재동', address3='아파트 101동 101호'where username='오렌지';
SQL 연산자
1. 산술 연산자
+,-,*,/,mod(나머지 연산), div(몫)
2. 비교 연산자
=(같다, 조건절),<,>,>=,<=,<>(다르다)
3. 대입 연산자
= (같다, 조건절)
4. 논리 연산자
and, or,not, xor
5. 기타 연산자
is: 양쪽이 모두 같으면 true 아니면 false
between A and B: 값이 A 보다는 크거나 같고, B보다는 작거나 같으며 true 아니면 false
in: 매개변수로 전달된 리스트에 값이 존재하면 true 아니면 false
like: 패턴으로 문자열을 검색하여 값이 존재하면 true 아니면 false
# 데이터 검색
# select 필드명1, 필드명2...from 테이블명;
select 100;
select 100+50;
use kdt;
select userid, username,gender from member;
# 별명
# select 필드명 as 별명 from 테이블명;
select 100 + 50 as '덧셈'; -- ''를 사용하는 이유는 띄어쓰기가 있을 수 있어서 사용
select 100 + 50 as '덧셈 연산';
select 100 + 50 as 덧셈;
select 100 + 50 덧셈;
select userid as 아이디, username as 이름, hp as 휴대폰번호 from member;
# 모든 컬럼 가져오기( 추천하지않음)
select * from member;
# null과
select null; #데이터가 없음, insert가 되지 않은 것
select''; # 해당 셀에 '' 데이터가 삽입된 것
select 100 +null; #결과 : null, 연산 할 수 없음
select 100 +''; # 결과:100, 연산할 수 있음
# 조건절
#select 필드명1, 필드명2 ... from 테이블명 where 조건절
select userid, username, hp, email from member where userid ='apple';
select userid, username from member where gender='남자';
select userid, username, point from member where point >=300;
# 로그인
select userid, username, hp, email, point from member where userid='apple' and userpw= '1111';
#is
select userid, username, hp from member where address1 = 'null'; -- x
select userid, username, hp from member where address1 = null; -- x
select userid, username, hp from member where address1 is null;
select uesrid, username, hp from member where address1 is not null;
update member set point = 300 where userid ='grapes';
select * from member;
select userid, username, point from member where point between 300 and 600;
select userid, username, point from member where point between >= 300 and point <=600;
# like 연산자
select userid, username from member where userid like 'a%'; -- a로시작하는 문자열
select userid, username from member where userid like '%a'; -- a로 끝나는 문자열
select userid, username from member where userid like '%a%'; -- a가 들어가는 문자열
select userid, username from member where userid like '%app%'; -- app가 들어가는 문자열
select userid, username from member where userid like 'app__'; -- app가 시작하는 5글자
# 정렬
# select 필드명1 필드명2... from 테이블명 order by 정렬할 필드명 [asc,desc]
select userid, username, point from member order by userid asc; # 아이디로 오름차순
select userid, username, point from member order by userid desc; # 아이디로 내림차순
select userid, username, point from member order by userid; # 아이디로 오름차순
# 포인트를 기준으로 내림차순하고 같은 포인트인 경우 아이디로 내림차순
select userid, username, point from member order by point desc, userid desc;
# 조건절 + 정렬
# select 필드명1, 필드명2... from 테이블명 where 조건절 order by 정렬한 필드명[asc,desc];
# 성별이 여성인 회원을 point가 많은순으로 정렬(단, 포인트가 같을 경우먼저 가입한 순으로 정렬)
select userid, username, gender,point regdate from member where gender='여자'order by point desc, regdate asc;
# limit
# select 필드명1, 필드명2.. from 테이블명 limit 가져올 행의 갯수
# select 필드명1, 필드명2... from 테이블명 limit 시작행, 가져올 행의 갯수
select * from member;
select userid, username, gender from member limit 3;
select userid, username, gender from member limit 3,2; # 인덱스 3행부터 2개의 행을 가져옴
# 정렬 + limit
# select 필드명1, 필드명2 .. from 테이블명 order by 정렬할 필드명 [asc, desc] limit 가져올 행
select userid, username, point from member order by point desc limit 3;
# 집계함수
# count : 행의 갯수를 세는 함수
# 전체인원을 알고싶다!: primary key가 적용되어 null이 포함될 수 없음
select count(userid) as 전체인원 from member; # 5
# 주고를 입력한 인원을 알고싶다! : null이 있으면 주소를 입력하지 않았음
select count(zipcode)as 우편번호 from member; # 1 null을 제외하고 갯수를 셈
# sum: 행의 값을 더함
select sum(point) as 포인트합 from member;
select userid, sum(point) as 포인트합 from member;
# avg : 행 값의 평균을 구함
select avg(point) as 평균 from memeber;
# min : 행의 최소값을 구함
select min(point) as 최소값 from memeber;
# max : 행의 최대값을 구함
select max(point) as 최대값 from memeber;
# 그룹
# select 그룹을 맺은 컬럽 또는 집계함수 from 테이블명 group by 그룹을 맺을 필드명;
select * from member;
select gender from member group by gender;
select gender, sum(point) as 합계 from member group by gender;
select gender, avg(point) as 평균 from member group by gender;
select gender, count(userid) as 인원수 from member group by gender;
# 그룹 + 조건
# select 그룹을 맺는 컬럼 또는 집계함수 from 테이블명 group by 그룹을 맺을 필드명 having 조건절;
select gender from member group by gender having gender = '여자';
select * from member;
insert into member (userid, userpw, username, hp, email, gender, ssn1, ssn2) values('watermelon', '1234','수박','010-1111-1111', 'watermelon@watermelon', '여', '000000','0000000');
# 조건절 + 그룹 + 그룹조건 + 정렬
# select 그룹을 맺은 컬럼 또는 집계함수 from 테이블명 where 조건절 group by 그룹을 맺을 필드명 having 조건절 order by 정렬할 필드명 [asc, desc];
# 포인트가 0이 아닌 회원들 중에서 남,여로 그룹을 나눠 포인트의 평균을 구하고 평균 포인트가 100 이상인 성별을 검색 하여 포인트로 내림차순 정렬
select gender, avg(point) as avg from member where point > 0 group by gender having avg>= 100 order by avg desc;
SQL과 파이썬의 다른점은 어제 수업이 오늘도 이어진다.
개념을 배워도 어제 배운 예시를 이용해야하고 그러기 때문에 더욱 더 복습이 필요한 것 같다.
그리고 오늘 과제를 끝냈다. 과제는 파일을 분류시키는것이였다. 너무 어려워서 주변에 도움을 얻어 해봤다.
하면서도 이게 맞나 하는 생각과 함께 했지만 결과를 보니 행복했다.
import os
import glob
import shutil
import pathlib
os.getcwd()
'/content'
target_path = './drive/MyDrive/Colab Notebooks/사진'
# 사진 파일 이름 모아놓기
pic = []
for filename in os.listdir(target_path):
if '.jpg' in filename:
pic.append(filename)
print(pic)
['소금호수.2.jpg', '일본.1.jpg', '달.2.jpg', '늑대와 달.2.jpg', '제주도.1.jpg', '서울.1.jpg', '은하수.2.jpg']
# 폴더 경로 생성
file_name = ['1번', '2번']
new_path = [] # 폴더 경로 지정(문자열)
new_dir = [] # 폴더 경로타입의 경로
for i in range(len(file_name)):
new_path.append(os.path.join(target_path, file_name[i])) # os.path .join (각각 넣어서 새로운 폴더경로 생성)
new_dir.append(pathlib.Path(new_path[i]))#pathlib.path (문자형태를 경로형태로 변경)
new_dir[i].mkdir(parents = True, exist_ok=True)
print(new_path)
['./drive/MyDrive/Colab Notebooks/사진/1번', './drive/MyDrive/Colab Notebooks/사진/2번']
# 파일들을 분류
num = []
for p in pic:
l_and = p.split('.')
num.append(l_and[1])
#print(num)
for i in range(len(pic)):
if num[i] == '1':
shutil.copy(target_path + '/' + pic[i], new_path[0] + '/' + pic[i])
else:
shutil.copy(target_path + '/' + pic[i], new_path[1] + '/' + pic[i]) #shutil.copy (폴더에 복사해서 넣기)
print(num)
print(num[0] == '1')
'학습일지' 카테고리의 다른 글
20230317 kdt 시험 (2) | 2023.03.20 |
---|---|
20230320 kdt 학습일지 (0) | 2023.03.20 |
20230315 kdt 학습일지 (0) | 2023.03.15 |
20230314 kdt 학습일지 (0) | 2023.03.14 |
20230313 kdt 학습 일지 (1) | 2023.03.14 |