نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی پرتال اطلاعاتی
  • خانه
  • ایمنی
  • زبان پرس و جو ساختاریافته - SQL: تاریخچه، استانداردها، عملگرهای زبان اصلی. هدف زبان SQL

زبان پرس و جو ساختاریافته - SQL: تاریخچه، استانداردها، عملگرهای زبان اصلی. هدف زبان SQL

و روی داده های جداول.

زبان SQL نامیده می شود ساخته شده استاز آنجا که این شامل توابع یک زبان توسعه کامل است و بر دسترسی به داده ها متمرکز است و در نتیجه در ابزارهای توسعه برنامه گنجانده شده است. استانداردهای زبان SQL از زبان های برنامه نویسی پاسکال، فرترن، COBOL، С و غیره پشتیبانی می کنند.

وجود دارد 2 روش استفاده از SQL تعبیه شده:

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

زبان SQL (مانند سایر زبان ها برای کار با پایگاه های داده) برای تهیه و اجرای پرس و جوها در نظر گرفته شده است. در نتیجه اجرای پرس و جو از داده ها از یک یا چند جدول، مجموعه ای از رکوردها به دست می آید که به آن می گویند. ارسال.

تعریف 1

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

عملگرهای اصلی زبان پرس و جو SQL

عبارات SQL به طور معمول به دو دسته تقسیم می شوند 2 زیر زبان:

  1. زبان تعریف داده DDL;
  2. زبان دستکاری داده ها DML.

در جدول، * با علامت گذاری شده است اپراتورهای خاصزبان

بیایید نگاهی به مهمترین عبارات SQL بیندازیم.

    بیانیه ایجاد جدول:

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

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

    مثال 1

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

    نوع- نوع کتاب،

    نام- نام کتاب،

    قیمت- قیمت کتاب

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

    عملگر تغییر ساختار جدول:

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

    مثال 2

    برای اضافه کردن به جدول کتاب هازمینه های عدد، که تعداد کتاب ها را ذخیره می کند، می توانید اپراتور را بنویسید:

    اپراتور جدول سقوط:

    مثال 3

    به عنوان مثال، برای رها کردن یک جدول موجود به نام کتاب هافقط از اپراتور استفاده کنید:

    عملگر ایجاد ایندکس:

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

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

    ASCمرتب سازی خودکار مقادیر در ستون ها را به ترتیب صعودی (پیش فرض) تنظیم می کند و DESC- به ترتیب نزولی

    عملگر افت شاخص:

    مشاهده اپراتور ایجاد:

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

    مشاهده اپراتور حذف:

    اپراتور انتخاب رکورد:

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

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

    عملگر تغییر رکورد:

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

    عملگر درج رکورد جدید:

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

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

    حذف عملگر رکورد:

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

استاندارد زبان SQL در سال 1992 پذیرفته شد و هنوز هم استفاده می شود. او بود که برای بسیاری استاندارد شد.البته برخی از تولیدکنندگان از تعابیر خود از استاندارد استفاده می کنند. اما در هر سیستمی هنوز اجزای اصلی وجود دارد - دستورات SQL.

معرفی

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

چندین دسته از دستورات SQL تعریف شده اند:

  • تعریف اشیاء پایگاه داده.
  • دستکاری ارزش ها؛
  • حفاظت و مدیریت؛
  • پارامترهای جلسه؛
  • اطلاعات در مورد پایگاه؛
  • SQL استاتیک؛
  • SQL پویا

دستورات SQL برای دستکاری داده ها

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

نام جدول (نام ستون 1، نام ستون 2)

VALUES (مقدار 1، مقدار 2).

برای استفاده از یک دستور INSERT روی چندین مقدار، نحو به صورت زیر است:

نام جدول 1 (نام ستون 1، نام ستون 2)

نام ستون 1، نام ستون 2 را انتخاب کنید

از نام جدول 2

WHERE نام جدول 2. نام ستون 1> 2

این کوئری تمام داده های جدول 2 را که بزرگتر از 2 در ستون 1 هستند انتخاب می کند و در ستون اول قرار می دهد.

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

به روز رسانی نام جدول 1

SET ستون نام 2 = "Vasily"

WHERE نام جدول 1. نام ستون 1 = 1

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

داده ها از جدول می توانید یک شرط را مشخص کنید یا تمام خطوط را حذف کنید.

حذف از نام جدول

WHERE نام جدول نام ستون 1 = 1

پرس و جوی بالا تمام داده های با مقدار یک در ستون اول را از پایگاه داده حذف می کند. و به این صورت می توانید کل جدول را پاک کنید:

عبارت SELECT

هدف اصلی SELECT انتخاب داده ها با توجه به شرایط خاص است. نتیجه کار او همیشه یک جدول جدید با داده های انتخاب شده است. اپراتور MS را می توان در طیف گسترده ای از پرس و جوها استفاده کرد. بنابراین در کنار آن می توانید کلیدواژه های مرتبط دیگری را نیز در نظر بگیرید.

برای انتخاب همه داده ها از یک جدول خاص، از علامت "*" استفاده کنید.

از نام جدول 1

نتیجه این پرس و جو یک کپی دقیق از جدول 1 خواهد بود.

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

از نام جدول 1

WHERE نام جدول 1. نام ستون 1> 2

همچنین می توانید در انتخاب نشان دهید که فقط ستون های خاصی مورد نیاز است.

نام جدول 1. نام ستون 1 را انتخاب کنید

از نام جدول 1

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

نام جدول 1 نام ستون 1

نام جدول 1 نام ستون 2

نام جدول 1 نام ستون 3

نام جدول 1. نام ستون 2 * نام جدول 1. نام ستون 3 AS SUMMA

از نام جدول 1

این پرس و جو به ظاهر پیچیده همه مقادیر را از جدول 1 واکشی می کند، سپس ستون های جدید EQ و SUMMA را ایجاد می کند. در اولی علامت "+" را وارد می‌کند، در دومی حاصل ضرب داده‌های ستون‌های 2 و 3. نتیجه به‌دست‌آمده را می‌توان در قالب یک جدول ارائه کرد تا بفهمیم چگونه کار می‌کند:

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

نام جدول 1 نام ستون 1

نام جدول 1 نام ستون 2

نام جدول 1 نام ستون 3

از نام جدول 1

ترتیب بر اساس نام ستون 2

جدول حاصل به شکل زیر خواهد بود:

یعنی تمام سطرها به ترتیبی تنظیم شدند که مقادیر ستون 2 به ترتیب صعودی باشند.

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

جدول "کارمندان".

جدول حقوق و دستمزد

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

کارکنان.اتاق

نام کارمند

حقوق. شرط بندی

حقوق تعلق گرفته

از کارکنان، حقوق و دستمزد

WHERE Employees.Number = حقوق و دستمزد.Number

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

کمی بیشتر در مورد SELECT. استفاده از توابع جمع

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

به عنوان مثال، برای به دست آوردن تعداد رکوردها از جدول "Employees"، باید از پرس و جو استفاده کنید:

تعداد (*) را به عنوان شماره انتخاب کنید

از کارمندان

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

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

SUM (حقوق. انباشته) AS SUMMA

MAX (حقوق. تعهدی) AS MAX

MIN (حقوق. انباشته) AS MIN

AVG (Salary. Accrued) AS SRED

از حقوق

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

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

اتحاد، تقاطع و تفاوت ها

چند پرس و جو را در SQL ترکیب کنید

Employees.Name را انتخاب کنید

از کارمندان

WHERE Employees.Number = 1

Employees.Name را انتخاب کنید

از کارکنان، حقوق و دستمزد

WHERE حقوق و دستمزد. تعداد = 1

باید در نظر داشت که با چنین اتصالی، جداول باید با هم سازگار باشند. یعنی به همان تعداد ستون داشته باشید.

نحو بیانیه و ترتیب پردازش را انتخاب کنید

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

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

اگر پرس و جو حاوی یک GROUP BY باشد، مقادیر با پارامترهای مشخص شده گروه بندی می شوند.

اپراتورهایی برای مقایسه داده ها

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

    "=". همانطور که ممکن است حدس بزنید، برابری دو عبارت را نشان می دهد. به عنوان مثال، قبلاً در مثال های بالا استفاده شده است - WHERE Salary. شماره = 1.

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

    «<». Знак меньше. Обратный предыдущему оператор.

    نشانه ها "<=» и «>= ". تفاوت آن با عملگرهای ساده این است که اگر عملوندها برابر باشند، شرط نیز صادق خواهد بود.

پسندیدن

این کلمه کلیدی را می توان به عنوان "مشابه" ترجمه کرد. عملگر LIKE در SQL تقریباً به همین روش استفاده می شود - یک پرس و جو را با استفاده از یک الگو اجرا می کند. به این معنی که به شما اجازه می دهد تا انتخاب داده ها را از پایگاه داده با استفاده از عبارات منظم گسترش دهید.

به عنوان مثال، وظیفه زیر تعیین شد: از پایگاه قبلاً شناخته شده "کارمندان" برای دریافت همه افرادی که نام آنها به "I" ختم می شود. سپس درخواست را می توان به صورت زیر تنظیم کرد:

از کارمندان

WHERE نام مانند `% i`

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

مورد

این دستور SQL Server یک پیاده سازی چند گزینه ای است. این شبیه سازه سوئیچ در بسیاری از زبان های برنامه نویسی است. دستور SQL CASE یک عمل را بر روی چندین شرط انجام می دهد.

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

سپس درخواست را می توان به صورت زیر تنظیم کرد:

از حقوق

WHERE CASE WHEN SELECT MAX (ارزیابی شده) سپس حداکثر

WHEN SELECT MIN (ارزیابی شده) سپس حداقل

در این زمینه، سیستم به دنبال مقادیر حداکثر و حداقل در ستون Accrued است. سپس با استفاده از END، یک فیلد "total" ایجاد می شود که بسته به نتیجه شرط، "Maximum" یا "Minimum" در آن وارد می شود.

به هر حال، SQL همچنین دارای فرم فشرده تری از CASE - COALESCE است.

اپراتورهای تعریف داده

این نمای به شما امکان می دهد تا تغییرات مختلفی را در جداول انجام دهید - ایجاد، حذف، اصلاح و کار با ایندکس ها.

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

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

کارمندان جدول ایجاد کنید

(شماره (10) NOT NULL

Varchar (50) NOT NULL

نام خانوادگی varchar (50) NOT NULL)

در این کوئری در داخل پرانتز بلافاصله نام فیلدها و انواع آنها مشخص می شود و همچنین می توان آن را برابر با NULL دانست.

