Skip to content · ⁨דלג לתוכן⁩
Subjects · ⁨נושאים⁩
  • 1 Querying basics · ⁨בסיסי שאילתות⁩
    1.1

    SELECT ו-FROM

    English

    A database 数据库 keeps data in tables 表. A query 查询 reads data with SELECT. SELECT * returns every column; FROM names the table.

    • Each row 行 is one record 记录. SQL keywords are written in UPPERCASE by habit.
    • A statement ends with a semicolon ;.
    עברית

    מאגר נתונים שומר נתונים בטבלאות. שאילתה קוראת נתונים באמצעות SELECT. SELECT * מחזירה את כל העמודות; FROM מציין את שם הטבלה.

    CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
    INSERT INTO student VALUES (1, 'Mei', 88), (2, 'Sam', 71);
    SELECT * FROM student;
    
    טבלה מאחסנת רשומות: כל שורה היא רשומה אחת, כל עמודה היא שדה אחד
    טבלה מאחסנת רשומות: כל שורה היא רשומה אחת, כל עמודה היא שדה אחד
    • כל שורה היא רשומה אחת. מילות מפתח SQL נכתבות באותיות גדולות לפי הרגל.
    • הוראה מסתיימת בסימן נקודה-פסיק ;.
    1.2

    בחירת עמודות

    English

    List the columns 列 you want, separated by commas. Use AS to rename a column in the result (an alias 别名).

    A selected column can also be a calculation — pair it with AS to name the new column:

    • SELECT DISTINCT col removes duplicate values from the result.
    עברית

    רשום את העמודות הרצויות, מופרדות בפסיקים. השתמש בAS כדי לשנות שם לעמודה בתוצאה (כינוי).

    CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
    INSERT INTO student VALUES (1, 'Mei', 88), (2, 'Sam', 71);
    SELECT name, score AS mark FROM student;
    

    עמודה שנבחרה יכולה להיות גם חישוב — הצמד אותה ל-AS כדי לקרוא לעמודה החדשה:

    CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
    INSERT INTO student VALUES (1, 'Mei', 88), (2, 'Sam', 71);
    SELECT name, score + 5 AS bonus FROM student;
    
    • SELECT DISTINCT col מסיר ערכים כפולים מהתוצאה.
    1.3

    סינון עם WHERE

    English

    WHERE keeps only the rows that match a condition 条件. Compare with =, <> (not equal), <, >, <=, >=. Put text in single quotes.

    • SQL runs the parts in this order: FROM → WHERE → SELECT.

    Common mistakes

    • Put text values in single quotes: WHERE name = 'Ann'; column names have no quotes.
    • SELECT * returns every column — name only the columns you need.
    • WHERE filters rows; it comes after FROM.
    עברית

    WHERE משאיר רק שורות העונים לתנאי. השווה ל-=, <> (לא שווה), <, >, <=, >=. כתוב טקסט בתוך סימני ציטוט יחידים.

    CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
    INSERT INTO student VALUES (1, 'Mei', 88), (2, 'Sam', 71), (3, 'Ana', 95);
    SELECT name, score FROM student WHERE score >= 80;
    
    • SQL מنفذ את החלקים בסדר זה: FROM → WHERE → SELECT.

    שגיאות נפוצות

    • כתוב ערכי טקסט בתוך סימני ציטוט יחידים: WHERE name = 'Ann'; שמות עמודות אינם זקוקים לסימנים.
    • SELECT * מחזיר כל עמודה — ציין רק את העמודות שהן נחוצות לך.
    • WHERE מסנן שורות; הוא בא לאחר FROM.
  • 2 Filtering & logic · ⁨סינון ולוגיקה⁩
    2.1

    AND, OR, NOT

    English

    Combine conditions with AND, OR, NOT. AND needs all sides true; OR needs any side true; NOT reverses one. Use brackets to set the precedence 优先级.

    עברית

    שלב תנאים ב-AND, OR, NOT. AND דורש שהכל יהיה אמת; OR דורש שרק אחד יהיה אמת; NOT הופך אחד. השתמש בסוגריים כדי לקבוע עדיפות.

    CREATE TABLE student (id INTEGER, name TEXT, form TEXT, score INTEGER);
    INSERT INTO student VALUES (1,'Mei','11A',88),(2,'Sam','11B',71),(3,'Ana','11A',95);
    SELECT name FROM student WHERE form = '11A' AND score >= 90;
    
    AND דורש שהכל יהיה אמת; OR דורש שאחד יהיה אמת; NOT הופך אחד
    AND דורש שהכל יהיה אמת; OR דורש שאחד יהיה אמת; NOT הופך אחד
    2.2

    LIKE, IN ו-BETWEEN

    English

    LIKE matches a text pattern 模式: % stands for any text and _ for one character — these are wildcards 通配符.

    Pattern Matches
    'M%' starts with M
    '%a' ends with a
    '%an%' contains "an"
    'M_i' M, then exactly one character, then i

    IN matches a set 集合 of values; BETWEEN matches a range 范围 (both ends included).

    עברית

    LIKE תואם דפוס של טקסט: % מייצג כל טקסט ו-_ מייצג תווה אחד — אלו הם פסי תווים (wildcards).

    CREATE TABLE student (id INTEGER, name TEXT, form TEXT, score INTEGER);
    INSERT INTO student VALUES (1,'Mei','11A',88),(2,'Sam','11B',71),(3,'Ana','11A',95);
    SELECT name FROM student WHERE name LIKE 'M%';        -- starts with M
    
    דפוס תואם
    'M%' מתחיל ב-M
    '%a' מסתיים ב-a
    '%an%' מכיל "an"
    'M_i' M, ולאחריו בדיוק תווה אחד, ואז i

    IN תואם קבוצה של ערכים; BETWEEN תואם טווח (שתי הקצוות כלולות).

    CREATE TABLE student (id INTEGER, name TEXT, form TEXT, score INTEGER);
    INSERT INTO student VALUES (1,'Mei','11A',88),(2,'Sam','11B',71),(3,'Ana','11A',95);
    SELECT name, score FROM student
    WHERE form IN ('11A', '11C') AND score BETWEEN 80 AND 100;
    
    2.3

    NULL

    English

    NULL marks a missing value 缺失值 — nothing was stored in that cell. NULL is not 0 and not an empty string. A comparison with = or <> never matches it; test with IS NULL or IS NOT NULL.

    • WHERE score = NULL returns no rows at all — not even Sam's row.
    • A NULL in arithmetic gives NULL: score + 5 stays NULL for Sam.

    Common mistakes

    • Test for an empty value with IS NULL, never = NULL.
    • In LIKE, % matches any text and _ matches one character: 'A%' means "starts with A".
    • IN (1, 2, 3) is shorter than many ORs; BETWEEN a AND b includes both ends.
    עברית

    NULL מסמן ערך חסר — לא נשמר כל דבר בתא זה. NULL אינו 0 ואינו מחרוזת ריקה. השוואה ל-= או ל-<> לעולם לא תתאים לו; בדיקה יש לבצע עם IS NULL או IS NOT NULL.

    CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
    INSERT INTO student VALUES (1, 'Mei', 88), (2, 'Sam', NULL), (3, 'Ana', 95);
    SELECT name FROM student WHERE score IS NULL;
    
    CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
    INSERT INTO student VALUES (1, 'Mei', 88), (2, 'Sam', NULL), (3, 'Ana', 95);
    SELECT name, score FROM student WHERE score IS NOT NULL;
    
    • WHERE score = NULL מחזירה אף שורה כלל — גם לא את שורת סם.
    • NULL באריתמטיקה נותן NULL: score + 5 נשאר NULL עבור סם.

    שגיאות נפוצות

    • בדוק ערך ריק עם IS NULL, לעולם אל תשתמש ב-= NULL.
    • ב-LIKE, % מתאים לכל טקסט ו-_ מתאים לאות אחת: 'A%' פירושו "מתחיל ב-A".
    • IN (1, 2, 3) קצר ממספר ORs; BETWEEN a AND b כולל את שני הקצוות.
  • 3 Sorting & limiting · ⁨מיון והגבלה⁩
    3.1

    ORDER BY ו-LIMIT

    English

    ORDER BY sorts 排序 the result rows. Add DESC for descending 降序 (high to low); the default is ascending 升序 (low to high).

    Sort by more than one column

    List several columns. A tie 平局 in the first column is broken by the next.

    LIMIT (top-N)

    LIMIT n keeps only the first n rows — pair it with ORDER BY for a top-N 前 N 名 list.

    • ORDER BY can also sort by an alias or a calculation: ORDER BY avg_score DESC.
    • Text sorts alphabetically: ORDER BY name runs A → Z.

    Common mistakes

    • ORDER BY sorts ascending by default; add DESC for descending.
    • ORDER BY comes near the end, after WHERE and GROUP BY.
    • LIMIT caps how many rows come back, but only after sorting.
    עברית

    ORDER BY ממיינת את שורות התוצאה. הוספת DESC תסדר יורד (גבוה לנמוך); ברירת המחדל היא עולה (נמוך לגבוה).

    CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
    INSERT INTO student VALUES (1,'Mei',88),(2,'Sam',71),(3,'Ana',95);
    SELECT name, score FROM student ORDER BY score DESC;
    

    סידור לפי יותר מעמודה אחת

    רשימה של כמה עמודות. במקרה של שוויון בעמודה הראשונה, הפריצה נעשית על ידי הבאה.

    CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
    INSERT INTO student VALUES (1,'Mei',88),(2,'Sam',88),(3,'Ana',95);
    SELECT name, score FROM student ORDER BY score DESC, name ASC;
    

    LIMIT (N העליונים)

    LIMIT n משארת רק את n השורות הראשונות — שלב אותה עם ORDER BY ליצירת רשימת N העליונים.

    CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
    INSERT INTO student VALUES (1,'Mei',88),(2,'Sam',71),(3,'Ana',95);
    SELECT name, score FROM student ORDER BY score DESC LIMIT 2;
    
    • ORDER BY יכול גם למיין לפי כינוי או חישוב: ORDER BY avg_score DESC.
    • טקסט ממוין אלפביתית: ORDER BY name מריץ A → Z.

    שגיאות נפוצות

    • ORDER BY ממיין ברירת מחדל עולה; הוספת DESC תסדר יורד.
    • ORDER BY נמצא בסוף, לאחר WHERE ו-GROUP BY.
    • LIMIT מגבילה את מספר השורות החוזרות, אך רק לאחר הסידור.
    ORDER BY סודה; LIMIT משארת את n הראשונים לאחר סידור
    ORDER BY סודה; LIMIT משארת את n הראשונים לאחר סידור
  • 4 Aggregates & grouping · ⁨צבירה וקבוצה⁩
    4.1

    פונקציות אגרוגט

    English

    An aggregate function 聚合函数 turns many rows into one summary 汇总 value. Wrap an average in ROUND(x, 2) to tidy it.

    Function Gives
    COUNT(*) how many rows
    SUM(col) the total
    AVG(col) the mean average
    MIN(col) / MAX(col) the smallest / largest value
    עברית

    פונקציית סיכום ממירה שורות רבים לערך סיכום אחד. עטוף ממוצע בROUND(x, 2) כדי לסדר אותו.

    פונקציה נותנת
    COUNT(*) כמה שורות יש
    SUM(col) הסכום הכולל
    AVG(col) הממוצע האריטמטי
    MIN(col) / MAX(col) הערך הקטן ביותר / הגדול ביותר
    CREATE TABLE student (id INTEGER, name TEXT, form TEXT, score INTEGER);
    INSERT INTO student VALUES (1,'Mei','11A',88),(2,'Sam','11B',71),(3,'Ana','11A',95);
    SELECT COUNT(*), ROUND(AVG(score), 2), MAX(score) FROM student;
    
    4.2

    קבוצה לפי (GROUP BY) וסינון (HAVING)

    English

    GROUP BY makes one summary row per group 组. HAVING filters those groups — it is like WHERE, but it runs after grouping.

    Whatever order you write them in, SQL always runs the clauses of a query in the same fixed order:

    Step Clause
    1 FROM (and any JOIN)
    2 WHERE — filter rows
    3 GROUP BY — form groups
    4 HAVING — filter groups
    5 SELECT — compute the output columns
    6 ORDER BY, then LIMIT

    Common mistakes

    • You cannot select a plain column beside an aggregate unless it is in GROUP BY.
    • Filter rows with WHERE (before grouping) and filter groups with HAVING (after).
    • COUNT(*) counts rows; COUNT(col) skips NULLs in that column.
    עברית

    GROUP BY יוצר שורת סיכום אחת לכל קבוצה. HAVING מסנן את הקבוצות הללו — זהו כמו WHERE, אך הוא מתבצע לאחר הקבוצה.

    CREATE TABLE student (id INTEGER, name TEXT, form TEXT, score INTEGER);
    INSERT INTO student VALUES (1,'Mei','11A',88),(2,'Sam','11B',71),(3,'Ana','11A',95);
    SELECT form, COUNT(*) AS n, ROUND(AVG(score), 2) AS avg_score
    FROM student
    GROUP BY form
    HAVING COUNT(*) > 1;
    
    GROUP BY אוסף שורות לתוך מיכל אחד עבור כל ערך; כל מיכל הופך לשורת סיכום אחת
    GROUP BY אוסף שורות לתוך מיכל אחד עבור כל ערך; כל מיכל הופך לשורת סיכום אחת

    לא משנה באיזה סדר תכתוב אותם, SQL תמיד מבצעת את סעיפי השאלה בסדר קבוע וקבוע:

    שלב סעיף
    1 FROM (וגם כל JOIN)
    2 WHERE — סינון שורות
    3 GROUP BY — יצירת קבוצות
    4 HAVING — סינון קבוצות
    5 SELECT — חישוב עמודות התוצאה
    6 ORDER BY, ולאחר מכן LIMIT

    שגיאות נפוצות

    • אין לבחור עמודה רגילה לצד פונקציית סיכום אלא אם כן היא נמצאת בתוך GROUP BY.
    • סנן שורות עם WHERE (לפני הקבוצה) וסנן קבוצות עם HAVING (אחרי).
    • COUNT(*) סופר שורות; COUNT(col) דורש NULLים בעמודה זו.
  • 5 Joins · ⁨חיבורים (Joins)⁩
    5.1

    Keys & relationships

    English

    A primary key 主键 uniquely names each row in a table. A foreign key 外键 in one table points to the primary key of another — that builds a relationship 关系 between them.

    עברית

    A primary key 主键 uniquely names each row in a table. A foreign key 外键 in one table points to the primary key of another — that builds a relationship 关系 between them.

    CREATE TABLE class (id INTEGER, name TEXT);
    CREATE TABLE student (id INTEGER, name TEXT, class_id INTEGER);
    INSERT INTO class VALUES (1, 'Maths'), (2, 'Art');
    INSERT INTO student VALUES (1, 'Mei', 1), (2, 'Sam', 2);
    SELECT * FROM student;
    
    5.2

    INNER JOIN

    English

    A join 连接 combines rows from two tables. INNER JOIN ... ON ... keeps rows where the keys match. A short alias 别名 (s, c) keeps the query readable.

    עברית

    A join 连接 combines rows from two tables. INNER JOIN ... ON ... keeps rows where the keys match. A short alias 别名 (s, c) keeps the query readable.

    CREATE TABLE class (id INTEGER, name TEXT);
    CREATE TABLE student (id INTEGER, name TEXT, class_id INTEGER);
    INSERT INTO class VALUES (1, 'Maths'), (2, 'Art');
    INSERT INTO student VALUES (1, 'Mei', 1), (2, 'Sam', 2);
    SELECT s.name, c.name AS class
    FROM student s INNER JOIN class c ON s.class_id = c.id;
    
    INNER JOIN matches each foreign key to a primary key and combines the matched rows
    INNER JOIN matches each foreign key to a primary key and combines the matched rows
    5.3

    Joining with grouping

    Join first, then GROUP BY to summarise across the joined rows.

    CREATE TABLE class (id INTEGER, name TEXT);
    CREATE TABLE student (id INTEGER, name TEXT, class_id INTEGER);
    INSERT INTO class VALUES (1, 'Maths'), (2, 'Art');
    INSERT INTO student VALUES (1, 'Mei', 1), (2, 'Sam', 2), (3, 'Ana', 1);
    SELECT c.name AS class, COUNT(*) AS n
    FROM student s INNER JOIN class c ON s.class_id = c.id
    GROUP BY c.name;
    
    5.4

    LEFT JOIN

    English

    An INNER JOIN keeps only matched rows. A LEFT JOIN 左连接 keeps every row of the left (first) table; where there is no match, the right table's columns come back as NULL.

    • Sam has no class, but the row still appears — with class as NULL.
    • To find only the unmatched rows, add WHERE c.id IS NULL.

    Common mistakes

    • A join with no ON condition pairs every row with every row (a cross join).
    • Match the foreign key to the primary key: ON orders.customer_id = customers.id.
    • An INNER JOIN drops rows that have no match on the other side; use a LEFT JOIN to keep them.
    עברית

    An INNER JOIN keeps only matched rows. A LEFT JOIN 左连接 keeps every row of the left (first) table; where there is no match, the right table's columns come back as NULL.

    CREATE TABLE class (id INTEGER, name TEXT);
    CREATE TABLE student (id INTEGER, name TEXT, class_id INTEGER);
    INSERT INTO class VALUES (1, 'Maths'), (2, 'Art');
    INSERT INTO student VALUES (1, 'Mei', 1), (2, 'Sam', NULL);
    SELECT s.name, c.name AS class
    FROM student s LEFT JOIN class c ON s.class_id = c.id;
    
    • Sam has no class, but the row still appears — with class as NULL.
    • To find only the unmatched rows, add WHERE c.id IS NULL.

    Common mistakes

    • A join with no ON condition pairs every row with every row (a cross join).
    • Match the foreign key to the primary key: ON orders.customer_id = customers.id.
    • An INNER JOIN drops rows that have no match on the other side; use a LEFT JOIN to keep them.
  • 6 Modifying data · ⁨שינוי נתונים⁩
    6.1

    INSERT

    English

    INSERT INTO ... VALUES ... adds new rows 行. Name the columns, then give the values in the same order. (Each block below ends with a SELECT so you can see the result.)

    • INSERT INTO t VALUES (...), (...); adds several rows in one statement.
    עברית

    INSERT INTO ... VALUES ... מוסיף שורות חדשות. ציין את העמודות, ולאחר מכן את הערכים באותו סדר. (כל בלוק למטה מסתיים ב-SELECT כך שתוכל לראות את התוצאה.)

    CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
    INSERT INTO student (id, name, score) VALUES (1, 'Mei', 88);
    INSERT INTO student VALUES (2, 'Sam', 71);
    SELECT * FROM student;
    
    • INSERT INTO t VALUES (...), (...); מוסיף מספר שורות במשמר אחד.
    INSERT מוסיף שורה חדשה לטבלה
    INSERT מוסיף שורה חדשה לטבלה
    6.2

    UPDATE

    English

    UPDATE ... SET ... WHERE ... changes existing rows. Always add WHERE, or every row changes.

    עברית

    UPDATE ... SET ... WHERE ... משנה שורות קיימות. תמיד יש להוסיף WHERE, אחרת כל השורות ישתנו.

    CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
    INSERT INTO student VALUES (1, 'Mei', 88), (2, 'Sam', 71);
    UPDATE student SET score = 75 WHERE name = 'Sam';
    SELECT * FROM student;
    
    6.3

    DELETE

    English

    DELETE FROM ... WHERE ... removes rows. Without WHERE it empties the whole table 表.

    Common mistakes

    • UPDATE and DELETE without a WHERE change every row — always add the WHERE.
    • In INSERT, the values must line up with the column list in order and type.
    • Test a risky DELETE first as a SELECT with the same WHERE.
    עברית

    DELETE FROM ... WHERE ... מחק שורות. ללא WHERE הוא ריק את כל הטבלה.

    CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
    INSERT INTO student VALUES (1, 'Mei', 88), (2, 'Sam', 71);
    DELETE FROM student WHERE score < 80;
    SELECT * FROM student;
    

    שגיאות נפוצות

    • UPDATE ו-DELETE ללא WHERE משנים כל שורה — תמיד יש להוסיף את הWHERE.
    • ב-INSERT, הערכים חייבים להיות מסודרים לפי רשימת העמודות בסדר ובסוג נתונים מתאים.
    • בדוק פקודה DELETE סיכוןית תחילה כ-SELECT עם אותו WHERE.
  • 7 Defining tables · ⁨הגדרת טבלאות⁩
    7.1

    CREATE TABLE & סוגי נתונים

    English

    CREATE TABLE defines a table's schema 表结构: the column names and their data types 数据类型. The main SQLite types are INTEGER, TEXT, and REAL (a decimal number).

    עברית

    CREATE TABLE מגדיר את הסכמה של טבלה: שמות העמודות וסוגי הנתונים שלהם. סוגי הנתונים העיקריים ב-SQLite הם INTEGER, TEXT, ו-REAL (מספר עשרוני).

    CREATE TABLE student (id INTEGER, name TEXT, score REAL);
    INSERT INTO student VALUES (1, 'Mei', 88.5);
    SELECT * FROM student;
    
    CREATE TABLE שם עמודות וסוגי נתונים
    CREATE TABLE שם עמודות וסוגי נתונים
    7.2

    מקראות ומגבלות

    English

    A constraint 约束 is a rule on a column: PRIMARY KEY (a unique id), NOT NULL (must have a value), UNIQUE, and DEFAULT (a fallback value).

    Declare a foreign key with REFERENCES — it records that the column points at another table's primary key:

    • The long form is FOREIGN KEY (class_id) REFERENCES class(id) on its own line.
    עברית

    מגבלה היא חוק על עמודה: PRIMARY KEY (מזהה ייחודי), NOT NULL (חייב לעבור ערך), UNIQUE, ו-DEFAULT (ערך ברירת מחדל).

    CREATE TABLE student (
        id INTEGER PRIMARY KEY,
        name TEXT NOT NULL,
        score INTEGER DEFAULT 0
    );
    INSERT INTO student (id, name) VALUES (1, 'Mei');
    SELECT * FROM student;
    

    הצהר מקרא חיצוני באמצעות REFERENCES — הוא מקליד שהעמודה מצביעה על המקרא הראשוני בטבלה אחרת:

    CREATE TABLE class (id INTEGER PRIMARY KEY, name TEXT);
    CREATE TABLE student (
        id INTEGER PRIMARY KEY,
        name TEXT NOT NULL,
        class_id INTEGER REFERENCES class(id)
    );
    INSERT INTO class VALUES (1, 'Maths');
    INSERT INTO student VALUES (1, 'Mei', 1);
    SELECT s.name, c.name AS class
    FROM student s INNER JOIN class c ON s.class_id = c.id;
    
    • הצורה הארוכה היא FOREIGN KEY (class_id) REFERENCES class(id) בשורה עצמאית.
    7.3

    ALTER TABLE

    English

    ALTER TABLE ... ADD COLUMN ... changes the schema of a table that already exists. A DEFAULT fills the new column in the old rows.

    • ALTER TABLE student RENAME TO pupil; renames the whole table.
    • DROP TABLE student; deletes the table completely — structure and data.

    Common mistakes

    • Every column needs a data type (e.g. INTEGER, TEXT).
    • A PRIMARY KEY must be unique and cannot be NULL.
    • A foreign key value must exist in the table it points to.
    עברית

    ALTER TABLE ... ADD COLUMN ... משנה את הסכמה של טבלה קיימת. ערך DEFAULT ממלא את העמודה החדשה בשורות הישנות.

    CREATE TABLE student (id INTEGER, name TEXT);
    INSERT INTO student VALUES (1, 'Mei');
    ALTER TABLE student ADD COLUMN score INTEGER DEFAULT 0;
    SELECT * FROM student;
    
    • ALTER TABLE student RENAME TO pupil; משנה את שם כל הטבלה.
    • DROP TABLE student; מחק את הטבלה לחלוטין — המבנה וגם הנתונים.

    שגיאות נפוצות

    • לכל עמודה יש צורך בסוג נתונים (למשל INTEGER, TEXT).
    • מפתח ראשי חייב להיות ייחודי ואינו יכול להיות NULL.
    • ערך של מפתח זר חייב לקיים קיום בטבלה שאליו הוא מצביע.
  • 8 Database design · ⁨עיצוב מסדי נתונים⁩
    8.1

    קשרים ותרגילי ER

    English

    Tables connect through relationships 关系. One-to-many 一对多 is the most common: one class has many students. Many-to-many 多对多 needs a join table 连接表 in the middle. An entity-relationship diagram 实体关系图 (ER diagram) draws each entity 实体 as a box and each relationship as a line.

    Relationship Example
    one-to-one a person and their passport
    one-to-many a class and its students
    many-to-many students and clubs

    The join table holds one row per link. Here Mei is in two clubs, and Chess has two members:

    עברית

    טבלות מחוברות דרך קשרים. קשר אחד-לרבים הוא הנפוץ ביותר: כיתה אחת מכילה תלמידים רבים. קשר רבים-לרבים דורש טבלת חיבור באמצע. דיאגרמת אובייקט-קשר (ER diagram) מציירת כל אובייקט כתיבה וכל קשר כקו.

    קשר דוגמה
    אחד-לאחד אדם והדרכון שלו
    אחד-לרבים כיתה ותלמידיה
    רבים-לרבים תלמידים ומועדונים
    הצד "רבים" מכיל את המפתח הזר; קשר רבים-לרבים דורש טבלת חיבור
    הצד "רבים" מכיל את המפתח הזר; קשר רבים-לרבים דורש טבלת חיבור

    טבלת החיבור מכילה שורה אחת לכל קשר. כאן, מי נמצאת בשני מועדונים, ומועדון השחמט יש לו שני חברים:

    CREATE TABLE student (id INTEGER PRIMARY KEY, name TEXT);
    CREATE TABLE club (id INTEGER PRIMARY KEY, name TEXT);
    CREATE TABLE membership (student_id INTEGER, club_id INTEGER);
    INSERT INTO student VALUES (1, 'Mei'), (2, 'Sam');
    INSERT INTO club VALUES (1, 'Chess'), (2, 'Art');
    INSERT INTO membership VALUES (1, 1), (1, 2), (2, 1);
    SELECT s.name, c.name AS club
    FROM membership m
    INNER JOIN student s ON m.student_id = s.id
    INNER JOIN club c ON m.club_id = c.id;
    
    8.2

    נורמליזציה

    English

    Normalisation 范式化 organises tables to avoid redundancy 冗余 (the same data repeated) and the update mistakes it causes. The first three normal forms 范式:

    • 1NF: every cell holds one atomic 原子 value — no lists inside a cell.
    • 2NF: no column depends on only part of a composite key 复合主键.
    • 3NF: no column depends on another non-key column.
    Unnormalised (bad) Normalised (better)
    student(name, club1, club2) student(name) + membership(student, club)

    Common mistakes

    • Split repeating groups into their own table (normalisation) instead of many similar columns.
    • Each table should describe ONE kind of thing.
    • Link tables with a foreign key that points to another table's primary key.
    עברית

    נורמליזציה מארגנת טבלות כדי למנוע כפילות (אותו נתון חוזר) והטעויות בעדכון שהיא גורמת. שלושת הצורות הנורמליות הראשונות:

    • 1NF: כל תא מכיל ערך אטומי בלבד — אין רשימות בתוך תא.
    • 2NF: אין עמודה שתלויה רק בחלק ממפתח מורכב.
    • 3NF: אין עמודה שתלויה בעמודה אחרת שאינה מפתח.
    לא נורמלי (גרוע) נורמלי (טוב יותר)
    student(name, club1, club2) student(name) + membership(student, club)

    שגיאות נפוצות

    • לחלוק קבוצות חוזרות לטבלה משלה (נורמליזציה) במקום להשתמש בהרבה עמודות דומות.
    • כל טבלה צריכה לתאר סוג אחד בלבד של דבר.
    • לקשר טבלות באמצעות מפתח זר שמצביע על המפתח הראשי של טבלה אחרת.

Log in or create account · ⁨היכנס או צור חשבון⁩

IGCSE, A-Level & AP