Database and SQL

OIM3600

Flat-file database

OIM3600

CSV

OIM3600

Relational database

OIM3600

SQL

OIM3600

C

R

U

D

OIM3600

CREATE

READ

UPDATE

DELETE

OIM3600

(in SQL)

CREATE, INSERT

SELECT

UPDATE

DELETE, DROP

...

OIM3600
CREATE TABLE table (column type, ...);
OIM3600

sqlite3

OIM3600

(in sqlite3 shell)

.mode csv
.import FILE TABLE
OIM3600

(in sqlite3 shell)

SELECT columns FROM table;
OIM3600

AVG
COUNT
DISTINCT
LOWER
MAX
MIN
UPPER

...

OIM3600

WHERE
LIKE
ORDER BY
LIMIT
GROUP BY
...

OIM3600
INSERT INTO table (column, ...) VALUES(value, ...);
OIM3600
UPDATE table SET column = value WHERE condition;
OIM3600
DELETE FROM table WHERE condition;
OIM3600

IMDB

OIM3600
OIM3600

INTEGER
REAL
NUMERIC
TEXT
BLOB

OIM3600

NOT NULL
UNIQUE

OIM3600

PRIMARY KEY
FOREIGN KEY

OIM3600

JOIN
...

OIM3600

Indexes

OIM3600
CREATE INDEX name ON table (column, ...);
OIM3600

Transaction

OIM3600
OIM3600
id = 'CmUv48DLvxd'

rows = db.execute("SELECT likes FROM posts WHERE id = ?", id)

likes = rows[0][3]

db.execute("UPDATE posts SET likes = ? WHERE id = ?", likes + 1, id)
OIM3600

BEGIN TRANSACTION
COMMIT
ROLLBACK

OIM3600
id = 'CmUv48DLvxd'

db.execute("BEGIN TRANSACTION")

rows = db.execute("SELECT likes FROM posts WHERE id = ?", id)

likes = rows[0][3]

db.execute("UPDATE posts SET likes = ? WHERE id = ?", likes + 1, id)

db.execute("COMMIT")
OIM3600

SQL injection attacks

OIM3600
OIM3600
rows = db.execute(
    "SELECT * FROM users WHERE username = ? AND password = ?",
    (username, password)
    )

if rows:
    ...

OIM3600
rows = db.execute(
    f"SELECT * FROM users WHERE username='{username}' AND password='{password}'"
    )

if rows:
    ...

OIM3600
rows = db.execute(
    "SELECT * FROM users WHERE username='leomessi'--' AND password='{password}"
    )

if rows:
    ...

OIM3600
OIM3600
OIM3600
OIM3600

Why not put genre column in table shows?

INTEGER: more efficient, less space

Numeric: General numeric type, more flexible

Blob: binary large object