본문 바로가기
TIL _Today I Learned/2024.08

[DAY 20] SQL

by gamdong2 2024. 8. 7.
[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 9기
학습일 : 2024.08.07

📕 학습 목록

  • DBeaver (통합 DB 관리 도구)
  • SQL (DML; 데이터 조작 언어)
  • Python - MariaDB 연동

 

📗 기억할 내용

1) DBeaver

  • 통합 DB 관리 도구; 다양한 DB를 한 곳에서 관리하고 쿼리를 실행할 수 있게 도와줌
  • 다양한 데이터베이스 시스템과 호환됨(MySQL, PostgreSQL, Oracle, SQL Server, SQLite 등)
  • 여기선 MariaDB - DBeaver 연결
DBeaver 실행 화면

 
2) SQL (DML; Data Manipulation Language)

  • DML(데이터 조작 언어) : 데이터 검색•등록•갱신•삭제

① DML 구조 : CRUD

C (create 생성) : INSERT INTO ~ VALUES   "행 데이터 or 테이블 데이터 삽입"
R (read 읽기) : SELECT ~ FROM ~ WHERE   "테이블 데이터의 검색 결과 집합 취득'
U (update 수정) : UPDATE ~ SET ~ WHERE  "표 업데이트"
D (delete 삭제) : DELETE FROM ~ WHERE   "테이블에서 특정 행 삭제"
-- 데이터 입력
INSERT INTO tb_board(
    title,
    content,
    user_id
) VALUES (
    '글제목',
    '글내용',
    1
)

-- 데이터 수집
UPDATE tb_board
SET
    title = '수정된 제목'
WHERE id = 1

-- 데이터 검색
SELECT
    id,
    title,
    content
FROM
    tb_board
WHERE 1=1  -- 항상 True -- 모든 행 삭제 : WHERE 구문 아예 삭제해도 됨
    AND id = 1
    AND title = '제목1'

-- 데이터 삭제
DELETE FROM
    tb_board
WHERE id = 1

 

② 두 테이블 연결 : JOIN 

  • 두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 냄
INNER JOIN(내부 조인) : 두 테이블을 조인할 때, 두 테이블에 모두 지정한 열의 데이터가 있어야 함
OUTER JOIN(외부 조인) : 두 테이블을 조인할 때, 1개의 테이블에만 데이터가 있어도 결과 도출O
CROSS JOIN(상호 조인)  : 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인
SELECT ~ FROM ~ (AS) ~ JOIN ~ (AS) ~ ON
CREATE TABLE tb_board_comment (
    id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    board_id BIGINT NOT NULL,
    user_id BIGINT NOT NULL,
    comment VARCHAR(200) NULL,
    create_date DATETIME DEFAULT CURRENT_TIMESTAMP,
    update_date DATETIME DEFAULT CURRENT_TIMESTAMP,
    -- 테이블 새로 생성시 FK 지정
    FOREIGN KEY(board_id) REFERENCES tb_board(id),
    FOREIGN KEY(use_id) REFERENCES tb_user(id)
);

-- 기존 테이블에 FK 추가하기
ALTER TABLE tb_board ADD CONSTRAINT
FOREIGN KEY(user_id) REFERENCES tb_user(id);

-- 데이터 JOIN하기
SELECT *  -- 전체 column 선택
FROM 
    tb_board AS board  -- 별칭 부여
    LEFT OUTER JOIN tb_board_comment AS comment
        ON board.id = comment.board_id  -- board의 id가 comment의 board_id와 같음

 
3) Python - MariaDB 연동

  • pymysql 라이브러리 설치 : 파이썬에서,  MySQL•MariaDB 데이터베이스와 상호작용
# Python 터미널에 입력
pip install pymysql

# Anaconda Prompt에 입력
conda install pymysql
  • 파이썬에서 데이터베이스 연결 / 실행
import pypmysql  # MySQL 데이터베이스와 연결하여 작업할 수 있게 도와주는 패키지

# [데이터베이스에 연결]
def db_connect():
    conn = pypmysql.connect(
        host = '000.0.0.0',
        user = '유저아이디',
        password = '비밀번호',
        db = '데이터베이스명',
        charset = 'utf8mb4',
        # 데이터베이스를 딕셔너리로 반환
        cursorclass = pymysql.cursors.DictCursor
    )
    return conn
    
# [연결된 데이터베이스 내 테이블에 연결 → 쿼리]
# 실행할 SQL 쿼리 정의
SQL = """
      SELECT *
      FROM tb_board
      """
# SQL 쿼리 실행
with db_connect() as conn:
    with conn.cursor() as cursor:
    	cursor.execute(SQL)
        # 쿼리 결과를 변수에 저장; 딕셔너리로 반환
        results = cursor.fetchall()
        # 쿼리 결과를 콘솔에 출력
        print(results)

 

 

 

 

📘 트러블 슈팅

[문제]

  • 문제 내용
출력 과정에서 오류 발생
name = "홍길동"
age = 20
print("안녕하세요," + name "님, 당신의 나이는 " + age + "세입니다.")
{
	"name": "TypeError",
	"message": "can only concatenate str (not \"int\") to str",
	"stack": "---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[2], line 3
      1 name = \"홍길동\"
      2 age = 20
----> 3 print(\"안녕하세요,\" + name + \"님, 당신의 나이는 \" + age + \"세입니다.\")

TypeError: can only concatenate str (not \"int\") to str"
}
  • 문제 원인
1종류 이상의 자료형을 한 문장으로 출력하려면; 산술연산자(+)가 아닌 쉼표(,)로 연결

 
[해결]

  • 해결 방법
print("문자열", 변수, "문자열", 변수, "문자열") 의 형태로 출력
  • 해결 결과
name = "홍길동"
age = 20
print("안녕하세요, ", name, "님, 당신의 나이는 ", age, "세입니다.")
안녕하세요,  홍길동 님, 당신의 나이는  20 세입니다.

 

📙 내일 일정

  • 파이썬 프로그래밍(컨테이너 자료형, 조건문, ...) 학습

 
 

'TIL _Today I Learned > 2024.08' 카테고리의 다른 글

[DAY 22] Flask  (0) 2024.08.09
[DAY 21] Flask  (0) 2024.08.08
[DAY 19] API, DB, SQL  (0) 2024.08.06
[DAY 18] HTML, CSS, Javascript  (0) 2024.08.05
[DAY 17] Git & Web  (0) 2024.08.02