1. 데이터베이스와 테이블
1️⃣ 데이터(Data)란?
- 데이터(Data)는 모든 기록들, 사실이나 정보를 나타내는 값을 의미
- 아직 가공되지 않은 정보의 기본 요소
- 숫자, 문자, 날짜, 이미지 등 모든 정보의 기본 값
- 의미 있는 정보를 만들기 위한 기본 자료
2️⃣ 데이터베이스(Database)란?
- 데이터베이스(DB)는 데이터가 모여져 있는 공간
- 구조적인 방식으로 관리되는 데이터들의 집합
- 여러 데이터를 체계적으로 모아서 조직적으로 저장하고 관리하는 시스템
- 데이터를 쉽게 저장, 검색, 수정, 삭제할 수 있도록 정리해 놓은 데이터의 집합
3️⃣ 데이터베이스의 특징
1. 실시간 접근성 (Real-time Access)
- 사용자가 요청하면 즉시 데이터를 검색하고 처리할 수 있습니다.
2. 계속적인 변화 (Continuous Evolution)
- 데이터베이스는 데이터 추가, 수정, 삭제가 계속 이루어집니다.
- 새로운 데이터의 삽입, 삭제, 갱신으로 항상 최신의 데이터를 유지합니다.
3. 동시 공유 (Concurrent Sharing)
- 여러 사용자가 동시에 같은 내용의 데이터를 사용할 수 있습니다.
4. 내용에 의한 참조 (Content Reference)
- 데이터의 행의 주소나 위치가 아니라 값을 기준으로 데이터를 검색할 수 있습니다.
- 사용자가 요구하는 데이터 내용으로 데이터를 찾을 수 있습니다.
4️⃣ 관계형 데이터베이스(Relational Database)
- 관계형 데이터베이스(RDB)는 데이터를 테이블(Table) 형태로 저장하고 서로 관계(Relation)로 연결하는 데이터베이스
- 2차원 테이블(행, 열) 구성인 표 형태로 데이터를 관리하는 데이터베이스
- 구조화된 데이터는 SQL을 통해 조회 가능
- 일관성이 있고, 안정적이며 신뢰성이 있음
5️⃣ 관계형 데이터베이스 특징
- 데이터를 테이블 형태로 저장
- 행(Row) 과 열(Column) 구조
- SQL이라는 언어로 데이터 관리
- 테이블 간 관계(Relationship) 존재
6️⃣ 테이블
- 테이블은 데이터를 표 형태로 저장하는 구조(엑셀의 표와 비슷)
- 관계형 데이터베이스에서 자료의 구조를 2차원의 표로 나타낸 것
- 행/열의 형태로 구성 및 관리
- Key를 지정함으로써 원하는 데이터를 빠르고 쉽게 찾아낼 수 있음
7️⃣ 행(Row), 열(Column)
행(Row)
- 행(Row)은 ****한 개의 데이터 묶음(한 사람 또는 한 객체의 정보)을 의미
- 하나의 대상에 대한 모든 데이터 묶음
- 레코드(Record), 튜플(Tuple)이라고도 부름
열(Column)
- 열(Column)은 데이터의 속성(항목)을 의미
- 데이터의 속성 또는 항목
- 속성(Attribute), 필드(Field)라고도 부름
8️⃣ 스키마(Schema)
- 스키마(Schema)는 데이터베이스의 구조와 설계를 정의한 것
- 테이블의 뼈대를 구성하는 것
- 데이터베이스에서 어떤 테이블이 있고, 어떤 열이 있으며, 컬럼별로 저장할 수 있는 데이터 타입까지 명시해야함
스키마의 특징
- 테이블 이름
- 열(Column) 이름
- 데이터 타입
- 관계(Relationship)
- 제약조건(Primary Key 등)
9️⃣ 데이터 타입(Data Type)
- 데이터 타입(Data Type)은 각 열(Column)에 어떤 종류의 데이터를 저장할지 정하는 것
- 데이터의 형태를 지정하는 규칙
- 프로그래밍 관점에서 데이터를 식별하기 위한 분류
- 문자열, 숫자, 날짜 등의 속성이 있음
- 데이터 타입에 따라 사용하는 SQL 구문이 다름
대표적인 데이터 타입
- 숫자형 (Numeric)
| 타입 |
설명 |
| INT |
정수 |
| FLOAT |
실수 |
| DOUBLE |
큰 실수 |
- 문자형 (Character)
| 타입 |
설명 |
| CHAR |
고정 길이 문자 |
| VARCHAR |
가변 길이 문자 |
- 날짜형 (Date)
| 타입 |
설명 |
| DATE |
날짜 |
| TIME |
시간 |
| DATETIME |
날짜 + 시간 |
- 논리형 (Boolean)
| 타입 |
설명 |
| BOOLEAN |
참(True) 또는 거짓(False) |
2. 데이터 다루기
파이썬 판다스 환경에서 SQL문을 돌릴 수 있도록 도와주는 라이브러리 설치
!pip install pandasql
쿼리문 작성하기(SELECT, FROM)
전체 컬럼 조회하기
SELECT 구문에 * 기호를 사용하면 해당 테이블의 모든 컬럼을 조회할 수 있습니다.
SELECT *
FROM 테이블명
특정 컬럼 조회하기
SELECT 컬럼명1, 컬럼명2, 컬럼명3
FROM 테이블명
전체 데이터 필터링하기(WHERE)
- SQL에서 쿼리 결과 필터링은 중요한 기술입니다.
WHERE는 FROM절 다음에 위치합니다.
WHERE절에는 연산자를 같이 사용해야 합니다.
LIMIT 전체 컬럼에서 100개만 볼 수 있도록 필터, LIMIT은 가장 마지막에 넣어줘야함
SELECT 원하는 컬럼
FROM 테이블명
WHERE 조건절
LIMIT 100
비교 연산자
- 같거나 같지 않다는 숫자형과 문자형 다 필터할 수 있음
- 크거나 작거나를 비교할 때는 숫자형만 가능
| 비교 연산자 |
의미 |
예시 |
| = |
같다 |
점수 = 90 |
| != 또는 <> |
같지 않다 |
점수 != 90 |
| > |
크다 |
점수 > 80 |
| < |
작다 |
점수 < 80 |
| >= |
크거나 같다 |
점수 >= 80 |
| <= |
작거나 같다 |
점수 <= 80 |
논리 연산자
AND : 모든 조건이 참일 때만 결과를 반환
WHERE [조건1] AND [조건2]
OR : 조건 중 하나라도 참이면 결과를 반환
WHERE [조건1] OR [조건2]
IN : 여러 개의 값 중 하나와 일치하는 데이터를 찾음
mysql("""
SELECT *
FROM bike
WHERE mnth IN ('Jan', 'Mar', 'May')
""")
mysql("""
SELECT *
FROM bike
WHERE mnth NOT IN ('Jan', 'Mar', 'May')
""")
IS NULL : NULL(값이 지정되지 않아 알 수 없는 값)값을 검색할 때 사용
mysql("""
SELECT *
FROM bike
WHERE weathersit IS NULL
""")
BETWEEN : 특정 범위의 값을 검색할 때 사용
mysql("""
SELECT *
FROM bike
WHERE dteday Between '2011-03-30' and '2011-03-31'
""")
| 연산자 |
설명 |
| AND |
모든 조건이 참 |
| OR |
하나라도 참 |
| NOT |
조건 반대 |
| BETWEEN |
범위 검색 |
| IN |
여러 값 중 하나 |
| IS NULL |
NULL 값 검색 |
산술 연산자
+, -, *, / 를 사용하여 데이터값을 계산하고 할 때 사용
• 우선 순위: () > *, / > +,-
SELECT, WHERE 문에서 사용
- 문자열 또는 날짜타입 데이터에 산술 연산자를 적용하면 에러가 나거나 원하지 않는 값이 나올 수 있음
- 산술 연산자를 통해 계산한
temp + 2 는 출력한 결과일 뿐, 새로운 컬럼을 만들어 데이터베이스에 추가한 것은 아님
mysql("""
SELECT temp, temp + 2, temp - 2, temp * 2, temp / 2
FROM bike
""")
3. 다양한 데이터 활용법
LIKE
- 문자열 패턴을 검색할 때 사용
- 주로
WHERE 절에서 사용하고 Wildcard와 함께 사용
- Wildcard (와일드카드) : 문자 패턴을 표현하기 위해 사용하는 특수 문자
| 기호 |
의미 |
| % |
0개 이상의 모든 문자 |
| _ |
한 글자 |
# 홍으로 시작하는 이름
SELECT *
FROM 학생
WHERE 이름
LIKE '홍%'
# 이름에 길이 들어가는 경우
LIKE '%길%'
# 동으로 끝나는 이름
LIKE '%동'
# 앞에 한 글자가 있는 길동
# _ 의 개수에 따라 문자열의 개수를 정할 수 있음
LIKE '_길동'
별칭(Alias)
- 임시로 컬럼명을 변경할 때 별칭을 사용
- 기존의 컬럼명이 물리적으로 변경되는 것은 아님
- 컬럼 이름이나 테이블 이름을 다른 이름으로 표시하는 것
- 결과를 더 보기 쉽게 만들기 위해 사용
SELECT, FROM 절에서 사용
# 컬럼 별칭
SELECT 컬럼 AS 별칭
FROM 테이블
SELECT 이름 AS 학생이름, 점수 AS 시험점수
FROM 학생
# AS 생략 가능
SELECT 이름 학생이름
FROM 학생
# 테이블 별칭 - 테이블 이름이 길 때 짧게 줄여 사용
SELECT s.이름, s.점수
FROM 학생 AS s
데이터 정렬하기(ORDER BY)
- 데이터 오름차순, 내림차순으로 정렬할 때 사용
- 작성순서
SELECT
FROM
WHERE
ORDER BY
LIMIT
- 오름차순 정렬 (ASC) : 기본값이며 작은 값 → 큰 값 순서로 정렬
SELECT *
FROM 학생
ORDER BY 점수 ASC
# ASC는 기본값이라 생략가능
SELECT *
FROM 학생
ORDER BY 점수
- 내림차순 정렬 (DESC) : 큰 값 → 작은 값 순서로 정렬
SELECT *
FROM 학생
ORDER BY 점수 DESC
# 첫번째 컬럼 기준으로 내림차순으로 정렬하고, 같은 값이 있다면 두번째 컬럼 기준으로 정렬
# 컬럼명말고 순서로도 정렬 가능
ORDER BY 1 DESC, 2
중복제거하기(DISTINCT)
- 중복된 데이터를 제거하고 고유한 값만 조회할 때 사용
DISTINCT 키워드는 옆에 온 모든 컬럼을 고려하여 중복을 제거
- 집계함수(
COUNT, SUM, AVG, MAX, MIN)에도 DISTINCT를 사용
SELECT DISTINCT 컬럼
FROM 테이블
# 학과와 점수의 조합이 같은 경우만 중복 제거
SELECT DISTINCT 학과, 점수
FROM 학생
# 학과 중복 제거 후 기본 값인 오름차순 정렬
SELECT DISTINCT 학과
FROM 학생
ORDER BY 학과
조건문 활용하기
IF(조건, 참일 때 반환값, 거짓일 때 반환값)
- 단일 조건문
- 엑셀의
IF 함수와 동일한 역할
SELECT, WHERE 절에서 사용 가능
- 조건이 참(TRUE)인지 거짓(FALSE)인지에 따라 다른 값을 반환하는 함수
- pandasql에서는
if함수를 iif로 표현
iif(조건, 참일 때 값, 거짓일 때 값)
# 1990년 이전과 이후에 태어난 고객을 분리
# 데이터를 이해하기 쉽게 '고객명', '생년월일', '1990년 기준'이라는 별칭을 사용
mysql("""
SELECT customerName AS "고객명"
, birthday AS "생년월일"
, iif(birthday >= '1990-01-01' , '이후', '이전') AS "1990년 이전/이후"
FROM customers
""")
CASE WHEN ~ THEN
- 다중 조건문
WHEN과 THEN은 한 쌍으로 존재
WHEN과 THEN은 여러 개가 존재 가능
ELSE는 앞의 조건들에 모두 해당하지 않았을 때 정해줄 기본 값
ELSE가 없고 조건에 맞는 값이 없으면 NULL값을 반환
CASE WHEN '조건1' THEN '조건1 반환값'
WHEN '조건2' THEN '조건2 반환값'
ELSE '만족하는 조건이 없을 때 반환 값'
END
mysql("""
SELECT customerName, creditLimit
, CASE WHEN creditLimit <= 50000 THEN '5만원이하'
WHEN creditLimit <= 100000 THEN '10만원이하'
ELSE '10만원초과'
END AS '고객한도분리'
FROM customers
""")
데이터 타입 변환하기(CAST)
- 데이터의 타입을 변환하는 함수
- 실제 데이터 타입이 바뀌는건 아님
CAST(컬럼 AS 변환할 타입)
- 변환할 타입에는 int, float, varchar(문자열), datetime(날짜) 등이 있음
| 타입 |
의미 |
| INT 또는 INTEGER |
정수 |
| FLOAT |
실수 |
| VARCHAR |
문자열 |
| TEXT |
문자열 |
| DATETIME |
날짜 + 시간 |
| DATE |
날짜 |
mysql("""
SELECT CAST(yr AS varchar) AS yr
FROM bike
LIMIT 5
""")
🚨 오늘의 이슈
함수들이 전부 대문자이길래 SQL은 이름처럼 대문자만 가능한가❓라는 의문이 생김
→ SQL의 키워드(keyword)는 보통 대소문자를 구분하지 않음
그럼 왜 대문자를 많이 쓰는가❓
→ 대문자를 쓰는 이유는 가독성 때문 코드가 훨씬 보기 쉬워서 관례처럼 쓰인다고 함