میز رها کردن

یک کار ساده را انجام می دهد - حذف جدول مشخص شده. دارای یک پارامتر اضافی IF EXISTS. اگر جدولی که به دنبال آن هستید وجود نداشته باشد، خطا را در drop حذف می کند. مثال استفاده:

در صورت وجود، کارمندان را رها کنید.

ایجاد شاخص

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

ایجاد INDEX index_name

ON table_name (column_name)

این عملگر در T-SQL، Oracle، PL SQL و بسیاری از تعابیر دیگر از فناوری ها استفاده می شود.

جدول تغییرات

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

    اضافه کردن. ستونی را به جدول اضافه می کند. نحو آن به شرح زیر است: ALTER TABLE table_name ADD column_name stored_data_type. ممکن است یک گزینه IF NOT EXISTS برای سرکوب خطا در صورتی که ستون ایجاد شده از قبل وجود داشته باشد، داشته باشد.

    رها کردن یک ستون را حذف می کند. همچنین دارای کلید IF EXISTS است که بدون آن خطایی ایجاد می شود که نشان می دهد ستون مورد نیاز وجود ندارد.

    تغییر دادن. برای تغییر نام فیلد به نام مشخص شده خدمت می کند. مثال استفاده: ALTER TABLE table_name CHANGE old_name new_name;

    تغییر. این دستور به شما کمک می کند تا نوع و ویژگی های اضافی یک ستون خاص را تغییر دهید. و از آن به این صورت استفاده می شود: ALTER TABLE جدول_نام تغییر ستون_نام ویژگی های داده_type;

ایجاد نمای

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

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

نام نما را ایجاد کنید AS SELECT FROM * نام جدول

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

کمی در مورد توابع

در پرس‌و‌جوهای SQL، توابع مختلف داخلی اغلب استفاده می‌شوند که به شما امکان می‌دهند با داده‌ها تعامل داشته باشید و آن‌ها را در لحظه تبدیل کنید. آنها ارزش بررسی دارند زیرا بخشی جدایی ناپذیر از یک زبان ساختاریافته را تشکیل می دهند.

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

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

    MIN و MAX. این توابع قبلاً در این مقاله استفاده شده است. آنها حداکثر و حداقل مقادیر را از ستون مشخص شده تعیین می کنند.

    جمع ساده است - تابع مجموع مقادیر ستون را محاسبه می کند. منحصراً برای نوع عددی داده استفاده می شود. با افزودن پارامتر DISTINCT به پرس و جو، فقط مقادیر منحصر به فرد جمع می شوند.

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

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

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

اپراتورهای اضافی

بسیاری از نمونه‌های دستورات SQL دارای کلمات کلیدی هستند که کارهای کوچکی را انجام می‌دهند، اما باز هم واکشی یا دستکاری پایگاه‌های داده را بسیار آسان‌تر می‌کنند.

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

    بین. یک ابزار نمونه برداری بسیار مفید. محدوده مقادیری را که می خواهید داده ها را از بین آنها دریافت کنید را نشان می دهد. ورودی پارامتری را از محدوده استفاده شده و به چه عددی می گیرد.

    نه. عملگر برعکس عبارت را می دهد.

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

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

    اتحاد. اتصال. یک اپراتور بسیار راحت برای ترکیب چند پرس و جو. او قبلاً در این مقاله با نمونه هایی از این موضوع آشنا شده است. برای استفاده راحت تر، می توانید ردیف های مورد نیاز را از چندین جدول با ترکیب آنها با UNION نمایش دهید. نحو آن به شرح زیر است: SELECT column_name FROM table_name UNION SELECT other_column_name از یک table_name دیگر. نتیجه یک جدول محوری با پرس و جوهای ترکیبی خواهد بود.

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

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

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

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

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

    ترکیب. پس از بازیابی داده ها از چندین جدول، بسیاری از برنامه نویسان شروع به جمع آوری آنها با استفاده از حافظه پوسته می کنند. اما چرا؟ از این گذشته ، می توانید یک درخواست داشته باشید که در آن همه اینها وجود داشته باشد. شما نیازی به نوشتن کد اضافی و ذخیره حافظه اضافی در سیستم ندارید.

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

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

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

    انواع برای صرفه جویی در فضا و منابع، باید نسبت به انواع داده های مورد استفاده حساس باشید. اگر می توان از نوعی استفاده کرد که برای حافظه کمتر «سنگین» است، استفاده از آن ضروری است. به عنوان مثال، اگر می دانید که مقدار عددی در این قسمت از 255 تجاوز نمی کند، پس چرا اگر TINYINT 1 بایتی وجود دارد، از یک INT 4 بایتی استفاده کنید.

نتیجه

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

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

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

SQL (StructuredQueryLanguage) یک زبان کامپیوتری جهانی است که برای ایجاد، تغییر و دستکاری داده ها در پایگاه های داده رابطه ای استفاده می شود. زبان SQL بر پایه جبر رابطه ای است و مجموعه ای از عملگرها است.

4 گروه از اپراتورها وجود دارد. گروهی از زبان های دستکاری داده ها (DML) را در نظر بگیرید، SQL DML)

انتخاب داده ها

انتخاب داده رایج ترین عملیات SQL است. دستور SELECT یکی از مهمترین دستورات این زبان برای انتخاب داده است. سینتکس این عملگر به صورت زیر است:

ستون را از جدول انتخاب کنید

عبارات SELECT باید حاوی کلمات SELECT و FROM باشند. سایر کلمات کلیدی اختیاری هستند.

پس از کلمه کلیدی SELECT، اطلاعاتی در مورد اینکه کدام فیلدها در مجموعه داده حاصل باید گنجانده شود، ارائه می شود. ستاره (*) تمام فیلدهای جدول را نشان می دهد، به عنوان مثال:

برای انتخاب یک ستون از دستور زیر استفاده می شود:

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

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

انتخاب کنید شرکت، تلفن،ایمیل

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

انتخاب کنید * از جانب مشتریان

این کوئری تمام فیلدهای جدول مشتریان را برمی گرداند.

می توانید از عبارت WHERE برای فیلتر کردن نتایج بازگردانده شده توسط عبارت SELECT استفاده کنید (اختیاری)

SELECT * از محصولات WHERE رده = 4

عبارات مختلفی را می توان در عبارت WHERE استفاده کرد،

WHERE عبارت 1 [(AND | OR) عبارت2 ...]

مثلا:

SELECT * FROM Products WHERE Category = 2 AND Postavshik> 10

نام، قیمت از محصولات WHERE رده = 3 یا قیمت را انتخاب کنید< 50

می توانید از عملگرهای زیر استفاده کنید:

< Меньше

<= Меньше или равно

<>نا برابر

> بیشتر

> = بزرگتر یا مساوی

عبارت ORDER BY (اختیاری) برای مرتب‌سازی مجموعه داده‌های حاصل بر اساس یک یا چند ستون استفاده می‌شود. برای تعیین ترتیب مرتب سازی از کلمات کلیدی ASC (صعودی) یا DESC (نزولی) استفاده می شود. به طور پیش فرض، داده ها به ترتیب صعودی مرتب شده اند.

اصلاح داده ها

علاوه بر بازیابی داده ها، SQL می تواند برای به روز رسانی و حذف داده ها، کپی رکوردها در جداول دیگر و انجام عملیات های دیگر استفاده شود. در زیر به عبارات UPDATE، DELETE و INSERT که برای انجام برخی از این وظایف استفاده می‌شوند، نگاه می‌کنیم.

بیانیه به روز رسانی

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

به روز رسانی مجموعه جدول ستون1 = بیان1 معیارهای WHERE

عبارت در عبارت SET می تواند یک ثابت یا نتیجه یک ارزیابی باشد. به عنوان مثال، برای افزایش قیمت تمام محصولاتی که قیمت آنها کمتر از 10 دلار است، می توانید پرس و جو زیر را اجرا کنید:

به روز رسانی محصولات مجموعه قیمت = قیمت * 1.1 WHERE قیمت< 10

بیانیه را حذف کنید

برای حذف ردیف‌ها از جداول، از دستور DELETE استفاده کنید که نحو آن عبارت است از:

حذف از جدول WHERE معیارها

همه محصولات با ارزش کمتر از 100 را حذف کنید:

حذف از محصولات WHERE قیمت< 100

اپراتوردرج کنید

برای افزودن رکورد به جداول، از عبارت INSERT استفاده کنید که نحو آن به صورت زیر است:

درج در جدول (VALUES (عبارت [، ...])

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

درج در مشتریان (شناسه مشتری، نام شرکت) مقادیر («XYZ»، «XYZ Deli»)

اساس زبان SQL از عملگرهایی تشکیل شده است که به طور مشروط به چندین گروه با توجه به عملکردشان تقسیم می شوند. گروه‌های عبارات زیر قابل تشخیص هستند (همه عبارات SQL فهرست نشده‌اند):

اپراتورهای Ddl (زبان تعریف داده).

بیانیه های DDL - بیانیه های تعریف شی پایگاه داده

    ایجاد طرحواره - ایجاد یک طرح واره پایگاه داده

    DROP SHEMA - یک طرح پایگاه داده را رها کنید

    ایجاد جدول - ایجاد یک جدول

    ALTER TABLE - یک جدول را تغییر دهید

    DROP TABLE - میز را رها کنید

    ایجاد دامنه - ایجاد یک دامنه

    ALTER DOMAIN - تغییر دامنه

    DROP DOMAIN - حذف دامنه

    CREATE COLLATION - ایجاد یک دنباله

    DROP COLLATION - یک دنباله را حذف کنید

    ایجاد نمای - ایجاد یک نمای

    DROP VIEW - حذف یک نما

اپراتورهای Dml (زبان دستکاری داده ها).

اپراتورهای DML - اپراتورهای دستکاری داده ها

    SELECT - سطرها را از جداول انتخاب کنید

    INSERT - سطرها را به جدول اضافه کنید

    به روز رسانی - تغییر ردیف ها در جدول

    DELETE - ردیف های جدول را حذف کنید

    COMMIT - تغییرات ایجاد شده را انجام دهید

    ROLLBACK - تغییرات ایجاد شده را به عقب برگردانید

اپراتورهای حفاظت و کنترل داده ها

    CREATE ASSERTION - ایجاد محدودیت

    DROP ASSERTION - یک محدودیت را حذف کنید

    GRANT - به یک کاربر یا برنامه برای دستکاری اشیا امتیازاتی اعطا می کند

    ReEVOKE - لغو امتیازات کاربر یا برنامه

علاوه بر این، گروه هایی از عملگرها برای تنظیم پارامترهای جلسه، دریافت اطلاعات در مورد پایگاه داده، دستورات SQL استاتیک، دستورات SQL پویا وجود دارد. مهمترین آنها برای کاربر اپراتورهای دستکاری داده ها (DML) هستند.

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

INSERT - درج ردیف ها در جدول

مثال 1 . درج یک سطر در جدول:

ارزش ها (4، "ایوانف")؛

مثال 2 ... درج چندین ردیف در جدول، انتخاب شده از جدول دیگری (داده های تامین کنندگان از جدول P، که اعداد بزرگتر از 2 دارند، در جدول TMP_TABLE درج می شوند):

TMP_TABLE (PNUM، PNAME)

PNUM، PNAME را انتخاب کنید

WHERE P.PNUM> 2;

به روز رسانی - به روز رسانی ردیف ها در یک جدول

مثال 3 ... به روز رسانی چندین ردیف در یک جدول:

SET PNAME = "Pushnikov"

WHERE P.PNUM = 1;

DELETE - حذف ردیف ها در جدول

مثال 4 . حذف چند ردیف در جدول:

WHERE P.PNUM = 1;

مثال 5 ... حذف تمام ردیف های جدول:

نمونه هایی از استفاده از عبارت SELECT

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

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

اظهار نظر... در واقع، پایگاه های داده می توانند نه تنها جداول ثابت، بلکه جداول موقت و به اصطلاح view ها را نیز داشته باشند. View ها به سادگی عبارت های SELECT هستند که در پایگاه داده ذخیره می شوند. از دیدگاه کاربران، نما جدولی است که به طور دائم در پایگاه داده ذخیره نمی شود، اما در زمان دسترسی به آن «ظاهر می شود». از نقطه نظر دستور SELECT، جداول پایدار و جداول و نماهای موقت دقیقاً یکسان به نظر می رسند. البته اجرای واقعی دستور SELECT توسط سیستم، تفاوت جداول ذخیره شده و نماها را در نظر می گیرد، اما این تفاوت ها پنهان شده استاز کاربر

نتیجه یک دستور SELECT همیشه یک جدول است. بنابراین، نتایج اقدامات، عبارت SELECT را شبیه به عملگرهای جبر رابطه ای می کند. هر عملگر جبر رابطه‌ای را می‌توان با یک عبارت SELECT بیان کرد. پیچیدگی دستور SELECT با این واقعیت مشخص می شود که شامل تمام ویژگی های جبر رابطه ای و همچنین ویژگی های اضافی است که در جبر رابطه ای موجود نیست.

در قسمت اول، ما قبلاً با استفاده از تقریباً کل مجموعه دستورات آن به استثنای دستور MERGE، کمی به زبان DML پرداخته ایم.

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

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

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

زیرا DML در گویش پایگاه داده MS SQL بسیار با نحو ساختار SELECT مرتبط است، سپس من شروع به صحبت در مورد DML با آن خواهم کرد. به نظر من، ساخت SELECT مهمترین ساخت زبان DML است، زیرا با هزینه آن یا قطعات آن، انتخاب داده های لازم از پایگاه داده انجام می شود.

DML شامل ساختارهای زیر است:

  • SELECT - انتخاب داده ها
  • INSERT - درج داده های جدید
  • به روز رسانی - به روز رسانی داده ها
  • DELETE - حذف داده ها
  • MERGE - ادغام داده ها

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

SELECT column_list یا * FROM source WHERE فیلتر ORDER BY sort_expression
موضوع دستور SELECT بسیار گسترده است، بنابراین در این قسمت فقط بر ساختارهای اصلی آن تمرکز خواهم کرد. من معتقدم که بدون شناخت کامل پایه، نمی توانید مطالعه ساختارهای پیچیده تر را شروع کنید، زیرا سپس همه چیز حول این ساختار اولیه می چرخد ​​(پرسمان های فرعی، اتحادیه ها و غیره).

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

اگر DDL ثابت تر باشد، به عنوان مثال. با کمک آن ساختارهای سفت و سختی (جدول، لینک و غیره) ایجاد می شود، سپس زبان DML ماهیت پویا دارد، در اینجا می توانید نتایج صحیح را به روش های مختلف دریافت کنید.

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

نمونه هایی در پایگاه داده تست نشان داده می شود که با استفاده از DDL + DML در قسمت اول ایجاد شده است.

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

تست اسکریپت ایجاد پایگاه داده

ایجاد پایگاه داده CREATE DATABASE Test GO - پایگاه داده آزمایش را تبدیل به استفاده فعلی کنید Test GO - ایجاد جداول مرجع ایجاد موقعیت های TABLE (ID int IDENTITY (1,1) NOT NULL CONSTRAINT PK_Positions PRIMARY KEY, Name nvarchar (30) NOT NULL) CREATE بخش ها (ID int IDENTITY (1,1) NOT NULL CONSTRAINT PK_Departments PRIMARY KEY, Name nvarchar (30) NOT NULL) GO - جداول مرجع را با داده پر کنید SET IDENTITY_INSERT موقعیت ها (ID, Name) VALUES (1, N "Accountant") , (2، N "کارگردان")، (3، N "برنامه نویس")، (4، N "برنامه نویس ارشد") SET IDENTITY_INSERT موقعیت ها OFF GO SET IDENTITY_INSERT بخش ها ON درج بخش ها (ID, Name) VALUES (1, N " مدیریت")، (2، N "حسابداری")، (3، N "IT") SET IDENTITY_INSERT بخش ها OFF GO - ایجاد جدول با کارمندان CREATE TABLE کارکنان (ID int NOT NULL، نام nvarchar (30)، تاریخ تولد، ایمیل nvarchar (30)، PositionID int، DepartmentID int، تاریخ استخدام NULL CONSTRAINT DF_Employees_HireDate پیش فرض SYSDATETIME ()، ManagerID int، C ONSTRAINT PK_Employees PRIMARY KEY (ID), CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY (DepartmentID) REFERENCES بخش ها (ID), CONSTRAINT FK_Employees_PositionID CO FOREIGN KEY (PositionID) (PositionID) (PositionIDONEECKE) (PositionID) (PositionIDONEECKE) (PositionID) (PositionIDONEECKES) REFERENCESIDRENCESRE شناسه بین 1000 و 1999)، INDEX IDX_Employees_Name (Name)) GO - آن را با درج اطلاعات کارکنان (شناسه، نام، تاریخ تولد، ایمیل، شناسه موقعیت، شناسه بخش، شناسه مدیر) VALUES پر کنید (1000، N "Ivanov II"5,211،" " [ایمیل محافظت شده]", 2,1, NULL), (1001, N" Petrov P.P. "," 19831203 "," [ایمیل محافظت شده]", 3,3,1003), (1002, N" Sidorov S.S. "," 19760607 "," [ایمیل محافظت شده]", 1,2,1000), (1003, N" Andreev A.A. "," 19820417 "," [ایمیل محافظت شده]",4,3,1000)

تمام، اکنون ما آماده شروع یادگیری زبان DML هستیم.

SELECT - اپراتور انتخاب داده

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

بیایید با ابتدایی ترین فرم SELECT شروع کنیم:

انتخاب * از کارکنان
در این پرس و جو، ما می خواهیم همه ستون ها (که با "*" نشان داده شده اند) را از جدول کارمندان برگردانیم - می توانید این را به عنوان "SELECT all_fields FROM table_employees" بخوانید. اگر شاخص خوشه‌ای وجود داشته باشد، داده‌های برگشتی به احتمال زیاد توسط آن مرتب می‌شوند، در این مورد بر اساس ستون ID (اما این موضوع نیست، زیرا در بیشتر موارد ما خودمان به صراحت مرتب‌سازی را با استفاده از ORDER BY مشخص می‌کنیم... ) :

شناسه نام روز تولد پست الکترونیک شناسه موقعیت شناسه بخش HireDate شناسه مدیر
1000 ایوانف I.I. 1955-02-19 [ایمیل محافظت شده] 2 1 2015-04-08 خالی
1001 پتروف P.P. 1983-12-03 [ایمیل محافظت شده] 3 3 2015-04-08 1003
1002 سیدوروف S.S. 1976-06-07 [ایمیل محافظت شده] 1 2 2015-04-08 1000
1003 آندریف A.A. 1982-04-17 [ایمیل محافظت شده] 4 3 2015-04-08 1000

به طور کلی، شایان ذکر است که در گویش MS SQL، ساده ترین شکل یک کوئری SELECT ممکن است حاوی بلوک FROM نباشد، در این صورت می توانید از آن برای دریافت مقادیری استفاده کنید:

SELECT 5550/100 * 15, SYSDATETIME ()، - دریافت تاریخ سیستم پایگاه داده SIN (0) + COS (0)

(بدون نام ستون) (بدون نام ستون) (بدون نام ستون)
825 2015-04-11 12:12:36.0406743 1

توجه داشته باشید که عبارت (5550/100 * 15) نتیجه 825 را به دست می دهد، اگرچه اگر روی ماشین حساب حساب کنیم مقدار (832.5) به دست می آید. نتیجه 825 به این دلیل به دست آمد که در عبارت ما همه اعداد صحیح هستند، بنابراین نتیجه یک عدد صحیح است، یعنی. (5550/100) به ما 55 می دهد، نه (55.5).

موارد زیر را به خاطر بسپارید، منطق زیر در MS SQL کار می کند:

  • عدد صحیح / عدد صحیح = عدد صحیح (یعنی در این مورد تقسیم عدد صحیح رخ می دهد)
  • واقعی / کل = واقعی
  • عدد صحیح / واقعی = واقعی
آن ها نتیجه به یک نوع بزرگتر تبدیل می شود، بنابراین در 2 مورد آخر یک عدد واقعی به دست می آوریم (مانند ریاضیات فکر کنید - محدوده اعداد واقعی بزرگتر از محدوده اعداد صحیح است، بنابراین نتیجه به آن تبدیل می شود):

SELECT 123/10, - 12 123./10, - 12.3 123/10. - 12.3
در اینجا (123.) = (123.0)، فقط در این حالت می توان 0 را حذف کرد و فقط نقطه را می توان باقی گذاشت.

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

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

برای تبدیل فیلدها می توانید از تابع CAST یا CONVERT استفاده کنید. به عنوان مثال، ما از فیلد ID استفاده خواهیم کرد، آن را از نوع int داریم:

SELECT ID، ID / 100، - در اینجا یک تقسیم عدد صحیح CAST (ID AS float) / 100 خواهد بود، - از تابع CAST برای تبدیل به نوع شناور CONVERT (float، ID) / 100 استفاده کنید، - از تابع CONVERT برای تبدیل استفاده کنید. به نوع float ID / 100. - ما از تبدیل با نشان دادن اینکه مخرج یک عدد واقعی FROM Employees است استفاده می کنیم

شناسه (بدون نام ستون) (بدون نام ستون) (بدون نام ستون) (بدون نام ستون)
1000 10 10 10 10.000000
1001 10 10.01 10.01 10.010000
1002 10 10.02 10.02 10.020000
1003 10 10.03 10.03 10.030000

در یک یادداشت.در پایگاه داده ORACLE، نحو بدون بلوک FROM مجاز نیست، برای این منظور از جدول سیستم DUAL استفاده می شود که شامل یک خط است:

SELECT 5550/100 * 15، - و در ORACLE نتیجه 832.5 sysdate، sin (0) + cos (0) FROM DUAL خواهد بود.


توجه داشته باشید.نام جدول در بسیاری از RDB ها می تواند قبل از نام طرحواره باشد:

SELECT * FROM dbo.Employees - dbo - schema name

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

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

به طور پیش فرض، یک طرح به نام dbo (مالک پایگاه داده) در پایگاه داده MS SQL ایجاد می شود و تمام اشیاء ایجاد شده به طور پیش فرض در این طرحواره ایجاد می شوند. بر این اساس، اگر به سادگی نام جدول را در کوئری مشخص کنیم، در طرح dbo پایگاه داده فعلی جستجو می شود. اگر بخواهیم یک شی در یک طرح خاص ایجاد کنیم، باید نام شی را نیز با نام طرحواره اضافه کنیم، به عنوان مثال، "CREATE TABLE schema_name.table_name (...)".

در مورد MS SQL، نام طرحواره همچنین می تواند قبل از نام پایگاه داده ای که این طرح در آن قرار دارد قرار گیرد:

* از Test.dbo.Employees - database_name.schema_name.table را انتخاب کنید
این توضیح مفید است، برای مثال، اگر:

  • در یک درخواست به اشیایی که در طرحواره ها یا پایگاه داده های مختلف قرار دارند اشاره می کنیم
  • شما باید داده ها را از یک طرحواره یا پایگاه داده به دیگری انتقال دهید
  • با حضور در یک پایگاه داده، باید داده ها را از پایگاه داده دیگری درخواست کنید
  • و غیره.
طرحواره ابزار بسیار مناسبی است که هنگام توسعه معماری پایگاه داده، به ویژه پایگاه داده های بزرگ، مفید است.

همچنین فراموش نکنید که در متن درخواست می توانیم از نظرات تک خطی «- ...» و چند خطی «/ * ... * /» استفاده کنیم. اگر درخواست بزرگ و پیچیده است، نظرات می توانند بسیار مفید باشند، شما یا شخص دیگری، پس از مدتی ساختار آن را به خاطر بسپارید یا درک کنید.

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

SELECT ID, Name FROM Employees

آن ها در اینجا می گوییم که فقط باید فیلدهای ID و Name را از جدول برگردانیم. نتیجه به شرح زیر خواهد بود (به هر حال، بهینه ساز در اینجا تصمیم گرفت از شاخص ایجاد شده در قسمت Name استفاده کند):

شناسه نام
1003 آندریف A.A.
1000 ایوانف I.I.
1001 پتروف P.P.
1002 سیدوروف S.S.

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

تجزیه و تحلیل طرح اجرا در هنگام بهینه سازی یک پرس و جو بسیار مفید است، به شما این امکان را می دهد که بفهمید کدام اندیس ها گم شده اند یا کدام اندیس ها اصلا استفاده نمی شوند و می توانید آنها را حذف کنید.

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

تنظیم نام مستعار برای جداول

هنگام فهرست کردن ستون ها، می توان قبل از آنها نام جدول در بلوک FROM قرار داد:

SELECT Employees.ID، Employees.Name FROM Employees

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

emp.ID، emp.Name FROM Employees AS emp را انتخاب کنید
یا

SELECT emp.ID، emp.Name FROM Employees emp - کلمه کلیدی AS را می توان حذف کرد (من این گزینه را ترجیح می دهم)

در اینجا emp یک نام مستعار برای جدول Employees است که می تواند در متن این عبارت SELECT استفاده شود. آن ها می توانیم بگوییم که در متن این عبارت SELECT به جدول یک نام جدید می دهیم.

البته در این حالت نتایج پرس و جو دقیقاً مشابه «SELECT ID, Name FROM Employees» خواهد بود. برای آنچه لازم است، بیشتر مشخص خواهد شد (حتی در این قسمت)، در حال حاضر فقط به یاد داریم که نام ستون را می توان مستقیماً با نام جدول یا با استفاده از نام مستعار قبل (مشخص) کرد. شما می توانید یکی از دو مورد را در اینجا استفاده کنید، i.e. اگر نام مستعار را مشخص کرده اید، باید از آن استفاده کنید، اما دیگر نمی توانید از نام جدول استفاده کنید.

در یک یادداشت.در ORACLE، تنها گزینه تعیین نام مستعار جدول بدون کلمه کلیدی AS مجاز است.

DISTINCT - خطوط تکراری را کنار بگذارید

کلمه کلیدی DISTINCT برای حذف ردیف های تکراری از نتیجه پرس و جو استفاده می شود. به طور کلی، تصور کنید که ابتدا کوئری بدون گزینه DISTINCT اجرا می شود و سپس همه موارد تکراری از نتیجه حذف می شوند. بیایید این را برای وضوح بیشتر با مثال نشان دهیم:

بیایید یک جدول موقت برای نمایش ایجاد کنیم CREATE TABLE #Trash (ID int NOT NULL PRIMARY KEY, Col1 varchar (10), Col2 varchar (10), Col3 varchar (10)) - این جدول را با انواع زباله پر کنید. INSERT #Trash ( ID، Col1، Col2، Col3) مقادیر (1، "A"، "A"، "A")، (2، "A"، "B"، "C")، (3، "C"، "A" "، "B")، (4، A "، A "، B ")، (5، B "، B "، B")، (6، A "، A "، " ب ") ، (7، "الف"، "الف"، "الف")، (8، "ج"، "الف"، "ب")، (9، "ج"، "الف"، "ب" ")، ( 10، "A"، "A"، "B")، (11، "A"، NULL، "B")، (12، "A"، NULL، "B") - بیایید ببینیم چه پرس و جو بدون گزینه DISTINCT SELECT Col1, Col2, Col3 FROM #Trash برمی گردد - بیایید ببینیم پرس و جو با گزینه DISTINCT چه چیزی را برمی گرداند SELECT DISTINCT Col1, Col2, Col3 FROM #Trash - جدول موقت را حذف کنید DROP TABLE #Trash

واضح است که به این شکل خواهد بود (همه موارد تکراری با یک رنگ مشخص شده اند):

اکنون بیایید با مثالی کاربردی تر به این موضوع نگاه کنیم که در کجا می توان این مورد را اعمال کرد - ما فقط شناسه های واحد منحصر به فرد را از جدول کارمندان برمی گردانیم (یعنی شناسه های دپارتمانی را که کارمندان در آن لیست شده اند را بیابیم):

شناسه دپارتمان متمایز از کارمندان را انتخاب کنید

در اینجا ما 4 خط گرفتیم، زیرا هیچ ترکیب تکراری (DepartmentID، PositionID) در جدول ما وجود ندارد.

یک لحظه به DDL برگردید

از آنجایی که داده‌های کافی برای نمونه‌های آزمایشی وجود ندارد، و می‌خواهم به طور گسترده‌تر و واضح‌تر به شما بگویم، بیایید جدول Employess خود را کمی گسترش دهیم. علاوه بر این، بیایید کمی DDL را به یاد بیاوریم، همانطور که می گویند "تکرار مادر یادگیری است"، و به علاوه بیایید کمی جلوتر بدویم و عبارت UPDATE را اعمال کنیم:

ایجاد ستون های جدید ALTER TABLE کارمندان افزودن نام خانوادگی nvarchar (30)، - نام خانوادگی FirstName nvarchar (30)، - نام MiddleName nvarchar (30)، - نام خانوادگی شناور حقوق، - و، البته، RFP در نوعی از BonusPercent float - درصد برای محاسبه پاداش از دستمزد GO - آنها را با داده ها پر می کنیم (برخی از داده ها عمدا حذف می شوند) به روز رسانی کارمندان نام خانوادگی = N "ایوانوف"، نام = N "ایوان"، نام میانی = N "ایوانوویچ"، حقوق = 5000، پاداش درصد = 50 WHERE ID = 1000 - Ivanov II به روز رسانی کارمندان SET نام خانوادگی = N "Petrov"، FirstName = N "Peter"، MiddleName = N "Petrovich"، حقوق = 1500، BonusPercent = 15 WHERE ID = 1001 - Petrov P.P. به روز رسانی کارمندان SET نام خانوادگی = N "Sidorov"، FirstName = N "Sidor"، MiddleName = NULL، حقوق = 2500، پاداش درصد = NULL WHERE ID = 1002 - Sidorov S.S. به روز رسانی کارمندان SET نام خانوادگی = N "Andreev"، FirstName = N "Andrey"، MiddleName = NULL، حقوق = 2000، BonusPercent = 30 WHERE ID = 1003 - Andreev A.A.

بیایید مطمئن شویم که داده ها با موفقیت به روز شده اند:

انتخاب * از کارکنان

شناسه نام نام خانوادگی نام کوچک نام میانی حقوق پاداش درصد
1000 ایوانف I.I. ایوانف ایوان ایوانوویچ 5000 50
1001 پتروف P.P. پتروف پیتر پتروویچ 1500 15
1002 سیدوروف S.S. سیدوروف سیدور خالی 2500 خالی
1003 آندریف A.A. آندریف آندری خالی 2000 30

تنظیم نام مستعار برای ستون های پرس و جو

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

SELECT - نامی به ستون محاسبه شده بدهید LastName + "" + FirstName + "" + MiddleName AS نام کامل، - از دو نقل قول استفاده کنید، زیرا فضا استفاده می شود HireDate به عنوان "تاریخ پذیرش"، - استفاده از براکت های مربع، از آنجا که از فضای خالی استفاده می‌شود Birthday AS [تاریخ تولد]، - کلمه AS اختیاری است حقوق ZP از کارکنان

نام و نام خانوادگی تاریخ رسید تاریخ تولد ZP
ایوانف ایوان ایوانوویچ 2015-04-08 1955-02-19 5000
پتروف پتر پتروویچ 2015-04-08 1983-12-03 1500
خالی 2015-04-08 1976-06-07 2500
خالی 2015-04-08 1982-04-17 2000

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

لطفا توجه داشته باشید، زیرا 2 کارمند آخر نام میانی (مقدار NULL) ندارند، سپس نتیجه عبارت "LastName +" "+ FirstName +" "+ MiddleName" نیز به ما NULL برگرداند.

برای پیوستن (افزودن، الحاق) رشته ها در MS SQL، از نماد "+" استفاده کنید.

به یاد داشته باشید که تمام عباراتی که در آنها NULL درگیر است (به عنوان مثال، تقسیم بر NULL، جمع با NULL) NULL را برمی گرداند.

در یک یادداشت.
در مورد ORACLE، عملگر "||" برای به هم پیوستن رشته ها استفاده می شود. و الحاق شبیه "LastName ||" "|| FirstName ||" "|| MiddleName" خواهد بود. برای ORACLE شایان ذکر است که برای انواع رشته ها استثنا دارد، برای آنها NULL و یک رشته خالی "" یکی هستند، بنابراین در ORACLE این عبارت برای 2 کارمند آخر سیدوروف سیدور و آندریف آندری باز خواهد گشت. در زمان نسخه ORACLE 12c، تا جایی که من می دانم، هیچ گزینه ای وجود ندارد که این رفتار را تغییر دهد (اگر درست نیست، لطفاً من را اصلاح کنید). در اینجا قضاوت در مورد خوب یا بد بودن آن برای من دشوار است، زیرا در برخی موارد رفتار رشته NULL مانند MS SQL و در برخی دیگر مانند ORACLE راحت تر است.

همه نام مستعار ستون بالا در ORACLE نیز معتبر هستند، به جز [...].


برای اینکه ساختار را با استفاده از تابع ISNULL حصار نکنیم، در MS SQL می توانیم از تابع CONCAT استفاده کنیم. بیایید 3 گزینه را بررسی و مقایسه کنیم:

SELECT LastName + "" + FirstName + "" + MiddleName FullName1، - 2 گزینه برای جایگزینی NULL با رشته های خالی "" (ما رفتار مشابهی را در ORACLE دریافت می کنیم) ISNULL (LastName, "") + "" + ISNULL (FirstName, "") + "" + ISNULL (MiddleName, "") FullName2, CONCAT (LastName, "", FirstName, ", MiddleName) FullName3 FROM Employees

نام کامل 1 نام کامل 2 نام کامل 3
ایوانف ایوان ایوانوویچ ایوانف ایوان ایوانوویچ ایوانف ایوان ایوانوویچ
پتروف پتر پتروویچ پتروف پتر پتروویچ پتروف پتر پتروویچ
خالی سیدوروف سیدور سیدوروف سیدور
خالی آندریف آندری آندریف آندری

در MS SQL، نام مستعار را می توان با استفاده از علامت مساوی نیز مشخص کرد:

SELECT "Date of Admission" = HireDate، - علاوه بر "…" و [...] می توانید از "…" [Date of birth] = Birthday، ZP = Salary FROM Employees استفاده کنید.

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

در نهایت می گویم که برای نام مستعار بهتر است فقط با استفاده از حروف و اعداد لاتین، از استفاده از "..."، "..." و [...] نام ها استفاده کنید، یعنی از قوانین مشابه استفاده کنید. که هنگام نامگذاری جداول از آن استفاده می کردیم. علاوه بر این، در مثال‌ها فقط از این نام‌ها استفاده می‌کنم و از «...»، «...» و [...] استفاده نمی‌کنم.

عملگرهای اساسی SQL Arithmetic


اولویت اجرای عملگرهای حسابی مانند ریاضیات است. در صورت لزوم، ترتیب عملگرها را می توان با استفاده از پرانتز تغییر داد - (a + b) * (x / (y-z)).

و یک بار دیگر تکرار می کنم که هر عملیات با NULL NULL می دهد، به عنوان مثال: 10 + NULL، NULL * 15/3، 100 / NULL - همه اینها به NULL منجر می شود. آن ها صرفاً بیان یک مقدار تعریف نشده نمی تواند نتیجه قطعی بدهد. این را هنگام نوشتن یک پرس و جو در نظر بگیرید و در صورت لزوم، مقادیر NULL را با توابع ISNULL، COALESCE پردازش کنید:

SELECT ID، نام، حقوق / 100 * BonusPercent AS Result1، - بدون پردازش مقادیر NULL Salary / 100 * ISNULL (BonusPercent، 0) AS Result2، - استفاده از تابع ISNULL حقوق و دستمزد / 100 * COALESCE (BonusPercent نتیجه، 30) - - ما از تابع COALESCE FROM Employees استفاده می کنیم

من کمی در مورد تابع COALESCE به شما می گویم:

COALESCE (expr1, expr2, ..., exprn) - اولین مقدار غیر NULL را در لیستی از مقادیر برمی‌گرداند.

SELECT COALESCE (f1, f1 * f2, f2 * f3) val - در این حالت مقدار سوم از FROM (SELECT null f1, 2 f2, 3 f3) q برگردانده می شود

اساساً، من بر روی صحبت در مورد ساختارهای DML تمرکز خواهم کرد و در بیشتر موارد در مورد توابعی که در مثال ها یافت می شوند صحبت نمی کنم. اگر متوجه نشدید که این یا آن تابع چه می کند، به دنبال توضیحات آن در اینترنت بگردید، حتی می توانید اطلاعات را به طور همزمان توسط گروهی از توابع جستجو کنید، به عنوان مثال، با جستجو در جستجوی Google "MS SQL string functions"، " توابع ریاضی MS SQL» یا «توابع MS SQL مدیریت NULL». اطلاعات زیادی در مورد توابع وجود دارد و شما به راحتی می توانید آن را پیدا کنید. به عنوان مثال، در کتابخانه MSDN، می توانید اطلاعات بیشتری در مورد تابع COALESCE بخوانید:

گزیده ای از MSDNمقایسه COALESCE و CASE

عبارت COALESCE یک میانبر نحوی برای عبارت CASE است. این بدان معنی است که کد COALESCE (expression1, ... n) توسط بهینه ساز query به صورت عبارت CASE زیر بازنویسی می شود:

مورد زمانی که (عبارت 1 تهی نیست) سپس عبارت 1 وقتی (عبارت 2 تهی نیست) سپس عبارت 2 ... عبارت ELSEN پایان

به عنوان مثال، در نظر بگیرید که چگونه می توانید از باقی مانده تقسیم (%) استفاده کنید. این عملگر زمانی که نیاز به تقسیم رکوردها به گروه دارید بسیار مفید است. به عنوان مثال، بیایید همه کارمندانی را که دارای شماره پرسنل زوج هستند (ID) بیرون بکشیم. شناسه هایی که بر 2 تقسیم می شوند:

SELECT ID, Name FROM Employees WHERE ID% 2 = 0 - باقی مانده تقسیم بر 2 0 است

ORDER BY - نتیجه پرس و جو را مرتب کنید

عبارت ORDER BY برای مرتب سازی نتیجه پرس و جو استفاده می شود.

نام خانوادگی، نام، حقوق و دستمزد از کارکنان را به ترتیب بر اساس نام خانوادگی، نام انتخاب کنید - نتیجه را بر اساس 2 ستون - بر اساس نام خانوادگی و پس از آن بر اساس نام ترتیب دهید

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

شایان ذکر است که در بند ORDER BY می توانید از فیلدهایی استفاده کنید که در بند SELECT ذکر نشده اند (به جز مواردی که از DISTINCT استفاده می شود، در زیر در مورد آن صحبت خواهم کرد). به عنوان مثال، من با استفاده از گزینه TOP کمی جلوتر می‌روم و نشان می‌دهم که چگونه، برای مثال، می‌توانید 3 کارمندی را که بالاترین حقوق را دارند انتخاب کنید، با توجه به اینکه نباید خود حقوق را برای حفظ محرمانه بودن نشان دهم:

SELECT TOP 3 - فقط 3 رکورد اول را از کل نتیجه برگردانید ID، نام خانوادگی، نام از کارمندان ترتیب بر اساس حقوق DESC - نتیجه را به ترتیب نزولی حقوق مرتب کنید

شناسه نام خانوادگی نام کوچک
1000 ایوانف ایوان
1002 سیدوروف سیدور

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

SELECT TOP 3 - فقط 3 رکورد اول را از کل نتیجه برگردانید ID، نام خانوادگی، نام از کارکنان ORDER BY DESC حقوق، - 1. مرتب سازی نتیجه به ترتیب نزولی تاریخ تولد حقوق، - 2. سپس بر اساس تاریخ تولد ID DESC - 3. و برای عدم ابهام کامل نتیجه مرتب سازی بر اساس ID را اضافه می کنیم

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

مرتب سازی را می توان با استفاده از عبارات مختلف در عبارت ORDER BY نیز انجام داد:

نام خانوادگی، نام خانوادگی را از کارمندان به ترتیب بر اساس CONCAT انتخاب کنید (Name, ", FirstName) - از عبارت استفاده کنید

همچنین در ORDER BY می توانید از نام مستعار مشخص شده برای ستون ها استفاده کنید:

SELECT CONCAT (LastName, ", FirstName) fi FROM Employees ORDER BY fi - با استفاده از نام مستعار

لازم به ذکر است که در مورد استفاده از بند DISTINCT فقط از ستون های لیست شده در بلوک SELECT می توان در بند ORDER BY استفاده کرد. آن ها پس از اعمال عملیات DISTINCT، یک مجموعه داده جدید با مجموعه جدیدی از ستون ها دریافت می کنیم. به همین دلیل، مثال زیر کار نخواهد کرد:

SELECT DISTINCT LastName, First Name, Salary FROM Employees ORDER BY ID - ID در مجموعه نهایی که با استفاده از DISTINCT دریافت کردیم وجود ندارد

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

یادداشت 1.همچنین، در بند ORDER BY، می توانید از شماره ستون های فهرست شده در SELECT استفاده کنید:

نام خانوادگی، نام، حقوق و دستمزد از کارمندان به ترتیب - ترتیب به ترتیب 3 DESC، - 1. کاهش حقوق 1، - 2. بر اساس نام خانوادگی 2 - 3. بر اساس نام

برای مبتدیان، راحت و وسوسه انگیز به نظر می رسد، اما بهتر است این گزینه مرتب سازی را فراموش کرده و هرگز استفاده نکنید.

اگر در این حالت (زمانی که فیلدها به صراحت لیست شده اند)، این گزینه همچنان قابل قبول است، پس برای مورد استفاده از "*" بهتر است هرگز از این گزینه استفاده نکنید. چرا - زیرا اگر شخصی، برای مثال، ترتیب ستون‌ها را در جدول تغییر دهد، یا ستون‌ها را حذف کند (و این یک وضعیت عادی است)، درخواست شما نیز ممکن است کار کند، اما در حال حاضر نادرست است، زیرا مرتب سازی می تواند در ستون های دیگر انجام شود و این موذیانه است زیرا ممکن است این خطا خیلی زود شناسایی نشود.

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

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

تبصره 2.
در MS SQL، هنگام مرتب‌سازی به ترتیب صعودی، ابتدا مقادیر NULL ظاهر می‌شوند.

BonusPercent از کارکنان سفارش بر اساس BonusPercent را انتخاب کنید

بر این اساس، هنگام استفاده از DESC، آنها در پایان خواهند بود

انتخاب پاداش درصد از کارکنان سفارش بر اساس پاداش درصد DESC

اگر نیاز به تغییر منطق برای مرتب سازی مقادیر NULL دارید، از عبارات استفاده کنید، به عنوان مثال:

انتخاب پاداش درصد از کارکنان به سفارش ISNULL (درصد پاداش، 100)

ORACLE 2 گزینه برای این منظور ارائه می دهد NULLS FIRST و NULLS LAST (به طور پیش فرض استفاده می شود). مثلا:

انتخاب پاداش درصد از کارکنان سفارش بر اساس پاداش درصد DESC NULLS LAST

هنگام جابجایی به یک پایگاه داده خاص به این نکته توجه کنید.

TOP - تعداد مشخص شده رکوردها را برگردانید

گزیده ای از MSDN. TOP - تعداد ردیف های برگشتی در نتیجه پرس و جو را به تعداد یا درصد مشخصی محدود می کند. اگر عبارت TOP همراه با عبارت ORDER BY استفاده شود، مجموعه نتایج به N ردیف اول نتیجه مرتب شده محدود می شود. در غیر این صورت، N ردیف اول به ترتیب نامشخص برگردانده می شوند.

معمولاً این عبارت با عبارت ORDER BY استفاده می‌شود و ما قبلاً به مثال‌هایی نگاه کرده‌ایم که لازم بود N ردیف اول را از مجموعه نتیجه برگردانیم.

بدون ORDER BY، این بند معمولاً زمانی استفاده می شود که شما فقط باید به یک جدول ناشناخته برای ما نگاه کنید، که ممکن است رکوردهای زیادی در آن وجود داشته باشد، در این مورد، به عنوان مثال، می توانیم فقط 10 ردیف اول را به ما برگردانیم. ، اما برای وضوح، فقط 2 می گوییم:

انتخاب TOP 2 * از کارکنان

همچنین می‌توانید کلمه PERCENT را تعیین کنید تا درصد مربوط به ردیف‌ها را از مجموعه نتایج برگردانید:

25 درصد برتر * از کارمندان را انتخاب کنید

در تمرین من، این انتخاب بر اساس تعداد ردیف ها است که بیشتر مورد استفاده قرار می گیرد.

همچنین می‌توانید از گزینه WITH TIES با TOP استفاده کنید، که به بازگشت همه ردیف‌ها در صورت مرتب‌سازی مبهم کمک می‌کند، یعنی. این جمله تمام ردیف هایی را که از نظر ترکیب برابر هستند به ردیف هایی که در انتخاب TOP N قرار می گیرند برمی گرداند، در نتیجه می توان بیش از N ردیف را انتخاب کرد. بیایید یک "برنامه نویس" دیگر با حقوق 1500 برای نمایش اضافه کنیم:

درج کارمندان (شناسه، نام، ایمیل، شناسه موقعیت، شناسه بخش، شناسه مدیر، حقوق) VALUES (1004، N "Nikolaev N.N."، " [ایمیل محافظت شده]",3,3,1003,1500)

و یک کارمند دیگر را بدون تعیین سمت و قسمت با حقوق 2000 معرفی می کنیم:

درج کارمندان (شناسه، نام، ایمیل، شناسه موقعیت، شناسه بخش، شناسه مدیر، حقوق) VALUES (1005، N "Aleksandrov A.A."، " [ایمیل محافظت شده]"، NULL، NULL، 1000،2000)

حالا بیایید از گزینه WITH TIES استفاده کنیم تا همه کارمندانی که حقوق آنها با حقوق 3 کارمند مطابقت دارد را با کمترین حقوق انتخاب کنیم (امیدوارم بعداً مشخص شود که در حال رانندگی چه هستم):

3 تاپ برتر را با شناسه، نام، حقوق و دستمزد از کارمندان به ترتیب بر اساس حقوق انتخاب کنید

در اینجا، اگرچه TOP 3 نشان داده شده است، درخواست 4 رکورد را برگرداند ارزش حقوقی که TOP 3 را برگرداند (1500 و 2000) در 4 کارمند یافت شد. ظاهراً اینگونه عمل می کند:

در یک یادداشت.
در پایگاه داده های مختلف، TOP به روش های مختلف پیاده سازی می شود، در MySQL یک بند LIMIT برای این وجود دارد که در آن می توانید یک افست اولیه را نیز تنظیم کنید.

در ORACLE 12c، آنها همچنین آنالوگ خود را با ترکیب عملکرد TOP و LIMIT - جستجو با کلمات "ORACLE OFFSET FETCH" معرفی کردند. قبل از 12c، شبه ستون ROWNUM معمولاً برای این منظور استفاده می شد.


اما اگر بندهای DISTINCT و TOP را همزمان اعمال کنید چه اتفاقی می‌افتد؟ پاسخ به این سوالات از طریق آزمایش آسان است. به طور کلی، نترسید و برای آزمایش تنبل نباشید، tk. بیشتر آن در عمل آموخته می شود. ترتیب کلمات در عبارت SELECT به شرح زیر است، ابتدا DISTINCT و سپس TOP، یعنی. اگر منطقی فکر کنید و از چپ به راست بخوانید، اولین مورد دور انداختن موارد تکراری است و سپس TOP در این مجموعه ساخته می شود. خوب، بیایید بررسی کنیم و مطمئن شویم که این مورد است:

2 حقوق و دستمزد بالا را از کارمندان به ترتیب بر اساس حقوق انتخاب کنید

حقوق
1500
2000

آن ها در نتیجه ما 2 کمترین حقوق را گرفتیم. البته ممکن است موردی وجود داشته باشد که حقوق برخی از کارمندان مشخص نباشد (NULL) زیرا این طرح به ما امکان می دهد این کار را انجام دهیم. بنابراین، بسته به وظیفه، تصمیم می‌گیریم یا مقادیر NULL را در بند ORDER BY پردازش کنیم، یا به سادگی تمام رکوردهایی را که در آنها Salary NULL است کنار بگذاریم و برای این کار به مطالعه بند WHERE روی می‌آوریم.

WHERE - شرط برای انتخاب ردیف

این پیشنهاد برای فیلتر کردن رکوردها بر اساس یک شرایط مشخص استفاده می‌شود. به عنوان مثال، بیایید همه کارکنان شاغل در بخش "IT" را انتخاب کنیم (شناسه آن = 3):

SELECT ID، نام خانوادگی، نام، حقوق و دستمزد از کارکنان WHERE DepartmentID = 3 - IT ORDER BY LastName, First Name

شناسه نام خانوادگی نام کوچک حقوق
1004 خالی خالی 1500
1003 آندریف آندری 2000
1001 پتروف پیتر 1500

عبارت WHERE قبل از دستور ORDER BY نوشته می شود.

ترتیب اعمال دستورات بر روی مجموعه اصلی Employees به شرح زیر است:

  1. WHERE - اگر مشخص شده باشد، اولین چیزی از کل مجموعه کارمندان این است که فقط رکوردهایی را انتخاب کنید که شرایط را برآورده کنند.
  2. DISTINCT - در صورت مشخص شدن، همه موارد تکراری کنار گذاشته می شوند
  3. ORDER BY - در صورت مشخص شدن، مرتب سازی نتیجه انجام می شود
  4. TOP - در صورت مشخص شدن، فقط تعداد مشخص شده رکورد از نتیجه مرتب شده برگردانده می شود

بیایید برای وضوح مثالی را در نظر بگیریم:

انتخاب 1 حقوق و دستمزد متمایز از کارمندان WHERE DepartmentID = 3 سفارش بر اساس حقوق

شبیه این خواهد شد:

شایان ذکر است که بررسی NULL با علامت مساوی انجام نمی شود، بلکه با استفاده از عملگرهای IS NULL و IS NOT NULL انجام می شود. فقط به یاد داشته باشید که نمی توانید با استفاده از عملگر "=" (علامت برابر) با NULL مقایسه کنید، زیرا نتیجه عبارت نیز NULL خواهد بود.

به عنوان مثال، بیایید همه کارمندانی را انتخاب کنیم که بخش مشخصی ندارند (به عنوان مثال DepartmentID IS NULL):

SELECT ID، نام از کارکنان WHERE DepartmentID IS NULL

اکنون، برای مثال، اجازه دهید پاداش را برای همه کارمندانی که دارای مقدار BonusPercent هستند (یعنی BonusPercent IS NOT NULL) محاسبه کنیم:

شناسه، نام، حقوق و دستمزد / 100 * پاداش درصد به عنوان پاداش از کارکنان در جایی که پاداش درصد تهی نیست

ضمناً، اگر فکر کنید، مقدار BonusPercent می تواند صفر باشد (0) و مقدار را نیز می توان با علامت منفی وارد کرد، زیرا ما هیچ محدودیتی در این زمینه اعمال نکردیم.

خوب، پس از صحبت در مورد مشکل، تا کنون به ما گفته شده است که اگر (BonusPercent<=0 или BonusPercent IS NULL), то это означает что у сотрудника так же нет бонуса. Для начала, как нам сказали, так и сделаем, реализуем это при помощи логического оператора OR и NOT:

SELECT ID، نام، حقوق / 100 * پاداش درصد به عنوان پاداش از کارکنان WHERE NOT ( پاداش درصد<=0 OR BonusPercent IS NULL)

آن ها در اینجا ما شروع به مطالعه عملگرهای بولی کردیم. عبارت در پرانتز "(BonusPercent<=0 OR BonusPercent IS NULL)» проверяет на то что у сотрудника нет бонуса, а NOT инвертирует это значение, т.е. говорит «верни всех сотрудников которые не сотрудники у которых нет бонуса».

همچنین، این عبارت را می توان بازنویسی کرد و بلافاصله گفت: «همه کارکنانی که پاداش دارند را بازگردانید» و این را با عبارت (BonusPercent> 0 and BonusPercent IS NOT NULL) بیان می کند:

شناسه، نام، حقوق و دستمزد / 100 * پاداش درصد به عنوان پاداش از کارمندان WHERE BonusPercent> 0 AND BonusPercent IS NULL

همچنین، در عبارت WHERE، می توانید انواع عبارات را با استفاده از عملگرها و توابع حسابی بررسی کنید. به عنوان مثال، یک بررسی مشابه را می توان با استفاده از یک عبارت با تابع ISNULL انجام داد:

SELECT ID، نام، حقوق / 100 * BonusPercent به عنوان پاداش از کارکنان WHERE ISNULL (BonusPercent, 0)> 0

عملگرهای بولی و مقایسه ساده

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

فقط 3 عملگر Boolean در SQL وجود دارد - AND، OR و NOT:

برای هر عملگر بولی، می توانید جداول صدق را بیاورید، که علاوه بر این نشان می دهد که وقتی شرایط برابر با NULL باشد، نتیجه چه خواهد بود:

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

به علاوه 2 عملگر برای آزمایش یک مقدار / عبارت برای NULL وجود دارد:

تهی است بررسی برابری NULL
پوچ نیست بررسی نابرابری NULL

اولویت: 1) همه عملگرهای مقایسه. 2) نه؛ 3) و 4) OR.

