نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی. پرتال اطلاعاتی

نمونه هایی از پرس و جوهای SQL در MariaDB (MySQL). پیوست D

  • ترجمه
  • آموزش
آیا باید “SELECT * WHERE a=b FROM c” یا “SELECT WHERE a=b FROM c ON *” باشد؟

اگر شما هم مثل من هستید، قبول خواهید کرد: SQL یکی از آن چیزهایی است که در نگاه اول آسان به نظر می رسد (مثل انگلیسی می شود!)، اما به هر حال باید هر پرس و جوی ساده ای را در گوگل جستجو کنید تا سینتکس درست را پیدا کنید.


و سپس پیوستن، تجمیع، سوالات فرعی شروع می شود، و معلوم می شود که کاملاً آشغال است. مثل این:


SELECT Members.firstname || "" || Members.lastname AS "Full Name" FROM borrowings INNER JOIN اعضا ON Members.memberid=borrowings.memberid INNER JOIN books ON books.bookid=borrowings.bookid WHERE borrowings.bookid IN (انتخاب bookid FROM books WHERE stock>(انتخاب میانگین ) از کتابها)) GROUP BY اعضا.نام، اعضا.نام خانوادگی;

Bue! این کار هر مبتدی یا حتی یک توسعه دهنده متوسط ​​را اگر برای اولین بار SQL را ببیند، ترسانده است. اما همه چیز آنقدرها هم بد نیست.


به خاطر سپردن آنچه که شهودی است، آسان است، و با این راهنما، امیدوارم بتوانم مانع ورود به SQL برای مبتدیان را کاهش دهم و ظاهر جدیدی به SQL با تجربه ارائه دهم.


اگرچه نحو SQL در پایگاه داده های مختلف تقریباً یکسان است، این مقاله از PostgreSQL برای پرس و جوها استفاده می کند. برخی از نمونه ها در MySQL و سایر پایگاه های داده کار خواهند کرد.

1. سه کلمه جادویی

کلمات کلیدی زیادی در SQL وجود دارد، اما SELECT، FROM و WHERE تقریباً در هر کوئری وجود دارند. کمی بعد متوجه خواهید شد که این سه کلمه بنیادی ترین جنبه های ساخت پرس و جوهای پایگاه داده را نشان می دهند و سایر پرس و جوهای پیچیده تر، فقط افزونه هایی در بالای آنها هستند.

2. پایگاه ما

بیایید نگاهی به پایگاه داده ای بیندازیم که در این مقاله به عنوان مثال از آن استفاده خواهیم کرد:







ما کتابخانه کتاب و مردم داریم. همچنین جدول ویژه ای برای دفاتر صادر شده حسابداری وجود دارد.

  • جدول «کتاب‌ها» اطلاعاتی درباره عنوان، نویسنده، تاریخ انتشار و در دسترس بودن کتاب ذخیره می‌کند. همه چیز ساده است.
  • در جدول "اعضا" - نام و نام خانوادگی همه افرادی که برای کتابخانه ثبت نام کرده اند.
  • جدول "قرض گیری" اطلاعات مربوط به کتاب های امانت گرفته شده از کتابخانه را ذخیره می کند. ستون bookid به شناسه کتاب امانت گرفته شده در جدول "کتابها" و ستون Memberid به شخص مربوطه در جدول "اعضا" اشاره دارد. همچنین تاریخ صدور و تاریخ بازگرداندن کتاب را داریم.

3. درخواست ساده

بیایید با یک درخواست ساده شروع کنیم: ما نیاز داریم نام هاو شناسه ها(ID) تمام کتاب های نوشته شده توسط نویسنده "دن براون"


درخواست به این صورت خواهد بود:


SELECT bookid AS "id", title FROM books WHERE author="Dan Brown";

و نتیجه به این صورت است:


شناسه عنوان
2 نماد گمشده
4 دوزخ

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

3.1 FROM - از کجا داده ها را دریافت می کنیم

این ممکن است در حال حاضر بدیهی به نظر برسد، اما FROM بعداً هنگامی که به جوین ها و سوالات فرعی می رسیم بسیار مهم خواهد بود.


FROM به جدول برای پرس و جو اشاره می کند. این می تواند یک جدول از قبل موجود باشد (مانند مثال بالا)، یا جدولی باشد که در جریان از طریق اتصالات یا زیرپرس و جوها ایجاد شده است.

3.2 WHERE - چه داده هایی برای نشان دادن

WHERE به سادگی مانند یک فیلتر رفتار می کند خطوطکه می خواهیم نمایش دهیم. در مورد ما، ما فقط می‌خواهیم ردیف‌هایی را ببینیم که مقدار ستون نویسنده «دان براون» است.

3.3 SELECT - نحوه نمایش داده ها

اکنون که تمام ستون های مورد نیاز خود را از جدول مورد نیاز داریم، باید تصمیم بگیریم که دقیقا چگونه این داده ها را نشان دهیم. در مورد ما، ما فقط به عنوان و شناسه کتاب نیاز داریم، بنابراین این کاری است که ما انجام می دهیم. انتخاب کنیدبا SELECT . در همان زمان، می توانید نام ستون را با استفاده از AS تغییر دهید.


کل پرس و جو را می توان با یک نمودار ساده تجسم کرد:


4. اتصالات (اتصالات)

اکنون می‌خواهیم عناوین (نه لزوما منحصربه‌فرد) همه کتاب‌های دن براون را که از کتابخانه به امانت گرفته شده‌اند، و زمانی که آن کتاب‌ها باید بازگردانده شوند، ببینیم:


books.title را به عنوان "عنوان"، borrowings.returndate AS "تاریخ بازگشت" FROM borrowings JOIN books ON borrowings.bookid=books.bookid WHERE books.author="Dan Brown";

نتیجه:


عنوان تاریخ بازگشت
نماد گمشده 2016-03-23 00:00:00
دوزخ 2016-04-13 00:00:00
نماد گمشده 2016-04-19 00:00:00

در بیشتر موارد، درخواست مشابه مورد قبلی است. به غیر ازبخش FROM. این به آن معنا است ما در حال جستجوی داده ها از جدول دیگری هستیم. ما نه به جدول "کتاب" و نه به جدول "قرض گیری" دسترسی نداریم. در عوض، ما به میز جدید، که با پیوستن این دو جدول ایجاد شده است.


قرض ها JOIN books ON borrowings.bookid=books.bookid جدول جدیدی است که با ترکیب تمام رکوردهای جداول "کتاب" و "قرض گیری" در جایی که مقادیر دفترچه با هم مطابقت دارند تشکیل شده است. نتیجه چنین ادغامی خواهد بود:



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


بیایید یک اتصال کمی پیچیده تر با دو جدول را امتحان کنیم.


حالا می‌خواهیم نام و نام خانوادگی افرادی را که کتاب‌های نویسنده «دن براون» را از کتابخانه گرفته‌اند، دریافت کنیم.


این بار از پایین به بالا برویم:


مرحله 1- داده ها را از کجا می گیریم؟ برای به دست آوردن نتیجه ای که می خواهیم، ​​باید جداول "عضو" و "کتاب" را با جدول "قرض گیری" بپیوندیم. بخش JOIN به شکل زیر خواهد بود:


