✍🏻 28일 공부 이야기.
jupyter notebook 또는 vscode프로그램을 실행시킨 후 sql_ws 폴더에서 시작!
AWS RDS로 생성한 database-1 사용
이전에 작성해둔 police_station 데이터 삭제
python.ipynb 파일 하나 생성
먼저, MySQL Driver를 설치해야한다.
pip install mysql-connector-python
위 코드를 실행한 후, import mysql.connector
를 실행시켰을 때 에러가 안 나면 된다.
📌 MySQL에 접속하기 위한 코드
변수명 = mysql.connector.connect(
host = "호스트이름",
user = "사용자이름",
password = "비밀번호"
)
기본적인 위 코드를 바탕으로 Local Database와 AWS RDS(database-1) 연결에 대해 알아보자.
local = mysql.connector.connect(
host = "localhost",
user = "root",
password = "비밀번호"
)
remote = mysql.connector.connect(
host = "database-1.cohcgh9bucnv.ap-southeast-2.rds.amazonaws.com",
port = 3306,
user = "admin",
password = "비밀번호"
)
연결을 다 했으면
변수명.close()
를 통해 연결을 끊어줘야한다.
📌 특정 database에 접속하기 위한 코드
변수명 = mysql.connector.connect(
host = "호스트이름",
user = "사용자이름",
password = "비밀번호",
database = "데이터베이스이름"
)
📌 쿼리를 실행하기 위한 코드
커서명 = 변수명.cursor()
커서명.excute("쿼리")
테이블을 생성해보자.
테이블을 삭제해보자.
📌 SQL 파일을 실행하기 위한 코드
커서명 = 변수명.cursor()
sql파일을읽은변수명 = open("파일명.sql").read()
커서명.execute(sql파일을읽은변수명)
sql파일을 생성해보고 실행해보자.
하지만, 파일 안에 쿼리가 여러 개인 경우 에러가 뜬다는데.. (나는 에러없이 실행은 정상적으로 되었지만 데이터가 insert되진 않았다. 심지어 테이블을 생성하는 코드는 multi 옵션 없이도 동작했다. 이유는 아직 모르겠음😓)
일단 대체적으로 쿼리가 여러 개인 경우는 옵션을 하나 더 추가해줘야 한다.
커서명 = 변수명.cursor()
sql파일을읽은변수명 = open("파일명.sql").read()
커서명.execute(sql파일을읽은변수명, multi = True)
sql파일을 생성해보고 실행해보자.
쿼리를 실행한 결과값을 변수에 담을 수 있다.
result = 변수명.fetchall()
for data in result:
print(data) # row마다 출력됨
sql_file 테이블을 조회해보자.(읽어올 데이터 양이 많은 경우 buffered = True 옵션을 주자)
검색 결과를 Pandas로 읽어보자.
csv 파일에 있는 데이터를 Python으로 insert해보자.
import pandas as pd
import mysql.connector
# csv 파일 읽기
df = pd.read_csv("police_station.csv")
df.head()
# 데이터베이스 연결
remote = mysql.connector.connect(
host = "database-1.cohcgh9bucnv.ap-southeast-2.rds.amazonaws.com",
port = 3306,
user = "admin",
password = "비밀번호",
database = "zerobase"
)
# cursor 만들기
cursor = remote.cursor(buffered=True)
# insert 문 만들기
sql = "insert into police_station values (%s , %s)"
# 컬럼 두 개의 정보를 읽기 위함
# 데이터 입력
for i , row in df.iterrows():
cursor.execute(sql, tuple(row)) # 데이터가 튜플형태로 담겨진 것을 sql %에 들어감
remote.commit()
# 결과 확인
cursor.execute("select * from police_station")
result = cursor.fetchall()
# 검색 결과를 pandas로 읽기
df = pd.DataFrame(result)
df.head()
🤔 csv파일을 pandas 데이터프레임으로 읽은 것을 다시 sql 테이블에 데이터를 집어넣어주고 이를 다시 또 pandas 데이터프레임으로 읽어들였다.. 처음에 pandas로 읽은 것을 다시 또 읽는.. 똑같은 작업을 2번 하는게 이해가 안되었지만 나중에 쓰이는 곳이 있겠지..?
local database에 접속하고 zerobase 데이터베이스로 이동해주기.
use zerobase;
Primary key | Foreign key |
---|---|
테이블의 각 레코드를 식별 | 한 테이블을 다른 테이블과 연결해주는 역할 |
중복되지 않은 고유값을 포함 | 참조되는 테이블의 항목은 그 테이블의 기본키(혹은 단일값) |
NULL 포함 안 됨 | |
테이블 당 하나의 기본키를 가짐 |
📌 Primary key 생성 방법
CREATE TABLE 테이블이름
(
....
CONSTRAINT constraint_name
PRIMARY KEY (컬럼이름1, 컬럼이름 2, ...) <-- 기본키는 1개 이상일 수 있음 -->
)
ALTER TABLE 테이블이름
ADD CONSTRAINT constraint_name PRIMARY KEY (컬럼이름1, 컬럼이름 2, ...)
📌 Primary key 삭제 방법
ALTER TABLE 테이블이름
DROP PRIMARY KEY <-- 모든 기본키가 삭제됨 -->
📌 Foreign key 생성 방법
CREATE TABLE 테이블이름
(
....
CONSTRAINT constraint_name
PRIMARY KEY (컬럼이름1, 컬럼이름 2, ...)
CONSTRAINT constraint_name
FOREIGN KEY (컬럼이름3, 컬럼이름 4, ...) REFERENCES 참조하는 테이블이름(참조 컬럼이름)
)
ALTER TABLE 테이블이름
ADD FOREIGN KEY (컬럼이름1, 컬럼이름 2, ...) REFERENCES 참조하는 테이블이름(참조 컬럼이름)
📌 자동 생성된 CONSTRAINT를 확인하는 방법
SHOW CREATE TABLE 테이블이름
📌 Foreign key 삭제 방법
ALTER TABLE 테이블이름
DROP FOREIGN KEY 삭제할 외래키 이름
앞서 생성한 prime_station의 name 컬럼을 기본키로, crime_status의 police_station을 외래키로 설정해보자.
Step1. 둘은 기본키, 외래키로 설정 가능한지 확인해야함.
: 두 컬럼은 모두 31개의 데이터로 동일하긴 하고 데이터가 잘 매치되는 것을 보아 기본키, 외래키로 설정할 수 있다. 하지만 police_station에는 구 이름이, name에는 경찰서의 full name이 들어가 있으므로 나중에 이를 맞춰주는 작업이 필요할 듯하다.
Step2. prime_station의 name 기본키 지정
Step3. crime_status의 police_station 외래키 지정
: 그냥 지정하게 되면 두 데이터가 일치되지 않기 떄문에 에러가 뜬다.
그래서 새로운 컬럼 reference
를 만들어 외래키로 지정해주고자 한다.
값 채워주기 |
---|
AWS RDS(database-1)에 접속
crime_status 테이블 데이터 확인
SELECT count(컬럼이름)
FROM 테이블이름
WHERE 조건
SELECT sum(컬럼이름)
FROM 테이블이름
WHERE 조건
SELECT avg(컬럼이름)
FROM 테이블이름
WHERE 조건
SELECT min(컬럼이름)
FROM 테이블이름
WHERE 조건
SELECT max(컬럼이름)
FROM 테이블이름
WHERE 조건
집계함수는 group by와 함께 자주 사용된다. distinct
와 달리 정렬을 할 수 있다는 장점이 있다.
SELECT 컬럼이름
FROM 테이블이름
GROUP BY 컬럼이름
ORDER BY 컬럼이름
WHERE 조건
조건에 집계함수가 포함되는 경우 where대신 having을 사용한다.
SELECT 컬럼이름
FROM 테이블이름
WHERE 조건
GROUP BY 컬럼이름
HAVING 조건
ORDER BY 컬럼이름
경찰서 별로 발생한 범죄 건수의 합이 4000건 보다 큰 경우를 조회하라.