هنگام ساخت عبارات منطقی پیچیده، از پرانتز استفاده می شود:

((شرط 1 و شرط 2) یا نه (شرط 3 و شرط4 و شرط5)) یا (...)

همچنین با استفاده از پرانتز می توانید ترتیب استاندارد محاسبات را تغییر دهید.

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

به پایان قسمت دوم می رویم

همانطور که می بینید، حتی در مورد نحو اصلی دستور SELECT، می توانید برای مدت طولانی صحبت کنید، اما برای اینکه در چارچوب مقاله بمانید، در پایان عملگرهای منطقی اضافی را نشان خواهم داد - BETWEEN، IN و پسندیدن.

BETWEEN - ورود به محدوده را بررسی کنید

Tested_value بین start_value و end_value

عبارات را می توان به عنوان مقادیر استفاده کرد.

بیایید مثالی بزنیم:

شناسه، نام، حقوق و دستمزد از کارمندانی که حقوق بین 2000 تا 3000 را انتخاب کنید - دارای حقوق بین 2000 تا 3000

در واقع، BETWEEN یک نماد ساده شده است مانند:

SELECT ID، نام، حقوق و دستمزد از کارکنان WHERE حقوق> = 2000 و حقوق<=3000 -- все у кого ЗП в диапозоне 2000-3000

