# Simple ```python def SQL(): import sqlite3 conn = sqlite3.connect('db.sqlite', isolation_level=None) conn.execute('PRAGMA journal_mode=WAL') conn.row_factory = sqlite3.Row return lambda *args: [dict(row) for row in conn.execute(*args)] sql = SQL() ``` # Class ```python class SQL: def __init__(self, filename='db.sqlite'): import sqlite3 self.conn = sqlite3.connect(filename, isolation_level=None # autocommit mode: ON ) self('PRAGMA journal_mode=WAL;') # WAL mode: ON self.conn.row_factory = lambda *args: dict(sqlite3.Row(*args)) def __call__(self, *args): import pandas as pd return pd.DataFrame(self.conn.execute(*args)) def __getattr__(self, table): return self(f"SELECT * FROM {table}") def __repr__(self): return self("SELECT name FROM sqlite_master WHERE type='table'").to_string() ``` ```python #%% try: get_ipython() except: display = print sql = SQL() sql #%% # 학생 테이블 생성 sql('''CREATE TABLE IF NOT EXISTS students (id INTEGER PRIMARY KEY, name TEXT, age INTEGER, grade INTEGER)''') # 과목 테이블 생성 sql('''CREATE TABLE IF NOT EXISTS courses (id INTEGER PRIMARY KEY, name TEXT, professor TEXT)''') # 수강 테이블 생성 (학생과 과목의 관계) sql('''CREATE TABLE IF NOT EXISTS enrollments (student_id INTEGER, course_id INTEGER, FOREIGN KEY(student_id) REFERENCES students(id), FOREIGN KEY(course_id) REFERENCES courses(id))''') sql #%% # 학생 데이터 삽입 sql('INSERT INTO students (name, age, grade) VALUES (?, ?, ?)', ('김철수', 20, 2)) sql('INSERT INTO students (name, age, grade) VALUES (?, ?, ?)', ('이영희', 22, 4)) sql('INSERT INTO students (name, age, grade) VALUES (?, ?, ?)', ('박민수', 19, 1)) # 과목 데이터 삽입 sql('INSERT INTO courses (name, professor) VALUES (?, ?)', ('데이터베이스', '홍길동')) sql('INSERT INTO courses (name, professor) VALUES (?, ?)', ('알고리즘', '이순신')) sql('INSERT INTO courses (name, professor) VALUES (?, ?)', ('인공지능', '강감찬')) # 수강 데이터 삽입 sql('INSERT INTO enrollments (student_id, course_id) VALUES (?, ?)', (1, 1)) sql('INSERT INTO enrollments (student_id, course_id) VALUES (?, ?)', (1, 2)) sql('INSERT INTO enrollments (student_id, course_id) VALUES (?, ?)', (2, 2)) sql('INSERT INTO enrollments (student_id, course_id) VALUES (?, ?)', (3, 3)) print("Students:") display(sql.students) print("\nCourses:") display(sql.courses) print("\nEnrollments:") display(sql.enrollments) #%% # JOIN을 사용하여 학생별 수강 과목 조회 print("\n학생별 수강 과목:") enrollments_df = sql(''' SELECT students.name AS student_name, courses.name AS course_name FROM students JOIN enrollments ON students.id = enrollments.student_id JOIN courses ON enrollments.course_id = courses.id ''') display(enrollments_df) #%% # 특정 과목을 수강하는 학생 수 조회 course_name = '알고리즘' result = sql(''' SELECT COUNT(*) as student_count FROM enrollments JOIN courses ON enrollments.course_id = courses.id WHERE courses.name = ? ''', (course_name,)) print(f"\n'{course_name}' 과목을 수강하는 학생 수: {result['student_count'].iloc[0]}") #%% # 가장 많은 학생이 수강하는 과목 조회 most_popular_course = sql(''' SELECT courses.name, COUNT(*) as enrollment_count FROM enrollments JOIN courses ON enrollments.course_id = courses.id GROUP BY courses.id ORDER BY enrollment_count DESC LIMIT 1 ''') print(f"\n가장 인기 있는 과목: {most_popular_course['name'].iloc[0]} (수강생 {most_popular_course['enrollment_count'].iloc[0]}명)") #%% # 최종 상태 출력 print("\n최종 상태:") print("Students:") display(sql('SELECT * FROM students')) print("\nCourses:") display(sql('SELECT * FROM courses')) print("\nEnrollments:") display(sql('SELECT * FROM enrollments')) ```