اذهب إلى المحتوى

الاستعلام عن البيانات في SQL


إبراهيم البحيصي

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

جملة الاستعلام

تجلب جملة الاستعلام SELECT بيانات جدول أو أكثر بعد الاستعلام عن وجود هذه الجداول في قاعدة البيانات، ونقصد بالاستعلام هنا ماذا نريد؟ ومن أين؟

ماذا نريد من أعمدة وسجلات، ومن أين، أي من أي الجداول نأتي بالمعلومات. البيانات الناتجة عن تنفيذ جملة الاستعلام تسمى مجموعة البيانات الناتجة Result Data-Set.

الصيغة العامة لجملة الاستعلام

SELECT column1, column2, ...
FROM table_name
[WHERE where_condition]
[GROUP BY group_by_expression]
[ORODER BY order_by_expression];

في بداية كل جملة استعلام نكتب كلمة SELECT (جمل SQL غير حساسة لحالة الأحرف) ومن ثم نُتبعها بأسماء الأعمدة التي نريد الاستعلام عنها، أو نستبدل أسماء الأعمدة برمز * والذي يعني كل الأعمدة، ثم نكتب كلمة From والتي يليها اسم الجدول أو أسماء الجداول التي تحتوي على البيانات التي نريدها.

ما بين الأقواس المعكوفة هي جمل إضافية تقوم بمهام معينة في جملة الاستعلام وهي كالتالي:

  • Where: هي جملة الشرط والتي ترشّح البيانات بناءً على الشرط الموجود بعدها.
  • Group By: تجمّع البيانات الناتجة من تنفيذ جملة الاستعلام بناءً على جملة التجميع التي تليها.
  • Order By: ترتّب البيانات تصاعديا أو تنازليا بناءً على جملة الترتيب التي تليها.

سنتطرق لتفاصيل الجمل الإضافية في هذا المقال وفي مقالات قادمة.

مثال على جملة الاستعلام

لو أردنا الاستعلام عن كافة البيانات الموجودة في جدول Persons والذي تكلمنا عنه في المقال السابق، ننفذ الجملة التالية:

SELECT *
FROM Persons;

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

Person_ID First_Name Last_Name Age
101 Ibrahim Mohammed 21
102 Mohammed Khaled 25
103 Saleem Yaser 25
104 Aly Mohammed 25
105 Reem   25

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

SELECT First_Name, Age
FROM Persons;

لاحظ أننا فصلنا بين الأعمدة التي نريد إظهاراها بفاصلة عادية ,، والعمود الأخير لا نكتب بعده فاصلة، بل كلمة From مباشر.
وسيكون ناتج الجملة البيانات التالية:

First_Name Age
Ibrahim 21
Mohammed 25
Saleem 25
Aly 25
Reem 25

الاستعلام عن السجلات الفريدة

في بيانات الجدول، ستجد في كثير من الأحيان أن هناك تكراراً للقيم في عمود ما، وقد تحتاج إلى الاستعلام عن القيم دون تكرار، فمثلا، في جدول الأشخاص Persons السابق، ستلاحظ أن عمود العمر Age يحتوي على 5 قيم، ولكن توجد 4 سجلات من نفس القيمة وهي 25، وهنا يأتي دور جملة الاستعلام الفريد DISTINCT Select.

تُرجع جملة الاستعلام عن السجلّات الفريدة سجلات دون تكرار في القيم وصيغتها العامة:

SELECT DISTINCT column1, column2, ...
FROM table_name;

لو نفذنا الجملة التالية:

SELECT  Age
FROM Persons;

سيكون الناتج:

Age
21
25
25
25
25

ولكن لو استخدمنا جملة الاستعلام عن السجلّات الفريدة

SELECT DISTINCT  Age
FROM Persons;

ستكون النتيجة كالتالي:

Age
21
25

ترشيح السجلات

لإجراء عملية ترشيح السجلات، سنضيف إلى جملة الاستعلام جملة شرطية تبدأ بالكلمة Where ويتبعها الشرط (أو مجموعة الشروط) الذي نريد والذي سيُرشِّح السجلات بحيث تبقى السجلات التي تحقق الشرط في مجموعة البيانات الراجعة، وتُستبعد السجلات التي لا تحقق الشرط.

