مشاهدة النسخة كاملة : لمحة بسيطة عن sql
nabilkeb
04-03-2009, 12:33 AM
من الأشياء التي لا يمكن تجاهلها أو الاستغناء عنها أثناء تعلم و استغلال قواعد البيانات هي لغة الاستعلام أو الاستفسار البنيوية Structured Query Language SQL
و هي لغة برمجة خاصة للتعامل مع قواعد البيانات وتعتبر لغة عالية المستوى، يمكنها في سطر واحد إجراء عمليات بالغة التعقيد على قاعدة البيانات.
1- ھى لغه قیاسیه من لغات الحاسب الخاصه بمعھد ANSI
2- تمكنك من الدخول لقواعد البیانات
3- تمكنك من إستخراج البیانات من القاعده
4- تمكنك من إضافه بیانات إلى قاعده البیانات
5- تمكنك من من حذف بیانات من القاعده
6- تمكنك من تعديل البیانات المسجله .....
تنقسم إلى قسمین :
1- SQL Data Manipulation Language (DML
ھو القسم المسئول عن : معالجه البیانات
2- Data Definition Language (DDL
ھو القسم المسئول عن : تعريف البیانات
و للتقرب و للتعرف عن كثب ، سوف نتطرق للتعليمة الأولى SELECT خطوة خطوة.
- أولا علينا انشاء قاعدة بيانات و لتكن مثلا الجدول الذي يأخذ اسم Vente و يحتوي على :
Produit - Qut - Date_de_Vente - Client
و كما تقدم في شرح و استغلال قواعد البيانات (http://www.delphi4arab.com/forum/showthread.php?p=5490#post5490) : يجب تجنب تسمية الحقول باسماء محجوزة لتعليمات SQl أو استعمال الفراغ.
نضع على الفورم مكون Query1 - Data Source1 - DBGrid
نربط DBGrid بــــ : DataSource1 و هذه الأخيرة بـــ : Query1
المكون Query كغيره له خصائص و أحداث . في قسم الخصائص (مثل مكون Table) له خاصية Active و خاصية DatabaseName .
الجديد في الخصائص : SQL على شكل (TStrings) هنا نقوم بكتابة التعليمات ثم تفعيل الخاصية Active بعد تحديد طبعا الاسم المستعار أو مسار القاعدة (DatabaseName)
- أول تعليمة كما سبق هي : SELECT
نكتب في الخاصية SQL:
SELECT * FROM VENTE
SELECT تعني تحديد.
- * بمعنى كل الحقول (و هنا يمكنك كتابة بعض أو كل الحقول الواحد تلو الآخر ، مع الفصل بينهما بـفاصلة , )
- FROM VENTE يعني من الجدول المسمى VENTE
لاحظ المرفقات .
.../...يتبع..../....
kachwahed
04-03-2009, 01:25 AM
السلام عليكم أخي نبيل
بارك الله وجزاك خيرا
وننبه أن المثال يشتغل من المسار
D:\sql
يبدو أن النعاس طار علينا أخي نبيل :D
nabilkeb
04-03-2009, 01:29 PM
السلام عليكم أخي نبيل
بارك الله وجزاك خيرا
وننبه أن المثال يشتغل من المسار
D:\sql
يبدو أن النعاس طار علينا أخي نبيل :D
لا عليك اخي ، يمكنك وضع المجلد بالمسار المذكوووور ، أو تغييره (DataBaseName) حسب الرغبة أو الحاجة :cool:
nabilkeb
04-03-2009, 10:21 PM
السلام عليكم و رحمة الله و بركاته:
لازلنا مع التعليمة Selecte وقبل كل شيء أود أن ألفت الانتباه إلى أن SQL غير حساس لحجم الحروف ، كبيرة أو صغير ، بمعنى : تكتب : SELECT أو select أو Select فالأمر لا يفرق .
- كما سلف بيان كيف يتم تحديد حقل أو أكثر من جدول معين ، فإنه يمكن تحديد مجموعة حقول أو كل الحقول الخاصة بجدولين أو أكثر في نفس الوقت . فمثلا لوكان لديانا إلى جانب الجدول السالف ، جدولا آخرا تحت اسم Client به حقلين مثلا تحت اسم : Nom - TPH
- تحديد كل حقول الجدولين نكتب :
Select *
From Vente,Client- تحديد الحقل Produit من الجدول Vente + الحقل Nom من الجدول Client :
Select Produit , Nom
From Vente , Nom
و هكذا يمكنك تحديد ما تريد من الحقول مهما كانت الجداول .
- إضافة كلمة DISTINCT إلى Select :
يتم هذا إدا أردنا تحديد معين من غير تكرار القيم ، يعني الحقل Produit للجدول Vente مثلا لو كان يحتوي قيم متعددة :
http://www.vip700.com/up/files/6981.jpg
فكتابة الكود :
SELECT DISTINCT Produit
FROM VENTEيعطي النتيجة
http://www.vip700.com/up/files/6982.jpg
أما كتابة الكود
SELECT DISTINCT Produit,Qut
FROM VENTE
فستكون النتيجة هي الصورة الأولى (نفسها) لأن Distinct يخص الحقلين معا ، يعني لابد أن يكون Produit+Qut يتكرران معا ، و إلا إذا كان Produit متكرر بكمية مختلفة ، أو الكمية متكررة بــ Produit آخر فستكون النتيجة المبينة بالصورة الاولى.
....../ يتبع /....
nabilkeb
04-03-2009, 11:19 PM
- استخدام الشرط (Where) أثناء التحديد :
عند الحاجة إلى تقييد التحديد : مثلا نريد تحديد Produit إذا كان الحقل Client يأخذ القيمة Nabil :
Select Produit
From Vente
Where Client='Nabil'- نريد تحديد PRODUIT الذي تساوي كميته 100 مثلا نكتب :
Select Produit
From Vente
Where Qut=100 و عليه فيمكننــا استعمال : (= تساوي) (< أصغر) (> أكبر) (<> لايساوي أو يختلف) (=>أصغر من أو يساوي) (=< أكبر من أو يساوي) (Between عندما يكون الشرط بين قيمتين ) (Like شرط الكلمات المتشابهة)
-استخدام Like
* تحديد Produit من جدول Vente الذي يبدأ اسمه بالحرف N
Select Produit
From Vente
Where Client like 'N%' * تحديد Produit من جدول Vente الذي ينتهي اسمه بالحرف N
Select Produit
From Vente
Where Client like '%N' * تحديد Produit من جدول Vente الذي يبدأ اسمه بالحرف N و عدد أحرفه5
Select Produit
From Vente
Where Client like 'N____' * تحديد Produit من جدول Vente الذي ...:Dهههههه... ؟؟؟؟؟
Select Produit
From Vente
Where Client like '%N____'
..../ يتبع /....
AL-MOB4RM3G
05-03-2009, 05:25 AM
بارك الله فيك وفي علمك اخي نبيل...
شرح مميز..
اخي الكريم...
عندي استفسار بارك الله لك...
ذكرت
* تحديد produit من جدول vente الذي يبدأ اسمه بالحرف n و عدد أحرفه5
select produit
from vente
where client like 'n____'
هل المفهوم من هذا اخي انه بدل من كل حرف اضع _ واحد؟
لأنك قلت 5 حروف وانت وضعت 4 من _ بارك الله فيك...
ربما كان قصدك مع حرف ال n والله اعلم
ثانيا....
لم استطع لحد الآن كتابة الأوامر sql في الدلفي...
سأحاول مجددا والله المستعان... والى فسأعود اليك اخي :rolleyes:
بارك الله فيك
nabilkeb
05-03-2009, 01:02 PM
العفو أخ طلال ، و مرحبا بك.
بارك الله فيك وفي علمك اخي نبيل...و فيك كل البركة أخي ، و شكرا . و لكن تجدر الإشارة أنه ليس لي أي علم و كل القصة هي رؤوس أقلام صادفتها هنا أو هناك مع بعض الكتب أو مع منتدانا الحبيب ، و أكون ممتنا جدا لو تصرف هذه العبارات إلى من يستحقها أمثال الأخ عبد العزيز - Strelitzia ....ـ و غيرهما ....
ربما كان قصدك مع حرف ال nأجل : الحرف N +أربعة أحرف ، إذن الكلمة تتكون من 5 أحرف ، و تبدأ بالحرف N
مع مراعات N أوn
لم استطع لحد الآن كتابة الأوامر sql في الدلفي... تقدمت بهذا الطرح إليك خصوصا ، (http://www.delphi4arab.com/forum/showthread.php?t=994) و من الطبيعي أني أتمنى أن تستفيد . فأين الإشكال بالضبط أخي ؟
AL-MOB4RM3G
05-03-2009, 04:23 PM
نعم اخي الكريم نبيل....
بصراحة اطلب السماح من حضرتك :o
الخطأ في انا وليس فيك...
يعني الله يعينك علي :p
تقدمت بهذا الطرح إليك خصوصا ، و من الطبيعي أني أتمنى أن تستفيد . فأين الإشكال بالضبط أخي ؟
بارك الله فيك... والله انك اخ كريم...
جزاك ربي كل خير وبارك فيك وعليك
ولكن ابشرك انه تم حل المشكلة ولله الحمد...
وانا الأن كتبت اول كود لي في ال sql وهو
select username from UsersList
ORDER BY username
فجزاك الله كل خير.. :)
وانا جاهز الآن لإكمال المشوار معك :rolleyes:
في انتظار القسم القادم من الدروس...
لأني بعد قليل انتهي من اكمال الدروس التي قمت به حدرتك في هذا الموضوع...
يعني الآن انا مثل الصاروخ :eek:
nabilkeb
05-03-2009, 04:53 PM
استخدام العمليات الجبرية AND OR IN NOT
بامكاننا استخدام إحدى هذه العمليات حسب الحاجة . و تسميتها دالة عليها من دون أي شرح.
أمثلــة Select Produit
From Vente
Where Client like 'N____' AND Produit='HDD'
Select Produit,Qut
From Vente
Where Qut=100 or Qut=120 or Qut=140
و هذا الأخير يمكن كتابته على الشكل :
Select Produit,Qut
From Vente
Where Qut IN (100,120,140)
-
Select *
From Vente
Where NOT Qut=100
nabilkeb
05-03-2009, 05:37 PM
- إستخدام Order By
تستخدم هذه التعليمة لترتيب البيانات حسب حقل معين مثل :
ٍSelect *
From Vente
Where Qut>10
Order By Produit
كما يمكن الترتيب حسب أكثر من حقل على أن تكون الأولوية للحقل الأول مثل :
ٍSelect *
From Vente
Where Qut>10
Order By Produit,Client
التــــــوابــــــــــــــــــع :
1- Count يعيد هذا التابع عدد السجلات التي تعيدها عبارة Select مثل :
Select count(*)
From Vente
Where Qut>10
يعني تحديد عدد السجلات من الجدول Vente و التي تكون فيها Qut أكبر من10. و تكون النتيجة عبارة عن حقل واحد تحت عنوان (*)Count به عدد الحقول التي تحقق الشرط.
- كما يمكن تغيير عنوان الحقل إلى مثلا Total
Select count(*) as Total
From Vente
Where Qut>10
Sum -2 يعيد مجموع سجلات حقل معين
Select Sum (Qut)
From Vente
Where Qut>10
يعني السجلات التي سيتم تحديدها إذا كانت Qut>10 ، سوف يتم جمع قيمها في حقل تحت عنوان Sum Of Qut
Avg -3 يعيد المعدل الوسطي ، مثل :
Select Avg (Qut)
From Vente
Where Qut>10
يعني السجلات التي سيتم تحديدها إذا كانت Qut>10 ، سوف يتم تقسيم مجموع قيمها على مجموع كل السجلات الموجودة بالجدول Vente
..../ يتبع /....
nabilkeb
06-03-2009, 11:06 PM
نسيت أن أضيف فيما يخص استخدام Order By
-لترتيب الاستعلام تنازليا نضيفdesc
Select *
From Field
Order By Field desc
و على هذا النحو مثلا :
Select *
From Vente
Order By Produit desc
كما يمكن ادراج الشرط .
nabilkeb
06-03-2009, 11:23 PM
4+5 التابعان MAX MIN : ستخدمان لتحديد أكبر أو أصغر قيمة في الحقل ، للجدول مثل:
Select Max(Qut)
From Vente
.../ يتبع /....
kachwahed
06-03-2009, 11:48 PM
بارك الله فيك أخي نبيل على ما تبذله من مجهود، أسأل الله عز وجل ألا يحرمكم الأجر وأن يجزل لك الثواب.
للتنبيه: هناك مصمم SQL Editor ، يقوم بإنشاء هذه الأكواد تلقائيا، لكنه لا يقوم بعمل Params ولا يمكن فتحه إذا أضفنا تخصيصات (Params) إلى تعليمة SQL.
شكرا كثيرا أخي نبيل.
nabilkeb
06-03-2009, 11:57 PM
أعرف ذلك ، و سوف أتعرض له أثناء هذا الشرح بإذن الله
شكرا أخي
AL-MOB4RM3G
07-03-2009, 03:10 PM
اخي نبيل...
بارك الله فيك مرة ثانية :)
ومرات كثر... وجزاك الله كل خير...
اخي سامحني على اسئلتي الكثيرا...
ولكن للفآئدة ان شاء الله...
ذكرت في المشاركة السابقة
Select Max(Qut)
From Vente
في هذه الحالة ماذا تعني (Qut) ؟ بارك الله فيك...
هل هو متغيّر خاص بلتعليمات ال sql ام ماذا؟
وان كان متغير.... هل يجب تعريفه سابقا...
بارك الله فيك
وآسف اخي جدا على أسئلتي...:rolleyes:
nabilkeb
07-03-2009, 05:34 PM
لا تأسف أخي ....
تابع معي من الأول ... Qut هو حقل من الجدول Vente الذي تم انشاؤه . و هو للتجريب أثناء الشرح فقط .
AL-MOB4RM3G
12-03-2009, 09:38 PM
اخي الكريم نبيل....
رحم الله والديك...
هل انتهت هذه المحات بارك الله لك؟
فأنا انتظر الجديد وكل يوم ادخل هذا الموضوع
لأرى ان كان هناك جديد :)
نريد المزيد حول هذا الموضوع بارك الله لك
تحيّاتي لك اخي الكريم
nabilkeb
13-03-2009, 11:54 PM
استخدام العبـارة Group By :
تستخدم مع التعليمة Select لاجراء عمليات على البيانات من تجميع ، و فرز ضمن مجموعات ، و هي مرتبطة جدا بالتوابع المذكورة سلفا .
من الجدولين المذكورين ، و إذا قلنا أن كل عملية شراء لمنتج معين تسجل وفقا للحقول :
Produit - Qut - Date_de_Vente - Client من جدول Vente .
كمثال : أردنــا معرفة عدد مبيعات ( عدد السجلات بالجدول Vente ) لكل زبون
Select Client , count(*)
From Vente
Group By Client
تلاحظ أخي الحبيب استعمال التابع Count ، كما تقدم بأن Group By مرتبطة جدا بالتوابع المذكورة سلفا.
ألم تتضح الصورة بعد . طيب مثـــال آخر: بفرض أن جدول البيع يمكن أن يتكرر فيه منتج معين ، و نريد معرفة مجموع كمية كل سلعة (املئ الجدول ببعض السلع و اجعل بعضها يتكرر بكميات مختلفة ) :
Select Produit , Sum(Qut )
From Vente
Group By Produit
..... / يتبع /.....
nabilkeb
14-03-2009, 12:17 AM
استخدام العبـارة Having :
تستخدم مع العبارة Group By لوضع قيود أو شروط على عملية الفرز و التجميع .
مثال : على نفس المثال السابق ، نريد معرفة عدد المبيعات لكل الزبائن ، التي زادت عن 10 مبيعات :
Select Client , Count(*)
From Vente
Group By Client
Having Count(*)>10
.../ يتبع /.....
nabilkeb
14-03-2009, 01:01 AM
ربط الجداول
ملاحظة: إذا كان هناك حقلين تحت نفس الاسم ، و كل حقل بجدول مغاير . نكتب اسم الجدول+نقطة+اسم الحقل. مثل : TAble1.Field1 . و نستطيع الكتابة على هذا الشكل من غير الحاجة لذلك .
الآن نتطرق إلى عبارة ربط الجداول :
Inner Join :
Select vente.Produit , client.code_comercial
From Vente
inner join client
on (client.nom=vente.client)
نكون بهذا قد ربطنا الجدولين Vente و Client ، مع الحقلين Produit و Code_Comercial على التوالي
يعني : تحديد كل سلعة تم بيعها للزبون بواسطة الاسم التجاري . السلعة بجدول البيع Vente ، و الاسم التجاري للزبون بجدول الزبائن Client
يعني إذا أردت أن أوضح و أشرح أكثر بواسطة كود برمجي مر معنا باستخدام التعليمة
(Select + Where) سأقول :
Select Vente.Produit , Client.code_comercial
From vente,Client
where Vente.client=client.nom
أضن أن الأمر واضح الآن ....
.../ يتبع /....
ALSOUF
28-01-2010, 01:55 PM
شكرا اخي نبيل
. وجدت درس لك في المكتبة الالكترونية بخصوص استخدام sql السكال في دلفي
و لكن عند التجربة هناك مراحل مفقودة و بالتالى الطريقة لا تعطي نتيجة
nabilkeb
29-01-2010, 11:16 AM
و لكن عند التجربة هناك مراحل مفقودة و بالتالى الطريقة لا تعطي نتيجة أهلا و سهلا بك أخي الكريم ، و مشكووور على الإهتمام و المشاركة.
ممكن التفصيل و التوضيح من فضلك ؟
dim106
01-06-2010, 03:32 PM
أشكرك يا أخي nabilkeb بارك الله فيك..
وياليت الأخ ALSOUF يتأكد لأ شرح قدامي وافي ومفصل.
ياليت تواصل استاذي الكريم nabilkeb (http://www.delphi4arab.com/forum/member.php?u=750) ونحن بالانتظار
جعل الله هذا العمل العظيم في موازين حسناتك
yacine
20-08-2010, 03:39 PM
السلام عليكم
كيف بمكن إعطاء النتيجة Select Sum (Qut)
From Vente
Where Qut>10 إلى edit.text
palunix
20-08-2010, 08:28 PM
السلام عليكم
كيف بمكن إعطاء النتيجة Select Sum (Qut)
From Vente
Where Qut>10 إلى edit.text
ABSQuery3.SQL.Add(
'select sum(ins) as zz ,sum(ind) as xx from incom where sid =2');
ABSQuery3.Open();
Edit8.Text = ABSQuery3.FieldByName("zz").AsFloat;
Edit9.Text = ABSQuery3.FieldByName("xx").AsFloat;
هذا مثال
saber-bsa
11-03-2011, 11:38 PM
السلام عليكم
بالنسبة لل : Inner Join :
لقد اوردتم كيفية الربط بين جدولين كيف يمكنني الربط بين عدة جداول
مثال على ذالك لدينا 4جداول
tabel 1
tabel 2
tabel 3
tabel 4
أستطيع ان أربط الأول مع الثاني ب Inner Join
أستطيع ان أربط الثاني مع الثالث ب Inner Join
أستطيع ان أربط الثالث مع الرابع ب Inner Join
كيف يمك ربط الاول مع الرابع أو الثالث
جزاكم الله كل خير
:)
kachwahed
11-03-2011, 11:57 PM
وعليكم السلام ورحمة الله وبركاته
بنفس الطريقة
SELECT * FROM Table1
INNER JOIN Table2 ON
Table1.Field1=Table2.Field1
INNER JOIN Table3 ON
Table3.Field2=Table2.Field2
INNER JOIN Table4 ON
Table1.Field3=Table4.Field3
saber-bsa
12-03-2011, 01:05 AM
جزاك الله كل خير أخي الكريم kachwahed (http://www.delphi4arab.com/forum/member.php?u=976)
وجعله الله في ميزان حسناتك لقد إستوعبة الفكرة الآن
أستطيع ان اربط حتى اكثر من 4 جداول
فقط تصحيح في آخر سطر
INNER JOIN Table4 ON
Table1.Field3=Table4.Field3
INNER JOIN Table4 ON
Table4.Field3=Table3.Field3
أي مفتاح الجدول الرابع مع نظيره في الجدول الثالث
kachwahed
12-03-2011, 09:03 AM
بارك الله فيك :)
فقط تصحيح في آخر سطر
ليست خطأ :) فعلتها عمدا لنعلم أنه لا يوجد أي شرط عند الربط
INNER JOIN Table4 ON
Table1.Field3=Table4.Field3
فقط ينبغي أن يكون الحقل موجود فعلا في الجدول المذكور
استخدم أي Query Designer عند بناء الاستعلامات لتوضيح الفكرة
بالتوفيق.
saber-bsa
12-03-2011, 05:46 PM
فقط ينبغي أن يكون الحقل موجود فعلا في الجدول المذكور
لكن اخي الكريم الجدول الأول ليس مربوط بالجدول الرابع
أي أن الحقل ليس موجود في كلا الجدولين
kachwahed
12-03-2011, 06:46 PM
اهلا اخي kachwahed كيفك
الحمد لله
أي أن الحقل ليس موجود في كلا الجدولين
وما الذي أدراك :)؟
لا توجد أي قيود خاصة في الربط بين الجداول
قم بإنشاء بعض الجداول وجرب بينها...
بالتوفيق.
saber-bsa
12-03-2011, 07:53 PM
وما الذي أدراك :)؟
اعجبتني وما ادراك.....
الذي ادراني لانني لدي مثال حي واجرب عليه عندي جداول في قاعدة بيانات
والجدول الاول ليس مربوط بشكل مباشر مع الجدول الرابع
اظن انك فهمت قصدي الآن
لأن الربط لا يتم إلا إذا كان نفس الحقل في الجدولين مثل ما وضحت لي
table1.field1=table2.field1
kachwahed
12-03-2011, 11:02 PM
الربط لا يتم إلا إذا كان نفس الحقل في الجدولين
كلا، وللتوضيح أكثر
لا علاقة لأسماء الحقول بالربط والكتابة هذه صحيحة:
INNER JOIN table2
table1.field1=table2.field99
وإنما جرت العادة على تسمية الحقل الغريب (Foreign Key) بنفس اسم الحقل الأساسي من الجدول الأصل
فقط ينبغي أن تكون البيانات في الحقل field1 مساوية لها في field99.
saber-bsa
13-03-2011, 12:55 AM
والكتابة هذه صحيحة:
السلام عليكم اخي
حاشا لله انا لم اقل انها خاطئة انت اعلم مني في هذا
وشكرا للتوضيح اكثر
جزاك الله كل خير وجعله في ميزان حسناتك
ELARAPY
04-07-2011, 11:12 PM
لا علاقة لأسماء الحقول بالربط والكتابة هذه صحيحة
فعلا كلام صحيح جرت العاده على تسمية الحقل الغريب بنفس اسم الحقل الاساسي الذي سيساوي له في نفس القيمه الموجوده بالحقل وانما تسمية الحقلان بنفس الاسم ليس من الضروري ولكن يتم التسميه بنفس الاسم لسهوله الشرح ووضوح المراد منه
اما فالاهم هي القيمه او المعلومه المكتوبه في الحقلين والمشكله ان اختلفا سيكون الحقل يتما مما يتنافى مع codd
هذا ما فهمته من قرأتي لاحد الكتب والله اعلم
بالتوفيق
vBulletin® , Copyright ©2008-2012