قبل از کلمه BETWEEN می توان از کلمه NOT استفاده کرد که مقدار وارد نشدن محدوده مشخص شده را بررسی می کند:

شناسه، نام، حقوق و دستمزد از کارکنان را انتخاب کنید، جایی که حقوق بین 2000 و 3000 نیست - مشابه NOT (حقوق> = 2000 و حقوق<=3000)

بر این اساس، در مورد استفاده از BETWEEN، IN، LIKE، می توانید با استفاده از AND و OR آنها را با شرایط دیگر ترکیب کنید:

شناسه، نام، حقوق و دستمزد از کارکنان را انتخاب کنید WHERE حقوق بین 2000 تا 3000 - دارای حقوق بین 2000-3000 و شناسه دپارتمان = 3 - فقط تعداد کارکنان بخش 3

IN - ورود به لیست مقادیر را بررسی کنید

این اپراتور به شکل زیر است:

Tested_value IN (value1, value2, ...)

من فکر می کنم نشان دادن آن با یک مثال ساده تر است:

شناسه، نام، حقوق و دستمزد از کارکنان WHERE PositionID IN (3،4) - که دارای موقعیت 3 یا 4 است

آن ها اساساً همان عبارت زیر است:

شناسه، نام، حقوق و دستمزد از کارکنان WHERE PositionID = 3 OR PositionID = 4 - که دارای موقعیت 3 یا 4 است