قرض ها به کتاب ها بپیوندید ON borrowings.bookid=books.bookid عضویت در اعضای ON Members.memberid=borrowings.memberid

نتیجه اتصال در لینک قابل مشاهده است.


گام 2چه داده هایی را نشان می دهیم؟ ما فقط به اطلاعاتی علاقه مندیم که نویسنده کتاب "دن براون" باشد.


WHERE books.author="Dan Brown"

مرحله 3چگونه داده ها را نمایش دهیم؟ اکنون که داده ها دریافت شده است، فقط باید نام و نام خانوادگی کسانی که کتاب ها را گرفته اند را نمایش دهید:


SELECT Members.firstname AS "First Name", Members.Lastname AS "Last Name"

فوق العاده! فقط کافی است سه جزء را ترکیب کنیم و درخواست مورد نیاز خود را ایجاد کنیم:


SELECT Members.firstname AS "First Name", Members.Lastname AS "Last Name" FROM borrowings JOIN books ON borrowings.bookid=books.bookid JOIN اعضا ON Members.memberid=borrowings.memberid WHERE books.author="Dan Brown";

چه چیزی به ما می دهد:


نام کوچک نام خانوادگی
مایک ویلیس
الن هورتون
الن هورتون

خوب! اما نام ها تکرار می شوند (آنها منحصر به فرد نیستند). ما به زودی این را برطرف خواهیم کرد.

5. تجمع

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


بیایید به مثال خود ادامه دهیم که در آن نام های تکراری ظاهر می شوند. می بینید که الن هورتون بیش از یک کتاب را قرض گرفته است، اما این بهترین راه برای نشان دادن این اطلاعات نیست. می توانید درخواست دیگری بدهید:


SELECT Members.firstname AS "First Name", Members.Lastname AS "Last Name", count(*) AS "تعداد کتاب های به امانت گرفته شده" FROM borrowings JOIN books ON borrowings.bookid=books.bookid JOIN اعضا ON Members.memberid=borrowings .memberid WHERE books.author="Dan Brown" GROUP BY Members.firstname, Members.Lastname;

که نتیجه مطلوب را به ما می دهد:


نام کوچک نام خانوادگی تعداد کتاب های امانت گرفته شده
مایک ویلیس 1
الن هورتون 2

تقریباً همه ادغام ها دارای یک بند GROUP BY هستند. این مورد، جدولی را که می‌توان با پرس و جو بدست آورد، به گروه‌هایی از جداول تبدیل می‌کند. هر گروه مربوط به یک مقدار (یا گروهی از مقادیر) منحصر به فرد از ستونی است که ما در GROUP BY مشخص کرده ایم. در مثال ما، نتیجه تمرین قبلی را به گروهی از رشته ها تبدیل می کنیم. ما همچنین یک تجمیع با count انجام می دهیم که چندین ردیف را به یک مقدار صحیح (در مورد ما تعداد ردیف ها) تبدیل می کند. سپس این مقدار به هر گروه اختصاص داده می شود.


هر ردیف در نتیجه حاصل تجمیع هر گروه است.



شما می توانید به این نتیجه منطقی برسید که تمام فیلدهای نتیجه یا باید در GROUP BY مشخص شوند یا اینکه تجمیع روی آنها انجام شود. زیرا همه فیلدهای دیگر می توانند در ردیف های مختلف با یکدیگر متفاوت باشند و اگر آنها را با SELECT "th انتخاب کنید، مشخص نیست که کدام یک از مقادیر ممکن باید گرفته شود.


در مثال بالا، تابع count همه ردیف ها را پردازش می کند (از آنجایی که ما تعداد ردیف ها را می شمردیم). توابع دیگر مانند sum یا max فقط ردیف های مشخص شده را پردازش می کنند. به عنوان مثال، اگر بخواهیم تعداد کتاب های نوشته شده توسط هر نویسنده را بدانیم، به این پرس و جو نیاز داریم:


انتخاب نویسنده، مجموع (سهام) FROM کتاب GROUP BY نویسنده.

نتیجه:


نویسنده مجموع
رابین شارما 4
دن براون 6
جان گرین 3
آمیش تریپاتی 2

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

6. سوالات فرعی


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

6.1 میز دو بعدی

پرس و جوهایی هستند که چندین ستون را برمی گرداند. یک مثال خوب، پرس و جو از تمرین تجمع قبلی است. از آنجایی که یک پرسش فرعی است، به سادگی جدول دیگری را برمی گرداند که می توان پرس و جوهای جدیدی را روی آن انجام داد. در ادامه تمرین قبلی، اگر بخواهیم تعداد کتاب‌های نویسنده «رابین شارما» را بدانیم، یکی از راه‌های ممکن استفاده از زیرپرسش‌ها است:


SELECT * FROM (انتخاب نویسنده، مجموع(سهام) FROM books GROUP BY نویسنده) به عنوان نتایج WHERE author="Robin Sharma";

نتیجه:



می توان اینگونه نوشت: ["رابین شارما"، "دن براون"]


2. اکنون از این نتیجه در یک کوئری جدید استفاده کنید:


SELECT عنوان، bookid FROM books WHERE author IN (انتخاب نویسنده FROM (انتخاب نویسنده، مجموع(موجود) FROM کتاب ها GROUP BY نویسنده) به عنوان نتایج WHERE sum > 3);

نتیجه:


عنوان کتابدار
نماد گمشده 2
وقتی بمیری چه کسی گریه خواهد کرد؟ 3
دوزخ 4

همان است که:


SELECT عنوان، bookid FROM books WHERE author IN ("Robin Sharma"، "Dan Brown");

6.3 ارزش های فردی

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


به عنوان مثال، بیایید اطلاعاتی در مورد همه کتابهایی که تعداد آنها در کتابخانه از میانگین مقدار در حال حاضر بیشتر است، بدست آوریم.


میانگین را می توان از این طریق بدست آورد:


میانگین (سهام) را از کتاب ها انتخاب کنید.

آنچه به ما می دهد:


7. عملیات را بنویسید

اکثر عملیات نوشتن پایگاه داده در مقایسه با عملیات خواندن پیچیده تر، بسیار ساده هستند.

7.1 به روز رسانی

نحو درخواست UPDATE از نظر معنایی مانند درخواست خواندن است. تنها تفاوت این است که به جای انتخاب ستون ها با SELECT "th، دانش را با SET "th تنظیم می کنیم.


اگر همه کتاب‌های دن براون گم شدند، باید مقدار کمیت را بازنشانی کنید. پرس و جو برای این خواهد بود:


به‌روزرسانی کتاب‌ها SET stock=0 WHERE author="Dan Brown";

WHERE همان کار قبلی را انجام می دهد: ردیف ها را انتخاب می کند. به جای SELECT که هنگام خواندن استفاده می شد، اکنون از SET استفاده می کنیم. با این حال، اکنون باید نه تنها نام ستون، بلکه مقدار جدید این ستون را در ردیف های انتخاب شده نیز مشخص کنید.


7.2 حذف کنید

