يفتح
يغلق

الإجراءات المخزنة والمشغلات. تدرب على استخدام وظيفة العد MySQL ووصف وأمثلة لوظائف MySQL

انتباه! يعتمد هذا العمل على ترجمة القسم "17.1. "الإجراءات المخزنة وجداول المنحة" وصف لبرنامج MySQL 5.0.19، "الدليل المرجعي. يقوم بتوثيق MySQL 5.0 إلى 5.0.19. تم إنشاء الوثيقة بتاريخ: 23-01-2006 (المراجعة:995)"
``اقرأ كل شيء أولاً، ثم جرب الأمثلة.''

الإجراءات المخزنة هي مجموعة من أوامر SQL التي يمكن تجميعها وتخزينها على الخادم. بهذه الطريقة، بدلاً من تخزين الاستعلام المستخدم بشكل متكرر، يمكن للعملاء الرجوع إلى الإجراء المخزن المقابل. يوفر هذا أداءً أفضل لأن الطلب المحدد يحتاج إلى التحليل مرة واحدة فقط ويقلل من حركة المرور بين الخادم والعميل. يمكن أيضًا زيادة المستوى المفاهيمي عن طريق إنشاء مكتبة من الوظائف على الخادم.

المشغل هو إجراء مخزن يتم تنفيذه عند وقوع حدث معين. على سبيل المثال، يمكنك تحديد إجراء مخزن يتم تشغيله في كل مرة يتم فيها حذف سجل من جدول المعاملات، وبالتالي ضمان حذف العميل المقابل تلقائيًا من جدول العملاء عند حذف كافة معاملاته.

يتم دعم البرامج المخزنة (الإجراءات والوظائف) في MySQL 5.0. الإجراءات المخزنة هي مجموعة من تعبيرات SQL التي يمكن تخزينها على الخادم. بمجرد الانتهاء من ذلك، لم يعد العميل بحاجة إلى إعادة إرسال الطلب، ولكن ببساطة يقوم باستدعاء البرنامج المخزن.

يمكن أن يكون هذا مفيدًا عندما:

  • تتم كتابة العديد من تطبيقات العميل بلغات مختلفة أو يتم تشغيلها على منصات مختلفة، ولكن يجب أن تستخدم نفس قاعدة بيانات المعاملات
  • السلامة تأتي أولا

يمكن للإجراءات والوظائف المخزنة (الإجراءات الروتينية) أن توفر أداءً أفضل نظرًا لأنه يلزم إرسال معلومات أقل بين العميل والخادم. يؤدي هذا الاختيار إلى زيادة الحمل على خادم قاعدة البيانات، ولكنه يقلل التكاليف على جانب العميل. استخدم هذا إذا كانت العديد من الأجهزة العميلة (مثل خوادم الويب) تخدمها قاعدة بيانات واحدة أو أكثر.

تسمح لك الإجراءات المخزنة أيضًا باستخدام مكتبات الوظائف المخزنة في قاعدة بيانات الخادم. يتم توفير هذه الميزة للعديد من لغات البرمجة الحديثة، والتي تسمح باستدعائها مباشرة (على سبيل المثال، باستخدام الفئات).

تتبع MySQL بناء جملة SQL:2003 للإجراءات المخزنة، والتي يتم استخدامها بالفعل في DB2 الخاص بشركة IBM.

من الأقوال إلى الأفعال..

عند إنشاء وتعديل وحذف الإجراءات المخزنة، يقوم الخادم بمعالجة جدول mysql.proc

اعتبارًا من MySQL 5.0.3، أصبحت الامتيازات التالية مطلوبة:

إنشاء روتينلإنشاء الإجراءات المخزنة

تغيير الروتيناللازمة لتغيير أو حذف الإجراءات. يتم تعيين هذا الامتياز تلقائيًا لمنشئ الإجراء (الوظيفة)

ينفذسوف تكون هناك حاجة إلى امتياز لتنفيذ الروتين الفرعي. ومع ذلك، يتم تعيينه تلقائيًا لمنشئ الإجراء (الوظيفة). أيضًا، افتراضيًا، معلمة SQL SECURITY لروتين DEFINER، والتي تسمح للمستخدمين الذين لديهم حق الوصول إلى قاعدة البيانات باستدعاء الإجراءات المرتبطة بقاعدة البيانات هذه.

بناء جملة الإجراءات والوظائف المخزنة

الروتين المخزن هو إجراء أو وظيفة. يتم إنشاء الإجراءات المخزنة باستخدام عبارات CREATE PROCEDURE أو CREATE FUNCTION. يتم استدعاء الروتين المخزن باستخدام عبارة CALL، مع استخدام متغيرات إرجاع القيمة فقط كمتغيرات إخراج. يمكن استدعاء الدالة مثل أي دالة أخرى ويمكنها إرجاع قيمة عددية. يمكن للإجراءات المخزنة استدعاء إجراءات مخزنة أخرى.

منذ MySQL 5.0.1، أصبح الإجراء أو الوظيفة المحملة مرتبطة بقاعدة بيانات محددة. وهذا له عدة معانٍ:

  • عندما يتم استدعاء روتين فرعي، يكون القصد هو استدعاء USE db_name (وتجاهل قاعدة البيانات عند اكتمال الروتين الفرعي وعدم الحاجة إلى قاعدة البيانات)
  • يمكنك تأهيل الأسماء العادية باسم قاعدة البيانات. يمكن استخدام هذا للإشارة إلى روتين غير موجود في قاعدة البيانات الحالية. على سبيل المثال، لتنفيذ إجراء مخزن p أو دالة f مرتبطة بقاعدة بيانات الاختبار، يمكنك إخبار مترجم الأوامر بهذه الطريقة: CALL test.p() أو test.f() .
  • عند حذف قاعدة بيانات، يتم أيضًا حذف كافة الإجراءات المحملة المرتبطة بها. في MySQL 5.0.0، تكون الإجراءات المحملة عامة وغير مرتبطة بقاعدة البيانات. إنهم يرثون قاعدة البيانات الافتراضية من بيان الاستدعاء. إذا تم تنفيذ استخدام db_name ضمن روتين فرعي، فستتم استعادة قاعدة البيانات الحالية الأصلية بعد الخروج من الروتين الفرعي (على سبيل المثال، قاعدة البيانات الحالية هي db_11، نسميها روتينًا فرعيًا يستخدم db_22، وبعد الخروج من الروتين الفرعي يظل db_11 الحالي)

يدعم MySQL بشكل كامل الامتدادات التي تسمح لك باستخدام تعبيرات SELECT العادية (دون استخدام المؤشرات أو المتغيرات المحلية) داخل الإجراءات المخزنة. يتم ببساطة إرسال مجموعة النتائج التي تم إرجاعها من الاستعلام مباشرة إلى العميل. يؤدي استعلام SELECT المتعدد إلى إنشاء مجموعات نتائج متعددة، لذا يجب على العميل استخدام مكتبة تدعم مجموعات نتائج متعددة.

إنشاء الإجراء- إنشاء إجراء مخزن.

إنشاء وظيفة- إنشاء وظيفة مخزنة.

بناء الجملة:

إنشاء الإجراءاسم_الإجراء ([معلمة_الإجراء[،...]])
[الخصائص...] subroutine_body

إنشاء وظيفةاسم_الوظيفة ([معلمة_الوظيفة[،...]])
عائداتيكتب
[الخاصية...] subroutine_body

الإجراء_المعلمة:
[ في | خارج | في خارج] نوع اسم المعلمة
معلمة_الوظيفة:
نوع اسم_المعلمة

يكتب:
أي نوع بيانات MySQL

صفة مميزة:
لغة SQL
| حتمية
| (يحتوي على SQL | لا يوجد SQL | يقرأ بيانات SQL | يعدل بيانات SQL)
| أمان SQL (المحدد | المستدعي)
| تعليق "سلسلة"

روتين_الجسم:
تعبير SQL الصحيح.

دعونا ننظر إلى كل شيء في الممارسة العملية.

أولاً، قم بإنشاء إجراء مخزن بالاستعلام التالي:

إنشاء الإجراء `my_proc`(OUT t INTEGER(11))
ليست حتمية
مُستدعى أمان SQL
تعليق ""
يبدأ
حدد val1+val2 في "t" من `my` LIMIT 0,1؛
نهاية؛

يتم استخدام تعبير LIMIT في هذا الاستعلام للتعرف على حقيقة أنه ليس كل عميل قادر على قبول مجموعة نتائج متعددة الصفوف.

وبعد ذلك، دعونا نسميها:

اتصل بـ my_proc(@a);
حدد@أ؛

لفصل طلب داخلي عن طلب خارجي، يتم دائمًا استخدام فاصل مختلف عن المعتاد (للمهمة، استخدم الأمر محدد <строка/символ>)

هنا مثال آخر مع الأخذ في الاعتبار جميع المتطلبات.

Mysql> المحدد //
Mysql> إنشاء الإجراء simpleproc (OUT param1 INT)
-> ابدأ
-> حدد COUNT(*) INTO param1 FROM t;
->النهاية؛
-> //

الخلية>المحدد؛
mysql> اتصل simpleproc(@a);
الاستعلام موافق، 0 صفوف متأثرة (0.00 ثانية)
الخلية> حدد @a؛
+------+
| @ا |
+------+
| 3 |
+------+
صف واحد في المجموعة (0.00 ثانية)

يمكن ملاحظة العملية برمتها في الشكل أدناه:

محفزات

يتوفر دعم المشغل في MySQL منذ الإصدار 5.0.2.

مشغل- كائن قاعدة بيانات مسمى مرتبط بجدول ويتم تنشيطه عند وقوع حدث معين، حدث مرتبط بهذا الجدول.

على سبيل المثال، تقوم التعليمة البرمجية التالية بإنشاء جدول ومشغل INSERT. يقوم المشغل بجمع القيم المدرجة في أحد أعمدة الجدول.

Mysql> إنشاء حساب الجدول (acct_num INT، المبلغ DECIMAL(10,2));
الاستعلام موافق، 0 صفوف متأثرة (0.03 ثانية)
mysql> قم بإنشاء TRIGGER ins_sum قبل الإدراج في الحساب
-> لكل صف تم تعيينه @sum = @sum + NEW.amount;
الاستعلام موافق، 0 صفوف متأثرة (0.06 ثانية)

دعونا نعلن عن المتغير sum ونخصص له القيمة 1. بعد ذلك، في كل مرة ندرج فيها في الجدول حسابوستزداد قيمة هذا المتغير تبعا للجزء المدرج.

تعليق. إذا لم تتم تهيئة قيمة المتغير، فلن يعمل المشغل!

بناء الجملة لإنشاء الزناد

يخلق

مشغلاسم المشغل مشغل_الوقت مشغل_الحدث
على اسم الجدول لكل صف، Expression_executed_when_trigger_fires

إذا كان كل شيء واضحًا على الفور فيما يتعلق باسم المشغل واسم المستخدم، فسنتحدث عن "وقت التشغيل" و"الحدث" بشكل منفصل.

تسبب_وقت

يحدد الوقت الذي يحدث فيه الإجراء المحفز. قبل يعني أن المشغل سيتم تنفيذه قبل اكتمال حدث المشغل، وبعد يعني بعد. على سبيل المثال، عند إدراج السجلات (انظر المثال أعلاه)، يتم تشغيل المشغل الخاص بنا قبل الإدراج الفعلي للسجل ويتم حساب المجموع. يعد هذا الخيار مناسبًا للحساب الأولي لبعض الحقول الإضافية في الجدول أو الإدراج الموازي في جدول آخر.

حدث مسبب

كل شيء أبسط هنا. إنه يشير بوضوح إلى الحدث الذي يتم فيه تنفيذ المشغل.

  • إدراج: أي. أثناء عمليات الإدراج أو التعبيرات المشابهة (INSERT، وLOAD DATA، وREPLACE)
  • تحديث: عندما يتم تعديل كيان (صف).
  • DELETE: عند حذف سجل (الاستعلامات التي تحتوي على عبارات DELETE و/أو REPLACE)