در مورد NOT، این یکسان خواهد بود (ما همه را به جز کسانی که از بخش 3 و 4 هستند دریافت می کنیم):

SELECT ID، نام، حقوق و دستمزد از کارکنان WHERE PositionID NOT IN (3،4) - مشابه NOT (PositionID = 3 OR PositionID = 4)

همچنین، یک درخواست با NOT IN را می توان از طریق AND بیان کرد:

شناسه، نام، حقوق و دستمزد از کارکنان WHERE PositionID را انتخاب کنید<>3 و شناسه موقعیت<>4 - معادل PositionID NOT IN (3،4)

توجه داشته باشید که نمی توانید مقادیر NULL را با استفاده از عبارت IN جستجو کنید، زیرا بررسی NULL = NULL نیز NULL را برمی گرداند، نه True:

SELECT ID، نام، DepartmentID FROM Employees WHERE DepartmentID IN (1،2، NULL) - رکوردهای NULL در نتیجه گنجانده نمی شوند

در این مورد، چک را به چند شرط تقسیم کنید:

شناسه، نام، شناسه بخش از کارمندان WHERE ID IN (1،2) - 1 یا 2 یا شناسه Department IS NULL - یا NULL انتخاب کنید

یا می توانید چیزی مانند این بنویسید:

SELECT ID، نام، DepartmentID FROM Employees WHERE ISNULL (DepartmentID, -1) IN (1,2, -1) - اگر مطمئن هستید که هیچ بخش با ID = -1 وجود ندارد

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