پرس و جوی DELETE فقط یک عبارت SELECT یا UPDATE بدون نام ستون است. به طور جدی. مانند SELECT و UPDATE، عبارت WHERE ثابت می ماند: ردیف هایی را که باید حذف شوند انتخاب می کند. عملیات حذف کل ردیف را از بین می برد، بنابراین تعیین ستون های جداگانه منطقی نیست. بنابراین، اگر تصمیم گرفتیم تعداد کتاب‌های دن براون را بازنشانی نکنیم، بلکه همه ورودی‌ها را به طور کلی حذف کنیم، می‌توانیم درخواستی مانند این داشته باشیم:


DELETE FROM Books WHERE نویسنده = "Dan Brown";

7.3 درج کنید

شاید تنها چیزی که با دیگر انواع پرس و جو متفاوت است INSERT باشد. قالب این است:


INSERT INTO x(a,b,c) VALUES(x,y, z);

جایی که a، b، c نام ستون‌ها و x، y و z مقادیری هستند که باید به ترتیب در آن ستون‌ها درج شوند. اساساً همین است.


بیایید به یک مثال خاص نگاه کنیم. در اینجا یک درخواست INSERT وجود دارد که کل جدول "کتاب" را پر می کند:


درج در کتابها (کتاب، عنوان، نویسنده، منتشر شده، سهام) VALUES (1"Scion of Ikshvaku"، "Amish Tripathi"، "06-22-2015"،2)، (2"The Lost Symbol"،" دن براون، "07-22-2010"، 3)، (3، "وقتی بمیری چه کسی گریه خواهد کرد؟"، "رابین شارما"، "06-15-2006"، 4)، (4"Inferno" "دن براون"، "05-05-2014"، 3)، (5"گسل در ستارگان ما"، "جان گرین"، "01-03-2015"،3);

8. تأیید

ما به پایان رسیدیم، من یک آزمایش کوچک را پیشنهاد می کنم. به آن درخواست در همان ابتدای مقاله نگاه کنید. آیا میتوانی حلش کنی؟ سعی کنید آن را به بخش های SELECT , FROM , WHERE , GROUP BY تقسیم کنید و به اجزای پرس و جوی جداگانه نگاه کنید.


در اینجا به شکلی خواناتر است:


SELECT Members.firstname || "" || Members.lastname AS "Full Name" FROM borrowings INNER JOIN اعضا ON Members.memberid=borrowings.memberid INNER JOIN books ON books.bookid=borrowings.bookid WHERE borrowings.bookid IN (انتخاب bookid FROM books WHERE stock> (انتخاب میانگین ) از کتابها)) GROUP BY اعضا.نام، اعضا.نام خانوادگی;

این پرس و جو لیستی از افرادی را که کتابی را از کتابخانه به امانت گرفته اند که مجموع آنها بالاتر از حد متوسط ​​است، بازمی گرداند.


نتیجه:


نام و نام خانوادگی
لیندا تایلر

امیدوارم بدون هیچ مشکلی موفق شده باشید. اما در غیر این صورت، خوشحال می شوم که نظرات و انتقادات شما را بیان کنید تا بتوانم این پست را بهبود بخشم.

برچسب ها: اضافه کردن برچسب

انواع داده هاSQL(چگونه درصفحهمانند استاندارد)

انواع رشته

انواع داده های عددی

انواع داده های ارزی، نمادین، باینری

نوع بولی. شمارش ها

نمونه هایی از ساده ترین پرس و جوهای SQL

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

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

انتخاب همه | DISTINCT] select_item_commalist

FROM table_reference_commalist

[WHERE شرطی_عبارت]

[ GROUP BY column_name_commalist ]

[داشتن عبارت_شرطی]

[ سفارش با order_item_commalist ]

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

کلمه کلیدی SELECT به پایگاه داده می گوید که عبارت داده شده درخواستی برای بازیابی اطلاعات است.

پس از کلمه SELECT، نام فیلدها (لیستی از ویژگی ها) که محتوای آنها درخواست شده است، با کاما از هم جدا می شوند.

کلمه کلیدی مورد نیاز در عبارت SELECT FROM است. پس از کلمه کلیدی FROM لیستی از نام جدول جدا شده با کاما قرار می گیرد که اطلاعات از آن بازیابی می شود.

به عنوان مثال، عنوان، توضیحات را از فیلم انتخاب کنید

هر پرس و جوی SQL باید به یک ";" ختم شود. (نقطه ویرگول). نتیجه این پرس و جو یک جدول است ...

ترتیب ستون ها در این جدول با ترتیب فیلدهای مشخص شده در پرس و جو مطابقت دارد

اگر نیاز به نمایش مقادیر تمام ستون های جدول دارید، به جای فهرست کردن نام آنها، می توانید از علامت "*" (ستاره) استفاده کنید.

انتخاب * از فیلم.

در این حالت، نتیجه پرس و جو کل جدول فیلم خواهد بود.

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

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

first_name را از بازیگر انتخاب کنید.

نتیجه آن یک جدول خواهد بود، ردیف های یکسانی در جدول وجود دارد. برای حذف رکوردهای تکراری از نتیجه جستجوی SELECT، از کلمه کلیدی DISTINCT (عالی) استفاده کنید.

اگر کوئری SELECT چندین فیلد را بازیابی کند، DISTINCT ردیف های تکراری را که در آن مقادیر تمام فیلدهای انتخاب شده یکسان است حذف می کند.

پرس و جو قبلی را می توان به صورت زیر نوشت.

first_name متمایز از بازیگر را انتخاب کنید.

در نتیجه، جدولی دریافت می کنیم که در آن ردیف های تکراری حذف می شوند.

کلمه کلیدی ALL (همه) بر خلاف DISTINCT اثر معکوس دارد، یعنی زمانی که از آن استفاده می شود، ردیف های تکراری در خروجی قرار می گیرند. حالت مشخص شده توسط کلمه کلیدی ALL پیش فرض است، بنابراین عملاً برای این منظور در پرس و جوهای واقعی استفاده نمی شود.

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

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

نام خانوادگی را از بازیگر انتخاب کنید

Where first_name="PENELOPE";

شرایط مشخص شده در عبارت WHERE می تواند از عملگرهای مقایسه تعریف شده توسط عملگرهای = (برابر)، > (بیشتر از)، استفاده کند.< (меньше), >= (بزرگتر یا مساوی)،<- (меньше или равно), <>(برابر نیست)، و همچنین عملگرهای منطقی AND، OR، و NOT.

به عنوان مثال، یک پرس و جو برای عنوان و توضیحات فیلم های کوتاه (کمتر از 60 دقیقه) که هزینه اجاره آنها کمتر از 3 دلار است، به این صورت است:

عنوان، توضیحات را از فیلم انتخاب کنید

که در آن طول< 60 and rental_rate < 3

نتیجه این پرس و جو این است:

اجاره - اجاره

موجودی - موجودی، سهام

فروشگاه- سهام، فروشگاه

SQL برای بازیابی داده ها از پایگاه داده استفاده می شود. SQL یک زبان برنامه نویسی است که شباهت زیادی به زبان انگلیسی دارد اما برای برنامه های مدیریت پایگاه داده در نظر گرفته شده است. SQL در هر پرس و جو در Access استفاده می شود.

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