الصيغة العامة لجملة الاستعلام والتي تحتوي على شرط لترشيح السجلات:

SELECT column1, column2, ...
FROM table_name
WHERE condition;

أمثلة على ترشيح البيانات في جدول Persons

  1. الحصول على البيانات الكاملة للشخص الذي له Person_ID يساوي 101:
SELECT *
FROM Persons
WHERE Person_ID = 101;
  1. الاستعلام عن أسماء الأشخاص الذين تساوي أعمارهم 25 سنة أو تزيد عليها:
SELECT First_Name, Last_Name
FROM Persons
WHERE Age >= 25;
  1. الاستعلام عن الاسم الأول والعمر للأشخاص الذين ليس لديهم قيمة للعمود Last_Name وأعمارهم فوق 22:
SELECT First_Name, Age
FROM Persons
WHERE Age > 22 AND Last_Name IS Null;

عمليات المقارنة في جملة Where

يلخص الجدول التالي العمليات التي من الممكن استخدامها في بناء شرط جملة Where:

العمليّة الوصف مثال
= يساوي Age = 20
<> لا يساوي (في بعض النظم تكتب != ) Age <> 20
> أكبر من Age > 20
< أصغر من Age < 20
>= أكبر من أو يساوي Age >= 20
<= أصغر من أو يساوي Age <= 20
BETWEEN … AND بين قيمتين أو يساويهما Age BETWEEN 20 AND 25
LIKE مطابقة نمط First_Name LIKE “%Ibr%”
IN يوجد ضمن قيم معينة Age in (20,23,25)

ملاحظة هامة: نستطيع الجمع بين أكثر من شرط في جملة Where وذلك باستخدام العمليات المنطقية NOT (للنفي)، AND (وجوب تحقّق جميع الشروط) أو OR (يكفي تحقّق شرط واحد من الشروط).

ترتيب السجلات

نستطيع الحصول على البيانات الراجعة مرتبة تصاعديا أو تنازليا بعد تنفيذ جملة الاستعلام، وذلك باستخدام جملة Order By.

ترتّب الجملةُ السجلات تصاعديًّا وهو الخيار المبدئي، ولترتيبها تنازليًّا نستخدم الكلمة المحجوزة DESC، كما أنه يمكن الترتيب باستخدام عمود واحد أو أكثر.

الصيغة العامة لجملة الاستعلام مع جملة الترتيب هي:

SELECT column1, column2, ...
FROM table_name
ORDER BY column1, column2, ... ASC|DESC;

فمثلا لو أردنا أن نستعلم عن كل البيانات من جدول Persons بحيث تكون البيانات مرتبة ترتيبا تصاعديا حسب عمود First_Name، نستخدم الجملة التالية:

SELECT *
FROM Persons
ORDER BY First_Name;

وستكون النتيجة:

Person_ID First_Name Last_Name Age
104 Aly Mohammed 25
101 Ibrahim Mohammed 21
102 Mohammed Khaled 25
105 Reem   25
103 Saleem Yaser 25

في حال أردنا أن نرتب نفس البيانات بطريقة تنازلية نستخدم الجملة التالية:

SELECT *
FROM Persons
ORDER BY First_Name DESC;

وتكون نتيجة الاستعلام كالتالي:

Person_ID First_Name Last_Name Age
103 Saleem Yaser 25
105 Reem   25
102 Mohammed Khaled 25
101 Ibrahim Mohammed 21
104 Aly Mohammed 25

تجميع البيانات باستخدام Group By:

تُستخدم جملة تجميع البيانات غالبا مع دوال التجميع Aggregate Functions بهدف تجميع وترتيب البيانات الناتجة عن الاستعلام حسب عمود أو أكثر.

سوف نتكلم عن جملة تجميع البيانات في مقال متقدم لعلاقته بموضوع الدوال الموجودة في SQL. 


تفاعل الأعضاء

أفضل التعليقات

السلام عليكم

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

ولكم جزيل الشكر

رابط هذا التعليق
شارك على الشبكات الإجتماعية

بتاريخ 14 ساعات قال خالد ناصر ناصر:

السلام عليكم

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

ولكم جزيل الشكر

مرحبًا خالد , 

