
| SQL 구문 | SQLAlchemy Core 메서드 | 설명 |
|---|---|---|
| CREATE DATABASE | engine.execute("CREATE DATABASE") | 데이터베이스 생성 |
| CREATE TABLE | Table(...), metadata.create_all(engine) | 테이블 구조 정의 및 실제 테이블 생성 |
| INSERT INTO...VALUES | table.insert(), conn.execute(...) | 테이블에 데이터 추가 |
| SELECT ... FROM ... | select() | 특정 조건을 만족하는 데이터 조회 |
| WHERE 조건 | .where() | 특정 조건을 만족하는 데이터 필터링 |
| ORDER BY | .order_by() | 특정 컬럼 기준으로 데이터 정렬 |
| LIMIT 숫자 | .limit() | 조회 결과 개수 제한 |
| COUNT(컬럼) | func.count(table.c.column) | 특정 컬럼의 개수 세기 |
| AVG(컬럼) | func.avg(table.c.column) | 특정 컬럼의 평균 계산 |
| GROUP BY 컬럼 | .group_by() | 특정 컬럼 기준으로 데이터를 그룹화 |
| HAVING 조건 | .having() | 그룹화된 결과에 조건 필터링 |
| AS 별칭 | .label(별칭) | 칼럼이나 집계 결과에 별명 지정 |
| JOIN | .join() | 여러 테이블을 연결하여 데이터 조회 |
| UPDATE...SET...WHERE | update().where().valuses() | 테이블의 특정 데이터 수정 |
| DELETE FROM ...WHERE | delete().where() | 테이블에서 특정 데이터 삭제 |
| COMMIT | conn.commit() | 데이테버이스 변경사항 최종반영(필수!!) |

[사용할 데이터]


from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, Float, DateTime, ForeignKey, select, func, update, delete, text
from datetime import datetime
.
➡️ import문은 "내 컴퓨터에 설치된 도구 상자(SQLAlchemy)에서 특정한 도구(함수, 클래스)들을 꺼내오겠다"고 선언하는 과정
➡️ 따라서 이 코드는 파이썬 파일(.py)이나 주피터 노트북(.ipynb)을 새로 만들 때마다 상단에 꼭 한 번은 입력해야 함.
데이터베이스 만들기
with engine.connect() as conn:
conn.execute(text("CREATE DATABASE IF NOT EXISTS counsel_db"))
conn.commit()
.
➡️ engine.connect() 만들어진 database에 접속한다는 의미
➡️ CREATE DATABASE IF NOT EXISTS counsel_db" : counsel_db이라는 데이터베이스를 만들어달라는 말
➡️ conn.commit() : 최종적으로 데이터베이스를 만든다고 확인해주는 역할
engine = create_engine('mysql+pymysql://root:@localhost/counsel_db')
metadata = MetaData()
.
➡️ 다시 engine을 언급한 이유: USE DATABASE같이 앞으로 이 데이터베이스를 이용할거라는 의미로 한번 더 쓰임
SELECT 문

SQL에서는?:
SELECT * FROM clients WHERE age >= 20;
💡 with engine.connect() as conn:
➡️ with : “연결을 열고 → 작업하고 → 자동으로 정리하고 닫아줌(자원관리)
➡️ with 아래 적힌 코드가 전부 실행되고 나면 데이터베이스와의 연결이 닫혀서 불필요한 데이터 손실을 막음
💡 as conn은 engine.connect를 conn으로 줄여서 쓰겠다는 의미
💡 fetch
1️⃣ fetchall(): 전부 가져오기
2️⃣ fetchone(): 한 줄만 가져오기
3️⃣ fetchmany(n): n개의 줄 가져로기

SQL에서는?:
SELECT * FROM clients ORDER BY clients.age DESC;

SQL에서는?:
SELECT * FROM clients LIMIT 2;
‼️ SQL에서 LIMIT 사용 시 ()사용 안함!!!

‼️ SQL에서는?:
SELECT COUNT(id), AVG(satisfaction) FROM sessions;
AS 키워드처럼 컬럼이나 계산된 결과에 읽기 쉬운 별명(Alias)을 붙일 때 사용
‼️ SQL에서는?:
SELECT
COUNT(id) AS 상담횟수,
AVG(satisfaction) AS 만족도
FROM sessions;

‼️ SQL에서는?:
SELECT concern, COUNT(id) FROM clients GROUP BY concern;

‼️ SQL에서는?:
SELECT counselor_id, COUNT(id) AS 상담횟수
FROM sessions GROUP BY counselor_id
HAVING COUNT(id) >= 2;
NULL로 표시
‼️ SQL에서는?:
SELECT clients.name, sessions.satisfaction FROM clients
INNER JOIN sessions ON clients.id = sessions.client_id;

LEFT JOIN시 실수형으로 출력되는 이유
➡️ NaN이 숫자가 아니기 때문에 자연수가 아니라고 판단해서 정수형으로 출력이 안됨.
conn.commit())
단일 추가 .values() 사용
- 쿼리문 안에 데이터 값을 직접 고정해서 보냅니다.
복수 추가 (리스트 전달)
- insert(clients)라는 빈 틀만 먼저 만들고, 실제 데이터는 따로 리스트(list) 형태로 묶어서 추가
‼️ SQL에서는?:
➡️ INSERT INTO clients (name, age, concern) VALUES ('가나영', 20, '대인관계');
.
➡️ INSERT INTO clients (name, age, concern)
VALUES
('다라영', 20, '직장 스트레스'),
('마바영', 20, '취업');
WHERE 절을 사용하지 않으면 테이블의 모든 데이터가 수정되므로 주의
‼️ SQL에서는?:
UPDATE clients SET concern = '진로변경' WHERE name = '이민지';

‼️ SQL에서는?:
DELETE FROM sessions WHERE client_id = 3;
DELETE FROM clients WHERE id = 3;