همچنین شایان ذکر است که یک اشتباه موذیانه تر مربوط به NULL که می تواند هنگام استفاده از ساختار NOT IN انجام شود، ذکر شود. به عنوان مثال، بیایید سعی کنیم همه کارمندان را انتخاب کنیم، به جز کسانی که دپارتمان آنها برابر با 1 است یا دپارتمان آنها اصلا مشخص نشده است. NULL است. به عنوان راه حل، این گزینه خود را نشان می دهد:

شناسه، نام، شناسه دپارتمان را از کارکنان که در آن قسمت شناسه نیست (1، NULL) انتخاب کنید

اما پس از اجرای کوئری، حتی یک سطر دریافت نمی کنیم، اگرچه انتظار داشتیم موارد زیر را مشاهده کنیم:

باز هم، شوخی در اینجا توسط NULL مشخص شده در لیست مقادیر پخش شد.

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

SELECT ID، نام، DepartmentID FROM Employees WHERE DepartmentID<>1 و بخش شناسه<>NULL - مشکل به دلیل این بررسی NULL - این شرط همیشه NULL را برمی گرداند

وضعیت مناسب (شناسه بخش<>NULL) همیشه در اینجا عدم قطعیت به ما می دهد، یعنی. خالی. حالا بیایید جدول حقیقت را برای عملگر AND به یاد بیاوریم، جایی که (TRUE AND NULL) NULL را می دهد. آن ها وقتی شرط سمت چپ برآورده شد (DepartmentID<>1) به دلیل وضعیت نامشخص درست، در نتیجه، مقدار تعریف نشده کل عبارت (DepartmentID) را دریافت می کنیم.<>1 و بخش شناسه<>NULL)، بنابراین رشته در نتیجه گنجانده نمی شود.

می توانید شرط را به صورت صحیح بازنویسی کنید:

شناسه، نام، شناسه دپارتمان را از کارمندان در جایی که DepartmentID در (1) نیست - یا در این مورد فقط شناسه بخش<>1 AND DepartmentID NOT NULL نیست - و به طور جداگانه NOT NULL را بررسی کنید

هنوز هم می‌توان از IN برای سوالات فرعی استفاده کرد، اما در بخش‌های بعدی این آموزش به آن فرم باز خواهیم گشت.

LIKE - یک رشته را در مقابل یک الگو بررسی کنید

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

این اپراتور به شکل زیر است:

Tested_string مانند string_pattern

کاراکترهای ویژه زیر را می توان در "pattern_string" استفاده کرد:

  1. خط زیر "_" - می گوید که در جای خود می تواند هر شخصیت منفرد باشد
  2. علامت درصد "%" - می گوید که در جای خود می تواند هر تعداد کاراکتر باشد، از جمله هیچ کدام
بیایید نمونه هایی را با نماد "%" در نظر بگیریم (به هر حال، در عمل بیشتر از آن استفاده می شود):

SELECT ID, Name FROM Employees WHERE Name LIKE "Pet%" - که نام آنها با حروف "Pet" شروع می شود ID SELECT، LastName FROM Employees WHERE LastName LIKE "% s" - نام خانوادگی که با "s" ختم می شود SELECT ID، LastName FROM کارمندان WHERE LastName LIKE "% pe%" - که نام خانوادگی آنها حاوی ترکیب "pe" است

بیایید به مثال هایی با نماد "_" نگاه کنیم:

SELECT ID, LastName FROM Employees WHERE LastName LIKE "_yetrov" - برای آنهایی که نام خانوادگی شامل هر کاراکتر اول و به دنبال آن حروف "etrov" SELECT ID, LastName FROM Employees WHERE LastName LIKE "____ s" - نام خانوادگی چه کسانی است هر چهار کاراکتر و حروف بعدی "s"

با کمک ESCAPE می توانید یک کاراکتر فرار را مشخص کنید که عمل اعتبارسنجی کاراکترهای ویژه "_" و "%" را لغو می کند. این بند زمانی استفاده می‌شود که می‌خواهید مستقیماً وجود یک علامت درصد یا زیرخط را در یک رشته بررسی کنید.

برای نشان دادن ESCAPE، بیایید مقداری زباله را در یک ورودی قرار دهیم:

به روز رسانی کارمندان SET FirstName = "It's_trash حاوی %" WHERE ID = 1005

و بیایید ببینیم که پرس و جوهای زیر چه چیزی را برمی گرداند:

SELECT * FROM Employees WHERE FirstName LIKE "%! %%" ESCAPE "!" - خط حاوی علامت "%" SELECT * FROM Employees WHERE FirstName LIKE "%! _%" ESCAPE "!" - خط حاوی "_" است

