انتخاب و جستجو در پایگاه داده sql

نویسنده :
تاریخ:سه شنبه 29 دی 1394-07:19 ب.ظ

SELECT

معمولا بیشترین عملی که روی پایگاه های داده توسط SQL انجام می گیرد جستجو است، که توسط عبارت SELECT انجام می پذیرد.

دستور SELECT داده ها را از یک یا چند جدول مرتبط بازیابی می کند و اغلب تاثیری روی داده ذخیره شده در پایگاه داده ندارد.

SELECT پیچیده ترین عبارت SQL است. فرم کلی عبارت SELECT به صورت زیر است:

SELECT DISTINCT columns AS columns
FROM table
WHERE rule
GROUP BY columns
HAVING rule
ORDER BY columns;

دستور SELECT دارای چند عبارت اختیاری به شرح زیر است:

    • FROM جدول یا جداولی را که از آنها داده بازیابی می شود را مشخص می کند. برای الحاق جداول بر اساس ضابطه خاصی می تواند همراه با عبارت JOIN بیاید.
    • WHERE همراه با یک گزاره شرطی برای محدود کردن سطرهای برگردانده شده استفاده می شود.
    • GROUP BY اغلب همراه با توابع تجمعی(AVE، SUM، MAX، MIN و COUNT) برای ترکیب یا گروه بندی سطرها یا حذف سطرهای تکراری در مجموعه نتیجه استفاده می شود.
    • HAVING همراه با یک گزاره شرطی روی نتیجه GROUP BY کار می کند. توابع تجمعی می توانند در گزاره شرطی HAVING هم استفاده شوند.
    • ORDER BY برای تعیین ستون های که بر اساس آنها داده نتیجه مرتب می شود (صعودی و نزولی) .

FROM

در ساده ترین دستور SELECT کلیه سطرهای یک جدول که بعد از عبارت FROM ذکر شده است را بازیابی می کند. لیستی از فیلدهای موردنظر در مقابل عبارت SELECT قرار می گیرد. نام فیلدها با کاما (,) از هم جدا می شوند.

علامت ستاره (*) برای بیان کلیه فیلدهای یک جدول (یا چند جدول) می تواند استفاده شود.

مثال. اسامی کلیه شعبه ها در loan را پیدا کن

SELECT branch_name
FROM loan;

مثال. مشخصات کلیه مشتریان را پیدا کن.

SELECT *
FROM customer;


عبارات محاسباتی +، -، * و / روی یک فیلد در لیست فیلدها می توانند بکاربرده شوند.


مثال. دستور زیر جدولی مشابه loan را بر می گرداند که مقدار صفت خاصه amount آن 10 برابر شده است.

SELECT loan_number, branch_name, amount * 100
FROM loan;


ممکن است لازم باشد داده های موردنیاز را از دو یا چند یک جدول استخراج کنیم.


مثال. اسامی و مقدار وام کلیه مشتریانی را که وامی از شعبه Perryridge گرفته اند را پیدا کن.

SELECT customer_name, borrower.loan_number, amount
FROM borrower, loan
WHERE borrower.loan_number = loan.loan_number AND
     branch_name = 'Perryridge';

مثال. دقت کنید که اگر شرطی ذکر نشود ضرب دکارتی دو جدول حاصل می شود.

SELECT *
FROM borrower, loan;


DISTINCT

SQL اجازه تکرار در نتیجه SELECT را می دهد. بنابراین جدول حاصل ممکن است دارای سطرهای مشابه باشد. اگر این موضوع موردنظر نباشد عبارت DISTINCT را استفاده می کنیم. در این صورت کلیه سطرهای جدول حاصل منحصر بفرد خواهند بود. و سطرهای تکراری حذف می شوند.


مثال. اسامی کلیه شعب بانک که از آنها وامی گرفته شده است را با حذف تکراری ها لیست کن.

SELECT DISTINCT branch_name
FROM loan;

عبارت all مشخص می کند که تکراری ها حذف نشوند.

SELECT ALL branch_name
FROM loan;


WHERE

عبارت WHERE برای انتخاب سطرهای برگردانده شده از دستور SELECT بر طبق شرط خاصی بکار می رود.

برای بیان شرط می توان عملگرهای مقایسه ای (=، !=، <>، >، <، >= و <=) را استفاده کرد.

