نمونه های sql را قطع کنید. عملگر مجموعه داده های INTERSECT. مثال سازنده بلوک داده

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

تفاوت های ظریف

اغلب از من سوال می شود که این مقاله برای چه کسانی است؟ اما، باور کنید، پاسخ دادن همیشه آسان نیست: از یک طرف، توسعه دهندگان نینجا وجود دارند که به سختی می توان با هر چیزی شگفت زده کرد، و از طرف دیگر، پاداوان های جوان. اما یک چیز را می توانم با اطمینان بگویم - برای خواننده ای که به SQL علاقه دارد، که می تواند تصویر غنی خود را با جزئیات کوچک اما بسیار جالب تکمیل کند. این مقاله شامل صفحات کیلومتری پرس و جوی sql، حداکثر 1، 2 خط، و فقط مواردی که به نظر من نادر است، نخواهد بود. اما از آنجایی که من می خواهم کاملاً صریح باشم، اگر با sql روی خود هستید، مقاله خسته کننده به نظر می رسد. تمام مثال های مقاله به استثنای مورد اول و چهارم را می توان به استاندارد SQL-92 نسبت داد.

داده ها

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

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

کالاهای جدول را ایجاد کنید (id bigint NOT NULL، نویسه نام متفاوت است(127) NOT NULL، نویسه توضیحات متفاوت است(255) NOT NULL، عدد قیمت (16،2) NOT NULL، نویسه مقاله متفاوت (20) NOT NULL، زمان act_time نه NULL , در دسترس بودن بولی NOT NULL, CONSTRAINT pk_goods PRIMARY KEY (id)); INSERT INTO کالا (شناسه، نام، توضیحات، قیمت، مقاله، زمان عمل، در دسترس بودن) VALUES (1، "دمپایی"، "نرم"، 100.00، "TR-75"، (ts "2017-01-01 01:01: 01.01")، TRUE)؛ INSERT INTO کالا (شناسه، نام، توضیحات، قیمت، مقاله، زمان عمل، در دسترس بودن) VALUES (2، "بالش"، "سفید"، 200.00، "PR-75"، (ts "2017-01-02 02:02: 02.02")، TRUE)؛ INSERT INTO کالا (شناسه، نام، توضیحات، قیمت، مقاله، زمان عمل، در دسترس بودن) VALUES (3، "Blanket"، "Down"، 300.00، "ZR-75"، (ts "2017-01-03 03:03: 03.03")، TRUE)؛ INSERT INTO کالا (شناسه، نام، توضیحات، قیمت، مقاله، زمان عمل، در دسترس بودن) VALUES (4، "روبالشی"، "خاکستری"، 400.00، "AR-75"، (ts "04-01-2017 04:04: 04.04")، FALSE)؛ INSERT INTO کالا (شناسه، نام، توضیحات، قیمت، مقاله، زمان عمل، در دسترس بودن) VALUES (5، "ورق"، "Silk"، 500.00، "BR-75"، (ts "2017-01-05 05:05: 05.05")، FALSE)؛

درخواست ها

1. نقل قول دوگانه

و اولین چیزی که من دارم یک سوال ساده است: می توانید مثالی از پرس و جوی sql با استفاده از آن بیاورید دو برابرنقل قول هابله، نه با یک نفر، دوبل؟

مثال با نقل قول های دوگانه

نام "نام محصول" را از کالاها انتخاب کنید


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

شاید زیاد به نظر نرسد مثال مفیدبرای توسعه واقعی برای من اینطور نیست. اکنون من به طور فعال از آن در تمام sql-blank های خود استفاده می کنم. نتیجه ساده است، وقتی در نیم سال به یک پرس و جوی sql از 40 ستون برگردید، آه، چگونه نام "ما" آنها ذخیره می شود. علیرغم این واقعیت که من در مورد SQL-92 اشاره نکردم، در آخرین نسخه به نقل قول های دوگانه اشاره شده است.

2. جدول شبه. SQL-92

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

جدول شبه

SELECT mock.nickname "Nickname"، (CASE WHEN mock.huff THEN "Yes" ELSE "No" END) "Huffed?" FROM (انتخاب نام به عنوان نام مستعار، در دسترس بودن AS huff FROM کالا) مسخره کردن

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

3. سازنده بلوک داده. SQL-92

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

مثال سازنده بلوک داده

نام را انتخاب کنید "نام محصول"، قیمت "قیمت" FROM (VALUES ("دمپایی"، 100.00)، ("بالش"، 200.00)) به عنوان کالا (نام، قیمت)