این مقاله بخشی از سری مقالات SQL for Access است. اصول استفاده از SQL برای بازیابی داده ها را شرح می دهد و نمونه هایی از نحو SQL را ارائه می دهد.

در این مقاله

SQL چیست؟

SQL یک زبان برنامه نویسی است که برای کار با مجموعه ای از حقایق و روابط بین آنها طراحی شده است. برنامه های پایگاه داده رابطه ای مانند Microsoft Office Access از SQL برای دستکاری داده ها استفاده می کنند. برخلاف بسیاری از زبان های برنامه نویسی، SQL حتی برای مبتدیان به راحتی قابل خواندن و درک است. مانند بسیاری از زبان های برنامه نویسی، SQL یک استاندارد بین المللی است که توسط کمیته های استاندارد مانند ISO و ANSI به رسمیت شناخته شده است.

مجموعه داده ها در SQL برای کمک به پاسخگویی به سوالات توضیح داده شده است. هنگام استفاده از SQL، باید از نحو صحیح استفاده شود. نحو مجموعه ای از قوانین است که اجازه می دهد عناصر یک زبان به درستی ترکیب شوند. نحو SQL بر اساس نحو انگلیسی است و بسیاری از عناصر را با نحو زبان Visual Basic for Applications (VBA) به اشتراک می گذارد.

به عنوان مثال، یک عبارت ساده SQL که لیستی از نام خانوادگی مخاطبین به نام مری را بازیابی می کند، ممکن است به شکل زیر باشد:

نام خانوادگی را انتخاب کنید
از مخاطبین
WHERE First_Name = "مریم";

توجه داشته باشید:زبان SQL نه تنها برای انجام عملیات روی داده ها، بلکه برای ایجاد و اصلاح ساختار اشیاء پایگاه داده مانند جداول نیز استفاده می شود. بخشی از SQL که برای ایجاد و تغییر اشیاء پایگاه داده استفاده می شود DDL نامیده می شود. DDL در این مقاله پوشش داده نشده است. برای اطلاعات بیشتر، به ایجاد و اصلاح جداول یا نمایه‌ها با استفاده از پرس و جوی تعریف داده مراجعه کنید.

عبارات را انتخاب کنید

دستور SELECT برای توصیف مجموعه ای از داده ها در SQL استفاده می شود. این شامل توضیحات کاملی از مجموعه داده هایی است که باید از پایگاه داده بازیابی شوند، از جمله موارد زیر:

    جداول حاوی داده ها؛

    پیوند بین داده ها از منابع مختلف؛

    فیلدها یا محاسباتی که بر اساس آن داده ها انتخاب می شوند.

    شرایط انتخابی که باید توسط داده های موجود در نتیجه پرس و جو برآورده شود.

    نیاز و روش مرتب سازی

عبارات SQL

یک دستور SQL از چندین بخش به نام clause تشکیل شده است. هر عبارت در دستور SQL یک هدف دارد. برخی از پیشنهادات اجباری است. جدول زیر متداول ترین عبارات SQL مورد استفاده را فهرست می کند.

بند SQL

شرح

اجباری

فیلدهایی را که حاوی داده های مورد نیاز هستند تعریف می کند.

جداول حاوی فیلدهای مشخص شده در عبارت SELECT را تعریف می کند.

معیارهای انتخاب رشته را تعریف می کند که همه رکوردهای موجود در نتایج باید رعایت کنند.

ترتیب مرتب سازی نتایج را مشخص می کند.

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

فقط در صورت وجود چنین زمینه هایی

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

شرایط SQL

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

اصطلاح SQL

بخش قابل مقایسه از گفتار

تعریف

مثال

مشخص کننده

اسم

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

مشتریان.[PhoneNumber]

اپراتور

فعل یا قید

کلمه کلیدی که یک عمل را نشان می دهد یا آن را تغییر می دهد.

مقدار ثابت

اسم

مقداری که تغییر نمی کند، مانند عدد یا NULL.

اصطلاح

صفت

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

>= کالاها.[قیمت]

بندهای اصلی SQL: SELECT، FROM و WHERE

فرمت کلی دستورات SQL به صورت زیر است:

فیلد_1 را انتخاب کنید
از جدول_1
معیار WHERE_1
;

یادداشت:

    Access به شکست خط در دستور SQL احترام نمی گذارد. با وجود این، توصیه می شود که هر جمله را در یک خط جدید شروع کنید تا دستور SQL هم برای شخصی که آن را نوشته و هم برای بقیه قابل خواندن باشد.

    هر دستور SELECT با یک نقطه ویرگول (;) به پایان می رسد. نقطه ویرگول می تواند در انتهای جمله آخر یا در یک خط جداگانه در انتهای دستور SQL باشد.

مثال در Access

مثال زیر نشان می دهد که یک عبارت SQL در Access برای یک پرس و جو انتخاب ساده چگونه می تواند باشد.

1. بند SELECT

2. بند FROM

3. بند WHERE

بیایید مثال را با جملات تقسیم کنیم تا بفهمیم نحو SQL چگونه کار می کند.

بند SELECT

انتخاب، شرکت

این یک بند SELECT است. این شامل یک عبارت (SELECT) و به دنبال آن دو شناسه ("[Email address]" و "Company") است.

اگر شناسه دارای فاصله یا کاراکترهای خاص باشد (مثلاً «آدرس ایمیل»)، باید در پرانتز قرار گیرد.

در بند SELECT، نیازی به تعیین جداول حاوی فیلدها نیست و نمی‌توانید شرایط انتخابی را که داده‌ها باید داشته باشند تا در نتایج لحاظ شود، تعیین کنید.

در دستور SELECT، عبارت SELECT همیشه قبل از عبارت FROM قرار می گیرد.

بند FROM

از مخاطبین

این بند FROM است. این شامل یک عبارت (FROM) و به دنبال آن یک شناسه (Contacts) است.

عبارت FROM فیلدهایی را برای انتخاب مشخص نمی کند.

بند WHERE

WHERE City = سیاتل

این بند WHERE است. این شامل یک عملگر (WHERE) به دنبال یک عبارت (City="Rostov") است.

شما می توانید بسیاری از کارها را با بندهای SELECT، FROM و WHERE انجام دهید. برای اطلاعات بیشتر در مورد نحوه استفاده از این پیشنهادات، به مقالات زیر مراجعه کنید:

مرتب سازی نتایج: ORDER BY

مانند مایکروسافت اکسل، اکسس به شما اجازه می دهد تا نتایج یک پرس و جو را در یک جدول مرتب کنید. با استفاده از عبارت ORDER BY، می‌توانید نحوه مرتب‌سازی نتایج را هنگام اجرای پرس و جو نیز مشخص کنید. اگر از عبارت ORDER BY استفاده می شود، باید در انتهای دستور SQL باشد.

عبارت ORDER BY حاوی لیستی از فیلدها برای مرتب سازی است، به همان ترتیبی که مرتب سازی اعمال خواهد شد.

