본문 바로가기

Doc/컴퓨터

컴퓨터과학 CS50 2020 Lecture 7 : SQL

 

 

 

 

<강의 필기>

 

 

CSV

comma seperated values의 줄임말이다.

데이터의 속성들이 comma로 분리되어 각 열에 따라 배열되는

flat-file database이다.

 

Favorite TV Shows.csv

TV Shows에 관한 amount of datacategory에 의해 sort한다.

catetory에 의한 format은 우리의 schema에 의해 결정된다.

 

Python

c에서는 datarowcolumn에 있는 각 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 looptitles 컬럼의 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

SQLsequal라고 부른다.

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를 했으면 

데이터베이스에 에러가 발생하지 않았을 것이다.

 

 

 

 

 

 

강의 자료

 

Week 7 - CS50

Introduction to the intellectual enterprises of computer science and the art of programming. This course teaches students how to think algorithmically and solve problems efficiently. Topics include abstraction, algorithms, data structures, encapsulation, r

cs50.harvard.edu

 

 

 

 
 
 
 









>