نتایج مقایسه را می توان توسط عملگرهای منطقی (NOT، AND و OR ) و پرانتز با هم ترکیب کرد. اجرای عملگرهای منطقی به ترتیب الویت آنها است. NOT الویت بالاتر و OR الویت کمتر را دارد. پرانتز می تواند برای تعیین ترتیب انجام عملیات استفاده شود. عمل داخل پرانتز همیشه اول انجام می گیرد.


مثال. کلیه شماره وام هائی که مقدار وام آنها از 1200 بیشتر است را پیدا کن.

SELECT loan_number
FROM loan
WHERE amount > 1200;

مثال. کلیه شماره وام های شعبه Perryridge که مقدار وام آنها از 1200 بیشتر است را پیدا کن.

SELECT loan_number
FROM loan
WHERE amount > 1200 AND branch_name = 'Perryridge';


توجه کنید که هنگام مقایسه با رشته باید آنرا در کوتیشن (' ') قرار داد.


مثال.شماره وام هائی که مقدار وام آنها بین 90,000 و 100,000 می باشد را پیدا کن.

SELECT loan_number
FROM loan
WHERE amount BETWEEN 90000 AND 100000;


عملگر IN برای تعیین اینکه آیا مقدار مشخصی درون مجموعه ای از مقادیر وجود دارد یا خیر بکار می رود.


مثال. مقدار وامهایی که از شعب Perryridge، Downtown یا Redwood گرفته شده اند را پیدا کن.

SELECT amount
FROM loan
WHERE Branch_name IN (' Perryridge' , 'Downtown' , 'Redwood');


هنگام کارکردن با رشته ها وقتی خواهان مطابقت کامل رشته ها نیستیم بلکه بخشی از رشته یا الگوی خاصی از آن بیشتر موردنظر است، می توان از عبارت LIKE به جای علامت (=) استفاده کرد. دو کاراکتر '%' و '_' به ترتیب به معنی یک کاراکتر و بیشتر از یک کاراکتر را برای تطابق می توان بکار برد.


مثال. اسامی کلیه مشتریانی که آدرس آنها شامل کلمه Main است را پیدا کن.

SELECT customer_name
FROM customer
WHERE customer_street LIKE '%Main%';


AS

SQL اجازه تغییر نام جدول را توسط عبارت AS می دهد.


مثال. تعداد وام و مقدار وام کلیه وام ها را پیدا کرده، نام ستون loan_number به loan_id تغییر بده.

SELECT loan_number AS loan_id, amount
FROM loan;

مثال. نام و تعداد وام کلیه مشتریانی که وامی در یک شعبه دارند را پیدا کن.

SELECT customer_name, T.loan_number, S.amount
FROM borrower AS T, loan AS S
WHERE T.loan_number = S.loan_numbe;


توابع تجمعی

توابع تجمعی (aggregation function) عملگرهایی هستند که محاسبه آماری روی گروهی از مقادیر داده ای را انجام می دهند. این توابع روی مقادیر یک ستون از یک جدول عمل می کند و یک مقدار را به عنوان نتیجه بر می گردانند. این توابع شامل AVG، SUM، MAX، MIN و COUNT هستند.

نتیجه تجمع نامی ندارد می تواند از AS برای نامگذاری آن استفاده کرد.


مثال. میانگین موجودی حساب ها در شعبه Perryridge را پیدا کن.

SELECT AVG (balance)
FROM account
WHERE branch_name = 'Perryridge';


COUNT تعداد سطرهای موجود در جواب که حاوی NULL نیستند را می دهد. برای اینکه تعداد مستقل از NULL باشد COUNT(*) را استفاده کنید.


مثال. تعداد مشتریان بانک را محاسبه کن.

SELECT COUNT (*)
FROM customer;


گاهی در جواب تعدادی سطرها مشابه می شوند، اگر می خواهید تعداد سطرهای متمایز را بدست آورید از COUNT DISTINCT استفاده کنید.


مثال. تعداد افرادی که در بانک پول دارند را پیدا کن.

SELECT COUNT (DISTINCT customer_name)
FROM depositor;

مثال. تعداد افرادی که در هر شعبه بانک حساب دارند را پیدا کن.

SELECT branch_name, COUNT (DISTINCT customer_name)
FROM depositor, account
WHERE depositor.account_number = account.account_number
GROUP BY branch_name;


GROUP BY

در بسیاری موارد تحلیل آماری روی گروهی از داده ها موردنیاز است. برای گروه بندی از عبارت GROUP BY استفاده کنید.


مثال. اسامی کلیه شعب و میانگین موجودی حساب آنها را پیدا کن