ما هي الوظائف؟

بإمكان MySQL القيام بأكثر من مجرد تخزين البيانات واسترجاعها. يمكننا أيضا إجراء عمليات التلاعب على البياناتقبل استعادتها أو حفظها. وهنا يأتي دور وظائف MySQL. الوظائف هي مجرد أجزاء من التعليمات البرمجية التي تقوم ببعض العمليات ثم تقوم بإرجاع نتيجة. تقبل بعض الوظائف المعلمات بينما لا تقبل الوظائف الأخرى المعلمات.

دعنا" نلقي نظرة سريعة على مثال لوظيفة MySQL. بشكل افتراضي، يقوم MySQL بحفظ أنواع بيانات التاريخ بالتنسيق "YYYY-MM-DD". لنفترض أننا أنشأنا تطبيقًا ويريد المستخدمون لدينا إرجاع التاريخ بالتنسيق "DD" -MM-YYYY"، يمكننا استخدام MySQL المضمنة في الدالة DATE_FORMAT لتحقيق ذلك. DATE_FORMAT هي إحدى الوظائف الأكثر استخدامًا في MySQL. سننظر إليها بمزيد من التفاصيل عندما نكشف عن الدرس.

لماذا استخدام الوظائف؟

بناءً على المثال الوارد في المقدمة، قد يفكر الأشخاص ذوو الخبرة في برمجة الكمبيوتر "لماذا تهتم بوظائف MySQL؟ يمكن تحقيق نفس التأثير باستخدام لغة البرمجة النصية/البرمجة؟"صحيح أنه يمكننا تحقيق ذلك عن طريق كتابة بعض الإجراءات/الوظائف في برنامج التطبيق.

بالعودة إلى مثال DATE الخاص بنا في المقدمة، لكي يتمكن مستخدمونا من الحصول على البيانات بالتنسيق المطلوب، يجب على طبقة الأعمال إجراء المعالجة اللازمة.

تصبح هذه مشكلة عندما يتعين على التطبيق التكامل مع الأنظمة الأخرى. عندما نستخدم وظائف MySQL مثل DATE_FORMAT، فيمكننا دمج هذه الوظيفة في قاعدة البيانات وأي تطبيق يحتاج إلى البيانات يحصل عليها بالتنسيق المطلوب. هذا يقلل من إعادة العمل في منطق الأعمال ويقلل من عدم تناسق البيانات.

سبب آخر لماذا يجب أن نفكر في استخدام وظائف MySQL هي حقيقة أنها يمكن أن تساعد في تقليل حركة مرور الشبكة في تطبيقات العميل/الخادم. ستحتاج طبقة الأعمال فقط إلى إجراء مكالمات إلى الوظائف المخزنة دون الحاجة إلى معالجة البيانات. في المتوسط، يمكن أن يساعد استخدام الوظائف بشكل كبير في تحسين الأداء العام للنظام.

أنواع الوظائف

وظائف مدمجة

يأتي MySQL مزودًا بعدد من الوظائف المضمنة. الوظائف المضمنة هي ببساطة وظائف تم تنفيذها بالفعل في خادم MySQL. تسمح لنا هذه الوظائف بإجراء أنواع مختلفة من المعالجات على البيانات. يمكن تصنيف الوظائف المضمنة بشكل أساسي إلى الفئات التالية الأكثر استخدامًا.

  • وظائف السلسلة- تعمل على أنواع البيانات السلسلة
  • وظائف رقمية- تعمل على أنواع البيانات الرقمية
  • وظائف التاريخ- تعمل على أنواع بيانات التاريخ
  • وظائف مجمعة- العمل على جميع أنواع البيانات المذكورة أعلاه وإنتاج مجموعات نتائج مختصرة.
  • وظائف أخرى- يدعم MySQL أيضًا أنواعًا أخرى من الوظائف المضمنة ولكننا سنقتصر درسنا على الوظائف المذكورة أعلاه فقط.

دعونا الآن نلقي نظرة على كل وظيفة من الوظائف المذكورة أعلاه بالتفصيل، وسنقوم بشرح الوظائف الأكثر استخدامًا باستخدام "Myflixdb".

وظائف السلسلة

لقد نظرنا بالفعل إلى ما تفعله وظائف السلسلة. سننظر إلى مثال عملي يستخدمها. في جدول الأفلام لدينا، يتم تخزين عناوين الأفلام باستخدام مجموعات من الأحرف الصغيرة والكبيرة. لنفترض أننا نريد الحصول على قائمة استعلام تُرجع عناوين الأفلام بأحرف كبيرة. يمكننا استخدام وظيفة "UCASE" للقيام بذلك. يأخذ سلسلة كمعلمة ويحول جميع الأحرف إلى أحرف كبيرة. يوضح البرنامج النصي الموضح أدناه استخدام الدالة "UCASE".

حدد `movie_id`،`title`، UCASE(`title`) من `الأفلام`؛

  • UCASE(`title`) هي الدالة المضمنة التي تأخذ العنوان كمعلمة وترجعه بأحرف كبيرة مع الاسم المستعار `upper_case_title`.

تنفيذ البرنامج النصي أعلاه في MySQL Workbench مقابل Myflixdb يعطينا النتائج التالية الموضحة أدناه.

movie_idعنوانUCASE("العنوان")
16 67% مذنب67% مذنب
6 الملائكة والشياطينالملائكة والشياطين
4 اسم الرمز أسوداسم الكود أسود
5 بنات أبي الصغيراتبنات أبي الصغيرات
7 شيفرة دافنشيشيفرة دافنشي
2 نسيان سارة مارشالنسيان سارة مارشال
9 شهر العسلشهر العسل
19 فيلم 3الفيلم 3
1 قراصنة الكاريبي 4قراصنة الكاريبي 4
18 فيلم عينةفيلم عينة
17 الدكتاتور العظيمالدكتاتور العظيم
3 العاشر من الرجالالعاشر من الرجال

يدعم MySQL عددًا من وظائف السلسلة. للحصول على قائمة كاملة بجميع وظائف السلسلة المضمنة، راجع هذا الرابط http://dev.mysql.com/doc/refman/5.0/en/string-functions.html على موقع MySQL الإلكتروني.

وظائف رقمية

كما ذكرنا سابقًا، تعمل هذه الوظائف على أنواع البيانات الرقمية. يمكننا إجراء حسابات رياضية على البيانات الرقمية في عبارات SQL.

العوامل الحسابية

يدعم MySQL العوامل الحسابية التالية التي يمكن استخدامها لإجراء العمليات الحسابية في عبارات SQL.

وصف

تقسيم صحيح

دعونا الآن نلقي نظرة على أمثلة لكل عامل من العوامل المذكورة أعلاه

قسم الأعداد الصحيحة (DIV)

حدد 23 شعبة 6 ;

مشغل القسم (/)

دعونا الآن نلقي نظرة على مثال عامل القسمة وسنقوم بتعديل مثال DIV.

تنفيذ البرنامج النصي أعلاه يعطينا النتائج التالية.

عامل الطرح (-)

دعونا الآن نلقي نظرة على مثال عامل الطرح، وسوف نستخدم نفس القيم كما في المثالين السابقين

تنفيذ البرنامج النصي أعلاه يعطينا 17

عامل الإضافة (+)

دعونا الآن نلقي نظرة على مثال عامل الإضافة وسنقوم بتعديل المثال السابق.

تنفيذ البرنامج النصي أعلاه يعطينا 29

عامل الضرب (*)

دعونا الآن نلقي نظرة على مثال عامل الضرب، وسوف نستخدم نفس القيم كما في الأمثلة السابقة.

اختر 23 * 6 AS `multiplication_result`؛

تنفيذ البرنامج النصي أعلاه يعطينا النتائج التالية.

multiplication_result

مشغل مودولو (-)

يقسم عامل modulo N على M ويعطينا التذكير. دعونا الآن نلقي نظرة على مثال عامل modulo وسوف نستخدم نفس القيم كما في الأمثلة السابقة.

حدد 23 وزارة الدفاع 6؛

تنفيذ البرنامج النصي أعلاه يعطينا 5

دعونا الآن نلقي نظرة على بعض الوظائف الرقمية الشائعة في MySQL.

أرضية- تقوم هذه الدالة بإزالة الكسور العشرية من الرقم وتقريبه إلى أقرب رقم أدنى. يوضح البرنامج النصي الموضح أدناه استخدامه.

حدد الطابق (23 / 6) كـ "floor_result"؛

تنفيذ البرنامج النصي أعلاه يعطينا النتائج التالية.

Floor_result

دائري- تقوم هذه الدالة بتقريب رقم بمنازل عشرية إلى أقرب رقم صحيح. يوضح البرنامج النصي الموضح أدناه استخدامه.

حدد ROUND(23 / 6) كـ `round_result`؛

تنفيذ البرنامج النصي أعلاه يعطينا النتائج التالية.

Round_result

راند- تستخدم هذه الدالة لتوليد رقم عشوائي، وتتغير قيمته في كل مرة يتم فيها استدعاء الدالة. يوضح البرنامج النصي الموضح أدناه استخدامه.

SELECT RAND() AS `random_result`؛

الوظائف المخزنة

تشبه الوظائف المخزنة الوظائف المضمنة تمامًا باستثناء أنه يتعين عليك تحديد الوظيفة المخزنة بنفسك. بمجرد إنشاء دالة مخزنة، يمكن استخدامها في عبارات SQL تمامًا مثل أي دالة أخرى. بناء الجملة الأساسي لإنشاء وظيفة مخزنة كما هو موضح أدناه

