פרק קודם:
מסדי נתונים ושפת השאילתות SQL - פרק 1בפרק הקודם הכרנו את התחביר לבחור את הכל מטבלה:
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 |
שימו לב שה-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'
שימו לב שניתן לפתור את אותו המשפט בצורות שונות :)
1 | SELECT * FROM pets WHERE species = 'Cat' AND age BETWEEN 1 AND 4 |
בשביל לבדוק מחרוזות בצורה דינאמית יותר, שפת השאילתות מאפשרת לנו לתשאל מחרוזות על פי תבנית.
%
- אפס או יותר תווים_
- תו אחד כלשהובחרו את כלל החיות שהאות הראשונה שלהן מתחילה ב-Z
:
1 | SELECT * FROM pets WHERE name LIKE 'Z%' |
נרחיב את התנאי ל -
בחרו את כלל החיות שהאות הראשונה מתחילה ב-Z
והשם הוא בגודל 3 אותיות.
במקום להתחיל לספור תווים נוכל לבצע את הדבר הבא:
1 | SELECT * FROM pets WHERE name LIKE 'Z__' |
כדי לבדוק אם ערך נמצא בסט ערכים מסוים נוכל להשתמש ב-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 |
הדוגמא הזו לא עובדת!
בודק אם שאילתא פנימית מחזירה תוצאה אחת או יותר.
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
- בודק אם הכל מקיים את התנאי.בטכנולוגיה שאנו משתמשים בה - sqlite
עם פייתון המילים לא קיימות ולכן נוכל לבצע בדיקה שונה בעזרת אופרטורים שונים שלמדנו עליהם.
למשל אנחנו רוצים למצוא את כל החיות שזמני האכלה שלהם בבוקר לפני 10:
1 | SELECT * |
ואם נרצה לבדוק את הכל נוכל לבצע NOT EXIST
:
1 | SELECT * |
כדי לעדכן את הערכים בתוך הטבלה, ניתן להשתמש בשאילתת העדכון:
תחביר:UPDATE
<table>
SET
<col>=val
,
col2 = val2
WHERE
[Condition]
שימו לב - צריך תנאי אחרת תוכלו בטעות לעדכן את כל הטבלה בבת ואחת ולגרום לשגיאות במידע!
במידע הטבלאי שיש לנו מס 94 זה תוכי בשם אוליבר.
בטעות רשמנו שזה תוכי אבל זה חתול!
איך נשנה את זה?
1 | UPDATE pets |
מחיקה זה קלי קלות - כמו עדכון:DELETE FROM
<table>
WHERE
[Condition]
שימו לב - אם לא תשימו תנאי אתם תמחקו הכל!
למשל נרצה למחוק רק את עמודה 100:
1 | DELETE FROM pets |
בפרק הקודם ראינו איך אנחנו יוצרים טבלאות.
כדי למחוק אותן כל מה שצריך לעשות זה למחוק!
1 | DROP TABLE pets |
כדי לסיים את הפרק מחקו את 2 הטבלאות שעבדו איתן ולבסוף מחקו את קובץ ה-DB
.
בפרק הזה הרחבנו את הידע שלנו על פילטורים ב-SQL
,
ואף נכנסו לנושא המתקדם של שאילתות משניות.
האם ניתן לעשות שאילתא בתוך שאילתא בתוך שאילתא?
בפרק הבא נרחיב את הידע על השפה עם JOIN
, GROUP BY
וסוגי מידע בעמודות.
תודה על הקריאה!