نام محصول قیمت
دمپایی 100.00
بالش 200.00

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

4. زمان، تاریخ و زمان و تاریخ

احتمالاً همه در پرس و جوهایی با نیاز به تعیین زمان، تاریخ یا تاریخ و زمان مواجه شده اند. بسیاری از DBMS ها برای کار با این انواع به ترتیب از t، d و ts پشتیبانی می کنند. اما توضیح آن با یک مثال ساده تر است: برای حرف های d و t، همه چیز یکسان است.
من از خواننده بابت گمراه کردن عذرخواهی می کنم، اما هر آنچه در پاراگراف 4 گفته شد در مورد زبان SQL صدق نمی کند، بلکه به قابلیت های پیش پردازش پرس و جو در JDBC اشاره دارد.

5. انکار. SQL-92

همه ما در مورد اپراتور می دانیم نه، اما اغلب فراموش می کنیم که می توان آن را هم برای گروهی از محمول ها و هم برای یک ستون استفاده کرد:

6. مقایسه بلوک های داده. SQL-92

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

مثال مقایسه بلوک داده

SELECT * FROM کالا WHERE (نام، قیمت، در دسترس بودن) = ("روبالشی"، 400.00، FALSE) -- یا معادل آن SELECT * FROM کالا WHERE نام = "روبالشی" و قیمت = 400.00 و در دسترس بودن = FALSE

همانطور که از مثال می بینید، مقایسه بلوک های داده شبیه به مقایسه عنصر به عنصر است. معنی_ 1 _block_1 = value_ 1 _block_2، value_ 2 _block_1 = value_ 2 _block_2، value_ 3 _block_1 = value_ 3 _block_2استفاده كردن وبین آنها.

7. عملگرها را با هر، برخی یا همه اصلاح کننده ها مقایسه کنید. SQL-92

اینجاست که توضیح لازم است. اما مثل همیشه، ابتدا یک مثال یعنی چه؟ همهدر این مورد؟ و به این معنی است که شرط انتخاب فقط توسط ردیف هایی که شناسه های آنها (در مورد ما 4 و 5 هستند) بیشتر از هراز مقادیر یافت شده در پرس و جو فرعی (1، 2 و 3). 4 بزرگتر از 1 و از 2 و از 3 است. 5 مشابه است. اگر تعویض کنیم چه اتفاقی می افتد همهبر روی هر?
چه می کند هردر این مورد؟ و به این معنی است که شرط انتخاب فقط توسط ردیف هایی که شناسه های آنها (در مورد ما 2، 3، 4 و 5 هستند) بیشتر از حداقل یکیاز مقادیر یافت شده در پرس و جو فرعی (1، 2 و 3). برای خودم تداعی کردم همهبا و، آ هربا یا. مقداریو هرمشابه یکدیگر

8. اپراتورها برای کار با درخواست / تحت درخواست. SQL-92

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

مثال با EXCEPT

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

سرمقاله

N1. با تشکر از streetflush برای انتقاد سازنده. مقاله ای را با اطلاعاتی در مورد اینکه استاندارد زبان چیست و چه چیزی نیست، مشارکت داد.
N2. مورد 4 تصحیح شد، با توضیح اینکه ts/d/t بخشی از زبان SQL نیست. با تشکر از توجه شما Melkij.

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

INTERSECT متعلق به کلاس عملگرها برای کار با مجموعه داده ها (عملگر مجموعه) است. سایر اپراتورهای این چنینی عبارتند از EXCEPT و UNION. همه عملگرهای مجموعه داده برای دستکاری مجموعه نتایج دو یا چند پرس و جو به طور همزمان استفاده می شوند، از این رو نام آنها به این معنی است.

سینتکس SQL2003

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

تقاطع

]تقاطع

کلید واژه ها

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

متمایز

قبل از اینکه مقایسه با دستور INTERSECT انجام شود، ردیف های تکراری از همه مجموعه های نتیجه حذف می شوند. ستون هایی با مقادیر NULL تکراری در نظر گرفته می شوند. اگر نه ALL و نه DISTINCT مشخص نشده باشد، DISTINCT به طور پیش فرض در نظر گرفته می شود.

متناظر

مشخص می‌کند که فقط ستون‌هایی که در هر دو کوئری نام یکسان دارند، بازگردانده می‌شوند، حتی اگر هر دو کوئری از کاراکتر عام (*) استفاده کنند.

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