إنشاء دالة sf_name () إرجاع نوع البيانات البيانات المحددة

  • "إنشاء دالة sf_name()"يعد أمرًا إلزاميًا ويطلب من خادم MySQL إنشاء وظيفة باسم `sf_name' مع معلمات اختيارية محددة بين قوسين.
  • "إرجاع نوع البيانات"إلزامي ويحدد نوع البيانات الذي يجب أن ترجعه الوظيفة.
  • "حتمية"يعني أن الوظيفة ستعيد نفس القيم إذا تم توفير نفس الوسائط لها.
  • "صياغات"هو الكود الإجرائي الذي تنفذه الوظيفة.

دعونا الآن نلقي نظرة على مثال عملي ينفذ وظيفة مدمجة. لنفترض أننا نريد معرفة الأفلام المستأجرة التي تجاوزت تاريخ الإرجاع. يمكننا إنشاء دالة مخزنة تقبل تاريخ الإرجاع كمعلمة ثم تقارنه بالتاريخ الحالي في خادم MySQL إذا كان التاريخ الحالي أقل من تاريخ إرجاع الفيلم، فإننا نعيد "لا" وإلا فإننا نعيد "نعم" النص الموضح أدناه يساعدنا على تحقيق ذلك.

المحدد | إنشاء وظيفة sf_past_movie_return_date (return_date DATE) إرجاع VARCHAR(3) البدء الحتمي في إعلان sf_value VARCHAR(3); إذا curdate() > return_date ثم قم بتعيين sf_value = "Yes"; ELSEIF curdate() !}<= return_date THEN SET sf_value = "لا"; END IF; RETURN sf_value; END|

أدى تنفيذ البرنامج النصي أعلاه إلى إنشاء الوظيفة المخزنة `sf_past_movie_return_date`.

دعونا الآن نختبر وظيفتنا المخزنة.

SELECT `movie_id`,` Membership_number`,`return_date`,CURDATE() ,sf_past_movie_return_date(`return_date`) FROM `movierentals`;

تنفيذ البرنامج النصي أعلاه في MySQL Workbench مقابل myflixdb يعطينا النتائج التالية.

movie_idرقم العضويةتاريخ العودةكورديت()sf_past_movie_return_date("return_date")
1 1 باطل04-08-2012 باطل
2 1 25-06-2012 04-08-2012 نعم
2 3 25-06-2012 04-08-2012 نعم
2 2 25-06-2012 04-08-2012 نعم
3 3 باطل04-08-2012 باطل

وظائف محددة من قبل المستخدم

يدعم MySQL أيضًا الوظائف التي يحددها المستخدم والتي تعمل على توسيع MySQL. الوظائف المحددة بواسطة المستخدم هي وظائف يمكنك إنشاؤها باستخدام لغة برمجة مثل C وC++ وما إلى ذلك. ثم قم بإضافتها إلى خادم MySQL. بمجرد إضافتها، يمكن استخدامها تمامًا مثل أي وظيفة أخرى.

ملخص

  • تتيح لنا الوظائف تحسين قدرات MySQL.
  • تقوم الدالات دائمًا بإرجاع قيمة ويمكنها قبول المعلمات بشكل اختياري.
  • الوظائف المضمنة هي الوظائف التي يتم شحنها مع MySQL. ويمكن تصنيفها وفقًا لأنواع البيانات التي تعمل عليها، على سبيل المثال. السلاسل والتاريخ والوظائف الرقمية المضمنة.
  • يتم إنشاء الوظائف المخزنة بواسطة المستخدم داخل خادم MySQL ويمكن استخدامها في عبارات SQL.
  • يتم إنشاء الوظائف التي يحددها المستخدم خارج MySQL ويمكن دمجها في خادم MySQL.

إرسال عملك الجيد في قاعدة المعرفة أمر بسيط. استخدم النموذج أدناه

سيكون الطلاب وطلاب الدراسات العليا والعلماء الشباب الذين يستخدمون قاعدة المعرفة في دراساتهم وعملهم ممتنين جدًا لك.

نشر على http://www.allbest.ru/

العمل التطبيقي

الوظائف في MySQL

المهمة 1. وظائف مدمجة

برمجة الوظائف الرياضية

الوظائف هي العمليات التي تسمح لك بمعالجة البيانات. هناك عدة مجموعات من الوظائف المضمنة في MySQL:

وظائف السلسلة. يستخدم لمعالجة السلاسل النصية، مثل قيم التشذيب أو الحشو.

وظائف رقمية. تستخدم لإجراء العمليات الحسابية على البيانات الرقمية. تتضمن الوظائف الرقمية الوظائف التي تُرجع القيم المطلقة، وجيب التمام وجيب التمام للزوايا، والجذر التربيعي لعدد، وما إلى ذلك. يتم استخدامها فقط للحسابات الجبرية والمثلثية والهندسية. بشكل عام، نادرا ما يتم استخدامها، لذلك لن نأخذها في الاعتبار. ولكن يجب أن تكون على علم بوجودها واستشر وثائق MySQL إذا لزم الأمر.

وظائف التلخيص. يتم استخدامها للحصول على بيانات تلخيصية من الجداول، على سبيل المثال، عندما تحتاج إلى تلخيص بعض البيانات دون تحديدها.

وظائف التاريخ والوقت. يُستخدم لمعالجة قيم التاريخ والوقت، على سبيل المثال لإرجاع الفرق بين التواريخ.

وظائف النظام. إرجاع معلومات خدمة نظام إدارة قواعد البيانات (DBMS).

من أجل إلقاء نظرة على الوظائف الأساسية المضمنة، سنحتاج إلى إنشاء قاعدة بيانات جديدة تحتوي على قيم رقمية وقيم تاريخ.

لنأخذ متجرًا عبر الإنترنت كمثال.

النموذج المفاهيمي:

النموذج العلائقي:

لذلك، دعونا نلقي نظرة على الرسم البياني الأخير وإنشاء قاعدة بيانات - متجر.

إنشاء متجر قاعدة البيانات؛

دعنا نختاره للعمل:

ونقوم بإنشاء 8 جداول فيها، كما في الرسم البياني: المشترين (العملاء)، الموردين (البائعون)، المشتريات (البيع)، التوريدات (الواردة)، سجل الشراء (مجلة_المبيعات)، سجل التسليم (مجلة_الواردة)، المنتجات (المنتجات)، الأسعار (الأسعار). تحذير واحد، متجرنا سوف يبيع الكتب، لذلك سنضيف عمودًا آخر إلى جدول المنتجات - المؤلف، هذا ليس ضروريًا من حيث المبدأ، ولكنه أكثر شيوعًا إلى حد ما.

يرجى ملاحظة أنه في جداول دفتر يومية الشراء، ودفتر يومية التسليم، والأسعار، تكون المفاتيح الأساسية مركبة، أي. تتكون قيمها الفريدة من أزواج قيمة (لا يمكن أن يحتوي الجدول على صفين لهما نفس أزواج القيمة). تتم الإشارة إلى أسماء الأعمدة لأزواج القيم هذه بفواصل بعد الكلمة الأساسية PRIMARY KEY.

في متجر حقيقي عبر الإنترنت، سيتم إدخال البيانات في هذه الجداول باستخدام البرامج النصية في بعض اللغات (مثل PHP)، ولكن في الوقت الحالي سيتعين علينا إدخالها يدويًا. يمكنك إدخال أي بيانات، فقط تذكر أن القيم الموجودة في الأعمدة التي تحمل الاسم نفسه في الجداول المرتبطة يجب أن تتطابق. أو انسخ البيانات أدناه:

لذلك، يوجد في متجرنا 24 عنصرًا من البضائع، تم تسليمها ثلاث شحنات من ثلاثة موردين، وثلاث مبيعات تمامًا. كل شيء جاهز، يمكننا البدء في دراسة وظائف MySQL المضمنة.

المهمة 2. إجمالي الوظائف والأعمدة المحسوبة وطرق العرض

تسمى الوظائف الإجمالية أيضًا بالوظائف الإحصائية أو التجميعية أو المجموعية. تقوم هذه الوظائف بمعالجة مجموعة من السلاسل لحساب وإرجاع قيمة واحدة. لا يوجد سوى خمس وظائف من هذا القبيل:

ترجع الدالة AVG () متوسط ​​قيمة العمود.

الدالة COUNT()‎ ترجع عدد الصفوف في العمود.

ترجع الدالة MAX() أكبر قيمة في عمود.

تقوم الدالة MIN() بإرجاع أصغر قيمة في العمود.

SUM() ترجع الدالة مجموع قيم الأعمدة.

لقد التقينا بالفعل بواحد منهم - COUNT() - http://www.site-do.ru/db/sql8.php. الآن دعونا نلتقي بالآخرين. لنفترض أننا أردنا معرفة الحد الأدنى والحد الأقصى ومتوسط ​​سعر الكتب في متجرنا. ثم من جدول الأسعار عليك أن تأخذ القيم الدنيا والقصوى والمتوسطة لعمود السعر. الطلب بسيط:

حدد الحد الأدنى (السعر)، الحد الأقصى (السعر)، المتوسط ​​(السعر) من الأسعار؛

الآن، نريد معرفة كمية البضائع التي جلبها إلينا المورد "House of Printing" (المعرف=2). إن تقديم مثل هذا الطلب ليس بالأمر السهل. دعونا نفكر في كيفية تأليفها:

أولاً، من جدول المستلزمات (الواردة)، حدد المعرفات (id_incoming) الخاصة بعمليات التسليم التي تم تنفيذها بواسطة المورد "Print House" (id=2):

الآن من جدول Supply Journal (magazine_incoming) تحتاج إلى تحديد البضائع (id_product) وكمياتها (الكمية) التي تم تنفيذها في عمليات التسليم الموجودة في النقطة 1. أي أن الاستعلام من النقطة 1 يصبح متداخلاً:

نحتاج الآن إلى إضافة أسعار المنتجات الموجودة المخزنة في جدول الأسعار إلى الجدول الناتج. أي أننا سنحتاج إلى الانضمام إلى جداول Supply Magazine (magazine_incoming) والأسعار باستخدام عمود id_product:

من الواضح أن الجدول الناتج يفتقر إلى عمود Sum، وهو عمود محسوب. يتم توفير القدرة على إنشاء مثل هذه الأعمدة في MySQL. للقيام بذلك، تحتاج فقط إلى تحديد اسم العمود المحسوب في الاستعلام وما يجب حسابه. في مثالنا، سيُطلق على هذا العمود اسم "الجمع"، وسيقوم بحساب حاصل ضرب عمودي الكمية والسعر. يتم فصل اسم العمود الجديد بكلمة AS:

رائع، كل ما يتعين علينا فعله هو جمع عمود الملخص ومعرفة المبلغ الذي جلبه لنا المورد "دار الطباعة" من البضائع. بناء الجملة لاستخدام الدالة SUM() كما يلي:

حدد SUM(column_name) من table_name؛

نحن نعرف اسم العمود - الخلاصة، ولكن ليس لدينا اسم الجدول، لأنه نتيجة استعلام. ما يجب القيام به؟ في مثل هذه الحالات، تحتوي MySQL على طرق عرض. طريقة العرض هي استعلام تحديد يتم إعطاؤه اسمًا فريدًا ويمكن تخزينه في قاعدة بيانات لاستخدامه لاحقًا.

بناء جملة إنشاء طريقة العرض كما يلي:

إنشاء عرض view_name كطلب؛

لنحفظ طلبنا كطريقة عرض باسم report_vendor:

إنشاء عرض report_vendor AS

حدد مجلة_incoming.id_product، مجلة_incoming.quantity، الأسعار، السعر،

Magazine_incoming.quantity*prices.price AS ملخص

من مجلة_الواردة، الأسعار

أين Magazine_incoming.id_product=الأسعار.id_product وid_incoming=

يمكنك الآن استخدام الدالة SUM() النهائية:

لذلك حققنا النتيجة، على الرغم من أنه كان علينا استخدام الاستعلامات المتداخلة والصلات والأعمدة المحسوبة وطرق العرض. نعم، في بعض الأحيان عليك أن تفكر للحصول على النتائج، وبدون ذلك لا يمكنك الوصول إلى أي مكان. لكننا تطرقنا إلى موضوعين مهمين للغاية - الأعمدة المحسوبة وطرق العرض. دعونا نتحدث عنهم بمزيد من التفصيل.

الحقول المحسوبة (الأعمدة)

باستخدام مثال، نظرنا إلى حقل حسابي رياضي. أود هنا أن أضيف أنه لا يمكنك استخدام عملية الضرب (*) فحسب، بل يمكنك أيضًا استخدام الطرح (-)، والجمع (+)، والقسمة (/). بناء الجملة هو كما يلي:

حدد column_name_1، column_name_2، column_name_1*column_name_2 AS محسوب_column_name

من اسم الجدول؛

الفارق الدقيق الثاني هو الكلمة الأساسية AS، التي استخدمناها لتعيين اسم العمود المحسوب. في الواقع، يتم استخدام هذه الكلمة الأساسية لتعيين الأسماء المستعارة لأية أعمدة. لماذا هذا ضروري؟ لتقليل الكود وسهولة القراءة. على سبيل المثال، يمكن أن تبدو وجهة نظرنا كما يلي:

إنشاء عرض report_vendor AS

حدد A.id_product، A.quantity، B.price، A.quantity*B.price AS ملخص

من مجلة incoming AS A، الأسعار AS B

حيث A.id_product= B.id_product وid_incoming=

(حدد id_incoming FROM الوارد حيث id_vendor=2);

توافق على أن هذا أقصر وأكثر وضوحًا.

التمثيل

لقد نظرنا بالفعل في بناء الجملة لإنشاء طرق العرض. بمجرد إنشاء طرق العرض، يمكن استخدامها بنفس طريقة استخدام الجداول. وهذا يعني تشغيل الاستعلامات ضدها، وتصفية البيانات وفرزها، ودمج بعض طرق العرض مع طرق عرض أخرى. من ناحية، تعد هذه طريقة ملائمة جدًا لتخزين الاستعلامات المعقدة المستخدمة بشكل متكرر (كما في مثالنا).

لكن تذكر أن طرق العرض ليست جداول، أي أنها لا تخزن البيانات، ولكنها تستردها فقط من الجداول الأخرى. وبالتالي، أولاً، عندما تتغير البيانات الموجودة في الجداول، ستتغير نتائج العرض أيضًا. وثانيًا، عند تقديم طلب إلى طريقة عرض، يتم البحث عن البيانات المطلوبة، أي أن أداء نظام إدارة قواعد البيانات ينخفض. لذلك يجب عدم إساءة معاملتهم.

وظائف سلسلة SQL

تسمح لك هذه المجموعة من الوظائف بمعالجة النص. هناك العديد من وظائف السلسلة، وسوف نلقي نظرة على أكثرها شيوعا.

كونكات (str1، str2 ...)

إرجاع سلسلة تم إنشاؤها عن طريق سلسلة الوسائط (يتم تحديد الوسائط بين قوسين - str1،str2...). على سبيل المثال، يوجد في جدول الموردين عمود "المدينة" وعمود "العنوان". لنفترض أننا نريد أن يحتوي الجدول الناتج على العنوان والمدينة في نفس العمود، أي. نريد دمج البيانات من عمودين في عمود واحد. للقيام بذلك، سنستخدم الدالة النصية CONCAT()، وسنشير كوسيطات إلى أسماء الأعمدة المراد دمجها - المدينة والعنوان:

يرجى ملاحظة أن الدمج تم دون تقسيم، وهو أمر غير قابل للقراءة. دعونا نضبط استعلامنا بحيث يكون هناك مسافة بين الأعمدة التي سيتم ضمها:

كما ترون، تعتبر المسافة أيضًا وسيطة ويتم الإشارة إليها مفصولة بفاصلة. إذا كان هناك المزيد من الأعمدة المراد دمجها، فإن تحديد المسافات في كل مرة سيكون غير منطقي. في هذه الحالة، يمكن للمرء استخدام وظيفة السلسلة CONCAT_WS(delimiter, str1,str2...)، التي تضع محددًا بين السلاسل المراد ربطها (يتم تحديد المحدد كوسيطة أولى). سيبدو استعلامنا بعد ذلك كما يلي:

SELECT CONCAT_WS(" "، المدينة، العنوان) من البائعين؛

النتيجة لم تتغير خارجيا، ولكن إذا قمنا بدمج 3 أو 4 أعمدة، فسيتم تقليل الكود بشكل كبير.

INSERT(str، pos، len، new_str)

تُرجع السلسلة النصية مع السلسلة الفرعية التي تبدأ من الموضع pos ويتم استبدال طول أحرف len بالسلسلة الفرعية new_str. لنفترض أننا قررنا عدم عرض الأحرف الثلاثة الأولى في عمود العنوان (الاختصارات st.، pr.، وما إلى ذلك)، فسنستبدلها بمسافات:

أي أنه يتم استبدال ثلاثة أحرف، بدءًا من الحرف الأول، بثلاث مسافات.

LPAD(str, len, dop_str) يُرجع السلسلة النصية المبطنة بـ dop_str إلى الطول len. لنفترض أننا نريد عرض المدن الموردة على اليمين وملء المساحة الفارغة بالنقاط:

RPAD (شارع، لين، dop_str)

تُرجع السلسلة النصية المبطنة على اليمين بـ dop_str إلى الطول len. لنفترض أننا نريد عرض مدن الموردين على اليسار، وملء المساحة الفارغة بالنقاط:

يرجى ملاحظة أن قيمة len تحدد عدد الأحرف المعروضة، أي. إذا كان اسم المدينة أطول من 15 حرفًا، فسيتم اقتطاعه.

تُرجع السلسلة النصية مع إزالة كافة المسافات البادئة. تعد وظيفة السلسلة هذه ملائمة لعرض المعلومات بشكل صحيح في الحالات التي يُسمح فيها بمسافات عشوائية عند إدخال البيانات:

حدد LTRIM(city) من البائعين؛

إرجاع السلسلة النصية مع إزالة كافة المسافات الزائدة:

حدد RTRIM(city) من البائعين؛

في حالتنا، لم تكن هناك مسافات زائدة، لذلك لن نرى النتيجة خارجيًا.

إرجاع السلسلة النصية مع إزالة جميع المسافات البادئة والزائدة:

حدد TRIM(city) من البائعين؛

تُرجع السلسلة النصية مع تحويل كافة الأحرف إلى أحرف صغيرة. إنه لا يعمل بشكل صحيح مع الحروف الروسية، لذا من الأفضل عدم استخدامه. على سبيل المثال، لنطبق هذه الوظيفة على عمود المدينة:

انظر أي نوع من الهراء اتضح أنه. لكن كل شيء على ما يرام مع الأبجدية اللاتينية:

تُرجع السلسلة النصية بجميع الأحرف المحولة إلى أحرف كبيرة. ومن الأفضل أيضًا عدم استخدامه مع الحروف الروسية. لكن كل شيء على ما يرام مع الأبجدية اللاتينية:

إرجاع طول السلسلة str. على سبيل المثال، دعنا نتعرف على عدد الأحرف الموجودة في عناوين الموردين لدينا:

إرجاع أحرف len اليسرى من السلسلة النصية. على سبيل المثال، دع الأحرف الثلاثة الأولى فقط تظهر في المدن الموردة:

إرجاع أحرف len اليمنى من السلسلة str. على سبيل المثال، دع الأحرف الثلاثة الأخيرة فقط تظهر في المدن الموردة:

إرجاع السلسلة str n عدد المرات. على سبيل المثال:

استبدال (شارع، pod_str1، pod_str2)

تُرجع السلسلة النصية مع استبدال جميع سلاسل pod_str1 الفرعية بسلاسل فرعية من pod_str2. على سبيل المثال، لنفترض أنه في المدن الموردة، بدلاً من "سانت بطرسبرغ" الطويلة، يتم عرض "SPb" القصير:

إرجاع السلسلة النصية المكتوبة بترتيب عكسي:

LOAD_FILE(اسم_الملف)

تقرأ هذه الوظيفة اسم الملف file_name وترجع محتوياته كسلسلة. على سبيل المثال، قم بإنشاء ملف proverka.txt، واكتب بعض النص فيه (يفضل أن يكون باللغة اللاتينية لتجنب مشاكل الترميزات)، واحفظه على محرك الأقراص C وقم بتقديم الطلب التالي:

يرجى ملاحظة أنه يجب عليك تحديد المسار المطلق للملف.

كما ذكرنا سابقًا، هناك العديد من وظائف السلسلة، ولكن حتى بعض تلك التي تمت مناقشتها هنا نادرًا ما يتم استخدامها. لذلك، دعونا ننتهي من النظر فيها هنا وننتقل إلى وظائف التاريخ والوقت الأكثر استخدامًا.

المهمة 3. وظائف التاريخ والوقت

تم تصميم هذه الوظائف للعمل مع أنواع بيانات التقويم. دعونا نلقي نظرة على الأكثر قابلية للتطبيق.

CURDATE() وCURTIME() وNOW()

الدالة الأولى ترجع التاريخ الحالي، والثانية ترجع الوقت الحالي، والثالثة ترجع التاريخ والوقت الحاليين. يقارن:

تعد الدالتان CURDATE() وNOW() مفيدة لإضافة السجلات إلى قاعدة البيانات التي تستخدم الوقت الحالي. في متجرنا، جميع عمليات التسليم والمبيعات تستخدم الوقت الحالي. لذلك، لإضافة سجلات حول عمليات التسليم والمبيعات، من المناسب استخدام الدالة CURDATE(). على سبيل المثال، لنفترض أن منتجًا وصل إلى متجرنا، فلنضيف معلومات عنه إلى جدول التسليم (الوارد):

إذا كنا نخزن تاريخ التسليم كنوع بيانات، فستكون الدالة NOW() أكثر ملاءمة لنا.

ADDDATE(التاريخ، قيمة الفاصل الزمني) ترجع الدالة التاريخ مع القيمة المضافة إليه. يمكن أن تكون قيمة القيمة سالبة، ثم سينخفض ​​التاريخ النهائي. دعونا نرى متى قام موردونا بتسليم البضائع:

لنفترض أننا أخطأنا عند إدخال التاريخ للمورد الأول، فلنخفض تاريخه بيوم واحد:

لا يمكن أن تكون قيمة القيمة أيامًا فقط، بل أيضًا أسابيع (WEEK)، وأشهر (MONTH)، وأرباع سنوية (QUARTER)، وسنوات (YEAR). على سبيل المثال، لنقم بتقليل تاريخ التسليم للمورد الثاني بمقدار أسبوع واحد:

في جدول التسليمات (الواردة)، استخدمنا نوع التاريخ لعمود تاريخ التسليم (التاريخ_الوارد). تم تصميم نوع البيانات هذا لتخزين التواريخ فقط. ولكن إذا استخدمنا نوع datatime، فلن نعرض التاريخ فحسب، بل الوقت أيضًا. ثم يمكننا استخدام الدالة ADDDATE للوقت أيضًا. يمكن أن تكون القيمة في هذه الحالة الثواني (SECOND)، والدقائق (MINUTE)، والساعات (HOUR) ومجموعاتها:

الدقائق والثواني (MINUTE_SECOND)،

الساعات والدقائق والثواني (HOUR_SECOND)،

الساعات والدقائق (HOUR_MINUTE)،

الأيام والساعات والدقائق والثواني (DAY_SECOND)،

الأيام والساعات والدقائق (DAY_MINUTE)،

الأيام والساعات (DAY_HOUR)،

السنوات والأشهر (YEAR_MONTH).

SUBDATE(التاريخ، قيمة الفاصل الزمني)

الدالة مماثلة للوظيفة السابقة، ولكنها تقوم بعملية الطرح بدلاً من الجمع.

PERIOD_ADD(الفترة، ن)

تضيف الدالة n أشهر إلى قيمة تاريخ الفترة. ملاحظة: يجب أن تكون قيمة التاريخ بتنسيق YYYYMM. دعونا نضيف شهرين إلى فبراير 2011 (201102):

TIMESTAMPADD (الفاصل الزمني، n، التاريخ)

تضيف الدالة فاصلًا زمنيًا n إلى التاريخ، ويتم تحديد قيمه بواسطة معلمة الفاصل الزمني. القيم المحتملة لمعلمة الفاصل الزمني:

FRAC_SECOND - ميكروثانية

الثانية - ثواني

دقيقة - دقائق

أسبوع - أسابيع

شهر - أشهر

الربع - كتل

TIMEDIFF (التاريخ 1، التاريخ 2)

حساب الفرق في الساعات والدقائق والثواني بين تاريخين.

DATEDIFF(التاريخ1، التاريخ2)

حساب الفرق في الأيام بين تاريخين. على سبيل المثال، نريد معرفة المدة التي مضت منذ أن قام المورد "Williams" (المعرف=1) بتزويدنا بالبضائع:

PERIOD_DIFF(الفترة 1، الفترة 2)

تقوم الدالة بحساب الفرق بالأشهر بين تاريخين ممثلين بتنسيق YYYYMM. دعونا نكتشف الفرق بين يناير 2010 وأغسطس 2011:

TIMESTAMPDIFF (الفاصل الزمني، التاريخ 1، التاريخ 2)

تقوم الدالة بحساب الفرق بين التواريخ date2 وdate1 في الوحدات المحددة في معلمة الفاصل الزمني. القيم المحتملة لمعلمة الفاصل الزمني:

FRAC_SECOND - ميكروثانية

الثانية - ثواني

دقيقة - دقائق

أسبوع - أسابيع

شهر - أشهر

الربع - كتل

SUBTIME (التاريخ والوقت)

تقوم الدالة بطرح الوقت من التاريخ والوقت:

إرجاع التاريخ، وتقليم الوقت. على سبيل المثال:

إرجاع الوقت، اقتطاع التاريخ. على سبيل المثال:

تأخذ الوظيفة تاريخًا وترجع النسخة الكاملة مع مرور الوقت. على سبيل المثال:

DAY(التاريخ) و DAYOFMONTH(التاريخ)

تقوم الدالات المترادفة بإرجاع الرقم التسلسلي ليوم من الشهر من التاريخ:

DAYNAME(تاريخ)، DAYOFWEEK(تاريخ) وWEEKDAY(تاريخ)

وظائف إرجاع يوم الأسبوع، الأول - اسمه، والثاني - عدد أيام الأسبوع (العد من 1 - الأحد إلى 7 - السبت)، والثالث - عدد أيام الأسبوع (العد من 0 - الاثنين إلى 6 - الأحد:

WEEK(التاريخ)، WEEKOFYEAR(التاريخ والوقت)

تقوم كلتا الدالتين بإرجاع رقم الأسبوع في السنة، الأولى لنوع التاريخ، والثانية لنوع التاريخ والوقت، الأولى لها أسبوع يبدأ من الأحد، والثانية - من الاثنين:

MONTH(التاريخ) وMONTHNAME(التاريخ)

كلا الدالتين ترجع قيم الشهر. الأول هو قيمته العددية (من 1 إلى 12)، والثاني هو اسم الشهر:

ترجع الدالة قيمة ربع السنة (من 1 إلى 4):

ترجع الدالة YEAR(date) قيمة السنة (من 1000 إلى 9999):

إرجاع الرقم التسلسلي لليوم في السنة (من 1 إلى 366):

إرجاع قيمة الساعة للوقت (0 إلى 23):

دقيقة (التاريخ والوقت)

إرجاع قيمة الدقائق للوقت (من 0 إلى 59):

الثاني (التاريخ والوقت)

إرجاع قيمة الثواني للوقت (من 0 إلى 59):

استخراج (اكتب من التاريخ)

إرجاع جزء التاريخ المحدد بواسطة معلمة النوع:

TO_DAYS(التاريخ) وFROM_DAYS(n)

وظائف متبادلة. الأول يحول التاريخ إلى عدد الأيام منذ السنة صفر. والثاني، على العكس من ذلك، يأخذ عدد الأيام التي مرت منذ السنة صفر ويحولها إلى تاريخ:

UNIX_TIMESTAMP(التاريخ) وFROM_UNIXTIME(n)

وظائف متبادلة. الأول يحول التاريخ إلى عدد الثواني منذ 1 يناير 1970. والثاني، على العكس من ذلك، يأخذ عدد الثواني منذ 1 يناير 1970 ويحولها إلى تاريخ:

TIME_TO_SEC(الوقت) وSEC_TO_TIME(n)

وظائف متبادلة. الأول يحول الوقت إلى عدد الثواني التي مرت منذ بداية اليوم. والثاني، على العكس من ذلك، يأخذ عدد الثواني من بداية اليوم ويحولها إلى وقت:

MAKEDATE(السنة، ن)

تأخذ الدالة رقم السنة واليوم في السنة وتحولهما إلى تاريخ:

المهمة 4. Fخيارات تنسيق التاريخ والوقت

تم تصميم هذه الوظائف أيضًا للعمل مع أنواع بيانات التقويم. دعونا نلقي نظرة فاحصة عليهم.

DATE_FORMAT(التاريخ، التنسيق)

تنسيق التاريخ حسب التنسيق المحدد. يتم استخدام هذه الوظيفة في كثير من الأحيان. على سبيل المثال، في MySQL تنسيق التاريخ هو YYYY-MM-DD (سنة-شهر-يوم)، بينما نحن أكثر دراية بالتنسيق DD-MM-YYYY (تاريخ-شهر-سنة). لذلك، لعرض التاريخ كالمعتاد، يجب إعادة تنسيقه. لنبدأ أولاً بتقديم الاستعلام، ثم نتعرف على كيفية تعيين التنسيق:

الآن يبدو التاريخ مألوفًا بالنسبة لنا. لتحديد تنسيق التاريخ، يتم استخدام مؤهلات خاصة. للراحة، نقوم بإدراجها في الجدول.

وصف

الاسم المختصر ليوم الأسبوع (الاثنين - الاثنين، الثلاثاء - الثلاثاء، الأربعاء - الأربعاء، الخميس - الخميس، الجمعة - الجمعة، السبت - السبت، الأحد - الأحد).

الاسم المختصر للأشهر (يناير - يناير، فبراير - فبراير، مارس - مارس، أبريل - أبريل، مايو - مايو، يونيو - يونيو، يوليو - يوليو، أغسطس - أغسطس، سبتمبر - سبتمبر، أكتوبر - أكتوبر، نوفمبر - نوفمبر، ديسمبر - ديسمبر).

الشهر بالشكل العددي (1 - 12).

يوم الشهر بشكل رقمي بصفر (01 - 31).

يوم الشهر باللغة الإنجليزية (الأول، الثاني...).

يوم الشهر بالشكل العددي بدون صفر (1 - 31).

الساعات ذات الصفر البادئ من 00 إلى 23.

ساعة بصفر بادئ من 00 إلى 12.

الدقائق من 00 إلى 59.

أيام السنة من 001 إلى 366.

الساعة ذات الصفر البادئ من 0 إلى 23.

الساعة بدون صفر بادئ من 1 إلى 12.

اسم الشهر بدون اختصار.

الشهر في شكل رقمي بصفر بادئ (01 - 12).

صباحًا أو مساءً لمدة 12 ساعة.

الوقت بتنسيق 12 ساعة.

الثواني من 00 إلى 59.

الوقت بتنسيق 24 ساعة.

الأسبوع (00 - 52)، حيث أول يوم في الأسبوع هو يوم الاثنين.

الأسبوع (00 - 52)، حيث أول يوم في الأسبوع هو الأحد.

اسم يوم الاسبوع بدون اختصار.

رقم يوم الأسبوع (0 - الأحد، 6 - السبت).

السنة، 4 فئات.

السنة، فئتان.

STR_TO_DATE(التاريخ، التنسيق)

الدالة هي عكس الوظيفة السابقة، فهي تقبل التاريخ بالتنسيق وترجع التاريخ بتنسيق MySQL.

.

TIME_FORMAT (الوقت، التنسيق)

تشبه الدالة الدالة DATE_FORMAT()، ولكنها تستخدم للوقت فقط:

GET_FORMAT (التاريخ والتنسيق)

تقوم الدالة بإرجاع سلسلة تنسيق تتوافق مع أحد تنسيقات الوقت الخمسة:

يورو - المعيار الأوروبي

الولايات المتحدة الأمريكية - المعيار الأمريكي

JIS - المعيار الصناعي الياباني

ISO - معيار ISO (منظمة المعايير الدولية)

داخلي - معيار دولي

هذه الوظيفة جيدة للاستخدام مع الوظيفة السابقة -

لنلقي نظرة على مثال:

كما ترون، تقوم الدالة GET_FORMAT() نفسها بإرجاع تنسيق العرض التقديمي، ومع الدالة DATE_FORMAT() فإنها تنتج التاريخ بالتنسيق المطلوب. قم بإجراء استعلاماتك الخاصة مع جميع المعايير الخمسة وشاهد الفرق.

حسنًا، أنت الآن تعرف كل شيء تقريبًا عن العمل مع التواريخ والأوقات في MySQL. سيكون هذا مفيدًا جدًا لك عند تطوير تطبيقات الويب المختلفة. على سبيل المثال، إذا قام المستخدم بإدخال تاريخ في نموذج على موقع ويب بتنسيق مألوف له، فلن يكون من الصعب عليك تطبيق الوظيفة اللازمة بحيث يظهر التاريخ في قاعدة البيانات بالتنسيق المطلوب.

المهمة 5. الإجراءات المخزنة

كقاعدة عامة، عند العمل مع قاعدة بيانات، نستخدم نفس الاستعلامات، أو مجموعة من الاستعلامات المتسلسلة. تسمح لك الإجراءات المخزنة بدمج سلسلة من الاستعلامات وتخزينها على الخادم. هذه أداة مريحة للغاية، والآن ستراها. لنبدأ مع بناء الجملة:

إنشاء الإجراء

اسم الإجراء (المعلمات)

العاملين

المعلمات هي البيانات التي سنمررها إلى الإجراء عند استدعائها، والمشغلون هم الطلبات نفسها. لنكتب الإجراء الأول ونتأكد من أنه مناسب. عندما أضفنا سجلات جديدة إلى قاعدة بيانات المتجر، استخدمنا استعلام إضافة قياسي مثل:

أدخل في قيمة العملاء (الاسم والبريد الإلكتروني) ("إيفانوف سيرجي"، " [البريد الإلكتروني محمي]");

لأن سنستخدم طلبًا مشابهًا في كل مرة نحتاج فيها إلى إضافة عميل جديد، لذلك من المناسب تمامًا إضفاء الطابع الرسمي عليه في شكل إجراء:

إنشاء الإجراء ins_cust(n CHAR(50)، e CHAR(50))

أدخل في قيمة العملاء (الاسم والبريد الإلكتروني) (n، e)؛

انتبه إلى كيفية تحديد المعلمات: تحتاج إلى إعطاء اسم للمعلمة والإشارة إلى نوعها، وفي نص الإجراء نستخدم بالفعل أسماء المعلمات. تحذير واحد. كما تتذكر، فإن الفاصلة المنقوطة تعني نهاية الطلب وإرساله للتنفيذ، وهو أمر غير مقبول في هذه الحالة. لذلك، قبل كتابة الإجراء، من الضروري إعادة تعريف الفاصل c؛ إلى "//" حتى لا يتم إرسال الطلب في وقت مبكر. ويتم ذلك باستخدام عامل التشغيل DELIMITER //:

وبالتالي، أوضحنا لنظام إدارة قواعد البيانات (DBMS) أنه يجب الآن تنفيذ الأوامر بعد //. يجب أن نتذكر أن إعادة تعريف الفاصل تتم لجلسة واحدة فقط، أي. في المرة التالية التي تعمل فيها مع MySql، سيصبح الفاصل مرة أخرى فاصلة منقوطة، وإذا لزم الأمر، سيتعين إعادة تعريفه مرة أخرى. الآن يمكنك وضع الإجراء:

لذلك، تم إنشاء الإجراء. الآن، عندما نحتاج إلى إدخال عميل جديد، نحتاج فقط إلى الاتصال به، وتحديد المعلمات الضرورية. لاستدعاء إجراء مخزن، استخدم عبارة CALL، متبوعة باسم الإجراء ومعلماته. لنقم بإضافة عميل جديد إلى جدول العملاء:

توافق على أن هذا أسهل بكثير من كتابة طلب كامل في كل مرة. دعونا نتحقق مما إذا كان الإجراء يعمل من خلال البحث لمعرفة ما إذا كان العميل الجديد قد ظهر في جدول العملاء:

يبدو أن الإجراء يعمل، وسيعمل دائمًا حتى نحذفه باستخدام عبارة DROP PROCEDURE الإجراء_اسم.

كما ذكرنا في بداية المهمة، تسمح لك الإجراءات بدمج سلسلة من الطلبات. دعونا نرى كيف يتم ذلك. دعونا نحاول معرفة المبلغ الذي جلبه لنا المورد "House of Printing" من البضائع؟ في السابق، كان يتعين علينا استخدام الاستعلامات الفرعية والصلات والأعمدة المحسوبة وطرق العرض للقيام بذلك. ماذا لو أردنا أن نعرف المبلغ الذي جلبه لنا المورد الآخر من البضائع؟ سيتعين عليك إنشاء استعلامات وانضمامات جديدة وما إلى ذلك. من الأسهل كتابة إجراء مخزن لهذا الإجراء مرة واحدة.

يبدو أن أسهل طريقة هي أخذ عرض مكتوب بالفعل والاستعلام عنه، ودمجه في إجراء مخزن وجعل معرف البائع (id_vendor) معلمة إدخال، مثل هذا:

لكن الإجراء لن يعمل بهذه الطريقة. الشيء هو أن طرق العرض لا يمكنها استخدام المعلمات. ولذلك، سيتعين علينا تغيير تسلسل الطلبات قليلاً. أولاً، سنقوم بإنشاء طريقة عرض تعرض معرف البائع (id_vendor)، ومعرف المنتج (id_product)، والكمية (quantity)، والسعر (price)، والمجموع (summa) من الجداول الثلاثة الإمدادات (الواردة)، والمجلة (المجلة_الواردة) , الأسعار ( الأسعار ):

وبعد ذلك سنقوم بإنشاء استعلام يلخص كميات العرض الخاصة بالمورد الذي نهتم به، على سبيل المثال، باستخدام id_vendor=2:

حدد SUM(summa) FROM report_vendor WHERE id_vendor=2;

يمكننا الآن دمج هذين الاستعلامين في إجراء مخزن، حيث ستكون معلمة الإدخال هي معرف البائع (id_vendor)، والذي سيتم استبداله في الاستعلام الثاني، ولكن ليس في العرض:

دعونا نتحقق من تشغيل الإجراء باستخدام معلمات الإدخال المختلفة:

كما ترون، يتم تنفيذ الإجراء مرة واحدة ثم يُظهر خطأً يخبرنا أن طريقة العرض report_vendor موجودة بالفعل في قاعدة البيانات. وذلك لأنه عند استدعاء الإجراء لأول مرة، فإنه يقوم بإنشاء طريقة عرض. عند الوصول إليها مرة ثانية، تحاول إنشاء العرض مرة أخرى، ولكنه موجود بالفعل، وهذا هو سبب ظهور الخطأ. لتجنب هذا هناك خياران.

الأول هو إخراج التمثيل من الإجراء. أي أننا سنقوم بإنشاء العرض مرة واحدة، وسيقوم الإجراء بالوصول إليه فقط، ولكن لن نقوم بإنشائه. لا تنس حذف الإجراء الذي تم إنشاؤه بالفعل وعرضه أولاً:

التحقق من العمل:

اتصل بـ sum_vendor(1)//

اتصل بـ sum_vendor(2)//

اتصل بـ sum_vendor(3)//

الخيار الثاني هو إضافة أمر مباشرة في الإجراء الذي سيحذف العرض إذا كان موجودًا:

قبل استخدام هذا الخيار، تأكد من إزالة إجراء sum_vendor ثم اختبار العمل:

كما ترون، من الأسهل حقًا إضفاء الطابع الرسمي على الاستعلامات المعقدة أو تسلسلها مرة واحدة في إجراء مخزن، ثم الوصول إليها ببساطة، مع تحديد المعلمات الضرورية. يؤدي هذا إلى تقليل التعليمات البرمجية بشكل كبير ويجعل العمل مع الاستعلامات أكثر منطقية.

المهمة 6. الإجراءات المخزنة

الآن دعونا نكتشف كيف يمكننا رؤية الإجراءات المخزنة لدينا على الخادم وكيف تبدو. للقيام بذلك، دعونا نتعرف على اثنين من المشغلين:

إظهار حالة الإجراء - يسمح لك بعرض قائمة بالإجراءات المخزنة المتاحة. صحيح أن عرض هذه القائمة ليس مريحًا جدًا، لأن... يتم توفير معلومات لكل إجراء حول اسم قاعدة البيانات التي ينتمي إليها الإجراء ونوعه والحساب الذي تم إنشاء الإجراء نيابة عنه وتاريخ إنشاء الإجراء وتعديله وما إلى ذلك. ومع ذلك، إذا كنت تريد معرفة الإجراءات التي لديك، فيجب عليك استخدام هذا العامل.

عرض إنشاء إجراء الإجراء_اسم - يتيح لك الحصول على معلومات حول إجراء معين، على وجه الخصوص، عرض التعليمات البرمجية الخاصة به. المنظر أيضًا ليس مريحًا جدًا، ولكن يمكنك معرفة ذلك.

جرب كلا المشغلين أثناء العمل لترى كيف يبدو الأمر. الآن دعونا نلقي نظرة على خيار أكثر ملاءمة للحصول على هذه المعلومات. تحتوي قاعدة بيانات نظام MySQL على جدول proc، حيث يتم تخزين المعلومات حول الإجراءات. حتى نتمكن من إجراء استعلام SELECT على هذا الجدول. علاوة على ذلك، إذا قمنا بإنشاء طلب مألوف:

اختر * من mysql.proc//

سنحصل على شيء غير قابل للقراءة كما هو الحال عند استخدام عبارات SHOW. ولذلك، سوف نقوم بإنشاء استعلامات مع الشروط. على سبيل المثال، إذا قمنا بإنشاء استعلام مثل هذا:

حدد الاسم من mysql.proc//

ثم سنحصل على أسماء كافة الإجراءات لجميع قواعد البيانات المتوفرة على الخادم. على سبيل المثال، في الوقت الحالي نحن مهتمون فقط بإجراءات قاعدة بيانات المتجر، لذلك دعونا نغير الاستعلام:

حدد الاسم من mysql.proc WHERE db="shop"//

والآن حصلنا على ما أردناه:

إذا أردنا أن ننظر فقط إلى نص إجراء معين (أي من البداية إلى النهاية)، فسنكتب الاستعلام التالي:

حدد نصًا من mysql.proc حيث الاسم = "sum_vendor"//

وسنرى نسخة قابلة للقراءة بالكامل:

بشكل عام، من أجل استخراج المعلومات التي تحتاجها من جدول proc، تحتاج فقط إلى معرفة الأعمدة التي يحتوي عليها، ولهذا يمكنك استخدام عامل التشغيل المألوف لوصف table_name، في حالتنا وصف mysql.proc. صحيح أن مظهره ليس سهل القراءة أيضًا، لذلك نقدم هنا أسماء الأعمدة الأكثر شيوعًا:

db هو اسم قاعدة البيانات التي يتم حفظ الإجراء فيها.

الاسم - اسم الإجراء.

param_list - قائمة معلمات الإجراء.

الجسم - نص الإجراء.

تعليق - تعليق على الإجراء المخزن.

لقد استخدمنا بالفعل أعمدة قاعدة البيانات والاسم والنص. قم بإنشاء استعلام يقوم باسترداد معلمات إجراء sum_vendor بنفسك. ولكن الآن سنتحدث بمزيد من التفاصيل حول التعليقات على الإجراءات المخزنة.

التعليقات ضرورية للغاية، لأنه بعد مرور بعض الوقت قد ننسى ما يفعله هذا الإجراء أو ذاك. بالطبع، باستخدام الكود الخاص به يمكننا استعادة ذاكرتنا، لكن لماذا؟ من الأسهل بكثير الإشارة على الفور إلى ما يفعله عند إنشاء إجراء، وبعد ذلك، حتى بعد فترة طويلة، ننتقل إلى التعليقات، سنتذكر على الفور سبب إنشاء هذا الإجراء.

إنشاء التعليقات سهل للغاية. للقيام بذلك، مباشرة بعد قائمة المعلمات، ولكن حتى قبل نص الإجراء المخزن، نشير إلى الكلمة الأساسية "تعليق هنا". دعونا نحذف إجراء sum_vendor الخاص بنا وننشئ إجراءً جديدًا مع تعليق:

الآن لنقدم طلبًا للتعليق على الإجراء:

في الواقع، لم يكن عليك حذف الإجراء القديم لإضافة تعليق. يمكنك تحرير إجراء مخزن موجود باستخدام عبارة ALTER PROCEDURE. دعونا نرى كيفية القيام بذلك باستخدام إجراء ins_cust من المهمة السابقة كمثال. يقوم هذا الإجراء بإدخال معلومات حول عميل جديد في جدول العملاء. دعنا نضيف تعليقًا على هذا الإجراء:

تغيير الإجراء تعليق ins_cust

يُدخل معلومات حول عميل جديد في جدول المشترين."//

ودعنا نتقدم بطلب إلى التعليق للتحقق:

حدد تعليقًا من mysql.proc حيث الاسم = "ins_cust"//

هناك إجراءان فقط في قاعدة البيانات الخاصة بنا، ويبدو أن التعليقات عليهما غير ضرورية. لا تكن كسولاً، تأكد من كتابة التعليقات. تخيل أن هناك العشرات أو المئات من الإجراءات في قاعدة بياناتنا. بعد تقديم الطلب اللازم، يمكنك بسهولة معرفة الإجراءات الموجودة وماذا تفعل وتفهم أن التعليقات ليست إسرافًا، ولكنها توفر وقتك في المستقبل. بالمناسبة هذا هو الطلب نفسه:

حسنًا، الآن يمكننا استرجاع أي معلومات حول إجراءاتنا، مما سيسمح لنا بعدم نسيان أي شيء أو الخلط.

المهمة 7. الإجراءات المخزنة

الإجراءات المخزنة ليست مجرد حاويات لمجموعات من الاستعلامات، كما قد يبدو. يمكن للإجراءات المخزنة استخدام مشغلي الفروع في عملهم. لا يمكن استخدام مثل هذه العبارات خارج الإجراءات المخزنة.

لنبدأ بالتعلم باستخدام عبارات IF...THEN...ELSE. إذا كنت معتادا على أي لغة برمجة، فهذا البناء مألوف لك. تذكر أن عبارة IF الشرطية تسمح لك بتنظيم تفرع البرنامج. في حالة الإجراءات المخزنة، يتيح لك هذا العامل تنفيذ استعلامات مختلفة اعتمادًا على معلمات الإدخال. كما هو الحال دائما، سيكون الأمر أكثر وضوحا مع مثال. لكن أولا بناء الجملة هو:

منطق التشغيل بسيط: إذا كان الشرط صحيحًا، فسيتم تنفيذ الطلب 1، وإلا فسيتم تنفيذ الطلب 2.

لنفترض أننا ننظم كل يوم ساعات سعيدة في متجرنا، أي. نقدم خصم 10% على جميع الكتب خلال الساعة الأخيرة من ساعات عمل المتجر. لكي نتمكن من اختيار سعر الكتاب، نحتاج إلى خيارين - مع خصم وبدونه. للقيام بذلك، سنحتاج إلى إنشاء إجراء مخزن مع مشغل الفرع. نظرًا لأن لدينا خيارين فقط للسعر، فمن الملائم أن يكون لديك قيمة منطقية كمعلمة إدخال، والتي، كما تتذكر، يمكن أن تأخذ إما 0 - خطأ، أو 1 - صحيح. رمز الإجراء يمكن أن يكون مثل هذا:

أولئك. عند الإدخال لدينا معلمة يمكن أن تكون إما 1 (إذا كان هناك خصم) أو 0 (إذا لم يكن هناك خصم). في الحالة الأولى، سيتم تنفيذ الطلب الأول، في الثانية - الثانية. دعونا نرى كيف يعمل الإجراء لدينا في كلا الخيارين:

خصم المكالمات(1)//

خصم المكالمات(0)//

يتيح لك عامل التشغيل IF تحديد عدد أكبر من خيارات الاستعلام، وفي هذه الحالة يتم استخدام الصيغة التالية:

إنشاء الإجراء اسم الإجراء (المعلمات)

إذا (الشرط) ثم

السيف (الحالة) إذن

علاوة على ذلك، يمكن أن يكون هناك عدة كتل ELSEIF. لنفترض أننا قررنا تقديم خصومات لعملائنا اعتمادا على مبلغ الشراء، لا يوجد خصم يصل إلى 1000 روبل، من 1000 إلى 2000 روبل - خصم 10٪، أكثر من 2000 روبل - خصم 20٪. يجب أن تكون معلمة الإدخال لمثل هذا الإجراء هي مبلغ الشراء. لذلك، نحتاج أولاً إلى كتابة الإجراء الذي سيحسبه. لنقم بذلك عن طريق القياس مع إجراء sum_vendor الذي تم إنشاؤه في الدرس 15، والذي قام بحساب كمية البضائع حسب معرف المورد.

يتم تخزين البيانات التي نحتاجها في جدولين: سجل الشراء (مجلة_المبيعات) والأسعار (الأسعار).

إنشاء إجراء sum_sale(IN i INT)

تعليق "إرجاع مبلغ الشراء حسب المعرف الخاص به."

قم بإسقاط العرض إذا كان موجودًا sum_sale؛

إنشاء عرض sum_sale AS SELECT Magazine_sales.id_sale،

مجلة_مبيعات.id_product، مجلة_مبيعات.كمية،

الأسعار.السعر، مجلة_المبيعات.الكمية*الأسعار.السعر كخلاصة

من مبيعات المجلات، الأسعار

أين Magazine_sales.id_product=prices.id_product;

حدد SUM(summa) من sum_sale WHERE id_sale=i;

هنا، قبل المعلمة، لدينا كلمة رئيسية جديدة IN. الحقيقة هي أنه يمكننا تمرير البيانات إلى إجراء ما وتمرير البيانات من إجراء ما. بشكل افتراضي، أي. إذا قمت بحذف الكلمة IN، فسيتم اعتبار المعلمات مدخلات (ولهذا السبب لم نستخدم هذه الكلمة من قبل). لقد أشرنا هنا بوضوح إلى أن المعلمة i هي مدخلات. إذا أردنا استخراج بعض البيانات من إجراء مخزن، فسنستخدم الكلمة الأساسية OUT، ولكن المزيد عن ذلك لاحقًا.

لذلك، قمنا بكتابة إجراء يقوم بإنشاء طريقة عرض عن طريق تحديد معرف الشراء ومعرف المنتج والكمية والسعر وحساب المبلغ لجميع صفوف الجدول الناتج. ثم هناك طلب لهذا العرض، حيث يتم حساب المبلغ الإجمالي لعملية الشراء هذه باستخدام معلمة الإدخال لمعرف الشراء.

نحتاج الآن إلى كتابة الإجراء الذي سيعيد حساب المبلغ الإجمالي مع مراعاة الخصم المقدم. هذا هو المكان الذي نحتاج فيه إلى مشغل الفرع:

أولئك. نقوم بتمرير معلمتين إدخال إلى الإجراء: المبلغ (sm) ومعرف الشراء (i)، واعتمادًا على المبلغ، يتم تقديم طلب إلى طريقة العرض sum_sale لحساب إجمالي مبلغ الشراء مضروبًا في المعامل المطلوب.

كل ما تبقى هو التأكد من تحويل مبلغ الشراء تلقائيًا إلى هذا الإجراء. للقيام بذلك، سيكون من الجيد استدعاء إجراء sum_discount مباشرة من إجراء sum_sale. سيبدو شيئا من هذا القبيل:

يتم وضع علامة الاستفهام عند استدعاء إجراء sum_discount، لأنه ليس من الواضح كيفية تمرير نتيجة الطلب السابق (أي المبلغ الإجمالي) إلى إجراء sum_discount. بالإضافة إلى ذلك، ليس من الواضح كيف سيعود إجراء sum_discount نتيجة عمله. ربما خمنت بالفعل أنه لحل السؤال الثاني، نحتاج فقط إلى معلمة تحتوي على الكلمة الأساسية OUT، أي. المعلمة التي ستقوم بإرجاع البيانات من الإجراء. دعنا ندخل المعلمة التالية ss، وبما أن المبلغ يمكن أن يكون أيضًا رقمًا كسريًا، فامنحه النوع المزدوج:

لذا، في كلا الإجراءين قدمنا ​​معلمة الإخراج ss. الآن استدعاء الإجراء CALL sum_discount(?, i, ss); يعني أنه من خلال تمرير المعلمتين الأوليين، فإننا ننتظر إرجاع المعلمة الثالثة إلى إجراء sum_sale. كل ما تبقى هو فهم كيفية تعيين بعض القيمة لهذه المعلمة ضمن إجراء sum_discount نفسه. نحتاج إلى تمرير نتيجة أحد الاستعلامات إلى هذه المعلمة. وبالطبع، يوفر MySQL هذا الخيار، باستخدام الكلمة الأساسية INTO:

باستخدام الكلمة الأساسية INTO، أشرنا إلى أنه يجب تمرير نتيجة الطلب إلى المعلمة ss.

الآن دعونا نتعامل مع علامة الاستفهام، أو بالأحرى، معرفة كيفية تمرير نتيجة الاستعلامات السابقة إلى إجراء sum_discount. للقيام بذلك، سوف نتعرف على مفهوم المتغير.

تتيح لك المتغيرات حفظ نتيجة الاستعلام الحالي لاستخدامها في الاستعلامات المستقبلية. يبدأ تعريف المتغير بحرف كلب (@) متبوعًا باسم المتغير. يتم الإعلان عنها باستخدام عامل التشغيل SET. على سبيل المثال، لنعلن عن المتغير z ونعطيه القيمة الأولية 20.

يوجد الآن متغير بهذه القيمة في قاعدة بياناتنا، ويمكنك التحقق منه عن طريق تقديم الطلب المناسب:

المتغيرات صالحة فقط خلال جلسة اتصال واحدة مع خادم MySQL. أي أنه بعد قطع الاتصال، سيختفي المتغير من الوجود.

لاستخدام المتغيرات في الإجراءات، استخدم عبارة DECLARE، التي تحتوي على بناء الجملة التالي:

قم بتعريف نوع اسم المتغير الافتراضي default_value_if_available

لذلك، دعونا نعلن عن المتغير s في إجراءاتنا، والذي سنقوم فيه بتخزين قيمة مبلغ الشراء باستخدام الكلمة الأساسية INTO:

سيكون هذا المتغير هو معلمة الإدخال الأولى لإجراء sum_discount. لذلك، تبدو النسخة النهائية من إجراءاتنا كما يلي:

في حال كنت في حيرة من أمرك، دعنا نلقي نظرة على كيفية عمل إجراء sum_sale الخاص بنا:

نطلق على الإجراء sum_sale، ونحدد معرف الشراء الذي نهتم به كمعلمة إدخال، على سبيل المثال id=1، ونشير إلى أن المعلمة الثانية هي متغير إخراج، وهو نتيجة الإجراء sum_discount:

اتصل بـ sum_sale(1,sum_discount)//

يقوم إجراء sum_sale بإنشاء طريقة عرض تجمع بيانات حول جميع المشتريات والمنتجات وكميتها وسعرها ومبلغها لكل سطر.

ثم يتم طلب هذا العرض لإجمالي مبلغ الشراء بالمعرف المطلوب، ويتم كتابة النتيجة للمتغير s.

يتم الآن استدعاء إجراء sum_discount، حيث تكون المعلمة الأولى هي المتغير s (مبلغ الشراء)، والثانية هي معرف الشراء i، والثالثة هي المعلمة ss، التي تعمل كمخرج، أي. سيُرجع نتيجة إجراء sum_discount.

يتحقق الإجراء sum_discount من الشرط الذي يلبيه مجموع الإدخال وينفذ الاستعلام المقابل، وتتم كتابة النتيجة إلى معلمة الإخراج ss، والتي يتم إرجاعها إلى إجراء sum_sale.

لرؤية نتيجة إجراء sum_sale، عليك تقديم طلب:

حددsum_discount //

دعونا نتأكد من أن إجراءاتنا تعمل:

مبلغ كل من مشترياتنا أقل من 1000 روبل، لذلك لا يوجد خصم. يمكنك إدخال عمليات الشراء بمبالغ مختلفة بنفسك ومعرفة كيفية سير إجراءاتنا.

ربما وجدت هذا الدرس صعبًا أو مربكًا للغاية. لا تنزعج. أولا، كل شيء يأتي مع الخبرة، وثانيا، في الإنصاف، يجب القول أن كلا من المتغيرات والمشغلين المتفرعين نادرا ما يتم استخدامهم في MySQL. يتم إعطاء الأفضلية للغات مثل PHP وPerl وما إلى ذلك، والتي يتم من خلالها تنظيم التفرع وإرسال الإجراءات البسيطة إلى قاعدة البيانات نفسها.

المهمة 8. الإجراءات المخزنة

اليوم سوف نتعلم كيفية العمل مع الدورات، أي. تشغيل نفس الاستعلام عدة مرات. يستخدم MySQL عبارات WHILE وREPEAT وLOOP للعمل مع الحلقات.

بينما بيان الحلقة

أولا بناء الجملة:

بينما تفعل الحالة

سيتم تنفيذ الطلب طالما أن الشرط صحيح. دعونا نلقي نظرة على مثال لكيفية عمل ذلك. لنفترض أننا نريد معرفة العناوين والمؤلفين وعدد الكتب التي وصلت في عمليات تسليم مختلفة. يتم تخزين المعلومات التي تهمنا في جدولين - مجلة الإمدادات (المجلة_الواردة) والمنتجات (المنتجات). لنكتب الاستعلام الذي يهمنا:

ولكن ماذا لو أردنا عرض النتيجة ليس في جدول واحد، بل لكل تسليم على حدة؟ بالطبع، يمكنك كتابة 3 استعلامات مختلفة، مع إضافة شرط إضافي لكل منها:

ولكن يمكنك القيام بذلك لفترة وجيزة باستخدام حلقة WHILE:

أولئك. أدخلنا المتغير i، والذي يساوي افتراضيًا 3، وسيقوم الخادم بتنفيذ الطلب بمعرف التسليم يساوي 3، ثم يقلل i بمقدار واحد (SET i=i-1)، وتأكد من أن القيمة الجديدة للمتغير i المتغير i موجب (i>0) وقم بتنفيذ الطلب مرة أخرى، ولكن بقيمة معرف التسليم الجديدة 2. سيحدث هذا حتى يتلقى المتغير i القيمة 0، ويصبح الشرط خطأ، وتنتهي الحلقة.

للتأكد من أن الحلقة تعمل، فلنقم بإنشاء دفتر إجراءات مخزن ووضع الحلقة فيه:

الآن دعنا نسمي الإجراء:

الآن لدينا 3 جداول منفصلة (لكل تسليم). توافق على أن الكود ذو الحلقة أقصر بكثير من ثلاثة طلبات منفصلة. ولكن هناك عيب واحد في إجراءاتنا: لقد أعلنا أن عدد جداول الإخراج هو القيمة الافتراضية (الافتراضي 3)، ومع كل تسليم جديد سيتعين علينا تغيير هذه القيمة، وبالتالي رمز الإجراء. إنه أكثر ملاءمة لجعل هذا الرقم معلمة إدخال. دعونا نعيد كتابة الإجراء الخاص بنا عن طريق إضافة معلمة إدخال num، مع الأخذ في الاعتبار أنها يجب ألا تساوي 0:

تأكد من أننا مع المعلمات الأخرى سنحصل على جداول لكل عملية تسليم. حلقتنا لها عيب آخر - إذا قمنا عن طريق الخطأ بتعيين قيمة الإدخال كبيرة جدًا، فسننتهي بحلقة لا نهائية زائفة، والتي ستحمل الخادم بعمل عديم الفائدة. يتم منع مثل هذه المواقف عن طريق تسمية الحلقة واستخدام عبارة LEAVE للإشارة إلى الخروج المبكر من الحلقة.

لذلك، قمنا بتزويد حلقتنا بالعلامة الرطبة في البداية (الرطب :) وفي النهاية، وأضفنا أيضًا شرطًا آخر - إذا كانت معلمة الإدخال أكبر من 10 (يتم أخذ الرقم 10 بشكل تعسفي)، فإن الحلقة ذات يجب أن تنتهي العلامة الرطبة (إذا (i> 10) ثم اتركها مبللة). وبالتالي، إذا قمنا باستدعاء إجراء ذي قيمة عددية كبيرة عن طريق الخطأ، فسوف تنقطع حلقتنا بعد 10 تكرارات (التكرار هو تمريرة واحدة للحلقة).

الحلقات في MySQL، وكذلك عوامل التشغيل المتفرعة، لا تُستخدم أبدًا في تطبيقات الويب. لذلك، بالنسبة للنوعين الآخرين من الحلقات، سنقدم فقط بناء الجملة والاختلافات. من غير المرجح أن تتاح لك الفرصة لاستخدامها، لكنك لا تزال بحاجة إلى معرفة وجودها.

كرر بيان الحلقة

يتم التحقق من حالة الحلقة ليس في البداية، كما هو الحال في حلقة WHILE، ولكن في النهاية، أي. مرة واحدة على الأقل، ولكن يتم تنفيذ الحلقة. تعمل الحلقة نفسها طالما أن الشرط خاطئ. بناء الجملة هو كما يلي:

حتى الحالة

حلقة المشغل LOOP

لا تحتوي هذه الحلقة على أي شروط على الإطلاق، لذا يجب أن تحتوي على عبارة LEAVE. بناء الجملة هو كما يلي:

بهذا نختتم دراستنا لـ SQL. بالطبع، لم نأخذ في الاعتبار جميع إمكانيات لغة الاستعلام هذه، ولكن في الحياة الواقعية من غير المرجح أن تواجه حتى ما تعرفه بالفعل.

تم النشر على موقع Allbest.ru

...

وثائق مماثلة

    استخدام وظائف MS Excel المضمنة لحل مشكلات محددة. إمكانية فرز الأعمدة والصفوف وقائمة الوظائف والصيغ. حدود الصيغ وطرق التغلب على الصعوبات. أداء المهام العملية على استخدام الوظائف.

    تمت إضافة العمل المختبري في 16/11/2008

    ميزات استخدام الوظائف المضمنة في Microsoft Excel. إنشاء الجداول وملئها بالبيانات ورسم الرسوم البيانية. تطبيق الصيغ الرياضية لتنفيذ الاستعلامات باستخدام حزم التطبيقات. المتطلبات الفنية للكمبيوتر.

    تمت إضافة الدورة التدريبية في 25/04/2013

    الغرض ومكونات الصيغ وقواعد كتابتها ونسخها. استخدام الدوال الرياضية والإحصائية والمنطقية ووظائف التاريخ والوقت في برنامج MS Excel. أنواع وتسجيل روابط معالج جداول البيانات وتقنية إدخالها ونسخها.

    تمت إضافة العرض في 12/12/2012

    النظر في ميزات إعلان الوظائف في لغة SI. التعريف بمفاهيم الوسائط الوظيفية ومتغيراتها (المحلية، المسجلة، الخارجية، الثابتة). حل المشكلة باستخدام الطريقة البرمجية: رسم مخطط بياني ووصف الوظائف الرئيسية ووظائف sqr.

    تمت إضافة العرض بتاريخ 26/07/2013

    قواعد الإنشاء والخوارزمية لاستخدام وظيفة المستخدم الخاصة بك في وحدة محرر VBA القياسية. دراسة هيكل كود الوظيفة. قائمة الوظائف الرياضية المضمنة في محرر Visual Basic. تحديد نطاق المتغير.

    تمت إضافة العمل العملي في 10/07/2010

    إنشاء تطبيق يرسم الرسوم البيانية للوظائف باستخدام تعبير رياضي معين. تطوير برنامج "مولد الدوال الرياضية". إنشاء معالج دالة لإدخال تعبير رياضي واختباره.

    أطروحة، أضيفت في 16/02/2016

    تحليل ديناميكيات الناتج الإقليمي الإجمالي وحساب توقعاته باستخدام وظائف Excel المدمجة. تطبيق تحليل الارتباط والانحدار لتوضيح العلاقة بين الأصول الثابتة وحجم GRP.

    الملخص، تمت إضافته في 20/05/2010

    الوظائف التي تسمح لك بالعمل مع قاعدة بيانات MySQL باستخدام PHP. الاتصال بالخادم وقطع الاتصال به. إنشاء واختيار قاعدة البيانات. الوصول إلى حقل فردي من السجل. الاستخدام المتكامل لوظائف المعلومات. الاستعلامات المرسلة إلى خادم MySQL.

    محاضرة، أضيفت في 27/04/2009

    تطوير تطبيق يؤدي وظائف عرض الوقت المحدد والتاريخ المحدد. تحديد الوظائف الإضافية للتطبيق المطور. النظر في المراحل الرئيسية لإنشاء منتج برمجي. نتائج اختبار التطبيق.

    تمت إضافة أعمال الدورة في 14/04/2019

    حساب برمجي باستخدام الصيغ، وتحديد مساحة المضلع المنتظم لأي بيانات أولية محتملة، باستخدام تدفقات المدخلات والمخرجات. استخدام العوامل عند حساب الوظائف الرياضية، وخوارزميات تجميع المبالغ.

قاعدة بيانات MySQL الحديثة ليست ذات أهمية كبيرة لعدد السجلات. نادرًا ما تكون هناك حاجة للتحكم في ما إذا كان عدد الصفوف يتجاوز الحدود المسموح بها.

وفي الوقت نفسه، هناك العديد من المهام عندما تكون بنية قاعدة البيانات نفسها بيانات أساسية ويجب التحكم في استخدام الجداول في عدد السجلات بشكل عام والمحتوى المحدد بشكل خاص.

بناء جملة الوظيفة ومثال الاستخدام

يتم استخدام وظيفة العد MySQL مباشرة في استعلام قاعدة البيانات. تحتوي الوظيفة على شكلين رئيسيين فقط من التطبيقات: جميع السجلات أو سجلات محددة فقط. يوجد عامل مهم واحد فقط - يجب ألا يحتوي الصف المحدد من الحقل المضمن في تعبير count() على القيمة NULL.

في المثال أعلاه، يتم استخدام وظيفة العد MySQL دون شروط. يرجى ملاحظة أن استخدام count(*) يشير إلى كافة الإدخالات في الجدول ولا علاقة له على الإطلاق بأن بعض الإدخالات قد تحتوي على قيم فارغة. سيؤدي الاستعلام الذي يحتوي على count(*) دائمًا إلى إرجاع العدد الكامل للسجلات الموجودة في الجدول.

يمكن للمطور تقديم معنى التعبير:

  • عد (...) بالنتيجة.

ولكن سيكون لها معنى بصري أكثر من المعنى العملي.

أمان PHP وMySQL: count() - عمليًا

يتم تكريس الكثير من الجهود لقضايا الأمان من قبل مجموعة من المطورين الأكثر تأهيلاً. ولكن حتى يومنا هذا، لا تزال هناك ثغرات، وتحدث هجمات، ويتم فقدان أو سرقة معلومات قيمة.

لا يوجد سوى حاجزين أكثر موثوقية وأمانًا أمام أي مهاجم:

  • جهل؛
  • انحراف.

الحاجز الأول هو الخرسانة المسلحة الأكثر. يمكنك التخمين بشأن أي شيء، ولكن إذا كنت لا تعرف أين ولماذا وكيف، فلن يكون هناك أي تأثير أبدًا. هناك دائمًا باب يجب فتحه، ومفتاح لفتحه، وسبب وجيه للقيام بذلك.

في سياق الحل الثاني، تعد وظائف MySQL count(*) وcount(...) أمثلة على الحماية المثالية. الأكثر أهمية - هذه الوظائف غير مشروطة وبدائية. سيتم تنفيذها في أي حالة، والشيء الرئيسي هو أن قاعدة البيانات نفسها تعمل وتم إنشاء اتصال معها.

من خلال إنشاء جدول أمان بحيث يتم تمييز كل دخول/خروج لموظف الشركة بالحالة NULL أو غير NULL، يمكنك التحكم في جميع الانحرافات التي تحدث أثناء ساعات العمل في اليوم. وبطبيعة الحال، يجب أن تقوم عطلات نهاية الأسبوع والعطلات وساعات العمل بإعادة تعيين كافة إدخالات جدول الأمان إلى NULL.

حتى مع هذا المنطق البدائي، من الممكن ملاحظة ومنع أي تدخل غير متوقع بأبسط الطرق، دون تكاليف خاصة. كلما كان الدفاع أبسط وغير مرئي، زادت صعوبة بناء الغزو.

الشروط والحالات الخاصة

يستخدم المثال أدناه شرط عدم تضمين كافة السجلات في الجدول في عملية حساب MySQL.

نتيجة تنفيذ جميع الطلبات تطابق الشرط. في هذه الحالة، باستخدام الطلب:

  • حدد param1 + param2 + param3 من "ex_count" حيث يوجد count(*)

يعادل الاستعلام

  • حدد العد (*) من `ex_count` حيث (param1 + param2 + param3) > 0.

تسمح وظيفة حساب MySQL بمجموعة متنوعة من الاستخدامات، بما في ذلك الاستعلامات المتداخلة. ومع ذلك، يجب عليك دائمًا أن تأخذ في الاعتبار: البساطة هي مفتاح النجاح. إن وظيفة حساب عدد السجلات لشروط معينة بسيطة للغاية، ولكن لا ينبغي أن يكون استخدامها معقدًا للغاية.

هناك مفتاح أكيد لأقوى دفاع - "القضية" - والتي، عند ترجمتها بلغة بسيطة، تعني "النمط". وبالمثل، في الاستخدام المعقد لعمليات بسيطة مثل MySQL، يمكن لعقل مطور فضولي آخر إضافة وظائف لن تعمل على الإطلاق على النحو المنشود، في موقف غير متوقع.

برمجة الوظائف الرياضية

الوظائف هي العمليات التي تسمح لك بمعالجة البيانات. هناك عدة مجموعات من الوظائف المضمنة في MySQL:

وظائف السلسلة. يستخدم لمعالجة السلاسل النصية، مثل قيم التشذيب أو الحشو.

وظائف رقمية. تستخدم لإجراء العمليات الحسابية على البيانات الرقمية. تتضمن الوظائف الرقمية الوظائف التي تُرجع القيم المطلقة، وجيب التمام وجيب التمام للزوايا، والجذر التربيعي لعدد، وما إلى ذلك. يتم استخدامها فقط للحسابات الجبرية والمثلثية والهندسية. بشكل عام، نادرا ما يتم استخدامها، لذلك لن نأخذها في الاعتبار. ولكن يجب أن تكون على علم بوجودها واستشر وثائق MySQL إذا لزم الأمر.

وظائف التلخيص. يتم استخدامها للحصول على بيانات تلخيصية من الجداول، على سبيل المثال، عندما تحتاج إلى تلخيص بعض البيانات دون تحديدها.

وظائف التاريخ والوقت. يُستخدم لمعالجة قيم التاريخ والوقت، على سبيل المثال لإرجاع الفرق بين التواريخ.

وظائف النظام. إرجاع معلومات خدمة نظام إدارة قواعد البيانات (DBMS).

من أجل إلقاء نظرة على الوظائف الأساسية المضمنة، سنحتاج إلى إنشاء قاعدة بيانات جديدة تحتوي على قيم رقمية وقيم تاريخ.

لنأخذ متجرًا عبر الإنترنت كمثال.

النموذج المفاهيمي:

النموذج العلائقي:


لذلك، دعونا نلقي نظرة على الرسم البياني الأخير وإنشاء قاعدة بيانات - متجر.

إنشاء متجر قاعدة البيانات؛

دعنا نختاره للعمل:

ونقوم بإنشاء 8 جداول فيها، كما في الرسم البياني: المشترين (العملاء)، الموردين (البائعون)، المشتريات (البيع)، التوريدات (الواردة)، سجل الشراء (مجلة_المبيعات)، سجل التسليم (مجلة_الواردة)، المنتجات (المنتجات)، الأسعار (الأسعار). تحذير واحد، متجرنا سوف يبيع الكتب، لذلك سنضيف عمودًا آخر إلى جدول المنتجات - المؤلف، هذا ليس ضروريًا من حيث المبدأ، ولكنه أكثر شيوعًا إلى حد ما.

يرجى ملاحظة أنه في جداول دفتر يومية الشراء، ودفتر يومية التسليم، والأسعار، تكون المفاتيح الأساسية مركبة، أي. تتكون قيمها الفريدة من أزواج قيمة (لا يمكن أن يحتوي الجدول على صفين لهما نفس أزواج القيمة). تتم الإشارة إلى أسماء الأعمدة لأزواج القيم هذه بفواصل بعد الكلمة الأساسية PRIMARY KEY.

في متجر حقيقي عبر الإنترنت، سيتم إدخال البيانات في هذه الجداول باستخدام البرامج النصية في بعض اللغات (مثل PHP)، ولكن في الوقت الحالي سيتعين علينا إدخالها يدويًا. يمكنك إدخال أي بيانات، فقط تذكر أن القيم الموجودة في الأعمدة التي تحمل الاسم نفسه في الجداول المرتبطة يجب أن تتطابق. أو انسخ المعلومات أدناه.