לעתים קרובות בעת שימוש ב- SQL עבור אחזורמידע מהטבלאות, המשתמש מקבל נתונים מיותרים, המורכב בנוכחות שורות כפולות זהות זהים. כדי לבטל מצב זה, השתמש בארגומנט SQL הנבחר בסעיף בחר. מאמר זה ידון בדוגמאות לשימוש בטענה זו, וכן במצבים בהם יש לנטוש את השימוש בטענה.
לפני שנתחיל לחשוב על דוגמאות קונקרטיות, ניצור כמה טבלאות חיוניות במסד הנתונים.
בואו נדמיין שמאגר המידע שלנו מאוחסןמידע על טפטים המוצג בשתי טבלאות. זהו טבלת אוביי (טפט) עם מזהה שדות (מזהה ייחודי), סוג (סוג טפט - נייר, ויניל וכו '), צבע (צבע), מבנה (מבנה) ומחיר (מחיר). וטבלת האוסטסטקי (שאריות) עם שדות id_oboi (קישור למזהה הייחודי בטבלה אובוי) וספירה (מספר הגלילים במחסן).
בואו נמלא את הטבלאות בנתונים. הוסף 9 ערכים לטבלת הטפטים:
אבובי | ||||
תְעוּדַת זֶהוּת | סוּג | צֶבַע | struct | מחיר |
1 | עיתון | סַסגוֹנִיוּת | מובלט | 56,9 |
2 | נייר דו שכבתי | בז ' | חלקלק | 114,8 |
3 | ויניל | תפוז | מובלט | 504 |
4 | לא ארוג | בז ' | מובלט | 1020,9 |
5 | נייר דו שכבתי | בז ' | חלקלק | 150,6 |
6 | עיתון | סַסגוֹנִיוּת | חלקלק | 95,4 |
7 | ויניל | חום | חלקלק | 372 |
8 | לא ארוג | לבן | מובלט | 980,1 |
9 | בד | ורוד | חלקלק | 1166,5 |
יש גם תשעה רשומות בטבלה עם שאריות:
אוסטאטקי | |
id_oboi | לספור |
1 | 8 |
2 | 12 |
3 | 24 |
4 | 9 |
5 | 16 |
6 | 7 |
7 | 24 |
8 | 32 |
9 | 11 |
נתחיל לתאר עד כמה נעשה שימוש מובחן ב- SQL.
יש להניח את הייחודי מיד לאחר מכןבחר מילת מפתח בשאילתות. הוא מוחל מיד על כל העמודות שצוינו בסעיף Select, מכיוון שהוא לא יכלול שורות זהות לחלוטין מתוצאת השאילתה הסופית. לפיכך, מספיק לציין "בחר נבדל" פעם אחת בעת כתיבת שאילתת SQL. יוצא מן הכלל הוא השימוש בפונקציות מצטברות נפרדות בתוך פנים, אותם נשקול מעט מאוחר יותר.
יש לזכור שרוב DBMS אינם מזהים את שאילתתך כך:
בחר Ostatki. ספירה מובחנת, אובוי מובחן. * מאובוי הצטרף פנימי ל- Ostatki ON Oboi.id = Ostatki.id_oboi |
הטיעון המדובר הוגדר כאן מספר פעמים, או שהוא צוין פעם אחת, אך לפני העמודה השנייה, השלישית או אחרת הניתנת לבחירה. תקבל שגיאה עם ציון חוסר דיוק בתחביר.
ברור שעם בנייה מוכשרת של המבנהטבלאות ומילוי שלהם, בתוך טבלה אחת מצבים אינם נכללים כאשר נתקלים בשורות זהות לחלוטין. לכן, ביצוע השאילתה "בחר מובחן *" עם בחירה מטבלה אחת אינו מעשי כמעט.
תארו לעצמכם מצב שנצטרך לברר איזה סוג טפט יש לנו, למען הנוחות, נמיין מיד לפי סוג:
בחר Oboi.type מסדר אבובי לפי סוג |
ואנחנו מקבלים את התוצאה:
סוּג |
עיתון |
עיתון |
נייר דו שכבתי |
נייר דו שכבתי |
ויניל |
ויניל |
בד |
לא ארוג |
לא ארוג |
כפי שאתה יכול לראות, יש שורות כפולות בטבלה. אם נוסיף לסעיף בחר מובחן:
בחר Oboi.type מובהק מסדר אבובי לפי סוג |
אנו מקבלים את התוצאה ללא חזרות:
סוּג |
עיתון |
נייר דו שכבתי |
ויניל |
בד |
לא ארוג |
לפיכך, אם הנתונים הוזנו כהלכהשולחנות, ואז מיד לאחר שיחה או בקשת לקוח, נוכל לענות כי אין טפט נוזלי, טפט זכוכית וטפט אקרילי בחנות. בהתחשב בכך שהמבחר בחנויות בדרך כלל אינו מוגבל למאה טפטים, יהיה די מייגע לחפש ברשימת הסוגים הלא ייחודיים.
ניתן להשתמש בארגומנט המובהק של SQL עם כל אחד מהםפונקציה מצטברת. אך עבור Min ו- Max זה לא ישפיע, וכשמחושבים את הסכום או הממוצע, לעתים נדירות אתה יכול לדמיין מצב בו לא יהיה צורך לקחת בחשבון את החזרות.
נניח שאנחנו רוצים לדעת כמה מלא המחסן שלנו, ולשם כך אנו שולחים בקשה המחשבת את המספר הכולל של הגלילים במחסן:
סכום בחר (Ostatki.count) מאוסטסטקי |
הבקשה תחזיר את התשובה 143. אם נשנה ל:
סכום בחירה (Ostatki.count מובהק) מאוסטסטקי |
אנו מקבלים רק 119, מכיוון שטפטים תחת מאמרים 3 ו -7 נמצאים באותו מחסן. עם זאת, ברור שתשובה זו אינה נכונה.
משמש לרוב ב- SQL שונה מהפונקציה Count. לכן, ללא קושי, אנו יכולים לגלות כמה סוגים ייחודיים של טפטים יש לנו בדרך כלל:
ספירת SELECT (Oboi.type מובחנת) מאובוי |
וקבל תוצאה 5 - נייר רגיל ודו שכבתי, ויניל, בד ולא ארוג. אין ספק שכולם ראו פרסומת כמו: "רק לנו יש יותר מ -20 סוגים של טפטים שונים!", כלומר בחנות זו אין כמה עשרות גלילים מכל דבר, אלא טפטים ממגוון רחב של סוגים מודרניים.
מעניין שבבקשה אחת תוכלו לצייןפונקציות ספירה מרובות עם ובלי מובחנות. כלומר, זהו המצב היחיד שבו מובחנים ב- Select יכולים להופיע מספר פעמים.
יש להשליך את השימוש בארגומנט המובהק של SQL באחד משני המקרים:
נניח שהבוס שלך מבקש ממך לרשום את הטפטים שיש לך עם שתי עמודות בלבד - סוג וצבע. מתוך הרגל, אתה מספק את הטיעון המובהק:
בחר Oboi.type מובחן, Oboi.color מאובוי סדר לפי Oboi.type |
וגם - אתה מאבד חלק מהנתונים:
סוּג | צֶבַע |
עיתון | סַסגוֹנִיוּת |
נייר דו שכבתי | בז ' |
ויניל | חום |
ויניל | תפוז |
בד | ורוד |
לא ארוג | בז ' |
לא ארוג | לבן |
נראה כי יש לנו רק סוג אחד של טפט נייר (רגיל ושתי שכבות), אם כי למעשה, אפילו בטבלה הקטנה שלנו ישנם שני מאמרים כל אחד (התוצאה היא ללא הבדל):
סוּג | צֶבַע |
עיתון | סַסגוֹנִיוּת |
עיתון | סַסגוֹנִיוּת |
נייר דו שכבתי | בז ' |
נייר דו שכבתי | בז ' |
ויניל | חום |
ויניל | תפוז |
בד | ורוד |
לא ארוג | לבן |
לא ארוג | בז ' |
לכן, כמו בכתיבת כל שאילתה, עם הטיעון המובהק, עליכם להיות זהירים ולפתור את הבעיה בצורה מיומנת ביישומה, בהתאם למשימה העומדת על הפרק.
ההפך מלהבדיל הוא טיעוןאת כל. קווים כפולים נשמרים בעת החלתם. אך מכיוון שברירת המחדל ה- DBMS חושב שיש להציג את כל הערכים, הארגומנט All הוא יותר מסייג מאשר ארגומנט פונקציונלי אמיתי.