ЁЯУЗ рдзрдбрд╛ 02 тАФ Tables, rows рдЖрдгрд┐ keys: рдУрд│ рдХреНрд░рдорд╛рдВрдХ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдиреЛрдВрджрд╡рд╣реНрдпрд╛
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 18 рдкреИрдХреА рдзрдбрд╛ 02 ┬╖ рдорд╛рдЧреЗ: lesson-01-why-databases ┬╖ рдкреБрдвреЗ: lesson-03-sql-reads
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбрд╛ 01, рдЖрдгрд┐ рд░реЗрдХреЙрд░реНрдб рд░реВрдордЪрд╛ рдЖрдХрд╛рд░: tables (рдиреЛрдВрджрд╡рд╣реНрдпрд╛), rows (рдУрд│реА), columns (рдЫрд╛рдкрд▓реЗрд▓реА рд╢реАрд░реНрд╖рдХреЗ), primary keys (рдУрд│ рдХреНрд░рдорд╛рдВрдХ) рдЖрдгрд┐ foreign keys ("рдиреЛрдВрджрд╡рд╣реА X, рдУрд│ 3 рдкрд╛рд╣рд╛").
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд░реЗрдХреЙрд░реНрдб рд░реВрдо рдЙрдШрдбрд╛ рдЖрдгрд┐ рддреБрдореНрд╣рд╛рд▓рд╛ рддреАрди рдиреЛрдВрджрд╡рд╣реНрдпрд╛ ЁЯУЗ рджрд┐рд╕рддрд╛рдд:
- classes тАФ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧрд╛рд╕рд╛рдареА рдПрдХ рдУрд│: рдУрд│ 1 рд╡рд░
3A, рдУрд│ 2 рд╡рд░3B. - students тАФ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреАрд╕рд╛рдареА рдПрдХ рдУрд│: рдирд╛рд╡, roll number, рдЖрдгрд┐ рдХреЛрдгрддрд╛ рд╡рд░реНрдЧ тАФ "classes рдиреЛрдВрджрд╡рд╣реА, рдУрд│ 1 рдкрд╛рд╣рд╛" рдЕрд╕реЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ, "3A" рд╣рд╛ рд╢рдмреНрдж copy рдХрд░реВрди рдирд╡реНрд╣реЗ.
- grades тАФ рдкреНрд░рддреНрдпреЗрдХ grade рд╕рд╛рдареА рдПрдХ рдУрд│: "students, рдУрд│ 2 рдкрд╛рд╣рд╛ ┬╖ maths ┬╖ term 1 ┬╖ A+".
рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдВрджрд╡рд╣реАрддреАрд▓ рдУрд│ рдХреНрд░рдорд╛рдВрдХ рдореНрд╣рдгрдЬреЗ primary key: рддреЛ рдХрдзреАрдЪ рдкреБрдиреНрд╣рд╛ рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рдд рдирд╛рд╣реА, рдХрдзреАрдЪ рдмрджрд▓рдд рдирд╛рд╣реА, рдЖрдгрд┐ рджреБрд╕рд░реА рдиреЛрдВрджрд╡рд╣реА рдлрдХреНрдд рддреНрдпрд╛рдХрдбреЗрдЪ рдмреЛрдЯ рджрд╛рдЦрд╡рддреЗ. рджреБрд╕рд▒реНрдпрд╛ рдиреЛрдВрджрд╡рд╣реАрдХрдбреЗ рдмреЛрдЯ рджрд╛рдЦрд╡рдгрд╛рд░реА рдиреЛрдВрдж рдореНрд╣рдгрдЬреЗ foreign key тАФ рдЖрдгрд┐ рджрдкреНрддрд░рджрд╛рд░ рдПрдХ рдирд┐рдпрдо рдкрд╛рд│рд╛рдпрд▓рд╛ рд▓рд╛рд╡рддреЛ: рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдирд╕рд▓реЗрд▓реНрдпрд╛ рдУрд│реАрдХрдбреЗ рдХреЛрдгрддреАрд╣реА рдУрд│ рдмреЛрдЯ рджрд╛рдЦрд╡реВ рд╢рдХрдд рдирд╛рд╣реА. "classes, рдУрд│ 99 рдкрд╛рд╣рд╛" рдЕрд╕реЗ рд▓рд┐рд╣рд╛рдпрдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рд╛, рдЖрдгрд┐ рдкреЗрди рдирд╛рдХрд╛рд░рд▓рд╛ рдЬрд╛рддреЛ.
рдкреНрд░рддреНрдпреЗрдХ рдЫрд╛рдкрд▓реЗрд▓реНрдпрд╛ рд╢реАрд░реНрд╖рдХрд╛рд▓рд╛ рдПрдХ type (TEXT, INTEGER) рдЖрдгрд┐ рдирд┐рдпрдо (NOT NULL,
UNIQUE, CHECK) рдЕрд╕рддрд╛рдд. рдХреЛрдгрддреНрдпрд╛рд╣реА program рд▓рд╛ рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрдгреНрдпрд╛рдЖрдзреАрдЪ рдиреЛрдВрджрд╡рд╣реА
рд╕реНрд╡рддрдГрдЪ рдореВрд░реНрдЦрдкрдгрд╛ рдирд╛рдХрд╛рд░рддреЗ тАФ рджреБрд╣реЗрд░реА roll number, Z рд╣рд╛ grade.
ЁЯЧ║я╕П рдЖрдХреГрддреА
erDiagram
classes ||--o{ students : "class_id тЖТ classes.id"
students ||--o{ grades : "student_id тЖТ students.id"
classes { int id PK "line number" string name "UNIQUE: 3A, 3B" }
students { int id PK string name string roll_no "UNIQUE" int class_id FK }
grades { int id PK int student_id FK string subject int term "CHECK 1-3" string grade "CHECK A+..C" }
тЭУ рдХрд╛рдп
- Table = рдПрдХ рдиреЛрдВрджрд╡рд╣реА; row = рдПрдХ рдУрд│ (рдПрдХ рдЧреЛрд╖реНрдЯ); column = type рдЕрд╕рд▓реЗрд▓реЗ рдПрдХ рд╢реАрд░реНрд╖рдХ. рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░рдЪреНрдпрд╛ рдЧреЛрд╖реНрдЯреАрд╕рд╛рдареА рдПрдХ table.
- Primary key: row рд▓рд╛ рдЕрдирдиреНрдпрдкрдгреЗ рдУрд│рдЦрдгрд╛рд░рд╛ рдЖрдгрд┐ рдХрдзреАрдЪ рди рдмрджрд▓рдгрд╛рд░рд╛ column (рдХрд┐рдВрд╡рд╛
columns рдЪрд╛ рд╕рдВрдЪ). integer ids рд╣рд╛ рдХрдВрдЯрд╛рд│рд╡рд╛рдгрд╛ рдкрдг рдмрд░реЛрдмрд░ default рдЖрд╣реЗ; рдиреИрд╕рд░реНрдЧрд┐рдХ keys
(roll numbers) рдирд╛ рддреНрдпрд╛рдРрд╡рдЬреА
UNIQUEconstraint рдорд┐рд│рддреЛ. - Foreign key: рджреБрд╕рд▒реНрдпрд╛ table рдЪреА primary key рдзрд░рдгрд╛рд░рд╛ column.
REFERENCES classes(id)рдореБрд│реЗ database рдЕрдирд╛рде rows рдирд╛рдХрд╛рд░рддреЛ.gradesрд╡рд░реАрд▓ON DELETE CASCADEрдореНрд╣рдгрдЬреЗ рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреА delete рдХреЗрд▓реА рдХреА рддрд┐рдЪреЗ grades рд╕реБрджреНрдзрд╛ рдЬрд╛рддрд╛рдд тАФ рд╣рд╛ рдирд┐рд░реНрдгрдп рддреБрдореНрд╣реА рдкреНрд░рддреНрдпреЗрдХ рдирд╛рддреНрдпрд╛рд╕рд╛рдареА, рдореБрджреНрджрд╛рдо рдШреЗрддрд╛. - Constraints:
NOT NULL,UNIQUE,CHECK (grade IN (...)), compositeUNIQUE (student_id, subject, term)тАФ "рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреАрд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╖рдпрд╛рдд рдкреНрд░рддреНрдпреЗрдХ term рд▓рд╛ рдПрдХрдЪ grade" рд╣реЗ рдереЗрдЯ рдХрдкрд╛рдЯрд╛рддрдЪ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ. - рдирд╛рддреА: рдПрдХ class тЖТ рдЕрдиреЗрдХ students тЖТ рдЕрдиреЗрдХ grades. "рдЕрдиреЗрдХ" рдмрд╛рдЬреВ foreign key рдзрд░рддреЗ.
- SQLite рдЯреАрдк: foreign keys рдлрдХреНрдд
PRAGMA foreign_keys = ONрдирдВрддрд░рдЪ рд▓рд╛рдЧреВ рд╣реЛрддрд╛рдд (рдЖрдордЪрд╛ code рдкреНрд░рддреНрдпреЗрдХ connection рд╡рд░ рд╣реЗ рдХрд░рддреЛ); Postgres рдЖрдгрд┐ MySQL рддреЗ рдиреЗрд╣рдореАрдЪ рд▓рд╛рдЧреВ рдХрд░рддрд╛рдд.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг рддреАрд╕ rows рдордзреНрдпреЗ copy рдХреЗрд▓реЗрд▓реА рдорд╛рд╣рд┐рддреА рд╢реБрдХреНрд░рд╡рд╛рд░рдкрд░реНрдпрдВрдд рддреНрдпрд╛рдкреИрдХреА рдПрдХрд╛рдд рддрд░реА рдЪреБрдХреАрдЪреА рдЕрд╕реЗрд▓, рдЖрдгрд┐ рдХреБрдареЗрдЪ рдмреЛрдЯ рди рджрд╛рдЦрд╡рдгрд╛рд░реА row рдореНрд╣рдгрдЬреЗ report рдЪреА рд╡рд╛рдЯ рдкрд╛рд╣рдгрд╛рд░рд╛ crash. Keys рдЖрдгрд┐ constraints рдирд┐рдпрдорд╛рдВрдирд╛ рдкреНрд░рддреНрдпреЗрдХ program рдордзреВрди рдмрд╛рд╣реЗрд░ рдХрд╛рдвреВрди рд╕рд░реНрд╡ programs рд╡рд╛рдкрд░рддрд╛рдд рддреНрдпрд╛ рдПрдХрд╛рдЪ рдЬрд╛рдЧреА рдиреЗрддрд╛рдд. рдореНрд╣рдгреВрдирдЪ API рд╢рд╛рд│реЗрдЪрд╛ counter рд▓рд╣рд╛рди рд░рд╛рд╣реВ рд╢рдХрддреЛ: рдЦреЛрд▓реА рдЖрдзреАрдЪ рдореВрд░реНрдЦрдкрдгрд╛ рдирд╛рдХрд╛рд░рддреЗ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
db/schema.sql рд╡рд░рдкрд╛рд╕реВрди рдЦрд╛рд▓рдкрд░реНрдпрдВрдд рд╡рд╛рдЪрд╛: рдЪрд╛рд░ CREATE TABLE, рдкреНрд░рддреНрдпреЗрдХреА рдЖрдкрд▓реА primary key, foreign keys, constraints тАФ рдЖрдгрд┐ рджреЛрди indexes
рдЬреЗ рдЖрдореНрд╣реА рдзрдбрд╛ 06 рдордзреНрдпреЗ рд╕рдордЬрд╛рд╡рддреЛ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 db/demo.py model # watch the schema refuse a duplicate roll number and an impossible grade
python3 - <<'EOF'
import sqlite3; c = sqlite3.connect("db/school.db"); c.execute("PRAGMA foreign_keys = ON")
print(c.execute("PRAGMA table_info(students)").fetchall()) # the printed headings
try: c.execute("INSERT INTO students (name, roll_no, class_id) VALUES ('Ghost', '9Z-01', 99)")
except sqlite3.IntegrityError as e: print("refused:", e) # a line may not point nowhere
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
table_info рдордзреНрдпреЗ id, name, roll_no, class_id рддреНрдпрд╛рдВрдЪреНрдпрд╛ types рдЖрдгрд┐ notnull flags рд╕рд╣ рджрд┐рд╕рддрд╛рдд; class_id = 99 рдЕрд╕рд▓реЗрд▓рд╛ insert refused: FOREIGN KEY constraint failed рдЫрд╛рдкрддреЛ; demo.py model рдЖрдгрдЦреА рджреЛрди рдирдХрд╛рд░ рджрд╛рдЦрд╡рддреЛ (UNIQUE рдЖрдгрд┐ CHECK).
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рдЦреЛрд▓реАрдЪрд╛ рдЖрдХрд╛рд░ рдХрдкрд╛рдЯрд╛рддрдЪ рд▓рд┐рд╣рд┐рд▓реЗрд▓рд╛ рдЖрд╣реЗ: keys рдиреЛрдВрджрд╡рд╣реНрдпрд╛ рдЬреЛрдбрддрд╛рдд, рдЖрдгрд┐ constraints рдХреЛрдгрддреНрдпрд╛рд╣реА program рд▓рд╛ рджрд┐рд╕рдгреНрдпрд╛рдЖрдзреАрдЪ рд╡рд╛рдИрдЯ рдУрд│реА рдирд╛рдХрд╛рд░рддрд╛рдд.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- classes рдиреЛрдВрджрд╡рд╣реАрдХрдбреЗ рдмреЛрдЯ рджрд╛рдЦрд╡рдгреНрдпрд╛рдРрд╡рдЬреА рд╡рд░реНрдЧрд╛рдЪреЗ рдирд╛рд╡ students table рдордзреНрдпреЗ copy рдХрд░рдгреЗ
- primary keys рдкреБрдиреНрд╣рд╛ рд╡рд╛рдкрд░рдгреЗ рдХрд┐рдВрд╡рд╛ рдмрджрд▓рдгреЗ тАФ key рдореНрд╣рдгрдЬреЗ рдУрд│ рдХреНрд░рдорд╛рдВрдХ, label рдирд╡реНрд╣реЗ
- "speed рд╕рд╛рдареА" foreign keys рд╡рдЧрд│рдгреЗ тАФ рддреБрдореНрд╣реА рдирдВрддрд░рдЪреА data рд╕рд╛рдлрд╕рдлрд╛рдИ рд╡рд┐рдХрдд рдШреЗрддрд▓реА рдЖрд╣реЗ
- value рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рддрд╛рдирд╛
NULLтАФNOT NULLрдореНрд╣рдгрд╛ рдЖрдгрд┐ рддреЗ рдЦрд░реЗ рдХрд░рд╛
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: "report рдЪреБрдХреАрдЪрд╛ рдЖрд╣реЗ" рдЕрд╢рд╛ рдмрд╣реБрддреЗрдХ tickets рдЪреЗ рдореВрд│ рджреЛрди рдард┐рдХрд╛рдгреА рд╕рд╛рдард╡рд▓реЗрд▓реА рдорд╛рд╣рд┐рддреА рдХрд┐рдВрд╡рд╛ delete рдЭрд╛рд▓реЗрд▓реНрдпрд╛ row рдХрдбреЗ рдмреЛрдЯ рджрд╛рдЦрд╡рдгрд╛рд░рд╛ reference рдЕрд╕рддреЗ. Constraints рд╣рд╛ рддреБрдореНрд╣реА рдХрдзреАрд╣реА рд▓рд┐рд╣рд╛рд▓ рдЕрд╕рд╛ рд╕рд░реНрд╡рд╛рдд рд╕реНрд╡рд╕реНрдд test suite рдЖрд╣реЗ.
тПня╕П рдкреБрдвреЗ
рдЖрддрд╛ рдиреЛрдВрджрд╡рд╣реНрдпрд╛рдВрдирд╛ рдЖрдХрд╛рд░ рдЖрд▓рд╛ рдЖрд╣реЗ, рддреНрдпрд╛рдВрдирд╛ рдкреНрд░рд╢реНрди рд╡рд┐рдЪрд╛рд░рд╛: SQL reads тАФ SELECT, WHERE, ORDER BY, LIMIT, рдЖрдгрд┐ рдиреЛрдВрджрд╡рд╣реНрдпрд╛рдВрдордзреНрдпреЗ JOIN.
git checkout lesson-03-sql-reads