07 SQL SELECT 명령어의 이해 및 실습
1. 인트로
SELECT(셀렉트)는 데이터베이스에서 데이터를 조회하는 명령어이다. SQL에서 가장 많이 사용되며, 리액트 앱에서 데이터를 화면에 표시할 때마다 SELECT가 사용된다. 이번 차시에서 SELECT의 기본 문법을 완전히 익힌다.
2. 실습 DB 준비
1import sqlite32
3conn = sqlite3.connect("game_store.db")4cur = conn.cursor()5
6# 게임 테이블 생성7cur.execute("""8 CREATE TABLE IF NOT EXISTS games (9 id INTEGER PRIMARY KEY AUTOINCREMENT,10 title TEXT NOT NULL,11 genre TEXT,12 platform TEXT,13 price INTEGER,14 rating REAL,15 release_yr INTEGER16 )17""")18
19# 샘플 데이터 삽입20games = [21 ("리그오브레전드", "MOBA", "PC", 0, 4.2, 2011),22 ("오버워치2", "FPS", "PC", 0, 3.8, 2022),23 ("스타크래프트2", "RTS", "PC", 24900, 4.5, 2010),24 ("마인크래프트", "샌드박스", "PC", 29900, 4.8, 2011),25 ("엘든링", "RPG", "PS5", 69900, 4.9, 2022),26 ("제노버스", "RPG", "PS5", 59900, 4.1, 2015),27 ("젤다의전설", "어드벤처", "Switch", 69900, 4.9, 2023),28 ("포켓몬스칼렛", "RPG", "Switch", 59900, 3.9, 2022),29 ("발로란트", "FPS", "PC", 0, 4.3, 2020),30 ("배틀그라운드", "배틀로얄", "PC", 33000, 4.0, 2017),31]32
33cur.executemany(34 "INSERT INTO games (title, genre, platform, price, rating, release_yr) VALUES (?,?,?,?,?,?)",35 games36)37conn.commit()38print("게임 데이터 삽입 완료")3. DB Browser 기반 DB 데이터 검토 실습
DB Browser for SQLite를 열고 game_store.db 파일을 열어 데이터를 확인한다.
- 데이터베이스 구조 탭: 테이블과 컬럼 구조를 확인한다.
- 데이터 탐색 탭: 삽입된 데이터를 표 형태로 확인한다.
- SQL 실행 탭: SQL 명령을 직접 입력하고 결과를 확인한다.
4. SQL SELECT 명령어의 이해 및 실습
4.1. 전체 조회 — SELECT *
1cur.execute("SELECT * FROM games")2rows = cur.fetchall()3for r in rows:4 print(r)코드 설명:
- 1행:
*는 모든 컬럼을 가져오라는 의미이다. - 3~4행: fetchall()로 전체 결과를 가져와 한 행씩 출력한다.
4.2. 특정 컬럼만 조회
1cur.execute("SELECT title, price, rating FROM games")2rows = cur.fetchall()3for r in rows:4 print(f"제목: {r[0]:<15} 가격: {r[1]:>6}원 평점: {r[2]}")코드 설명:
- 1행: 가져올 컬럼명을 쉼표(
,)로 구분하여 나열한다. - 4행:
f-string으로 보기 좋게 정렬하여 출력한다.
4.3. WHERE(웨어) — 조건 검색
1# RPG 게임만 조회2cur.execute("SELECT title, platform, price FROM games WHERE genre = 'RPG'")3rows = cur.fetchall()4print("=== RPG 게임 목록 ===")5for r in rows:6 print(f" {r[0]} / {r[1]} / {r[2]}원")코드 설명:
- 2행:
WHERE genre = 'RPG'— genre 컬럼 값이 ‘RPG’인 행만 가져온다. - 텍스트 조건은 작은따옴표(
')로 감싼다.
1# 무료 게임 조회2cur.execute("SELECT title, genre FROM games WHERE price = 0")3rows = cur.fetchall()4print("=== 무료 게임 ===")5for r in rows:6 print(f" {r[0]} ({r[1]})")4.4. 비교 연산자 & 논리 연산자
1# 평점 4.5 이상이면서 PC 플랫폼인 게임2cur.execute("""3 SELECT title, rating, platform4 FROM games5 WHERE rating >= 4.5 AND platform = 'PC'6""")7rows = cur.fetchall()8for r in rows:9 print(r)코드 설명:
- 5행:
AND— 두 조건을 모두 만족하는 행만 가져온다. OR— 둘 중 하나만 만족해도 가져온다.NOT— 조건을 만족하지 않는 행을 가져온다.
1# PC 또는 PS5 게임 조회2cur.execute("SELECT title, platform FROM games WHERE platform = 'PC' OR platform = 'PS5'")3rows = cur.fetchall()4for r in rows:5 print(r)4.5. LIKE(라이크) — 부분 검색
1# 제목에 '오버'가 포함된 게임2cur.execute("SELECT title FROM games WHERE title LIKE '%오버%'")3rows = cur.fetchall()4for r in rows:5 print(r)코드 설명:
- 2행:
LIKE '%오버%'—%는 임의의 문자열을 의미한다.%오버— ‘오버’로 끝나는 값오버%— ‘오버’로 시작하는 값%오버%— ‘오버’를 포함하는 값
4.6. ORDER BY(오더 바이) — 정렬
1# 평점 높은 순으로 정렬2cur.execute("SELECT title, rating FROM games ORDER BY rating DESC")3rows = cur.fetchall()4print("=== 평점 순위 ===")5for i, r in enumerate(rows, 1):6 print(f" {i}위: {r[0]} ({r[1]})")코드 설명:
- 2행:
ORDER BY rating DESC— rating 기준으로 내림차순(높은 → 낮은) 정렬한다. ASC— 오름차순 (낮은 → 높은), 기본값이다.- 5행:
enumerate(rows, 1)— 인덱스를 1부터 시작하여 순위를 매긴다.
4.7. LIMIT(리밋) — 개수 제한
1# 평점 TOP 3 조회2cur.execute("SELECT title, rating FROM games ORDER BY rating DESC LIMIT 3")3rows = cur.fetchall()4print("=== 평점 TOP 3 ===")5for r in rows:6 print(f" {r[0]} : {r[1]}")코드 설명:
- 2행:
LIMIT 3— 조건에 맞는 결과 중 위에서 3개만 가져온다.
5. 활용 Plus — pandas와 함께
1import pandas as pd2
3df = pd.read_sql("SELECT title, genre, rating FROM games ORDER BY rating DESC", conn)4print(df)실행 결과 (상위 5행):
1 title genre rating20 젤다의전설 어드벤처 4.931 엘든링 RPG 4.942 마인크래프트 샌드박스 4.853 스타크래프트2 RTS 4.564 발로란트 FPS 4.36. 문제풀기
SELECT 컬럼1, 컬럼2 FROM 테이블명; 여러 컬럼은 쉼표(,)로 구분한다.
‘전설’로 끝나는 모든 문자열을 검색한다. 예: ‘젤다의전설’은 해당하고, ‘전설의 검’은 해당하지 않는다.
SELECT title, price, rating FROM games WHERE price >= 30000 AND rating >= 4.5;
DESC(내림차순): 큰 값에서 작은 값 순서로 정렬한다. ASC(오름차순): 작은 값에서 큰 값 순서로 정렬한다. 기본값이다.