0% found this document useful (0 votes)
22 views

Lecture 3

The document discusses databases and SQL. It introduces PostgreSQL and describes how to create tables, define data types, add constraints, insert data, and perform queries using SQL statements like SELECT, WHERE, ORDER BY and JOIN. Functions, updating data, deleting records and foreign keys are also covered at a high level.

Uploaded by

Moudi Mouhamadou
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
22 views

Lecture 3

The document discusses databases and SQL. It introduces PostgreSQL and describes how to create tables, define data types, add constraints, insert data, and perform queries using SQL statements like SELECT, WHERE, ORDER BY and JOIN. Functions, updating data, deleting records and foreign keys are also covered at a high level.

Uploaded by

Moudi Mouhamadou
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 93

Web Programming

with Python and JavaScript


Databases
origin destination dura,on

New York London 415

Shanghai Paris 760

Istanbul Tokyo 700

New York Paris 435

Moscow Paris 245

Lima New York 455


SQL
PostgreSQL
Data Types
• INTEGER
• DECIMAL
• SERIAL
• VARCHAR
• TIMESTAMP
• BOOLEAN
• ENUM
• ...
CREATE TABLE
CREATE TABLE flights (
id SERIAL PRIMARY KEY,
origin VARCHAR NOT NULL,
destination VARCHAR NOT NULL,
duration INTEGER NOT NULL
);
CREATE TABLE flights (
id SERIAL PRIMARY KEY,
origin VARCHAR NOT NULL,
destination VARCHAR NOT NULL,
duration INTEGER NOT NULL
);
CREATE TABLE flights (
id SERIAL PRIMARY KEY,
origin VARCHAR NOT NULL,
destination VARCHAR NOT NULL,
duration INTEGER NOT NULL
);
CREATE TABLE flights (
id SERIAL PRIMARY KEY,
origin VARCHAR NOT NULL,
destination VARCHAR NOT NULL,
duration INTEGER NOT NULL
);
CREATE TABLE flights (
id SERIAL PRIMARY KEY,
origin VARCHAR NOT NULL,
destination VARCHAR NOT NULL,
duration INTEGER NOT NULL
);
CREATE TABLE flights (
id SERIAL PRIMARY KEY,
origin VARCHAR NOT NULL,
destination VARCHAR NOT NULL,
duration INTEGER NOT NULL
);
CREATE TABLE flights (
id SERIAL PRIMARY KEY,
origin VARCHAR NOT NULL,
destination VARCHAR NOT NULL,
duration INTEGER NOT NULL
);
Constraints

• NOT NULL
• UNIQUE
• PRIMARY KEY
• DEFAULT
• CHECK
• ...
INSERT
INSERT INTO flights
(origin, destination, duration)
VALUES ('New York', 'London', 415);
INSERT INTO flights
(origin, destination, duration)
VALUES ('New York', 'London', 415);
INSERT INTO flights
(origin, destination, duration)
VALUES ('New York', 'London', 415);
INSERT INTO flights
(origin, destination, duration)
VALUES ('New York', 'London', 415);
INSERT INTO flights
(origin, destination, duration)
VALUES ('New York', 'London', 415);
INSERT INTO flights
(origin, destination, duration)
VALUES ('New York', 'London', 415);
SELECT
SELECT * FROM flights;
id origin des,na,on dura,on
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights;
id origin des,na,on dura,on
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT origin, destination FROM flights;
id origin des,na,on dura,on
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT origin, destination FROM flights;
id origin des,na,on dura,on
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights WHERE id = 3;
id origin des,na,on dura,on
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights WHERE id = 3;
id origin des,na,on dura,on
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights WHERE origin = 'New York';

id origin des,na,on dura,on


1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights WHERE origin = 'New York';

id origin des,na,on dura,on


1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights WHERE duration > 500;

id origin des,na,on dura,on


1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights WHERE duration > 500;

id origin des,na,on dura,on


1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights
WHERE destination = 'Paris' AND duration > 500;
id origin des,na,on dura,on
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights
WHERE destination = 'Paris' AND duration > 500;
id origin des,na,on dura,on
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights
WHERE destination = 'Paris' OR duration > 500;
id origin des,na,on dura,on
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights
WHERE destination = 'Paris' OR duration > 500;
id origin des,na,on dura,on
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights
WHERE origin IN ('New York', 'Lima');
id origin des,na,on dura,on
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights
WHERE origin IN ('New York', 'Lima');
id origin des,na,on dura,on
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights
WHERE origin LIKE '%a%';
id origin des,na,on dura,on
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights
WHERE origin LIKE '%a%';
id origin des,na,on dura,on
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
FuncMons

• SUM
• COUNT
• MIN
• MAX
• AVG
• ...
UPDATE
UPDATE flights
SET duration = 430
WHERE origin = 'New York'
AND destination = 'London';
DELETE
DELETE FROM countries
WHERE destination = 'Tokyo';
Other Clauses

• LIMIT
• ORDER BY
• GROUP BY
• HAVING
• ...
Foreign Keys
flights
id origin des,na,on duration
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
flights
id origin origin_code des,na,on des,na,on_code duration
1 New York JFK London LHR 415
2 Shanghai PVG Paris CDG 760
3 Istanbul IST Tokyo NRT 700
4 New York JFK Paris CDG 435
5 Moscow SVO Paris CDG 245
6 Lima LIM New York JFK 455
locations
id code name
1 JFK New York
2 PVG Shanghai
3 IST Istanbul
4 LHR London
5 SVO Moscow
6 LIM Lima
7 CDG Paris
8 NRT Tokyo
flights
id origin_id destination_id duration
1 1 4 415
2 2 7 760
3 3 8 700
4 1 7 435
5 5 7 245
6 6 1 455
passengers
id name flight_id
1 Alice 1
2 Bob 1
3 Charlie 2
4 Dave 2
5 Erin 4
6 Frank 6
7 Grace 6
JOIN
Types of JOINs

