שליפת נתונים בסיסית ב-MySQL עם אופרטורים

כיצד לבצע שליפות יותר מורכבות וכן עדכונים למידע שיש כבר בטבלת ה-MySQL.

במאמר הקודם למדנו כיצד לעשות שליפת נתונים ב-MySQL באמצעות SELECT. במאמר הזה נרחיב את הדיבור על SELECT.

אנו ממשיכים לעבוד על טבלת my_costumer מהמאמר הקודם. הטבלה נראית כך:


+-------------+---------------+--------------+--------------+
| costumer_id | costumer_name | costumer_age | costumer_sex |
+-------------+---------------+--------------+--------------+
|           1 | moshe         |           26 | male         |
|           2 | Haim          |           22 | male         |
|           3 | Yaakov        |           19 | male         |
|           4 | Dan           |           19 | male         |
|           5 | Dana          |           42 | female       |
|           6 | Rina          |           24 | female       |
|           7 | Omri          |            9 | male         |
+-------------+---------------+--------------+--------------+

אנו כבר יודעים מהמאמר הקודם כיצד לבחור אנשים שהגיל שלהם הוא 26 או 9 או 42, אבל נניח שאני צריך לבחור טווח של תאריכים – למשל בין גיל 20 לגיל 30? בשביל זה יש לנו את האופרטורים הפשוטים. אני יכול לשלב ב-WHERE את האופטרטורים כדי להגיע לתוצאות מיטביות מבחינתי. דוגמא פשוטה שתבהיר את הכל:


SELECT * FROM my_costumer WHERE costumer_age > 20 && costumer_age < 30;

שאילתה כזו תתן לי את כל אלו שגילם (costumer_age) הוא גדול מ-20 וקטן מ-30:


+-------------+---------------+--------------+--------------+
| costumer_id | costumer_name | costumer_age | costumer_sex |
+-------------+---------------+--------------+--------------+
|           1 | moshe         |           26 | male         |
|           2 | Haim          |           22 | male         |
|           6 | Rina          |           24 | female       |
+-------------+---------------+--------------+--------------+

אנו לא חייבים להשתמש רק באופרטורים מתמטיים! אם אנו רוצים לבדוק שמות למשל, אין דבר קל מזה. בואו ונניח שאני רוצה את כל השמות שמתחילים ב-'D'. כל מה שעלי לעשות זה להשתמש באופרטור LIKE שמקבל מחרוזת טקסט באופן הבא: %טקסט%. אם אני מחפש שם שמתחיל ב-D אני אחפש D% ואם אני מחפש שם שנגמר ב-D אני אחפש %D. אם אני רוצה גם שמות שמתחילים ב-D וגם שמות שמסתיימים ב-D, אני אחפש %D%. אין כמו דוגמא:


select * from my_costumer where costumer_name LIKE 'D%';

שאילתא כזו תחזיר לי את כל השמות שמתחילים ב-D:


+-------------+---------------+--------------+--------------+
| costumer_id | costumer_name | costumer_age | costumer_sex |
+-------------+---------------+--------------+--------------+
|           4 | Dan           |           19 | male         |
|           5 | Dana          |           42 | female       |
+-------------+---------------+--------------+--------------+

אפשר להריץ חיפוש גם עם Regular Expressions. כך למשל, כך אחפש את כל השמות שמתחילים באותיות a-m:


select * from my_costumer where costumer_name REGEXP '^[a-m]';

ניתן לקרוא בדוקומנטציה של MySQL על האופרטורים השונים והמגוונים שיש.

איסוף נתונים באמצעות GROUP BY

כאשר אנו רוצים לאגד את הנתונים שלנו בקבוצות ולראות איזה נתונים יש לנו, אחת השיטות החביבות ביותר היא שימוש בשיטת GROUP BY. דוגמא היא אולי הדבר הטוב ביותר להמחשה. נניח ואני רוצה לדעת אילו קבוצות גיל יש לי בטבלה שלי. כל מה שעלי לעשות זה להריץ SELECT שיקבץ לי את התוצאות לפי קבוצות:


SELECT costumer_age FROM my_costumer GROUP BY  costumer_age;

וזה יחזיר לי את כל הגילאים שיש לי בטבלה:


+--------------+
| costumer_age |
+--------------+
|            9 |
|           19 |
|           22 |
|           24 |
|           42 |
+--------------+

אני יכול להוסיף גם תנאים כמובן. אם אני רוצה לבדוק את כל הגילאים של הזכרים בלבד במועדון שלי, כל מה שעלי לעשות זה להריץ את השאילתא עם התנאי:


SELECT costumer_age FROM my_costumer WHERE costumer_sex = 'male' GROUP BY costumer_age;

אם אני משתמש ב-GROUP BY אני גם יכול להריץ פונקציות מתמטיות על התוצאות, כמו למשל לסכום את התוצאות. על מנת להריץ את הסכימה, כל מה שעלי לעשות זה להריץ את פקודת COUNT ולומר לה מה לספור וכן לציין את שם הטור שבו אני רוצה שהתוצאה תופיע. כאן אני מריץ חיפוש רגיל על הגילאים, משתמש ב-GROUP BY כדי לקבל את כל התוצאות ומשתמש ב-COUNT כדי לקבל סכימה. הנה השאילתה:



SELECT costumer_age, COUNT(costumer_id) my_count  FROM my_costumer GROUP BY costumer_age;

וזו התוצאה:


+--------------+----------+
| costumer_age | my_count |
+--------------+----------+
|            9 |        1 |
|           19 |        2 |
|           22 |        1 |
|           24 |        1 |
|           42 |        1 |
+--------------+----------+

אני יכול להשתמש גם בפונקציות MIN ו-MAX כדי להביא מקסימום או מינימום. למשל, אני רוצה למצוא את הגיל הצעיר ביותר בקבוצת הזכרים ואת הגיל הצעיר ביותר בקבוצת הנקבות שיש במועדון שלי. ראשית אני אבצע שאילתת SELECT שתבחר את השמות, תעשה GROUP BY לפי המינים ואז אני אריץ פונקציות MIN על שדות הגילאים. נשמע מסובך? שימו לב לשאילתה:


select costumer_sex, MIN(costumer_age)  FROM my_costumer GROUP BY costumer_sex;

וזו התוצאה – פשוט ביותר. כל מה שצריך להפעיל זו לוגיקה. ראשית בוחרים את מה שאני רוצה להציג (במקרה הזה השם). אחרי כן, את הפונקציה שאני מריץ (במקרה הזה MIN), על איזה שדה אני מריץ את הפונקציה (במקרה הזה על costumer_age) ואחר כך לפי איזה שדה אני מקבץ את התוצאה.


+--------------+-------------------+
| costumer_sex | MIN(costumer_age) |
+--------------+-------------------+
| male         |                 9 |
| female       |                24 |
+--------------+-------------------+

אני כמובן יכול להכניס WHERE על מנת למיין את הנתונים שבהם אני עושה את ה-min כלומר, לסנן את התוצאות לפני הפעולה המתמטית. כך למשל, אם אני רוצה להציג את הצעירים ובתנאי שהם בני 18 ומעלה, אני יכול להכניס פונקצית WHERE שתסנן את התוצאות עוד לפני שאני מפעיל את ה-MIN:


SELECT costumer_sex, MIN(costumer_age) FROM my_costumer WHERE costumer_age>18 GROUP BY costumer_sex;

וזה יתן לנו את התוצאה הבאה:


+--------------+-------------------+
| costumer_sex | MIN(costumer_age) |
+--------------+-------------------+
| male         |                19 |
| female       |                24 |
+--------------+-------------------+

אם אני רוצה לסנן את התוצאות שהתקבלו לאחר הפעלת פונקצית ה-MIN (במקרה שלנו, הצגת הגיל הצעיר ביותר ואז סינון שלו, אנחנו צריכים להשתמש בפונקצית HAVING שהסינטקס שלה זהה לזה של WHERE רק שהיא באה לאחר ה-GROUP BY:


select costumer_sex, MIN(costumer_age) my_age  FROM my_costumer GROUP BY costumer_sex HAVING my_age>18;

וזו התוצאה שאני אקבל:


+--------------+--------+
| costumer_sex | my_age |
+--------------+--------+
| female       |     24 |
+--------------+--------+

עדכון נתונים

אם אנו רוצים לשנות נתונים בטבלה, למשל להפוך את moshe ל-Moshe, אין דבר קל מזה. עלינו להשתמש בפקודת UPDATE ו-SET. הסינטקס הוא פשוט, אנו מציינים איזו טבלה לעדכן, מציינים את השדה שיש לעדכן ואת הערך שאנו מעדכנים ואז WHERE והתנאי שלנו שאומר באיזה שורה (או שורות) יש לעדכן את הערך. כך למשל:


UPDATE my_costumer SET costumer_name='Moshe' WHERE costumer_id=1;

וכמובן שכל האופרטורים שלמדנו יכולים להכנס ב-WHERE. כך שזה מאד שימושי.

מחיקת נתונים

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


DELETE FROM my_costumer WHERE costumer_id = 9;

⚠️המדריכים כאן הם טעימה בלבד! יש ספר מקיף המלמד MySQL מרמת בסיס ועד רמה מתקדמת. הספר הדיגיטלי, שרלוונטי גם לכל מסדי הנתונים שעובדים עם SQL – זמין כאן כחלק מהפרויקט "ללמוד ג'אווהסקריפט בעברית" – זו הדרך הטובה ביותר ללמוד באופן מקיף MySQL.

במאמר הבא אנו נדבר על join ב-MySQL.

פוסטים נוספים שכדאי לקרוא

פתרונות ומאמרים על פיתוח אינטרנט

נגישות טכנית – פודקאסט ומבוא

פרק בפודקאסטעל נגישות בעברית שצולל לכלים האוטומטיים ולפן המאד מאד טכני של הנגישות.

גלילה לראש העמוד