به عنوان مثال، فرض کنید می خواهید نتایج را ابتدا بر اساس فیلد Company به ترتیب نزولی مرتب کنید و سپس اگر رکوردهایی با همان مقدار فیلد Company وجود دارد، آنها را بر اساس فیلد آدرس ایمیل به ترتیب صعودی مرتب کنید. بند ORDER BY به شکل زیر است:

سفارش توسط DESC شرکت،

توجه داشته باشید:به طور پیش فرض، Access مقادیر را به ترتیب صعودی (A تا Z، کوچکترین به بزرگ) مرتب می کند. برای مرتب کردن مقادیر به ترتیب نزولی، باید کلمه کلیدی DESC را مشخص کنید.

برای اطلاعات بیشتر در مورد ORDER BY clause، ORDER BY clause را ببینید.

کار با داده های خلاصه: GROUP BY و HAVING clauses

گاهی اوقات باید با داده های خلاصه کار کنید، مانند کل فروش ماهانه یا گران ترین اقلام موجود در انبار. برای انجام این کار، بند SELECT یک تابع جمع را در فیلد اعمال می کند. به عنوان مثال، اگر نتیجه یک پرس و جو برگرداندن تعداد آدرس های ایمیل برای هر شرکت باشد، عبارت SELECT ممکن است به این صورت باشد:

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

تعیین فیلدهایی که در یک تابع جمع استفاده نمی شوند: عبارت GROUP BY

هنگام استفاده از توابع جمع، معمولاً باید یک بند GROUP BY ایجاد کنید. عبارت GROUP BY تمام فیلدهایی را که تابع تجمیع در آنها اعمال نمی شود مشخص می کند. اگر توابع انبوه برای همه فیلدهای یک پرس و جو اعمال می شود، نیازی به ایجاد بند GROUP BY ندارید.

اگر بند WHERE وجود نداشته باشد، بند GROUP BY باید بلافاصله از بند WHERE یا FROM پیروی کند. در بند GROUP BY، فیلدها به همان ترتیبی که در عبارت SELECT مشخص شده است.

بیایید مثال قبلی را ادامه دهیم. اگر عبارت SELECT فقط تابع مجموع را در فیلد [آدرس ایمیل] اعمال کند، بند GROUP BY به شکل زیر خواهد بود:

گروه بر اساس شرکت

برای اطلاعات بیشتر در مورد بند GROUP BY، به بند GROUP BY مراجعه کنید.

محدود کردن مقادیر تجمعی با شرایط گروه بندی: عبارت HAVING

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

برای مثال، فرض کنید که تابع AVG (که مقدار میانگین را محاسبه می‌کند) به اولین فیلد در عبارت SELECT اعمال می‌شود:

SELECT COUNT()، شرکت

اگر می خواهید نتایج پرس و جو را بر اساس مقدار تابع COUNT محدود کنید، نمی توانید یک شرط فیلتر را برای این فیلد در عبارت WHERE اعمال کنید. در عوض، شرط باید در یک بند HAVING قرار گیرد. برای مثال، اگر می‌خواهید پرس و جو فقط در صورتی که شرکت دارای چندین آدرس ایمیل باشد، ردیف‌ها را برگرداند، می‌توانید از عبارت HAVING زیر استفاده کنید:

داشتن COUNT()>1

توجه داشته باشید:یک پرس و جو می تواند شامل یک بند WHERE و یک عبارت HAVING باشد، با معیارهای فیلدهایی که در توابع انبوه مشخص شده در عبارت WHERE استفاده نمی شوند، و شرایط برای فیلدهایی که در توابع انبوه استفاده می شوند در عبارت HAVING مشخص شده اند. .

برای اطلاعات بیشتر در مورد بند HAVING، به بند HAVING مراجعه کنید.

ترکیب نتایج پرس و جو: اپراتور UNION

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

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

توجه داشته باشید:در کوئری های اتحادیه، انواع داده های عددی و متنی با هم سازگار هستند.

با استفاده از عملگر UNION، می توانید تعیین کنید که آیا ردیف های تکراری، در صورت وجود، باید در نتایج پرس و جو گنجانده شوند یا خیر. برای این کار از کلمه کلیدی ALL استفاده کنید.

یک پرس و جو برای پیوستن به دو عبارت SELECT دارای نحو اصلی زیر است:

فیلد_1 را انتخاب کنید
از جدول_1
اتحاد. اتصال
فیلد_a را انتخاب کنید
از جدول_a
;

مثلاً فرض کنید دو جدول به نام‌های «محصولات» و «خدمات» وجود دارد. هر دو جدول حاوی فیلدی با نام محصول یا خدمات، قیمت و اطلاعات گارانتی و همچنین فیلدی است که انحصاری بودن محصول یا خدمات ارائه شده را نشان می دهد. اگرچه جداول محصولات و خدمات دارای انواع مختلفی از ضمانت‌ها هستند، اما اطلاعات اولیه یکسان است (اینکه آیا تضمین کیفیت برای محصولات یا خدمات جداگانه ارائه شده است). برای پیوستن چهار فیلد از دو جدول، می توانید از جوین کوئری زیر استفاده کنید:

نام، قیمت، گارانتی_موجود، پیشنهاد_انحصاری را انتخاب کنید
از محصولات
اتحاد همه
نام، قیمت، تضمین_موجود، پیشنهاد_انحصاری را انتخاب کنید
از خدمات
;

برای اطلاعات بیشتر در مورد ترکیب دستورات SELECT با استفاده از عملگر UNION، به مقاله مراجعه کنید

پرس و جوها بدون نقل قول فرار نوشته می شوند، زیرا MySQL, MS SQLو PostGreeآنها متفاوتند.

پرس و جوی SQL: دریافت فیلدهای مشخص شده (الزامی) از جدول

SELECT ID، country_title، count_people FROM table_name

ما لیستی از رکوردها را دریافت می کنیم: همه کشورها و جمعیت آنها. نام فیلدهای مورد نیاز با کاما از هم جدا می شوند.

SELECT * FROM table_name

* تمام فیلدها را نشان می دهد. یعنی نمایش هایی وجود خواهد داشت همه چیزفیلدهای داده

پرس و جو SQL: نمایش رکوردها از یک جدول به استثنای موارد تکراری

کشور_عنوان متمایز از نام جدول_نام را انتخاب کنید

ما فهرستی از سوابق دریافت می کنیم: کشورهایی که کاربران ما در آنها قرار دارند. ممکن است کاربران زیادی از یک کشور وجود داشته باشد. در این صورت این درخواست شماست.

پرس و جوی SQL: نمایش رکوردها از یک جدول با توجه به شرایط داده شده

SELECT id, country_title, city_title FROM table_name WHERE count_people>100000000

ما لیستی از رکوردها را دریافت می کنیم: کشورهایی که تعداد افراد آنها بیش از 100،000،000 است.

پرس و جو SQL: نمایش رکوردها از یک جدول با سفارش

شناسه، city_title از نام جدول را انتخاب کنید. ORDER BY city_title

ما لیستی از رکوردها را دریافت می کنیم: شهرها به ترتیب حروف الفبا. A در ابتدا، Z در پایان.