• JOIN / INNER JOIN


• LEFT OUTER JOIN
• RIGHT OUTER JOIN
• FULL OUTER JOIN
CREATE INDEX
Nested Queries
flights
id origin des,na,on dura,on
1 New York London 415
2 Shanghai Paris 760
3 Istanbul Tokyo 700
4 New York Paris 435
5 Moscow Paris 245
6 Lima New York 455
passengers
id name flight_id
1 Alice 1
2 Bob 1
3 Charlie 2
4 Dave 2
5 Erin 4
6 Frank 6
7 Grace 6
SELECT flight_id FROM passengers
GROUP BY flight_id HAVING COUNT(*) > 1;
SELECT flight_id FROM passengers
GROUP BY flight_id HAVING COUNT(*) > 1;
id name flight_id
1 Alice 1
2 Bob 1
3 Charlie 2
4 Dave 2
5 Erin 4
6 Frank 6
7 Grace 6
SELECT flight_id FROM passengers
GROUP BY flight_id HAVING COUNT(*) > 1;
id name flight_id
1 Alice 1
2 Bob 1 flight_id
3 Charlie 2 1
4 Dave 2 2
5 Erin 4 6
6 Frank 6
7 Grace 6
SELECT flight_id FROM passengers
GROUP BY flight_id HAVING COUNT(*) > 1;

flight_id
1
2
6
SELECT * FROM flights WHERE id IN
(SELECT flight_id FROM passengers
GROUP BY flight_id HAVING COUNT(*) > 1);

flight_id
1
2
6
SELECT * FROM flights WHERE id IN
(SELECT flight_id FROM passengers
GROUP BY flight_id HAVING COUNT(*) > 1);

id origin des,na,on dura,on


1 New York London 415
flight_id
2 Shanghai Paris 760
1
3 Istanbul Tokyo 700 2
4 New York Paris 435 6
5 Moscow Paris 245
6 Lima New York 455
SELECT * FROM flights WHERE id IN
(SELECT flight_id FROM passengers
GROUP BY flight_id HAVING COUNT(*) > 1);

id origin des,na,on dura,on


1 New York London 415
flight_id
2 Shanghai Paris 760
1
3 Istanbul Tokyo 700 2
4 New York Paris 435 6
5 Moscow Paris 245
6 Lima New York 455
SQL InjecMon
Username:

Password:
SELECT * FROM users
WHERE (username = username)
AND (password = password);
Username:
alice

Password:
12345
SELECT * FROM users
WHERE (username = username)
AND (password = password);
SELECT * FROM users
WHERE (username = 'alice')
AND (password = '12345');
Username:
hacker

Password:
1' OR '1' = '1
SELECT * FROM users
WHERE (username = username)
AND (password = password);
SELECT * FROM users
WHERE (username = 'hacker')
AND (password = '1' OR '1' = '1');
Race Conditions
Race Conditions
Bank Account

$100
Race Conditions
Bank Account
SELECT balance FROM bank
WHERE user_id = 1;

$100
Race Conditions
Bank Account
SELECT balance FROM bank
WHERE user_id = 1;

100

$100
Race Conditions
Bank Account
SELECT balance FROM bank
WHERE user_id = 1;

100

UPDATE bank $100


SET balance = balance - 100
WHERE user_id = 1;

$100
Race Conditions
Bank Account
SELECT balance FROM bank
WHERE user_id = 1;

100

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

$100
Race Conditions
Bank Account

$100
Race Conditions
Bank Account
SELECT balance FROM bank
WHERE user_id = 1;

$100
Race Conditions
Bank Account
SELECT balance FROM bank
WHERE user_id = 1;

100

$100
Race Conditions
Bank Account
SELECT balance FROM bank
WHERE user_id = 1;
SELECT balance FROM bank
100 WHERE user_id = 1;

$100
Race Conditions
Bank Account
SELECT balance FROM bank
WHERE user_id = 1;
SELECT balance FROM bank
100 WHERE user_id = 1;

100
$100
Race Conditions
Bank Account
SELECT balance FROM bank
WHERE user_id = 1;
SELECT balance FROM bank
100 WHERE user_id = 1;

UPDATE bank 100


SET balance = balance - 100
WHERE user_id = 1;
$100
$100
Race Conditions
Bank Account
SELECT balance FROM bank
WHERE user_id = 1;
SELECT balance FROM bank
100 WHERE user_id = 1;

UPDATE bank 100


SET balance = balance - 100
WHERE user_id = 1;
$0
$100
Race Conditions
Bank Account
SELECT balance FROM bank
WHERE user_id = 1;
SELECT balance FROM bank
100 WHERE user_id = 1;

UPDATE bank 100


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

$100
Race Conditions
Bank Account
SELECT balance FROM bank
WHERE user_id = 1;
SELECT balance FROM bank
100 WHERE user_id = 1;

UPDATE bank 100


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

$100
SQL Transactions

• BEGIN
• COMMIT
SQLAlchemy
Web Programming
with Python and JavaScript

You might also like