Top Banner
CS50 Beyond
94

CS50 Beyond

May 21, 2022

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: CS50 Beyond

CS50 Beyond

Page 2: CS50 Beyond

Databases

Page 3: CS50 Beyond

origin destination duration

New York London 415

Shanghai Paris 760

Istanbul Tokyo 700

New York Paris 435

Moscow Paris 245

Lima New York 455

Page 4: CS50 Beyond

SQL

Page 5: CS50 Beyond

SQL Databases

• MySQL • PostgreSQL • SQLite • ...

Page 6: CS50 Beyond

Data Types• INTEGER

• DECIMAL • SERIAL • VARCHAR • TIMESTAMP • BOOLEAN • ENUM • ...

Page 7: CS50 Beyond

CREATE TABLE

Page 8: CS50 Beyond

CREATE TABLE flights ( id SERIAL PRIMARY KEY, origin VARCHAR NOT NULL, destination VARCHAR NOT NULL, duration INTEGER NOT NULL );

Page 9: CS50 Beyond

CREATE TABLE flights ( id SERIAL PRIMARY KEY, origin VARCHAR NOT NULL, destination VARCHAR NOT NULL, duration INTEGER NOT NULL );

Page 10: CS50 Beyond

CREATE TABLE flights ( id SERIAL PRIMARY KEY, origin VARCHAR NOT NULL, destination VARCHAR NOT NULL, duration INTEGER NOT NULL );

Page 11: CS50 Beyond

CREATE TABLE flights ( id SERIAL PRIMARY KEY, origin VARCHAR NOT NULL, destination VARCHAR NOT NULL, duration INTEGER NOT NULL );

Page 12: CS50 Beyond

CREATE TABLE flights ( id SERIAL PRIMARY KEY, origin VARCHAR NOT NULL, destination VARCHAR NOT NULL, duration INTEGER NOT NULL );

Page 13: CS50 Beyond

CREATE TABLE flights ( id SERIAL PRIMARY KEY, origin VARCHAR NOT NULL, destination VARCHAR NOT NULL, duration INTEGER NOT NULL );

Page 14: CS50 Beyond

CREATE TABLE flights ( id SERIAL PRIMARY KEY, origin VARCHAR NOT NULL, destination VARCHAR NOT NULL, duration INTEGER NOT NULL );

Page 15: CS50 Beyond

Constraints

• NOT NULL

• UNIQUE • PRIMARY KEY • DEFAULT • CHECK • ...

Page 16: CS50 Beyond

INSERT

Page 17: CS50 Beyond

INSERT INTO flights (origin, destination, duration) VALUES ('New York', 'London', 415);

Page 18: CS50 Beyond

INSERT INTO flights (origin, destination, duration) VALUES ('New York', 'London', 415);

Page 19: CS50 Beyond

INSERT INTO flights (origin, destination, duration) VALUES ('New York', 'London', 415);

Page 20: CS50 Beyond

INSERT INTO flights (origin, destination, duration) VALUES ('New York', 'London', 415);

Page 21: CS50 Beyond

INSERT INTO flights (origin, destination, duration) VALUES ('New York', 'London', 415);

Page 22: CS50 Beyond

INSERT INTO flights (origin, destination, duration) VALUES ('New York', 'London', 415);

Page 23: CS50 Beyond

SELECT

Page 24: CS50 Beyond

id origin destination duration1 New York London 4152 Shanghai Paris 7603 Istanbul Tokyo 7004 New York Paris 4355 Moscow Paris 2456 Lima New York 455

SELECT * FROM flights;

Page 25: CS50 Beyond

id origin destination duration1 New York London 4152 Shanghai Paris 7603 Istanbul Tokyo 7004 New York Paris 4355 Moscow Paris 2456 Lima New York 455

SELECT * FROM flights;

Page 26: CS50 Beyond

id origin destination duration1 New York London 4152 Shanghai Paris 7603 Istanbul Tokyo 7004 New York Paris 4355 Moscow Paris 2456 Lima New York 455

SELECT origin, destination FROM flights;

Page 27: CS50 Beyond