شناسه، city_title از نام جدول را انتخاب کنید. ORDER BY city_title DESC

ما لیستی از رکوردها را دریافت می کنیم: شهرها برعکس ( DESC) خوبه. در ابتدا من، در پایان A.

پرس و جوی SQL: شمارش تعداد رکوردها

COUNT(*) را از جدول_نام انتخاب کنید

تعداد (تعداد) رکوردهای جدول را بدست می آوریم. در این مورد، هیچ لیستی از رکوردها وجود ندارد.

SQL query: نمایش محدوده مورد نظر از رکوردها

SELECT * FROM table_name LIMIT 2, 3

ما 2 رکورد (دوم) و 3 (سوم) از جدول بدست می آوریم. پرس و جو هنگام ایجاد ناوبری در صفحات وب مفید است.

پرس و جوهای SQL با شرایط

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

پرس و جوی SQL: و ساخت (AND)

SELECT id, city_title FROM table_name WHERE country="Russia" AND oil=1

دریافت لیست رکوردها: شهرهای روسیه وبه نفت دسترسی داشته باشند. چه زمانی از اپراتور استفاده می شود؟ و، پس هر دو شرط باید مطابقت داشته باشند.

پرس و جوی SQL: ساخت یا ساز (OR)

SELECT id, city_title FROM table_name WHERE country="Russia" OR country="USA"

لیستی از رکوردها را دریافت کنید: همه شهرها از روسیه یاایالات متحده آمریکا. چه زمانی از اپراتور استفاده می شود؟ یا، پس حداقل یک شرط باید مطابقت داشته باشد.

پرس و جوی SQL: AND NOT construct (AND NOT)

شناسه، user_login از جدول_نام WHERE country="Russia" و NOT count_Comments را انتخاب کنید<7

دریافت لیستی از سوابق: همه کاربران از روسیه وساخته شده است نه کمتر 7 نظر.

پرس و جوی SQL: در ساختار (B)

SELECT ID، user_login FROM table_name WHERE country IN ("روسیه"، "بلغارستان"، "چین")

ما لیستی از سوابق دریافت می کنیم: همه کاربرانی که در ( که در) (روسیه یا بلغارستان یا چین)

پرس و جوی SQL: ساختار NOT IN (NOT IN)

شناسه انتخاب کنید، user_login FROM table_name WHERE country NOT IN ("روسیه"، "چین")

ما لیستی از سوابق دریافت می کنیم: همه کاربرانی که در ( نه در) (روسیه یا چین).

پرس و جوی SQL: ساختار NULL است (مقادیر خالی یا خالی نیست)

شناسه انتخاب کنید، user_login FROM table_name WHERE status IS NULL

ما لیستی از رکوردها را دریافت می کنیم: همه کاربرانی که وضعیت آنها تعریف نشده است. NULL یک موضوع جداگانه است و بنابراین به طور جداگانه بررسی می شود.

شناسه انتخاب کنید، user_login از نام جدول_جایی که حالت تهی نیست

ما لیستی از رکوردها را دریافت می کنیم: همه کاربرانی که وضعیت آنها تعریف شده است (نه صفر).

پرس و جوی SQL: ساختار LIKE

شناسه، user_login را از جدول_نام انتخاب کنید، جایی که نام خانوادگی مانند "جان%"

ما لیستی از رکوردها را دریافت می کنیم: کاربرانی که نام خانوادگی آنها با ترکیب "ایوان" شروع می شود. علامت % به معنای هر تعداد از هر کاراکتر است. برای پیدا کردن علامت %، باید از علامت فرار «Ivan\%» استفاده کنید.

پرس و جو SQL: BETWEEN construct

SELECT ID, user_login از جدول_نام WHERE حقوق بین 25000 و 50000

ما لیستی از سوابق دریافت می کنیم: کاربرانی که از 25000 تا 50000 حقوق دریافت می کنند.

عملگرهای منطقی بسیار زیادی وجود دارد، بنابراین مستندات سرور SQL را با جزئیات مطالعه کنید.

پرس و جوهای پیچیده SQL

پرس و جوی SQL: به پرس و جوهای متعدد بپیوندید

(شناسه SELECT، user_login FROM table_name1) UNION (شناسه SELECT، user_login FROM table_name2)

ما لیستی از ورودی ها را دریافت می کنیم: کاربرانی که در سیستم ثبت نام کرده اند و همچنین کاربرانی که به طور جداگانه در انجمن ثبت نام کرده اند. اپراتور UNION می تواند چندین پرس و جو را ترکیب کند. UNION مانند SELECT DISTINCT عمل می کند، یعنی مقادیر تکراری را کنار می گذارد. برای به دست آوردن کاملاً تمام رکوردها، باید از عملگر UNION ALL استفاده کنید.

پرسش SQL: محاسبه مقادیر فیلد MAX، MIN، SUM، AVG، COUNT

خروجی یک، حداکثر مقدار شمارنده در جدول:

SELECT MAX(counter) FROM table_name

خروجی یک، حداقل مقدار شمارنده در جدول:

MIN(counter) FROM table_name را انتخاب کنید

نمایش مجموع تمام مقادیر شمارنده در جدول:

SUM(counter) FROM table_name را انتخاب کنید

نمایش مقدار میانگین شمارنده در جدول:

AVG(counter) FROM table_name را انتخاب کنید

نمایش تعداد شمارنده ها در جدول:

COUNT(counter) FROM table_name را انتخاب کنید

نتیجه گیری تعداد کنتور در مغازه شماره 1 در جدول:

SELECT COUNT(counter) FROM table_name WHERE office="Workshop #1"

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

پرس و جوی SQL: سوابق گروه بندی

SELECT قاره، SUM(country_area) FROM کشور GROUP BY قاره

ما لیستی از رکوردها را دریافت می کنیم: با نام قاره و با مجموع مناطق همه کشورهای آنها. یعنی اگر فهرستی از کشورهایی وجود داشته باشد که هر کشور منطقه خود را در آن ثبت کرده است، با استفاده از ساخت و ساز GROUP BY، می توانید اندازه هر قاره (بر اساس گروه بندی بر اساس قاره ها) را دریابید.

پرس و جو SQL: استفاده از چندین جدول از طریق نام مستعار (نام مستعار)

SELECT o.order_no, o.amount_paid, c.company FROM orders AS o, مشتری AS با WHERE o.custno=c.custno AND c.city="تیومن"

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

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

o.order_no، o.amount_paid، z.company از سفارشات AS o LEFT JOIN مشتری AS z ON (z.custno=o.custno) را انتخاب کنید

سوالات فرعی تو در تو

SELECT * FROM table_name WHERE salary=(انتخاب حداکثر (حقوق) از کارمند)

ما یک رکورد دریافت می کنیم: اطلاعات در مورد کاربر با حداکثر حقوق.

