פרק קודם:
מסדי נתונים ושפת השאילתות SQL - פרק 1פרק 2 - שפת השאילתות SQL
מה נלמד בפרק הזה?
- עוד על SELECT FROM
- WHERE - סוגים ושילובים
- UPDATE - עדכון ערכים
- DELETE FROM - מחיקת ערכים
- DROP TABLE - מחיקת טבלאות
SELECT FROM
בפרק הקודם הכרנו את התחביר לבחור את הכל מטבלה:
1 | SELECT * FROM MY_TABLE |
הורידו את קובץ ה-csv
ובעזרת קוד הפייתון הבא נטען אותו ל-db
מסוג - sqllite
.
הקובץ מכיל מידע על חיות לאימוץ.
1 | import sqlite3 |
כדי לראות שזה עובד ונבסס את קוד הבסיס שלנו לפרוייקט נריץ את הקוד הבא:
1 | import sqlite3 |
בחירת עמודות ספציפיות
בשאילתת ה-select
ניתן להציב עמודות במקום כוכבית כדי לבחור רק את המידע הספציפי שאנחנו רוצים.
1 | selectCur = cur.execute("""SELECT pet_id,name FROM pets""") |
תרגיל - בחרו רק את העמודות name
ו-adoption_status
.
1 | selectCur = cur.execute("""SELECT name,adoption_status FROM pets""") |
אותיות גדולות או קטנות?
זה לא משנה כל כך, שפת ה-SQL
יודעת להתמודד גם עם אותיות גדולות וגם עם קטנות.
אולם קונבנציה עולמית נוחה זה לכתוב את כל המילים של שפת ה-sql
באותיות גדולות וכל מה ששלכם באותיות קטנות.
למשל:
1 | SELECT * from pets |
בעזרת המילה AS
ניתן שם שונה לעמודה שבחרנו.
נראה בעתיד כי זה עוזר לנו להבדלה בין טבלאות שונות כאשר אנחנו בוחרים יותר מטבלה אחת!
באותו האופן ניתן לבחור גם בעזרת שם הטבלה לפני שם העמודה:
1 | SELECT pets.name as pet_name, age FROM pets |
התחביר:
1 | SELECT <....> `` ``WHERE`` ``<column>`` ``[operator]`` ``<filter value> |
<> או != לא שווה
1 | SELECT * FROM pets WHERE species != 'Bird' |
וכאן התנאי הפך ל- תביאו את כלל החיות שהן לא בנות - 5.
> גדול מ
1 | SELECT * FROM pets WHERE age > 1 |
תביאו את כלל החיות הצעירות
>= גדול שווה
1 | SELECT * FROM pets WHERE species >= 1 |
<= קטן שווה
1 | SELECT * FROM pets WHERE species <= 1 |
תנאים לוגיים
ניתן לצרף את המילים AND
, OR
או NOT
בשילוב תנאים.
אני רוצה לבחור את כלל החתולים הצעירים.
כאן מסתתרים שני תנאים - סוג החיה והגיל שלה.
ננסח את שני התנאים:
age <= 1
species = 'cat
ונשלב אותם בעזרת ה-AND
1 | SELECT * FROM pets WHERE species = 'Cat' AND age <=1 |
שימו לב שה-sql
לא מבדיל בין אותיות קטנות לגדולות אך כאשר מדובר במחרוזות הוא מבדיל!
ולכן צריך לכתוב - Cat
.
תרגיל, כתבו תנאים למשפטים הבאים:
- הביאו את כלל האוגרים והחתולים
- הביאו את כלל החיות שאימצו אותן והן מסוג ציפור
- תביאו את כלל החיות שהן לא חתול
- תביאו את כלל החיות שהן לא חתול, והן מבוגרות וגם לא אומצו
SELECT * FROM pets WHERE species = 'Cat' OR species = 'Hamster'
SELECT * FROM Pets WHERE species = 'Bird' AND adoption_status = 'Adopted'
SELECT * FROM Pets WHERE NOT species = 'Cat'
SELECT * FROM Pets WHERE species != 'Cat' AND age >=1 AND adoption_status != 'Adopted'
שימו לב שניתן לפתור את אותו המשפט בצורות שונות :)
BETWEEN בין מספרים
1 | SELECT * FROM pets WHERE species = 'Cat' AND age BETWEEN 1 AND 4 |
LIKE דומה ל
בשביל לבדוק מחרוזות בצורה דינאמית יותר, שפת השאילתות מאפשרת לנו לתשאל מחרוזות על פי תבנית.
%
- אפס או יותר תווים_
- תו אחד כלשהו
בחרו את כלל החיות שהאות הראשונה שלהן מתחילה ב-Z
:
1 | SELECT * FROM pets WHERE name LIKE 'Z%' |
נרחיב את התנאי ל -
בחרו את כלל החיות שהאות הראשונה מתחילה ב-Z
והשם הוא בגודל 3 אותיות.
במקום להתחיל לספור תווים נוכל לבצע את הדבר הבא:
1 | SELECT * FROM pets WHERE name LIKE 'Z__' |
IN - תנאי מערכים
כדי לבדוק אם ערך נמצא בסט ערכים מסוים נוכל להשתמש ב-IN
:
1 | SELECT * FROM pets WHERE species IN ('Dog','Cat','Bird','Goat') |
כאן אנו בודקים אם אחת מהחיות היא אחת מהסוגים שבחרנו.
בניית שאילתות משאילתות משניות
כמו שזה נשמע - שאילתה בתוך שאילתה!
בשביל התרגול ניצור טבלה נוספת בשם - feeding_schedules
:
זה הולך להיות מעט ארוך ואני לא אסביר מה קורה כאן, העתיקו את הקוד והריצו אותו.
1 | import sqlite3 |
עכשיו יש לנו 2 טבלאות: pets
ו-feeding_schedules
.
ביצעו SELECT * FROM
כדי לראות שהכל תקין.
שאילתא בתוך שאילתא
1 | SELECT * FROM pets WHERE pet_id IN |
השאילתא הזו בוחרת את כלל החיות אשר סוג האוכל שלהן זה אוכל יבש - שימו לב שהמידע הזה נלקח מטבלה אחרת!
- זה בוחר קודם כל את החיות שאוכלות אוכל יבש, ולוקח רק את העמודה
pet_id
. - לאחר מכן זה רץ על טבלת
pets
ובוחר את כל החיות אשר ה-pet_id
נמצא בשאילתא הפנימית.
אם נשנה את שם העמודה בשאילתא הפנימית מ -pet_id
ל - id
.
מה ייקרה?
1 | SELECT * FROM pets WHERE pet_id IN |
כלום! כי השפה יודעת להתמודד עם עמודה אחת בתוך השאילתא הפנימית.
במידה והייתם בוחרים את כלל העמודות זה היה גורם לשגיאה!
1 | SELECT * FROM pets WHERE pet_id IN |
הדוגמא הזו לא עובדת!
EXISTS - בדיקת אם השאילתא בפנים החזירה משהו
בודק אם שאילתא פנימית מחזירה תוצאה אחת או יותר.
1 | SELECT * FROM pets WHERE EXISTS (SELECT 1 FROM feeding_schedule WHERE pets.pet_id = feeding_schedule.pet_id) |
בדוגמא הזו השאילתא תחזיר את הכל כי עבור כל חיה יש לה זמן האכלה במסד נתונים.
1 | SELECT * FROM pets WHERE EXISTS (SELECT 1 FROM feeding_schedule WHERE type_of_food = 'Special Food') |
בשאילתא הזו אנו בודקים סוג של אוכל שלא קיים - אז במקרה הזה השאילתא הפנימית תחזיר תמיד 0 עמודות ולכן גם השאילתא הראשית לא תחזור כי תנאי ה-Exist
לא מתקיים.
ANY או ALL
בודק במערך אם יש ערך אחד או כולם לפי התנאי.
ANY
- בודק אם יש תנאי אחד לפחות שמתקייםALL
- בודק אם הכל מקיים את התנאי.
בטכנולוגיה שאנו משתמשים בה - sqlite
עם פייתון המילים לא קיימות ולכן נוכל לבצע בדיקה שונה בעזרת אופרטורים שונים שלמדנו עליהם.
למשל אנחנו רוצים למצוא את כל החיות שזמני האכלה שלהם בבוקר לפני 10:
1 | SELECT * |
ואם נרצה לבדוק את הכל נוכל לבצע NOT EXIST
:
1 | SELECT * |
Update - עדכון מידע
כדי לעדכן את הערכים בתוך הטבלה, ניתן להשתמש בשאילתת העדכון:
תחביר:UPDATE
<table>
SET
<col>=val
,
col2 = val2
WHERE
[Condition]
שימו לב - צריך תנאי אחרת תוכלו בטעות לעדכן את כל הטבלה בבת ואחת ולגרום לשגיאות במידע!
במידע הטבלאי שיש לנו מס 94 זה תוכי בשם אוליבר.
בטעות רשמנו שזה תוכי אבל זה חתול!
איך נשנה את זה?
1 | UPDATE pets |
DELETE - מחיקת עמודות
מחיקה זה קלי קלות - כמו עדכון:DELETE FROM
<table>
WHERE
[Condition]
שימו לב - אם לא תשימו תנאי אתם תמחקו הכל!
למשל נרצה למחוק רק את עמודה 100:
1 | DELETE FROM pets |
DROP TABLE - מחיקת טבלאות
בפרק הקודם ראינו איך אנחנו יוצרים טבלאות.
כדי למחוק אותן כל מה שצריך לעשות זה למחוק!
1 | DROP TABLE pets |
כדי לסיים את הפרק מחקו את 2 הטבלאות שעבדו איתן ולבסוף מחקו את קובץ ה-DB
.
בפרק הזה הרחבנו את הידע שלנו על פילטורים ב-SQL
,
ואף נכנסו לנושא המתקדם של שאילתות משניות.
האם ניתן לעשות שאילתא בתוך שאילתא בתוך שאילתא?
בפרק הבא נרחיב את הידע על השפה עם JOIN
, GROUP BY
וסוגי מידע בעמודות.
תודה על הקריאה!