يمكنك فعل ذلك عن طريق استخدام المكون card في بوتستراب بهذا الشكل 

<div class="card" style="width: 18rem;">
	<img src="هنا مسار الصورة" class="card-img-top" alt="اسم الصورة">
	<div class="card-body">
		<h5 class="card-title">عنوان المنتج</h5>
		<p class="card-text">وصف المنتج</p>
		<p class="card-text">سعر المنتج</p>
	</div>
</div>

و إذا أردنا وضع المنتجات بجانب بعضها بشكل أفقي نستخدم المحدد row بهذا الشكل 

<div class="container">
	<div class="container">
		<div class="col-md-4">
			<div class="card" style="width: 18rem;">
				<img src="هنا مسار الصورة" class="card-img-top" alt="اسم الصورة">
				<div class="card-body">
					<h5 class="card-title">عنوان المنتج</h5>
					<p class="card-text">وصف المنتج</p>
					<p class="card-text">سعر المنتج</p>
				</div>
			</div>
		</div>
		<div class="col-md-4">
			<div class="card" style="width: 18rem;">
				<img src="هنا مسار الصورة" class="card-img-top" alt="اسم الصورة">
				<div class="card-body">
					<h5 class="card-title">عنوان المنتج</h5>
					<p class="card-text">وصف المنتج</p>
					<p class="card-text">سعر المنتج</p>
				</div>
			</div>
		</div>
		<div class="col-md-4">
			<div class="card" style="width: 18rem;">
				<img src="هنا مسار الصورة" class="card-img-top" alt="اسم الصورة">
				<div class="card-body">
					<h5 class="card-title">عنوان المنتج</h5>
					<p class="card-text">وصف المنتج</p>
					<p class="card-text">سعر المنتج</p>
				</div>
			</div>
		</div>
		<div class="col-md-4">
			<div class="card" style="width: 18rem;">
				<img src="هنا مسار الصورة" class="card-img-top" alt="اسم الصورة">
				<div class="card-body">
					<h5 class="card-title">عنوان المنتج</h5>
					<p class="card-text">وصف المنتج</p>
					<p class="card-text">سعر المنتج</p>
				</div>
			</div>
		</div>
	</div>
</div>

بالتوفيق

رابط هذا التعليق
شارك على الشبكات الإجتماعية

بتاريخ 6 دقائق مضت قال خالد ناصر ناصر:

شكرا لك وعلى تجاوبك انا اقصد بال php  بحيث يكون ادراج العامود تلقي  بشكل افقي 

تمام , سوف تقوم  بطباعة النتائج باستخدام أكواد html , لذلك عند استخراج البيانات باستخدام loop فعلياً راح تستخدم 

<div class="col-md-4">
  <div class="card" style="width: 18rem;">
    <img src="هنا مسار الصورة" class="card-img-top" alt="اسم الصورة">
    <div class="card-body">
      <h5 class="card-title">عنوان المنتج</h5>
      <p class="card-text">وصف المنتج</p>
      <p class="card-text">سعر المنتج</p>
    </div>
  </div>
</div>

داخل loop بهذا الشكل 

<?php 

/// ... 

while(Loop Statement){
	echo '<div class="col-md-4">
			<div class="card" style="width: 18rem;">
				<img src="هنا مسار الصورة" class="card-img-top" alt="اسم الصورة">
				<div class="card-body">
					<h5 class="card-title">عنوان المنتج</h5>
					<p class="card-text">وصف المنتج</p>
					<p class="card-text">سعر المنتج</p>
				</div>
			</div>
		</div>';
}

?>

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

اقتباس

 كيف استعلم عن رابع أدنى شخص في ترتيب معين

مرحبًا هالة, 

يمكنك فعل ذلك عن طريق الاستعلام التالي 

SELECT MIN(column_name) as minimum FROM Persons

ومن ثم باستخدام حلقة تكرار و عند الوصول للتكرار المرة الرابعة ممكن تطبعي النتيجة, أو من خلال استخدام Limit, offset

 

SELECT MIN(column_name) as minimum FROM Persons LIMIT 1 OFFSET 4

SELECT MIN(column_name) as minimum FROM Persons LIMIT 1, 4
رابط هذا التعليق
شارك على الشبكات الإجتماعية



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...