توجه!سوالات فرعی تو در تو یکی از گلوگاه های سرورهای SQL هستند. آنها همراه با انعطاف پذیری و قدرت خود، بار روی سرور را نیز به میزان قابل توجهی افزایش می دهند. که منجر به کندی فاجعه بار برای سایر کاربران می شود. موارد بسیار مکرری از تماس های بازگشتی با پرس و جوهای تودرتو وجود دارد. بنابراین، من قویاً توصیه می‌کنم از پرس‌و‌جوهای تودرتو استفاده نکنید، بلکه آنها را به موارد کوچک‌تر تقسیم کنید. یا از ترکیب LEFT JOIN که در بالا توضیح داده شد استفاده کنید. علاوه بر این نوع درخواست ها، آنها کانون افزایش نقض امنیت هستند. اگر تصمیم به استفاده از سوالات فرعی تو در تو دارید، باید آنها را با دقت طراحی کنید و اجراهای اولیه را روی نسخه های پایگاه داده (پایگاه های داده آزمایشی) انجام دهید.

پرس و جوهای SQL داده ها را تغییر می دهد

پرس و جوی SQL: INSERT

دستورالعمل درج کنیدبه شما امکان می دهد رکوردها را در جدول وارد کنید. به عبارت ساده، یک خط با داده ها در یک جدول ایجاد کنید.

گزینه شماره 1. دستورالعمل اغلب استفاده می شود:

INSERT INTO table_name (id، user_login) VALUES (1، "ivanov")، (2، "petrov")

در جدول " جدول_نام» 2 (دو) کاربر را همزمان وارد می کند.

گزینه شماره 2. استفاده از سبک راحت تر است:

INSERT table_name SET id=1, user_login="ivanov"; INSERT table_name SET id=2, user_login="petrov";

این مزایا و معایب خود را دارد.

معایب اصلی:

  • بسیاری از پرس و جوهای کوچک SQL کمی کندتر از یک پرس و جوی بزرگ SQL هستند، اما سایر پرس و جوها برای سرویس در صف قرار می گیرند. یعنی اگر یک پرس و جوی SQL بزرگ به مدت 30 دقیقه اجرا شود، در تمام این مدت بقیه پرس و جوها بامبو دود می کنند و منتظر نوبت خود می مانند.
  • درخواست نسبت به نسخه قبلی گسترده تر است.

مزایای اصلی:

  • در طول پرس و جوهای کوچک SQL، سایر پرس و جوهای SQL مسدود نمی شوند.
  • سهولت در خواندن.
  • انعطاف پذیری. در این گزینه نمی توانید ساختار را دنبال کنید، بلکه فقط داده های لازم را اضافه کنید.
  • هنگام ایجاد بایگانی به این روش، می توانید به راحتی یک خط را کپی کرده و آن را از طریق خط فرمان (کنسول) اجرا کنید، در نتیجه کل ARCHIVE را بازیابی نمی کنید.
  • سبک نوشتن مشابه عبارت UPDATE است که به خاطر سپردن آن آسان تر است.

پرس و جوی SQL: به روز رسانی

UPDATE table_name SET user_login="ivanov", user_surname="Ivanov" WHERE id=1

در جدول " جدول_نام» در رکورد با شماره id=1، مقادیر فیلدهای user_login و user_surname به مقادیر مشخص شده تغییر می کند.

پرس و جوی SQL: DELETE

DELETE FROM table_name WHERE id=3

رکورد با شناسه شماره 3 در جدول table_name حذف می شود.

  1. همه نام فیلدها توصیه می شود که با حروف کوچک نوشته شوند و در صورت لزوم با یک فضای اجباری "_" برای سازگاری با زبان های برنامه نویسی مختلف مانند دلفی، پرل، پایتون و روبی از هم جدا شوند.
  2. دستورات SQL برای خوانایی با حروف بزرگ نوشته می شوند. همیشه به یاد داشته باشید که افراد دیگر می توانند کد را بعد از شما بخوانند، اما به احتمال زیاد شما خودتان پس از N زمان می توانند کد را بخوانند.
  3. فیلدها را ابتدا با یک اسم و سپس با یک عمل نامگذاری کنید. به عنوان مثال: city_status، user_login، user_name.
  4. سعی کنید از کلمات ذخیره شده در زبان های مختلف که می توانند در SQL، PHP یا Perl مشکلاتی ایجاد کنند، مانند (نام، تعداد، پیوند) خودداری کنید. به عنوان مثال: پیوند را می توان در MS SQL استفاده کرد، اما در MySQL رزرو شده است.

این مطالب یک مرجع کوتاه برای کارهای روزمره است و وانمود نمی کند که یک منبع فوق العاده معتبر است، که منبع اصلی جستجوهای SQL یک پایگاه داده خاص است.

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

    جداول مشتق شده;

    عبارات جدول تعمیم یافته

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

جداول مشتق شده

جدول مشتق شدهعبارت جدولی است که در عبارت FROM یک پرس و جو گنجانده شده است. جداول مشتق شده را می توان زمانی استفاده کرد که استفاده از نام مستعار ستونی امکان پذیر نباشد زیرا مترجم SQL دستور دیگری را قبل از اینکه نام مستعار شناخته شود پردازش می کند. مثال زیر تلاشی برای استفاده از نام مستعار ستونی را در شرایطی نشان می‌دهد که قبل از شناخته شدن نام مستعار، عبارت دیگری در حال پردازش است:

از SampleDb استفاده کنید. MONTH(EnterDate) را به عنوان enter_month از Works_on GROUP BY enter_month انتخاب کنید.

تلاش برای اجرای این کوئری پیغام خطای زیر را برمی‌گرداند:

پیام 207، سطح 16، وضعیت 1، خط 5 نام ستون نامعتبر "enter_month". (پیام 207: سطح 16، وضعیت 1، خط 5 نام ستون نامعتبر enter_month)

دلیل خطا این است که عبارت GROUP BY قبل از پردازش لیست مربوطه دستور SELECT پردازش می شود و نام مستعار ستون enter_month هنگام پردازش گروه مشخص نیست.

این مشکل را می توان با استفاده از نمایه ای که شامل پرس و جوی قبلی است (بدون عبارت GROUP BY) حل کرد، زیرا عبارت FROM قبل از عبارت GROUP BY اجرا می شود:

از SampleDb استفاده کنید. SELECT enter_month FROM (SELECT MONTH(EnterDate) as enter_month FROM Works_on) AS m GROUP BY enter_month;

نتیجه این پرس و جو به این صورت خواهد بود:

به طور معمول، یک عبارت جدول را می توان در هر جایی از عبارت SELECT قرار داد که نام جدول ممکن است ظاهر شود. (نتیجه یک عبارت جدول همیشه یک جدول یا در موارد خاص یک عبارت است.) مثال زیر استفاده از عبارت جدول را در لیست انتخاب دستور SELECT نشان می دهد:

نتیجه این پرس و جو این است:

عبارات جدول عمومی

بیان جدول مشترک (OTB) (به اختصار CTE)یک عبارت جدول نامگذاری شده است که توسط زبان Transact-SQL پشتیبانی می شود. عبارات جدول رایج در دو نوع پرس و جو استفاده می شود:

    غیر بازگشتی؛

    بازگشتی

این دو نوع درخواست در بخش های بعدی مورد بحث قرار می گیرند.

OTB و پرس و جوهای غیر بازگشتی

