<강의 필기>
CSV
comma seperated values의 줄임말이다.
데이터의 속성들이 comma로 분리되어 각 열에 따라 배열되는
flat-file database이다.
Favorite TV Shows.csv
TV Shows에 관한 amount of data가 category에 의해 sort한다.
catetory에 의한 format은 우리의 schema에 의해 결정된다.
Python
c에서는 data의 row와 column에 있는 각 string을 호출하고
malloc, remalloc, free하는 번거로운 작업이 필요하다.
python에서는 그 작업 과정 없이 바로 편리하게 실행한다.
Dictreader
import csv
titles = {}
with open("Favorite TV Shows - Form Responses 1.csv", "r") as file:
reader = csv.DictReader(file)
for row in reader:
title = row["title"].strip().upper()
if title not in titles:
titles[title] = 0
titles[title] += 1
for title in sorted(titles):
print(title, titles[title])
csv 파일을 딕셔너리 자료형으로 읽는다.
row["title"]의 공백을 제거하고 알파벳을 대문자로 바꾼다.
for loop은 titles 컬럼의 title 문자열을 추출해 titles set에 저장한다.
dictionary의 key를 0부터 1씩 증가시켜 각 value에 맞춰 mapping한다.
Search
...
counter = 0
for row in reader:
if row["title"].strip().upper() == title:
counter += 1
print(counter)
csv file에서 n개의 different shows가 존재하면
반복문을 따라서 linear search를 하여 O(n) 작업시간이 필요하다.
Database
Flat-file database
text editing program으로 관리되는 csv file이다.
상황에 따라 융통성있게 적절한 data structure로 기능하지는 않는다.
Relational database
오랜 시간을 두고 파일에 데이터를 저장한다.
Orcale. MySQL. ProstgreSQL. SQL Server에서 소프트웨어를 작동하여
데이터를 insert. delete. update한다.
SQL
SQL를 sequal라고 부른다.
Structured Query Language
특정한 속성을 가진 데이터를 추가하거나 제외한다.
CRUD
CREATE. INSERT
SELECT
UPDATE
DELETE
CREATE TABLE table (column type, ...);
SELECT columns FROM table;
...
INSERT INTO table (column, ...) VALUES(value, ...);
UPDATE table SET column = value WHERE condition;
DELETE FROM table WHERE condition;
Function
AVG
COUNT
DISTINCT
LOWER
MAX
MIN
UPPER
SELECT DISTINCT(UPPER(title)) From table;
...
Clauses. Syntax
WHERE
LIKE
ORDER BY
LIMIT
GROUP BY
SELECT title FROM table WHERE title LIKE “%Office%”;
...
SELECT UPPER(TRIM(title)), COUNT(title) From showsG ROUP by UPPER(TRIM(title)) ORDER by UPPER(title) DESC LIMIT 10;
...
INSERT INTO shows (Timestamp, title, genres) VALUES(“now”, “The Muppet Showw”, Comedy, Musical“);
UPDATE shows SET Genres = “Comedy, Drama, Musical” WHERE title = “The Muppet Show”;
DELETE FROM shows WHERE title LIKE “&Muppet%”;
Main Data Type
BLOB
INTEGER
smallint. integer. bitgint
NUMERIC
boolean. date. datetime. time. timestamp
numeric(scale. precision)
REAL
real. double precision
TEXT
char(n). varchar(n). text
Column
각 열에는 추가 속성을 부여할 수 있다.
NOT NULL
UNIQUE
PRIMRAY KEY
FOREIGN KEY
Many-to-Many Relationship
Primary Key : 각 열을 고유하게 정의하는 속성 (id column)
Foregin Key : 다른 열로부터 가져오는 외부 속성 (show_id column)
SELECT DISTINCT(genre) FROM genres WHERE show_id IN (SELECT id FROM shows WHERE title = “THE OFFICE”) ORDER BY genre;
B-Tree
Binary Tree는 index를 CREATE하는 것과 같이 데이터를 정렬시키면
데이터를 검색하는 시간이 linear search O(n)보다 빨라진다.
SELECT * FROM shows WHERE title = “The Office”;
Run Time : real 0.012 user 0.011421 sys 0.00202
CREATE INDEX title_index ON shows (title);
Run Time : real 0.098 user 0.086092 sys 0.007673
SELECT * FROM shows WHERE title = “The Office”;
Run Time : real 0.001 user 0.000113 sys 0.00100
JOIN
SELECT title FROM people
JOIN stars ON peple.id = stars.person_id
JOIN shows ON stars.show_id = shows.id
WHERE name = “Steve Carell”
SQL Injection Attacks
f"SELECT * FROM users WHERE username = '{username}' AND password = '{password}'"
Instageram Like
egg photograph에 대한 어떤 ID의 좋아요의 실시간 개수를 반영하기 위해서는
ID를 SELECT하고 1를 더하고 database를 UPDATE하고 COMMIT한다.
db.execute("BEGIN TRANSACTION")
rows = db.execute("SELECT likes FROM posts WHERE id = ?", id);
likes = rows[0]["likes"]
db.execute("UPDATE posts SET likes = ? WHERE id = ?", likes + 1, id);
db.execute("COMMIT")
Drink Some Milk Habit
냉장고에 우유 한 통을 저장한다.
Malan은 다른 테이블 CVS Store에서 우유 한 통을 가져와 INSERT하고 UPDATE한다.
그렇게 데이터베이스를 UPDATE했는데
알고보니 우유 두 통이 UPDATE되었다.
어떻게 된 것일까?
우유 두 통이라는 에러가 발생한 것이다.
이를 디버깅했더니
Malan이 가게를 갔다온 사이에 Brian이 우유 한 통을 냉장고에 넣은 것이었다.
Malan의 우유 한 통 + Brian의 우유 한 통 = 우유 두 통
사전에 Brian에게 데이터베이스를 UPDATE하지말라는 Command를 했으면
데이터베이스에 에러가 발생하지 않았을 것이다.
강의 자료
CS50 Sandbox
Exploits of a Mom
world_record_egg
'Doc > 컴퓨터' 카테고리의 다른 글
컴퓨터과학 CS50 2020 Lecture 9 : Flask (0) | 2022.07.03 |
---|---|
컴퓨터과학 CS50 2020 Lecture 8 : HTML, CSS, JavaScript (0) | 2022.06.27 |
컴퓨터과학 CS50 2020 Lecture 6 : Python (0) | 2022.06.10 |
컴퓨터과학 CS50 2020 Lecture 5 : Data Structures (0) | 2022.06.07 |