قوانین عمومی

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

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

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

هیچ یک از پلتفرم‌ها از بند CORRESPONDING پشتیبانی نمی‌کنند.

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

با توجه به استاندارد ANSI، تنها از یک عبارت ORDER BY می توان در یک پرس و جو استفاده کرد. آن را در انتهای آخرین عبارت SELECT درج کنید. برای جلوگیری از ابهام در تعیین ستون‌ها و جداول، حتماً نام مستعار مشابهی را به تمام ستون‌های جدول منطبق اختصاص دهید. مثلا:

در پلتفرم هایی که از عملگر INTERSECT پشتیبانی نمی کنند، می توانید آن را با یک جستار فرعی FULL JOIN جایگزین کنید.

SELECT a.au_lname AS "Lastname"، a.au_fname AS "Firstname" FROM نویسندگان AS a INTERSECT SELECT e.emp_lname AS "Lastname"، e.emp_fname AS "Frostname" FROM کارکنان AS e ORDER BY نام خانوادگی، نام;

از آنجایی که انواع داده‌های ستون‌ها در عبارات INTERSECT مختلف ممکن است سازگار باشند، پلتفرم‌های مختلف RDBMS ممکن است با انواع مختلفبا ستون هایی با طول های مختلف کار کنید. به عنوان مثال، اگر ستون aujname از اولین پرس و جو در مثال قبلی به طور قابل توجهی طولانی تر از ستون empjname از کوئری دوم باشد، در این صورت پلتفرم های مختلف ممکن است قوانین متفاوتی برای تعیین طول نتیجه نهایی داشته باشند. اما به طور کلی، پلتفرم‌ها اندازه طولانی‌تر (و کمتر محدودکننده) را برای نتیجه انتخاب می‌کنند.

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

DB2

پلت فرم DB2 از کلیدواژه های ANSI INTERSECT و INTERSECT ALL به اضافه یک بند اختیاری VALUES پشتیبانی می کند.

(دستورالعمل._SELECT_7 | VALUES (expr7 [, ...])) INTERSECT

] (instruction_SCJ_2 | VALUES (expr2 [, ...])) INTERSECT

اگرچه عبارت INTERSECT DISTINCT پشتیبانی نمی شود، معادل تابعی آن INTERSECT است. بند CORRESPONDING پشتیبانی نمی شود.

علاوه بر این، انواع داده های LONG VARCHAR، LONG VARGRAPHIC، BLOB، CLOB، DBCLOB، DATALINK و انواع ساختار در یک عبارت INTERSECT استفاده نمی شوند، اما می توانند در یک عبارت INTERSECT ALL استفاده شوند.

اگر مجموعه نتایج دارای ستونی باشد که در تمام عبارات SELECT نام یکسانی داشته باشد، آن نام به عنوان نام نهایی ستونی که توسط دستور برگردانده شده است استفاده می شود. با این حال، اگر نام ستون های مختلف در پرس و جو استفاده شود، پلت فرم DB2 نام جدیدی برای ستون حاصل ایجاد می کند. پس از آن، در بندهای ORDER BY و FOR UPDATE غیر قابل استفاده می شود.

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