شکل غیر بازگشتی OTB می تواند به عنوان جایگزینی برای جداول و نماهای مشتق شده استفاده شود. معمولا OTB توسط تعریف می شود با بندهاییو یک پرس و جو اضافی که به نام استفاده شده در عبارت WITH اشاره دارد. در Transact-SQL، معنای کلمه کلیدی WITH مبهم است. برای جلوگیری از ابهام، دستور قبل از عبارت WITH باید با نقطه ویرگول خاتمه یابد.

از AdventureWorks2012 استفاده کنید. SELECT SalesOrderID FROM Sales.SalesOrderHeader WHERE TotalDue > (SELECT AVG(TotalDue) FROM Sales.SalesOrderHeader WHERE YEAR(OrderDate) = "2005") AND Freight > (SELECT AVG(TotalDue)Heder00RHE)FROM ")/2.5;

پرس و جو در این مثال سفارش هایی را انتخاب می کند که مجموع مالیات آنها (TotalDue) بیشتر از میانگین همه مالیات ها و حمل و نقل آنها بیشتر از 40٪ از میانگین مالیات است. ویژگی اصلی این کوئری حجیم بودن آن است، زیرا کوئری تودرتو باید دو بار نوشته شود. یکی از راه های ممکن برای کاهش دامنه ساختار پرس و جو ایجاد نمایه ای است که حاوی یک پرسش فرعی باشد. اما این راه حل کمی مشکل است زیرا نیاز به ایجاد نمای و سپس حذف پس از اتمام کوئری دارد. بهترین رویکرد ایجاد یک OTB خواهد بود. مثال زیر استفاده از OTB غیر بازگشتی را نشان می دهد که تعریف پرس و جو در بالا را کوتاه می کند:

از AdventureWorks2012 استفاده کنید. WITH price_calc(year_2005) AS (SELECT AVG(TotalDue) FROM Sales.SalesOrderHeader WHERE YEAR(OrderDate) = "2005") SELECT SalesOrderID FROM Sales.SalesOrderHeader WHEREOrderHeader WHEREFree2_calDue>Free2_calMal year /2.5;

نحو عبارت WITH در پرس و جوهای غیر بازگشتی به شرح زیر است:

پارامتر cte_name نام OTB است که جدول به دست آمده را تعریف می کند و پارامتر column_list لیستی از ستون ها در عبارت جدول است. (در مثال بالا، OTB قیمت_calc نام دارد و دارای یک ستون، year_2005 است.) پارامتر inner_query یک عبارت SELECT را نشان می دهد که مجموعه نتایج عبارت جدول مربوطه را مشخص می کند. سپس عبارت جدول تعریف شده را می توان در outer_query استفاده کرد. (کوئری بیرونی در مثال بالا از OTB price_calc و ستون year_2005 آن برای ساده کردن پرس و جوی تو در تو استفاده می کند.)

OTB و پرس و جوهای بازگشتی

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

پارامترهای cte_name و column_list همان معنایی را دارند که در OTB برای جستارهای غیر بازگشتی وجود دارد. بدنه بند WITH شامل دو عبارت است که توسط عبارت به هم می پیوندند اتحاد همه. اولین کوئری فقط یک بار فراخوانی می شود و شروع به جمع آوری نتیجه بازگشت می کند. عملوند اول عملگر UNION ALL به یک OTB اشاره نمی کند. به این پرس و جو کوئری یا منبع مرجع می گویند.

کوئری دوم حاوی پیوندی به OTB است و بخش بازگشتی آن را نشان می دهد. به همین دلیل به آن عضو بازگشتی می گویند. در اولین فراخوانی بخش بازگشتی، مرجع OTB نتیجه پرس و جوی مرجع را نشان می دهد. عضو بازگشتی از نتیجه اولین تماس با پرس و جو استفاده می کند. پس از آن، سیستم دوباره قسمت بازگشتی را فراخوانی می کند. تماس با یک عضو بازگشتی زمانی پایان می‌یابد که تماس قبلی با آن یک مجموعه نتیجه خالی را برمی‌گرداند.

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

در نهایت، پارامتر outer_query کوئری بیرونی را تعریف می‌کند که OTB برای دریافت همه تماس‌ها به اتحادیه هر دو عضو استفاده می‌کند.

برای نشان دادن شکل بازگشتی OTB، از یک جدول Airplane استفاده می کنیم که با کد نشان داده شده در مثال زیر پر شده است:

از SampleDb استفاده کنید. CREATE TABLE هواپیما (ContainingAssembly VARCHAR(10)، ContainedAssembly VARCHAR(10)، QuantityContained INT، UnitCost DECIMAL(6،2)); INSERT INTO Airplane VALUES ("Airplane"، "Fuselage"، 1، 10); درج در مقادیر هواپیما ("Airplane"، "Wings"، 1، 11); INSERT INTO Airplane VALUES ("Airplane"، "Tail"، 1، 12); INSERT INTO VALUES هواپیما ("بدنه"، "سالن"، 1، 13)؛ INSERT INTO VALUES هواپیما ("بدنه"، "کاکپیت"، 1، 14)؛ INSERT INTO VALUES هواپیما ("بدنه"، "دماغه"، 1، 15)؛ INSERT INTO Airplane VALUES ("Salon", NULL, 1,13); INSERT INTO Airplane VALUES("Cabin", NULL, 1, 14); INSERT INTO Airplane VALUES ("Nose", NULL, 1, 15); INSERT INTO VALUES هواپیما ("بال"، NULL، 2، 11); INSERT INTO Airplane VALUES("Tail", NULL, 1, 12);

جدول هواپیما چهار ستون دارد. ستون ContainingAssembly مجموعه را تعریف می کند و ستون ContainedAssembly قسمت هایی را (یک به یک) که مجموعه مربوطه را تشکیل می دهند، تعریف می کند. شکل زیر یک تصویر گرافیکی از نوع احتمالی هواپیما و قطعات تشکیل دهنده آن را نشان می دهد:

جدول هواپیما از 11 ردیف زیر تشکیل شده است:

مثال زیر از عبارت WITH برای تعریف پرس و جوی استفاده می کند که هزینه کل هر ساخت را محاسبه می کند:

از SampleDb استفاده کنید. WITH list_of_parts (assembly1, quantity, cost) AS (انتخاب حاوی مونتاژ، مقدار موجود، UnitCost FROM Airplane WHERE ContainedAssembly IS NULL UNION ALL SELECT a.ContainingAssembly، a.Quantity*ContainedContained,A.Quantity*2Contained,AL) ) FROM list_of_parts l, Airplane a WHERE l.assembly1 = a.ContainedAssembly) SELECT assembly1 "Part"، مقدار "Quantity"، هزینه "Price" FROM list_of_parts;

بند WITH یک لیست OTB به نام list_of_parts تعریف می کند که از سه ستون تشکیل شده است: assembly1، مقدار و هزینه. اولین دستور SELECT در مثال فقط یک بار برای ذخیره نتایج مرحله اول فرآیند بازگشت فراخوانی می شود. دستور SELECT در خط آخر مثال نتیجه زیر را نشان می دهد.

برترین مقالات مرتبط