id origin destination duration1 New York London 4152 Shanghai Paris 7603 Istanbul Tokyo 7004 New York Paris 4355 Moscow Paris 2456 Lima New York 455

SELECT origin, destination FROM flights;

Page 28: CS50 Beyond

id origin destination duration1 New York London 4152 Shanghai Paris 7603 Istanbul Tokyo 7004 New York Paris 4355 Moscow Paris 2456 Lima New York 455

SELECT * FROM flights WHERE id = 3;

Page 29: CS50 Beyond

id origin destination duration1 New York London 4152 Shanghai Paris 7603 Istanbul Tokyo 7004 New York Paris 4355 Moscow Paris 2456 Lima New York 455

SELECT * FROM flights WHERE id = 3;

Page 30: CS50 Beyond

id origin destination duration1 New York London 4152 Shanghai Paris 7603 Istanbul Tokyo 7004 New York Paris 4355 Moscow Paris 2456 Lima New York 455

SELECT * FROM flights WHERE origin = 'New York';

Page 31: CS50 Beyond

id origin destination duration1 New York London 4152 Shanghai Paris 7603 Istanbul Tokyo 7004 New York Paris 4355 Moscow Paris 2456 Lima New York 455

SELECT * FROM flights WHERE origin = 'New York';

Page 32: CS50 Beyond

id origin destination duration1 New York London 4152 Shanghai Paris 7603 Istanbul Tokyo 7004 New York Paris 4355 Moscow Paris 2456 Lima New York 455

SELECT * FROM flights WHERE duration > 500;

Page 33: CS50 Beyond

id origin destination duration1 New York London 4152 Shanghai Paris 7603 Istanbul Tokyo 7004 New York Paris 4355 Moscow Paris 2456 Lima New York 455

SELECT * FROM flights WHERE duration > 500;

Page 34: CS50 Beyond

id origin destination duration1 New York London 4152 Shanghai Paris 7603 Istanbul Tokyo 7004 New York Paris 4355 Moscow Paris 2456 Lima New York 455

SELECT * FROM flights WHERE destination = 'Paris' AND duration > 500;

Page 35: CS50 Beyond

id origin destination duration1 New York London 4152 Shanghai Paris 7603 Istanbul Tokyo 7004 New York Paris 4355 Moscow Paris 2456 Lima New York 455

SELECT * FROM flights WHERE destination = 'Paris' AND duration > 500;

Page 36: CS50 Beyond

id origin destination duration1 New York London 4152 Shanghai Paris 7603 Istanbul Tokyo 7004 New York Paris 4355 Moscow Paris 2456 Lima New York 455

SELECT * FROM flights WHERE destination = 'Paris' OR duration > 500;

Page 37: CS50 Beyond

id origin destination duration1 New York London 4152 Shanghai Paris 7603 Istanbul Tokyo 7004 New York Paris 4355 Moscow Paris 2456 Lima New York 455

SELECT * FROM flights WHERE destination = 'Paris' OR duration > 500;

Page 38: CS50 Beyond

id origin destination duration1 New York London 4152 Shanghai Paris 7603 Istanbul Tokyo 7004 New York Paris 4355 Moscow Paris 2456 Lima New York 455

SELECT * FROM flights WHERE origin IN ('New York', 'Lima');

Page 39: CS50 Beyond

id origin destination duration1 New York London 4152 Shanghai Paris 7603 Istanbul Tokyo 7004 New York Paris 4355 Moscow Paris 2456 Lima New York 455

SELECT * FROM flights WHERE origin IN ('New York', 'Lima');

Page 40: CS50 Beyond

id origin destination duration1 New York London 4152 Shanghai Paris 7603 Istanbul Tokyo 7004 New York Paris 4355 Moscow Paris 2456 Lima New York 455

SELECT * FROM flights WHERE origin LIKE '%a%';

Page 41: CS50 Beyond

id origin destination duration1 New York London 4152 Shanghai Paris 7603 Istanbul Tokyo 7004 New York Paris 4355 Moscow Paris 2456 Lima New York 455

SELECT * FROM flights WHERE origin LIKE '%a%';

Page 42: CS50 Beyond

Functions

• SUM

• COUNT • MIN • MAX • AVG • ...