SELECT empno FROM کارمند WHERE workdept LIKE "E%" INTERSECT (انتخاب empno FROM emp_act WHERE projno IN ("IF1000"، "IF2000"، "AD3110") UNION VALUES ("AA0001")، ("AB00002")، ("AB00002") "))

مثال بالا شناسه کارمندان همه کارکنان بخش را که نام آنها با "E" شروع می شود از جدول کارمندان بازیابی می کند. با این حال، شناسه‌ها تنها در صورتی بازیابی می‌شوند که در جدول حساب کارمند به نام emp_act نیز وجود داشته باشند و در پروژه‌های IF1000، IF200 و AD3110 دخیل باشند.

SQL دو راه برای پیوستن به جداول ارائه می دهد:
  • تعیین جداول برای پیوستن (از جمله سوالات فرعی) در عبارت FROM عبارت SELECT. ابتدا جداول به هم متصل می شوند و تنها پس از آن شرایط مشخص شده توسط بند WHERE، تجمع، ترتیب داده ها و غیره که توسط بند GROUP BY تعیین شده است، در مجموعه حاصل اعمال می شود.
  • تعریف اتحاد مجموعه های نتیجه تولید شده توسط پردازش دستور SELECT. در این حالت دو عبارت SELECT با عبارت به هم می پیوندند اتحاد. اتصال, تقاطع, بجزیا مربوطه .

اتحاد. اتصال

عبارت اتحاد. اتصالنتایج دو پرس و جو را طبق قوانین زیر ترکیب می کند:

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

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


برنج. 4.3.

عبارت اتحاد. اتصال ALL اتحاد دو پرسش فرعی را مانند بند UNION انجام می دهد، با استثناهای زیر:

  • ردیف های منطبق از مجموعه نتایج تولید شده حذف نمی شوند.
  • پرس و جوهای ادغام شده به صورت متوالی در مجموعه نتایج بدون ترتیب ظاهر می شوند.

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


برنج. 4.4.

INTERSECT ملحق شوید

عبارت تقاطعبه شما امکان می دهد فقط ردیف هایی را انتخاب کنید که در هر مجموعه نتیجه ادغام شده وجود دارند. روی انجیر 4.5 نمونه ای از ترکیب کوئری ها به عنوان مجموعه های متقاطع را نشان می دهد.


برنج. 4.5.

به جز اتحادیه

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

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

این درس به موضوع استفاده از عملیات اتحاد، تقاطع و اختلاف پرس و جو می پردازد. نمونه هایی از نحوه استفاده SQL query Union، وجود دارد، و همچنین استفاده از کلیدواژه های SOME، ANY و All. توابع رشته در نظر گرفته شده است


در یک مجموعه، می توانید عملیات اتحاد، تفاوت و محصول دکارتی را انجام دهید. از همین عملیات می توان در پرس و جوهای sql استفاده کرد (عملیات را با پرس و جو انجام داد).

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

< запрос 1 >اتحادیه [ALL]< запрос 2 >

<запрос 1>اتحاد. اتصال<запрос 2>

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

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

هر تعداد پرس و جو را می توان با هم ترکیب کرد.

استفاده از اپراتور UNION نیازمند چند شرط است:

  1. تعداد ستون های خروجی هر یک از کوئری ها باید یکسان باشد.
  2. ستون های خروجی هر یک از پرس و جوها باید از نظر انواع داده ها (به ترتیب اولویت) با یکدیگر قابل مقایسه باشند.
  3. مجموعه حاصل از نام ستون های مشخص شده در اولین پرس و جو استفاده می کند.
  4. ORDER BY فقط در پایان یک پرس و جو چند قسمتی قابل استفاده است، زیرا در نتیجه یک پیوستن اعمال می شود.

مثال:نمایش قیمت رایانه‌ها و لپ‌تاپ‌ها و همچنین تعداد آنها (یعنی تخلیه از دو جدول مختلف در یک جستجو)


✍ راه حل:
1 2 3 4 5 6 «تعداد»، «قیمت» از رایانه شخصی را انتخاب کنید UNION «شماره»، «قیمت» را از نوت بوک سفارش بر اساس «قیمت» انتخاب کنید

«تعداد»، «قیمت» از رایانه شخصی را انتخاب کنید UNION «شماره»، «قیمت» را از نوت بوک سفارش بر اساس «قیمت» انتخاب کنید

نتیجه:

بیشتر در نظر بگیرید مثال پیچیدهبا اتصال داخلی:

مثال:نوع محصول، تعداد و قیمت کامپیوتر و لپ تاپ را بیابید


✍ راه حل:
1 2 3 4 5 6 7 8 محصول را انتخاب کنید "نوع"، کامپیوتر 'تعداد'، 'قیمت' از کامپیوتر داخلی محصول JOIN در کامپیوتر. «تعداد» = محصول. محصول "تعداد" UNION SELECT. «نوع»، دفترچه یادداشت. 'تعداد'، 'قیمت' از نوت بوک INNER JOIN محصول در نوت بوک. «تعداد» = محصول. "تعداد" سفارش بر اساس "قیمت".

SELECT product.`Type`, pc.`Number` , `Price` FROM pc INNER JOIN product ON pc.`Number` = محصول.`Number` UNION SELECT product.`Type` , notebook.`Number` , `Price` FROM notebook INNER JOIN محصول در نوت بوک. «تعداد» = محصول. «تعداد» سفارش بر اساس «قیمت»

نتیجه:

SQL Union 1.سازنده، شماره قطعه و قیمت تمام لپ تاپ ها و چاپگرها را بیابید

SQL Union 2.شماره و قیمت تمام محصولات تولید شده توسط سازنده روسیه را بیابید

گزاره وجودی SQL وجود دارد

AT زبان SQLابزارهایی برای انجام عملیات تقاطع و تفاوت پرس و جو وجود دارد - عبارت INTERSECT (تقاطع) و بند EXCEPT (تفاوت). این بندها مشابه نحوه عملکرد UNION عمل می‌کنند: فقط آن ردیف‌هایی که در هر دو پرس‌وجو وجود دارند - INTERSECT، یا فقط آن ردیف‌هایی از جستار اول که در جستار دوم وجود ندارند - EXCEPT وارد مجموعه نتایج می‌شوند. اما مشکل اینجاست که بسیاری از DBMS از این پیشنهادات پشتیبانی نمی کنند. اما راهی برای خروج وجود دارد - استفاده از گزاره EXISTS.

اگر پرس و جو فرعی هر تعداد ردیف را برگرداند، گزاره EXISTS TRUE است، در غیر این صورت EXISTS FALSE است. همچنین یک محمول NOT EXISTS وجود دارد که برعکس عمل می کند.

به طور معمول، EXISTS در سوالات فرعی وابسته (مانند IN) استفاده می شود.

EXISTS (پرسمان فرعی جدول)

مثال:آن دسته از تولیدکنندگان رایانه را پیدا کنید که لپ تاپ نیز تولید می کنند


✍ راه حل:

SELECT DISTINCT Manufacturer FROM product AS pc_product WHERE Type = "Computer" AND EXISTS (SELECT Manufacturer FROM product WHERE Type = "Notebook" AND Manufacturer = pc_product.Manufacturer)

نتیجه:

تولیدکنندگان رایانه را پیدا کنید که چاپگر نمی‌سازند

کلمات کلیدی SQL SOME | هر و همه

کلمات کلیدی SOME و ANY مترادف هستند، بنابراین می توان از هر یک در یک پرس و جو استفاده کرد. نتیجه چنین پرس و جوی یک ستون از مقادیر خواهد بود.

نحو:

< выражение>< оператор сравнения>برخی | هر (< подзапрос> )

<выражение><оператор сравнения>برخی | هر (<подзапрос>)

اگر برای هر مقدار از X بدست آمده از پرس و جوی فرعی، نتیجه عملیات " " TRUE را برمی گرداند، آنگاه گزاره ANY نیز برابر با TRUE است.

مثال:فروشندگان رایانه ای را پیدا کنید که شماره قطعه در فروش ندارند (یعنی در جدول رایانه شخصی نیستند)


✍ راه حل:

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

نتیجه:

در مثال، گزاره Number = ANY (SELECT Number FROM pc) در صورتی که Number از کوئری اصلی در لیست Numbers در جدول pc (بازگردانی شده توسط subquery) یافت شود، TRUE برمی گردد. همچنین، NOT استفاده می شود. مجموعه نتایج شامل یک ستون - سازنده است. برای جلوگیری از نمایش چندین بار یک سازنده، کلمه کلیدی DISTINCT معرفی شده است.
حالا استفاده را در نظر بگیرید کلمه کلیدیهمه:

مثال:تعداد و قیمت لپ‌تاپ‌هایی را پیدا کنید که از هر کامپیوتری قیمت بیشتری دارند


✍ راه حل:

مهم:شایان ذکر است که در مورد کلییک پرس و جو با ANY مجموعه ای از مقادیر را برمی گرداند. بنابراین، استفاده از یک پرس و جو فرعی در یک عبارت WHERE بدون عملگرهای EXISTS، IN، ALL و ANY که یک مقدار بولی (بولی) به دست می‌دهد، می‌تواند منجر به خطای زمان اجرا پرس و جو شود.


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


✍ راه حل:


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

توابع رشته SQL

تابع LEFT تعداد کاراکترهای مشخص شده توسط آرگومان دوم را از سمت چپ رشته برش می دهد:

ترک کرد (<строка>,<число>)

تابع RIGHT تعداد مشخص شده از کاراکترها را در سمت راست عبارت رشته برمی گرداند:

درست(<строка>,<число>)

مثال:حروف اول اسامی تمام سازندگان را استخراج کنید


✍ راه حل:

SELECT DISTINCT LEFT(`Manufacturer` , 1) FROM `product`

نتیجه:

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


✍ راه حل:

تابع جایگزینی SQL

نحو:

SELECT `name` , REPLACE(`name`, "a", "aa") FROM `teachers`