SELECT branch_name,AVG (balance)
FROM account
GROUP BY branch_name;


HAVING

توابع تجمعی در عبارت WHERE کار نمی کنند. اگر می خواهید با توجه به نتیجه توابع تجمعی شرطی داشته باشید از عبارت HAVING استفاده کنید. HAVING مانند عبارت WHERE کار می کند با این تفاوت که روی آخرین داده حاصل کار می کند و اجازه استعمال توابع تجمعی را هم می دهد. البته هزینه اجرای آن بالاست بنابراین فقط در زمانی که واقعا نیاز است استفاده کنید.


مثال. اسامی کلیه شعب را که میانگین حساب آنها بیشتر از 1200 است را پیدا کن

SELECT branch_name,AVG (balance)
FROM account
GROUP BY branch_name
HAVING AVG (balance) > 1200;


ORDER BY

ترتیب رکوردها در نتیجه پرس و جو معمولا بدون نظم است. اگر می خواهید جدول حاصل دارای نظم خاصی بر طبق یک یا چند فیلد باشد عبارت ORDER BY را به همراه فیلدهای موردنظر اضافه کنید.

برای ترتیب نزولی از DESC و برای ترتیب صعودی از ASC روی هر صفت خاصه استفاده می شود. پیش فرض ترتیب صعودی است.


مثال. اسامی کلیه مشتریانی که وامی در شعبه Perryridge دارند را به ترتیب حروف الفبا لیست کن.

SELECT DISTINCT customer_name
FROM borrower, loan
WHERE borrower loan_number = loan.loan_number AND
     branch_name = 'Perryridge'
ORDER BY customer_nam;


NULL

ممکن است مقدار بعضی از صفات خاصه در رکوردها تهی باشد که توسط NULL مشخص می شود. وقتی فیلدی حاوی NULL است بیان کننده این است که مقدار آن فیلد نامعلوم است یا مقداری در دنیای واقعی ندارد.

عملگرهای مقایسه ای اگر روی NULL عمل کنند مقدار Unknown را برمی گردانند. گزاره IS NULL می تواند برای بررسی مقادیر NULL استفاده شود. عملگر متضاد آن IS NOT است که مقادیری که NULL نیستند را پیدا می کند.

نتیجه هر عبارت ریاضی روی NULL برابر با NULL است. کلیه توابع تجمعی به استثنای COUNT از مقدار NULL صرفنظر می کنند.


مثال. تعداد وام هائی که میزان وام آنها معین نیست را پیدا کن.

SELECT loan_number
FROM loan
WHERE amount IS NULL;


پرس و جوهای تودرتو

در SQL مکانیسمی برای پرس و جوهای تودرتو فراهم شده است. به عبارت دیگر یک عبارت SELECT می تواند درون دیگری قرار بگیرد تا نتیجه اجرای آن در شرط WHERE عبارت SELECT دیگر استفاده شود. عبارت SELECT دوم را یک پرس و جوی فرعی می نامند و حتما باید یک فیلد را برگرداند یعنی فقط یک صفت خاصه در دستور SELECT آن باید باشد.

وقتی حاصل پرس و جوی فرعی بیشتر از یک سطر باشد از عملگرهای ALL، ANY، IN، NOT IN، EXISTS و NOT EXISTS برای گرفتن نتیجه مطلوب باید استفاده کرد.


مثال. اسامی کلیه مشتریانی که هم حساب وهم وام در بانک دارند را پیدا کن.

SELECT DISTINCT customer_name
FROM borrower
WHERE customer_name IN (SELECT customer_name FROM depositor );

مثال. اسامی کلیه مشتریانی که از بانک وام گرفته اند ولی حساب ندارند را پیدا کن.

SELECT DISTINCT customer_name
FROM borrower
WHERE customer_name NOT IN (SELECT customer_name FROM depositor );

مثال. اسامی کلیه مشتریانی که هم حساب وهم وام در شعبه Perryridge دارند را پیدا کن.

SELECT DISTINCT customer_name
FROM borrower, loan
WHERE borrower.loan_number = loan.loan_number AND branch_name = 'Perryridge' AND
branch_name, customer_name IN (SELECT branch_name, customer_name
FROM depositor, account WHERE depositor.account_number = account.account_number );

توجه. پرس و جوهای بالا ساده تر هم می تواند نوشته شود.


ترکیب پرس و جوها