Page 43: CS50 Beyond

UPDATE

Page 44: CS50 Beyond

UPDATE flights SET duration = 430 WHERE origin = 'New York' AND destination = 'London';

Page 45: CS50 Beyond

DELETE

Page 46: CS50 Beyond

DELETE FROM flights WHERE destination = 'Tokyo';

Page 47: CS50 Beyond

Other Clauses

• LIMIT

• ORDER BY • GROUP BY • HAVING • ...

Page 48: CS50 Beyond

Foreign Keys

Page 49: CS50 Beyond

id origin destination duration1 New York London 4152 Shanghai Paris 7603 Istanbul Tokyo 7004 New York Paris 4355 Moscow Paris 2456 Lima New York 455

flights

Page 50: CS50 Beyond

id origin origin_code destination destination_code duration

1 New York JFK London LHR 4152 Shanghai PVG Paris CDG 7603 Istanbul IST Tokyo NRT 7004 New York JFK Paris CDG 4355 Moscow SVO Paris CDG 2456 Lima LIM New York JFK 455

flights

Page 51: CS50 Beyond

id code name1 JFK New York2 PVG Shanghai3 IST Istanbul4 LHR London5 SVO Moscow6 LIM Lima7 CDG Paris8 NRT Tokyo

locations

Page 52: CS50 Beyond

id origin_id destination_id duration1 1 4 4152 2 7 7603 3 8 7004 1 7 4355 5 7 2456 6 1 455

flights

Page 53: CS50 Beyond

id name flight_id1 Alice 12 Bob 13 Charlie 24 Dave 25 Erin 46 Frank 67 Grace 6

passengers

Page 54: CS50 Beyond

JOIN

Page 55: CS50 Beyond

Types of JOINs

• JOIN / INNER JOIN

• LEFT OUTER JOIN • RIGHT OUTER JOIN • FULL OUTER JOIN

Page 56: CS50 Beyond

CREATE INDEX

Page 57: CS50 Beyond

Nested Queries

Page 58: CS50 Beyond

id origin destination duration1 New York London 4152 Shanghai Paris 7603 Istanbul Tokyo 7004 New York Paris 4355 Moscow Paris 2456 Lima New York 455

flights

Page 59: CS50 Beyond

id name flight_id1 Alice 12 Bob 13 Charlie 24 Dave 25 Erin 46 Frank 67 Grace 6

passengers

Page 60: CS50 Beyond

SELECT flight_id FROM passengers GROUP BY flight_id HAVING COUNT(*) > 1;

Page 61: CS50 Beyond

id name flight_id1 Alice 12 Bob 13 Charlie 24 Dave 25 Erin 46 Frank 67 Grace 6

SELECT flight_id FROM passengers GROUP BY flight_id HAVING COUNT(*) > 1;

Page 62: CS50 Beyond

id name flight_id1 Alice 12 Bob 13 Charlie 24 Dave 25 Erin 46 Frank 67 Grace 6

SELECT flight_id FROM passengers GROUP BY flight_id HAVING COUNT(*) > 1;

flight_id126

Page 63: CS50 Beyond

SELECT flight_id FROM passengers GROUP BY flight_id HAVING COUNT(*) > 1;

flight_id126

Page 64: CS50 Beyond

SELECT * FROM flights WHERE id IN (SELECT flight_id FROM passengers

GROUP BY flight_id HAVING COUNT(*) > 1);

flight_id126

Page 65: CS50 Beyond

SELECT * FROM flights WHERE id IN (SELECT flight_id FROM passengers

GROUP BY flight_id HAVING COUNT(*) > 1);

flight_id126

id origin destination duration1 New York London 4152 Shanghai Paris 7603 Istanbul Tokyo 7004 New York Paris 4355 Moscow Paris 2456 Lima New York 455

Page 66: CS50 Beyond

SELECT * FROM flights WHERE id IN (SELECT flight_id FROM passengers

GROUP BY flight_id HAVING COUNT(*) > 1);

flight_id126

id origin destination duration1 New York London 4152 Shanghai Paris 7603 Istanbul Tokyo 7004 New York Paris 4355 Moscow Paris 2456 Lima New York 455