اگر باید یک رشته را برای مطابقت کامل بررسی کنید، به جای LIKE بهتر است فقط از علامت "=" استفاده کنید:

SELECT * FROM Employees WHERE FirstName = "Peter"

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

ORACLE از تابع REGEXP_LIKE برای جستجوی عبارات منظم استفاده می کند.

کمی در مورد رشته ها

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

SELECT ID, Name FROM Employees WHERE Name LIKE N "Pet%" SELECT ID, LastName FROM Employees WHERE LastName = N "Petrov"

اگر به درستی انجام شود، هنگام مقایسه با یک فیلد از نوع varchar (ASCII)، باید سعی کنید از چک با استفاده از "..." استفاده کنید، و هنگام مقایسه یک فیلد با نوع nvarchar (یونیکد)، باید سعی کنید از چک ها با استفاده از N استفاده کنید. ...». این کار برای جلوگیری از تبدیل نوع ضمنی در طول اجرای پرس و جو انجام می شود. هنگام درج مقادیر (INSERT) در یک فیلد یا به روز رسانی آنها (UPDATE) از همین قانون استفاده می شود.

هنگام مقایسه رشته ها، شایان ذکر است که، بسته به تنظیمات پایگاه داده (ترکیب)، مقایسه رشته ها می تواند به حروف بزرگ و کوچک (زمانی که "Petrov" = "PETROV") یا حساس به حروف بزرگ و کوچک (زمانی که "Petrov" است، باشد.<>"PETROV").
در مورد تنظیمات حساس به حروف کوچک و بزرگ، اگر می‌خواهید جستجوی غیرحساس به حروف بزرگ و کوچک داشته باشید، می‌توانید برای مثال، یک تبدیل اولیه عبارت سمت راست و چپ را به یک حروف بزرگ و کوچک - بالا یا پایین انجام دهید:

SELECT ID, Name FROM Employees WHERE UPPER (Name) LIKE UPPER (N "Pet%") - or LOWER (Name) LIKE LOWER (N "Pet%") SELECT ID, LastName FROM Employees WHERE UPPER (LastName) = UPPER (N) "Petrov") - یا LOWER (LastName) = LOWER (N "Petrov")

کمی در مورد خرما

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

صرف نظر از تنظیمات منطقه ای در MS SQL، می توانید از دستور تاریخ زیر "YYYYMMDD" (سال، ماه، روز به هم پیوسته بدون فاصله) استفاده کنید. MS SQL همیشه این قالب تاریخ را درک می کند:

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

در برخی موارد، تنظیم تاریخ با استفاده از تابع DATEFROMPARTS راحت تر است:

SELECT ID، نام، تولد از کارکنان WHERE Birthday BETWEEN DATEFROMPARTS (1980,1,1) AND DATEFROMPARTS (1989,12,31) ترتیب بر اساس تاریخ تولد

همچنین یک تابع مشابه DATETIMEFROMPARTS وجود دارد که برای تنظیم تاریخ و زمان (برای نوع تاریخ) استفاده می شود.

همچنین در صورت نیاز به تبدیل رشته به تاریخ یا مقدار تاریخ، می توانید از تابع CONVERT استفاده کنید:

SELECT CONVERT (تاریخ، "03/12/2015"، 104)، CONVERT (تاریخ، "2014-11-30 17:20:15"، 120)

مقادیر 104 و 120 نشان می دهد که کدام فرمت تاریخ در رشته استفاده شده است. با جستجوی عبارت "MS SQL CONVERT" می توانید شرحی از تمام فرمت های معتبر در کتابخانه MSDN بیابید.

توابع زیادی برای کار با تاریخ در MS SQL وجود دارد، به دنبال "توابع ms sql برای کار با تاریخ" باشید.

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

کمی در مورد اعداد و تبدیل آنها

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

برخلاف تابع تبدیل CAST، تابع CONVERT به شما امکان می دهد پارامتر سومی را تنظیم کنید که مسئول سبک (فرمت) تبدیل است. انواع داده های مختلف می توانند مجموعه ای از سبک های خاص خود را داشته باشند که می تواند بر نتیجه برگشتی تأثیر بگذارد. زمانی که به تبدیل رشته با تابع CONVERT به انواع تاریخ و تاریخ زمان نگاه کردیم، قبلاً استفاده از سبک ها را لمس کرده ایم.

جزئیات بیشتر در مورد CAST، CONVERT و سبک‌ها را می‌توانید در MSDN بیابید - "CAST and CONVERT Functions (Transact-SQL)": msdn.microsoft.com/ru-ru/library/ms187928.aspx

برای ساده‌سازی مثال‌ها، از دستورات Transact-SQL DECLARE و SET در اینجا استفاده می‌شود.

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

DECLARE @min_int int SET @ min_int = -2147483648 DECLARE @max_int int SET @ max_int = 2147483647 SELECT - (-2147483648) @ min_int, CAST (@min_int AS float), CONVERT @min_int AS float, CONVERT@347 (@max_int AS float)، CONVERT (float, @ max_int)، - عددی (16.6) @ min_int / 1.، - (-2147483648.000000) @ max_int / 1. - 2147483647.000000

شاید ارزش تعیین روش تبدیل ضمنی حاصل از تقسیم بر (1) را نداشته باشد، زیرا برای کنترل بیشتر بر نوع نتیجه به دست آمده، توصیه می شود سعی کنید تبدیل های صریح انجام دهید. اگر چه در صورتی که بخواهیم نتیجه ای از نوع عددی بدست آوریم، با تعداد ارقام مشخص شده بعد از نقطه اعشار، در MS SQL می توانیم ترفندی را با ضرب یک عدد صحیح در (1., 1.0, 1.00 و غیره) اعمال کنیم. ):

اعلام @int int SET @ int = 123 SELECT @ int * 1.، - عددی (12، 0) - 0 رقم اعشار @ int * 1.0، - عددی (13، 1) - 1 نویسه @ int * 1.00، - عددی ( 14، 2) - 2 کاراکتر - اگرچه گاهی اوقات بهتر است یک تبدیل صریح CAST (@int AS عددی (20، 0))، - 123 CAST (@int AS عددی (20، 1))، - 123.0 CAST ( @int AS عددی (20، 2)) - 123.00

در برخی موارد، جزئیات تبدیل می تواند بسیار مهم باشد زیرا آنها بر صحت نتیجه به دست آمده تأثیر می گذارند، به عنوان مثال، هنگام تبدیل یک مقدار عددی به یک رشته (varchar). بیایید به نمونه هایی از تبدیل پول و مقادیر شناور به varchar نگاه کنیم:

رفتار هنگام تبدیل پول به varchar اعلام کنید @money money SET @money = 1025.123456789 - تبدیل ضمنی به 1025.1235 وجود خواهد داشت، زیرا نوع پول فقط 4 رقم بعد از نقطه اعشار SELECT @money، - 1025.1235 ذخیره می کند - به طور پیش فرض، CAST و CONVERT یکسان رفتار می کنند (به عنوان مثال، به طور کلی، سبک 0 اعمال می شود) CAST (@money به عنوان varchar (20))، - 1025.12 CONVERT (varchar (20)، @money)، - 1025.12 CONVERT (varchar (20)، @money، 0)، - 1025.12 (سبک 0 - بدون جداکننده هزارم و 2 رقم اعشار (قالب پیش‌فرض)) CONVERT (varchar (20) ، @money، 1)، - 1025.12 (سبک 1 - استفاده از جداکننده هزارم و 2 رقم اعشار) تبدیل (varchar (20)، @money، 2) - 1025.1235 (سبک 2 - بدون جداکننده و 4 رقم پس از اعشار)

رفتار در هنگام تبدیل float برای اعلان varchar و @ SET شناور float1 @ float1 = 1025.123456789 اعلام @ SET شناور float2 @ float2 = 1،231،025.123456789 SELECT @ float1، - 1025.123456789 @ float2، - 1،231،025.12345679 - رفتار همان CAST و تبدیل به طور پیش فرض است که، تقریبا صحبت کردن، سبک 0 اعمال می شود) - سبک 0 - حداکثر 6 رقم. در صورت لزوم، از نماد نمایی اعداد استفاده می شود - هنگام تبدیل به varchar، چیزهای واقعا وحشتناکی در اینجا اتفاق می افتد CAST (@ float1 به عنوان varchar (20))، - 1025.12 CONVERT (varchar (20)، @ float1)، - 1025.12 CONVERT (varchar ( 20)، @ float1، 0)، - 1025.12 CAST (@ float2 به عنوان varchar (20))، - 1.23103e + 006 CONVERT (varchar (20)، @ float2)، - 1.23103e + 006 CONVERT (varchar (20)، @ float2، 0)، - 1.23103e + 006 - سبک 1 - همیشه 8 بیت. نماد نمایی همیشه استفاده می شود. - این سبک برای شناور نیز بسیار دقیق نیست CONVERT (varchar (20)، @ float1، 1)، - 1.0251235e + 003 CONVERT (varchar (20)، @ float2، 1)، - 1.2310251e + 006 - سبک 2 - همیشه 16 بیتی نماد نمایی همیشه استفاده می شود. - در اینجا با دقت بهتر تبدیل (varchar (30)، @ float1، 2)، - 1.025123456789000e + 003 - OK CONVERT (varchar (30)، @ float2، 2) - 1.231025123456789 - OK

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

اگر نیاز به کنترل صریح دقت تا یک علامت خاص، بیش از 4 دارید، گاهی اوقات بهتر است از نوع اعشاری / عددی برای ذخیره داده ها استفاده کنید. اگر 4 کاراکتر کافی است، می توانید از نوع پول استفاده کنید - تقریباً با عدد (20،4) مطابقت دارد.

دهدهی و اعلام عددیmoney SET پولmoney = 1،025.123456789-1025.1235 اعلام @ float1 SET شناور @ float1 = 1025.123456789 اعلام @ SET شناور float2 @ float2 = 1،231،025.123456789 DECLAREnumeric Cumeric (2867) SET45numeric عنوان VARCHAR (20))، - 1025.12345679 CONVERT (VARCHAR (20)،numeric)، - 1025.12345679 CAST (money به عنوان عددی (28،9))، - 1025.123500000 CAST (@ float1 به عنوان عددی (28، 9))، - 1025.123456789 CAST (@ float2 به عنوان عددی (28,9)) - 1231025.123456789

توجه داشته باشید.
از MS SQL 2008، می توانید به جای ساختار زیر استفاده کنید:
  • سرور ms sql
  • افزودن برچسب

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