گاهی می خواهیم نتیجه دو پرس و جو را با هم به نحوی ترکیب کنیم و یک جدول را بدست بیاوریم. عملگرهای UNION، INTERSECT و EXCEPT برای ترکیب نتیجه دو پرس و جو می توانند استفاده شوند که به ترتیب مشابه عملگرهای اجتماع، اشتراک و تفاضل در جبر رابطه ای عمل می کنند.

مجموعه فیلدهای دو پرس و جوئی که با هم ترکب می شوند باید از نظر تعداد و نوع مطابق هم باشند.

عملگر UNION جدولی شامل کلیه سطرهای هردو پرس و جو را می دهد. سطرهای تکراری حذف می شوند مگر اینکه از عبارت UNION ALL استفاده شود.

عملگر INTERSECT سطرهای مشترک در نتیجه دو پرس و جو را بر می گرداند. سطرهای تکراری حذف می شوند مگر اینکه از عبارت INTERSECT ALL استفاده شود.

عملگر EXCEPT سطرهائی از نتیجه پرس و جوی اول که در نتیجه پرس و جوی دوم ظاهر نشده است را بر می گرداند. EXCEPT ALL سطرهای تکراری را حذف نمی کند.


مثال. اسامی کلیه مشتریانی که هم حساب وهم وام در بانک دارند را پیدا کن.

SELECT customer_nameFROM borrower
UNION
SELECT customer_name FROM depositor;


JOIN

وقتی بخواهیم اطلاعاتی را از دو جدول بدست بیاوریم می توانیم عمل الحاق را روی دو جدول انجام دهیم. عملگر JOIN رکوردهای گرفته شده از دو جدول را با هم ترکیب می کند و جدول دیگری را به عنوان نتیجه می دهد. شرط الحاق نحوه جفت کردن رکوردهای دو جدول را تعیین می کند.

الحاق دارای انواع مختلفی نظیر الحاق طبیعی و الحاق خارجی است. نوع الحاق تعیین می کند چه رکوردهائی از هر جدول که جفتی در جدول دیگر ندارند در جدول نتیجه باید اضافه شوند.

Natural Join

در الحاق طبیعی کلیه سطرهائی که فیلدهای همنام آنها که در هردو جدول دارای یک مقدار هستند، درنظر گرفته می شود. جدول حاصل تنها شامل یک ستون از ستونهای هم نام خواهد بود.


مثال. اسامی وام گیرنده ها به همراه وام های گرفته شده از بانک را پیدا کنید.

SELECT *
FROM borrower NATURAL JOIN loan;


Outer Join

در الحاق خارجی نیازی نیست رکوردهای دو جدول حتما رکورد مطابقی در جدول دیگر داشته باشند. الحاق خارجی، بسته به جدولی که همه سطرهایش نگهداشته می شود، به سه دسته الحاق چپ، راست و کامل تقسیم می شود.

LEFT OUTER JOIN کلیه مقادیر جدول سمت چپ خود را بعلاوه مقادیری از جدول سمت راست که مطابقت دارند می دهد. RIGHT OUTER JOIN کلیه مقادیر جدول سمت راست خود را می دهد بعلاوه مقادیری از جدول سمت چپ که رکوردهایش جور هستند. FULL OUTER JOIN نتیجه الحاق خارجی چپ و راست را با هم ترکیب می کند.

الحاق خارجی داده های مفقود را، برای سطرهائی که شرط الحاق در آنها برقرار نبوده، با NULL پر می کند.


مثال. اسامی کلیه وام گیرنده ها به همراه میزان وامی که گرفته اند را پیدا کنید.

SELECT *
FROM borrower LEFT OUTER JOIN loan
ON borrower.loan_no = loan.loan_no;

مثال. مقدار کلیه وام های گرفته شده از شعبه Perryridge را به همراه نام وام گیرنده ها پیدا کنید.

SELECT *
FROM borrower RIGHT OUTER JOIN loan
ON borrower.loan_no = loan.loan_no
WHERE loan.branch_name = 'Perryridge';



تلگرام

دسته بندی : SQL 

برچسب ها: select from database، انتخاب داده از دیتابیس، select از دیتابیس، select ساده از sql، دستور select دیتابیس، کد select در mysql،

نظرات() 
 
لبخندناراحتچشمک
نیشخندبغلسوال
قلبخجالتزبان
ماچتعجبعصبانی
عینکشیطانگریه
خندهقهقههخداحافظ
سبزقهرهورا
دستگلتفکر
نظرات پس از تایید نشان داده خواهند شد.