Page 67: CS50 Beyond

SQL Injection

Page 68: CS50 Beyond

Username:

Password:

Page 69: CS50 Beyond

SELECT * FROM users WHERE (username = username) AND (password = password);

Page 70: CS50 Beyond

alice

12345

Username:

Password:

Page 71: CS50 Beyond

SELECT * FROM users WHERE (username = username) AND (password = password);

Page 72: CS50 Beyond

SELECT * FROM users WHERE (username = 'alice') AND (password = '12345');

Page 73: CS50 Beyond

hacker

1' OR '1' = '1

Username:

Password:

Page 74: CS50 Beyond

SELECT * FROM users WHERE (username = username) AND (password = password);

Page 75: CS50 Beyond

SELECT * FROM users WHERE (username = 'hacker') AND (password = '1' OR '1' = '1');

Page 76: CS50 Beyond

Race Conditions

Page 77: CS50 Beyond

Race Conditions

$100

Bank Account

Page 78: CS50 Beyond

Race Conditions

$100

Bank AccountSELECT balance FROM bank WHERE user_id = 1;

Page 79: CS50 Beyond

Race Conditions

$100

Bank AccountSELECT balance FROM bank WHERE user_id = 1;

100

Page 80: CS50 Beyond

Race Conditions

$100

Bank AccountSELECT balance FROM bank WHERE user_id = 1;

100

UPDATE bank SET balance = balance - 100 WHERE user_id = 1;

$100

Page 81: CS50 Beyond

Race Conditions

$0

Bank AccountSELECT balance FROM bank WHERE user_id = 1;

$100

100

UPDATE bank SET balance = balance - 100 WHERE user_id = 1;

Page 82: CS50 Beyond

Race Conditions

$100

Bank Account

Page 83: CS50 Beyond

Race Conditions

$100

Bank AccountSELECT balance FROM bank WHERE user_id = 1;

Page 84: CS50 Beyond

Race Conditions

$100

Bank AccountSELECT balance FROM bank WHERE user_id = 1;

100

Page 85: CS50 Beyond

Race Conditions

$100

Bank AccountSELECT balance FROM bank WHERE user_id = 1;

100SELECT balance FROM bank WHERE user_id = 1;

Page 86: CS50 Beyond

Race Conditions

$100

Bank AccountSELECT balance FROM bank WHERE user_id = 1;

100SELECT balance FROM bank WHERE user_id = 1;

100

Page 87: CS50 Beyond

Race Conditions

$100

Bank AccountSELECT balance FROM bank WHERE user_id = 1;

$100

100SELECT balance FROM bank WHERE user_id = 1;

100UPDATE bank SET balance = balance - 100 WHERE user_id = 1;

Page 88: CS50 Beyond

Race Conditions

$0

Bank AccountSELECT balance FROM bank WHERE user_id = 1;

$100

100SELECT balance FROM bank WHERE user_id = 1;

100UPDATE bank SET balance = balance - 100 WHERE user_id = 1;

Page 89: CS50 Beyond

Race Conditions

$0

Bank AccountSELECT balance FROM bank WHERE user_id = 1;

$100

100SELECT balance FROM bank WHERE user_id = 1;

100UPDATE bank SET balance = balance - 100 WHERE user_id = 1; UPDATE bank

SET balance = balance - 100 WHERE user_id = 1;

$100

Page 90: CS50 Beyond

Race Conditions

-$100

Bank AccountSELECT balance FROM bank WHERE user_id = 1;

$100

100SELECT balance FROM bank WHERE user_id = 1;

100UPDATE bank SET balance = balance - 100 WHERE user_id = 1; UPDATE bank

SET balance = balance - 100 WHERE user_id = 1;

$100

Page 91: CS50 Beyond

SQL Transactions

• BEGIN

• COMMIT

Page 92: CS50 Beyond

SQLAlchemy

Page 93: CS50 Beyond

Morning Project

• Create a database on Heroku. • Decide on a database schema and create tables: one

for authors and one for books. • Write a Python program to import data into the

database. • Write a Python program that queries the database

for a book by its (partial) title or author.

Page 94: CS50 Beyond

CS50 Beyond