SQL, EXISTS පුරෝකථනය තුළ කැදලි සහ සම්බන්ධිත උප විමසුම්. EXISTS ක්‍රියාකරු භාවිතා කිරීම පවතින ශ්‍රිතය භාවිතා කරමින් විමසුම්

පවතින තැන

පේළි එකක් හෝ කිහිපයක් තිබීම සඳහා උප විමසුම පරීක්ෂා කරනු ලැබේ. අවම වශයෙන් එක් පේළියක් විමසුමට ගැලපේ නම්, boolean අගය TRUE ලබා දෙනු ඇත. විකල්ප NOT මූල පදය සඳහන් කර ඇති විට, උප විමසුම ගැලපෙන පේළි කිසිවක් ලබා නොදෙන්නේ නම්, Boolean අගය TRUE ලබා දෙනු ඇත.

උප විමසුම

සම්පුර්ණයෙන්ම සාදන ලද උප විමසුම මත පදනම්ව, ප්රතිඵල දත්ත කට්ටලය නැවත ලබා ගනී.

පොදු නීති

EXISTS ක්‍රියාකරු මාපිය විමසුමක උප විමසුමක පේළි එකක හෝ වැඩි ගණනක පැවැත්ම පරීක්ෂා කරයි.

තෝරා ගන්න * නොපවතින රැකියා වලින් (තෝරන්න * සේවකයා කොහෙද jobs.job_id=employye.job_id);

මෙම උදාහරණය අතිරේක NOT මූල පදය භාවිතයෙන් වාර්තා උප විමසුම පරීක්ෂා කරයි. පහත උදාහරණය ප්‍රධාන ප්‍රතිඵල කට්ටලය ලබා ගැනීම සඳහා උප විමසුමක නිශ්චිත වාර්තා සොයයි.

පවතින තැන කතුවරුන්ගෙන් au_lname තෝරන්න (ප්‍රකාශකයින් වෙතින් තෝරන්න * authors.city=publishers.city);

මෙම විමසුම ප්‍රකාශකයන් සිටින නගරයේම ජීවත් වන කතුවරුන්ගේ (au_lname) අවසාන නම් ලබා දෙයි. උප විමසුමේදී ඔබට තරු ලකුණක් භාවිතා කළ හැකි බව සලකන්න, මන්ද උප විමසුම බූලියන් අගය TRUE සමඟ එක් වාර්තාවක් පමණක් ලබා දිය යුතුය. එවැනි අවස්ථාවලදී, තීරු වැදගත් නොවේ. ප්රධාන කරුණ වන්නේ නූල් පැවැත්මයි.

බොහෝ විමසුම් වලදී, EXISTS ක්රියාකරු ඕනෑම කාර්යයක් ඉටු කරයි. සහසම්බන්ධ විමසුම් සමඟ භාවිතා කරන විට EXISTS ක්රියාකරු සාමාන්යයෙන් වඩාත් කාර්යක්ෂම වේ.

EXISTS ක්‍රියාකරු ඕනෑම ක්‍රියාකරුවෙකුට අර්ථමය වශයෙන් සමාන වේ.

EXISTS ප්‍රකාශයක උප විමසුමක් සාමාන්‍යයෙන් සෙවුම් වර්ග දෙකෙන් එකක් සිදු කරයි. පළමු විකල්පය වන්නේ Wildcard භාවිතා කිරීමයි - තරු ලකුණ (උදාහරණයක් ලෙස, SELECT * FROM...), මෙම අවස්ථාවේදී ඔබ කිසියම් නිශ්චිත තීරුවක් හෝ අගයක් ලබා නොගනී. මෙහි තරු ලකුණෙන් අදහස් වන්නේ "ඕනෑම තීරුවක්" යන්නයි. දෙවන විකල්පය නම් උප විමසුමේ එක් නිශ්චිත තීරුවක් පමණක් තෝරා ගැනීමයි (උදාහරණයක් ලෙස, SELECT aujd FROM). සමහර තනි වේදිකා බහුවිධ තීරු මත උප විමසුම් වලට ඉඩ දෙයි (උදා. SELECT aujd, aujname FROM...). කෙසේ වෙතත්, මෙම විශේෂාංගය දුර්ලභ වන අතර වෙනත් වේදිකා වෙත ගෙන යා යුතු කේතයෙන් වැළකී සිටිය යුතුය.

වේදිකා අතර වෙනස්කම්

සියලුම වේදිකා අප ඉහත විස්තර කළ පෝරමයෙහි EXISTS ක්‍රියාකරුට සහය දක්වයි.

"ඉස්සර එය පහසු විය" - මම SQL හි මීළඟ විමසුම ප්‍රශස්ත කිරීමට වාඩි වූ විට සිතුවෙමි කළමනාකරණ චිත්රාගාරය. මම MySQL යටතේ ලියූ විට, සියල්ල ඇත්තෙන්ම සරල විය - එක්කෝ එය ක්‍රියාත්මක වේ හෝ එසේ නොවේ. එක්කෝ එය මන්දගාමී වේ හෝ එසේ නොවේ. මගේ සියලු ගැටලු විසඳා ඇති බව පැහැදිලි කරන්න, තවත් කිසිවක් අවශ්ය නොවේ. දැන් මට විමසුම් සහ ක්‍රියා පටිපාටි/කාර්යයන් සංවර්ධනය කිරීම, දෝෂහරණය කිරීම සහ ප්‍රශස්ත කිරීම සඳහා ප්‍රබල පරිසරයක් ඇති අතර, මේ සියලු අවුල් සහගත බව මගේ මතය අනුව තවත් ගැටලු ඇති කරයි. සහ ඇයි සියල්ල? ගොඩනඟන ලද විමසුම් ප්‍රශස්තකාරකය නරක බැවින්. MySQL සහ PostgreSQL වල නම් මම ලියන්නේ

a.id = b.id, b.id = c.id යන a, b, c වලින් * තෝරන්න

සහ සෑම ටැබ්ලට් එකකම අවම වශයෙන් 5k රේඛා ඇත - සියල්ල කැටි වේ. සහ දෙවියන්ට ස්තූතියි! මක්නිසාද යත්, එසේ නොමැති නම්, සංවර්ධකයා, නිවැරදිව ලිවීමට කම්මැලිකම වර්ධනය කරන අතර, නරකම අවස්ථාවක, ඔහු කරන්නේ කුමක්ද යන්න ඔහුට කිසිසේත් වැටහෙන්නේ නැත! සියල්ලට පසු, MSSQL හි එකම විමසුම සමාන ලෙස ක්‍රියා කරයි

a.id = b.id join c මත b.id = c.id මත එකතු වීමකින් * තෝරන්න

ගොඩනඟන ලද ප්‍රශස්තකාරකය අතිරික්ත ඉල්ලීම සමනය කරන අතර සියල්ල හොඳින් සිදුවනු ඇත.

කිරීමට වඩා හොඳ කුමක්ද - පවතිනු හෝ සම්බන්ධ වීම සහ තවත් බොහෝ දේ ඔහු විසින්ම තීරණය කරනු ඇත. තවද සෑම දෙයක්ම හැකි තරම් ප්රශස්ත ලෙස ක්රියා කරනු ඇත.

ඇත්තේ එකක් පමණි නමුත්. එක් අවස්ථාවක, ප්‍රශස්තකාරකය පැකිළෙනු ඇත සංකීර්ණ විමසුමසහ සමත් වේ, එවිට ඔබට විශාල ගැටලුවක් ඇති වේ. ඔබට එය වහාම ලබා ගත නොහැක, නමුත් මේසවල බර විවේචනාත්මක ස්කන්ධයට ළඟා වන විට.

එහෙනම් මෙන්න ලිපියේ කාරණය. පවතින අතර ඉතා දැඩි මෙහෙයුම් වේ. මෙය ඇත්ත වශයෙන්ම වෙනම උප විමසුමකි එක් එක් සඳහාප්රතිඵල රේඛා. තවද කූඩු ද තිබේ නම්, එය සාමාන්යයෙන් විදුලි පහන් නිවා දමයි. පේළි 1, 10, 50 ආපුවම ඔක්කොම හරි යයි. ඔබට වෙනස දැනෙන්නේ නැත, සමහර විට සම්බන්ධ වීම ඊටත් වඩා මන්දගාමී වනු ඇත. හැබැයි 500ක් එලියට ගත්තම ප්‍රශ්න පටන් ගන්නවා. එක් ඉල්ලීමක් තුළ උප ප්‍රශ්න 500 ක් බරපතල ය.

මානව අවබෝධයේ දෘෂ්ටි කෝණයෙන්, තුළ සහ පවතින බව වඩා හොඳ වුවද, නමුත් පේළි 50+ ආපසු ලබා දෙන විමසුම් සඳහා කාල පිරිවැය අනුව, ඒවා පිළිගත නොහැකිය.

ස්වාභාවිකවම, එය කොහේ හරි අඩු වුවහොත්, එය කොහේ හරි පැමිණිය යුතු බව වෙන් කරවා ගැනීම අවශ්ය වේ. ඔව්, සම්බන්ධ වීම වැඩි මතක ශක්තියක් වේ, මන්දයත්, එක් එක් පේළිය සඳහා උප විමසුම් ධාවනය කිරීමට වඩා, සම්පූර්ණ අගයන් වගුව එකවර අල්ලාගෙන එය සමඟ ක්‍රියා කිරීම මිල අධික වන අතර, ඉක්මනින් මතකය නිදහස් කරයි. ඔබ විශේෂයෙන් ඉල්ලීම දෙස බැලිය යුතු අතර කාලය සඳහා අමතර මතකය භාවිතා කිරීම තීරණාත්මකද නැද්ද යන්න මැනිය යුතුය.

මම සම්පූර්ණ ප්රතිසමයන් සඳහා උදාහරණ දෙන්නෙමි. සාමාන්‍යයෙන් කිවහොත්, සම්බන්ධ වීමේ කඳුරැල්ලක් දක්වා ව්‍යාප්ත කළ නොහැකි තරම් සංකීර්ණත්වය පිළිබඳ විමසීම් මට තවමත් හමු වී නොමැත. එය දිනක් ගත විය හැකිය, නමුත් සියල්ල හෙළි කළ හැකිය.

a.id හි ඇති ස්ථානයෙන් * තෝරන්න (b වෙතින් id තෝරන්න) පවතින තැනකින් * තෝරන්න (b.id = a.id යන ස්ථානයේ සිට ඉහළ 1 1 තෝරන්න) a.id = b මත සම්බන්ධ වීමකින් * තෝරන්න. id තෝරන්න * a.id නොමැති තැනකින් (b වෙතින් id තෝරන්න) නොපවතින තැනකින් * තෝරන්න (b.id = a.id සිට ඉහළ 1 1 තෝරන්න) a මත වම් සම්බන්ධක b වෙතින් * තෝරන්න. id = b.id මෙහි b.id ශුන්‍ය වේ

මම නැවතත් - MSSQL ප්‍රශස්තිකරණය මෙම උදාහරණ සඳහා ප්‍රශස්ත කරයි උපරිම කාර්ය සාධනයඑවැනි සරල ඉල්ලීම් ඇති මෝඩ මිනිසුන් කිසි විටෙකත් නොසිටිනු ඇත.

සමහර සාම්පල මත එය කැටි වූ නිසා නැවත ලිවිය යුතු සැබෑ විමසුමක උදාහරණයක් අපි දැන් සලකා බලමු (ව්‍යුහය ඉතා සරල කර ඇති අතර සංකල්ප ප්‍රතිස්ථාපනය කර ඇත, දත්ත සමුදා ව්‍යුහයේ ප්‍රශස්ත නොවන බව ගැන බිය විය යුතු නැත. )

ඔබ විවිධ ගිණුම්වල ඇති සියලුම අනුපිටපත් “නිෂ්පාදන” ඉවත් කළ යුතුය, නිෂ්පාදනයේ පරාමිතීන්, එහි කණ්ඩායම සහ මව් කණ්ඩායම තිබේ නම් ඒවා කෙරෙහි අවධානය යොමු කරන්න.

PRODUCT s වෙතින් d.PRODUCT_ID තෝරන්න, PRODUCT_GROUP sg වමේ M_PG_DEPENDENCY sd මත එකතු වී (sg.PRODUCT_GROUP_ID = sd.M_PG_DEPENDENCY_CHILD_ID), PRODUCT d, PRODUCT_GROUP dg වමේ PG_DEPENDENCY_CHILD_ID) මෙහි s.PRODUCT_GROUP_ID=sg .PRODUCT_GROUP_ID සහ d.PRODUCT_GROUP_ID=dg.PRODUCT_GROUP_ID සහ sg.PRODUCT_GROUP_PERSPEC=dg.PRODUCT_GROUP_PERSPEC සහ sg.PRODUCT_GROUP_NAME=dg.PRODUCT_GROUP_NAME සහ s.PRODUCT_GROUP_NAME සහ s.PRODUCT_GROUP_NAME සහ PRODUCT_NAME=d.PRODUCT_T_T RE=d.PRODUCT_IS_SECURE සහ s.PRODUCT_MULTISELECT=d.PRODUCT_MULTISELECT සහ dg.PRODUCT_GROUP_IS_TMPL=0 සහ ((sd.M_PG_DEPENDENCY_CHILD_ID ශුන්‍ය වන අතර dd.M_PG_DEPENDENCY_CHILD_ID ශූන්‍ය වේ) හෝ PRODUCT 1Gd Gd .M_PG_DEPENDENCY_PARENT_ID = sg1.PRODUCT_GROUP_ID සහ dd .M_PG_DEPENDENCY_PARENT_ID = dg1.PRODUCT_GROUP_ID සහ sg1.PRODUCT_GROUP_PERSPEC=dg1.PRODUCT_GROUP_PERSPEC සහ sg1.PRODUCT_GROUP_NAME=dg1.PRODUCT_GROUP_NAME සහ))

ඉතින් මේක තමයි Optimizer එක අතඇරල දැම්මම. තවද සෑම පේළියක් සඳහාම බර පැවැත්මක් ක්‍රියාත්මක කරන ලද අතර එමඟින් දත්ත සමුදාය විනාශ විය.

PRODUCT s වෙතින් d.PRODUCT_ID තෝරන්න PRODUCT s මත PRODUCT d හා සම්බන්ධ වන්න sg.PRODUCT_GROUP_ID PRODUCT_GROUP dg හා සම්බන්ධ වන්න d.PRODUCT_GROUP_ID=dg.PRODUCT_GROUP_ID සහ sg.PRODUCT_GROUP_NAME=dg.PRODUCT_GROUP_NAME සහ sg.PRODUCT_GROUP_PERSPEC=dg.PRODUCT_GROUP_PERSPEC = sd.M_PG_DEPENDENCY_CHILD_ID dg මත M_PG_DEPENDENCY dd එකතු වේ. PRODUCT_GROUP_ID = dd.M_PG_DEPENDENCY_CHILD_ID sgp මත PRODUCT_GROUP sgp සමඟ එකතු විය. .PRODUC T_GROUP_NAME = dgp.PRODUCT_GROUP_NAME සහ isnull(sgp.PRODUCT_GROUP_IS_TMPL, 0) = isnull( dgp. PRODUCT_GROUP_IS_TMPL, 0) (sd.M_PG_DEPENDENCY_CHILD_ID ශුන්‍ය වන අතර dd.M_PG_DEPENDENCY_CHILD_ID ශුන්‍ය වේ) හෝ (sgp.PRODUCT_GROUP_NAME ශුන්‍ය නොවන අතර dgp_NAME යන්න GROUP_IS_TMPL නොවේ.

මෙම පරිවර්තනයන්ගෙන් පසුව, සොයාගත් නිෂ්පාදන ගණන සමඟ දර්ශනයේ කාර්ය සාධනය ඝාතීය ලෙස වැඩි විය. එසේත් නැතිනම්, සෙවුම් කාලය තරඟ ගණනින් ප්‍රායෝගිකව ස්වාධීන වූ අතර සෑම විටම ඉතා කුඩා විය. විය යුතු පරිදි.

MSSQL ප්‍රශස්තකරණය විශ්වාස කිරීම කුරිරු විහිළුවක් කළ හැකි ආකාරය පිළිබඳ පැහැදිලි උදාහරණයකි. ඔහුව විශ්වාස නොකරන්න, කම්මැලි නොවන්න, අතින් සම්බන්ධ වන්න, සෑම අවස්ථාවකදීම දී ඇති තත්වයකදී වඩා හොඳ කුමක්දැයි සිතන්න - පවතී, හෝ සම්බන්ධ වන්න.

SQL භාෂා පුරෝකථනය EXISTS තාර්කික කාර්යයක් ඉටු කරයි. තුල SQL විමසුම්මෙම පුරෝකථනය ආකෘතියේ ප්‍රකාශනවල භාවිතා වේ

පවතී (වගුව වෙතින් * තෝරන්න ...).

මෙම ප්‍රකාශනය කොන්දේසියට ගැළපෙන පේළි එකක් හෝ කිහිපයක් සොයා ගන්නා විට සත්‍ය වන අතර, පේළි කිසිවක් සොයාගත නොහැකි වූ විට අසත්‍ය ලබා දෙයි.

NOT EXISTS සඳහා එය අනෙක් පැත්තයි. ප්රකාශනය

නොපවතියි (වගුවෙන් * තෝරන්න ...)

විමසුමේ කිසිදු පේළියක් සොයාගත නොහැකි වූ විට true ලෙසද, අවම වශයෙන් එක් පේළියක් සොයාගත් විට අසත්‍ය ලෙසද ලබා දෙයි.

SQL EXISTS පුරෝකථනය සමඟ ඇති සරලම විමසුම්

උදාහරණ වලදී අපි පුස්තකාල දත්ත ගබඩාව සහ එහි "භාවිතා කරන පොත" (BOOKINUSE) සහ "පරිශීලක" (USER) වගු සමඟ වැඩ කරන්නෙමු. දැනට, අපට අවශ්‍ය වන්නේ “භාවිතා කරන පොත” වගුව (BOOKINUSE) පමණි.

කර්තෘශීර්ෂයපුබ් වසරInv_Noපරිශීලක ID
ටෝල්ස්ටෝයියුද්ධය සහ සාමය2005 28 65
චෙකොව්චෙරි වතුයාය2000 17 31
චෙකොව්තෝරාගත් කථා2011 19 120
චෙකොව්චෙරි වතුයාය1991 5 65
ඉල්ෆ් සහ පෙට්රොව්පුටු දොළහ1985 3 31
මායාකොව්ස්කිකවි1983 2 120
Parsnipවෛද්‍ය ෂිවාගෝ2006 69 120
ටෝල්ස්ටෝයිඉරිදා2006 77 47
ටෝල්ස්ටෝයිඇනා කරෙනිනා1989 7 205
පුෂ්කින්කැප්ටන්ගේ දුව2004 25 47
ගොගොල්සෙල්ලම් කරයි2007 81 47
චෙකොව්තෝරාගත් කථා1987 4 205
Parsnipප්රියතම2000 137 18

උදාහරණ 1.ටෝල්ස්ටෝයිගේ පොත් ලබා දුන් සහ චෙකොව්ගේ පොත් ලබා දුන් පරිශීලකයින්ගේ හැඳුනුම්පත් තීරණය කරන්න. බාහිර විමසුම ටෝල්ස්ටෝයිගේ පොත් ලබා දුන් පරිශීලකයින් පිළිබඳ දත්ත තෝරන අතර, EXISTS පුරෝකථනය මඟින් චෙකොව්ගේ පොත් ලබා දී ඇති පරිශීලකයින් සඳහා අභ්‍යන්තර විමසුමේ පරීක්ෂා කරන අමතර කොන්දේසියක් නියම කරයි. අභ්‍යන්තර ඉල්ලීමෙහි ඇති අමතර කොන්දේසියක් වන්නේ බාහිර සහ අභ්‍යන්තර ඉල්ලීම් වලින් පරිශීලක හැඳුනුම්පත් ගැළපීමයි: User_ID=tols_user.user_id. ඉල්ලීම පහත පරිදි වනු ඇත:

මෙම විමසුම පහත ප්‍රතිඵලය ලබා දෙනු ඇත:

EXISTS සහ IN අනාවැකි අතර වෙනස්කම්

EXISTS පුරෝකථනය සමඟ විමසුම් වලදී මුලින්ම බැලූ බැල්මට එය සමාන බව ඔබට හැඟෙන්නට පුළුවන. IN පුරෝකථනය කරන්න. මේක වැරදියි. ඔවුන් ඉතා සමාන වුවත්. IN පුරෝකථනය එහි තර්කයේ දක්වා ඇති පරාසයෙන් අගයන් සොයන අතර, එවැනි අගයන් තිබේ නම්, මෙම පරාසයට අනුරූප වන සියලුම පේළි තෝරා ගනු ලැබේ. EXISTS පුරෝකථනයේ ප්‍රතිඵලය වන්නේ තර්කයේ නිශ්චිතව දක්වා ඇති අගයන්ට අනුරූපී අගයන් කිසිවක් තිබේද යන ප්‍රශ්නයට “ඔව්” හෝ “නැත” යන පිළිතුරයි. ඊට අමතරව, IN පුරෝකථනයට පෙර පරාසයේ අගයන්ට ගැලපෙන පේළි සෙවීමට තීරුවේ නම ඇතුළත් වේ. EXISTS පුරෝකථනය සහ IN පුරෝකථනය අතර වෙනස සහ IN පුරෝකථනය භාවිතයෙන් විසඳන ලද ගැටළුව පෙන්වන උදාහරණයක් බලමු.

උදාහරණය 4. ID 31 සහිත පරිශීලකයාට පොත් නිකුත් කර ඇති කතුවරුන් විසින් පොත් නිකුත් කර ඇති පරිශීලකයින්ගේ ID නිර්ණය කරන්න. ඉල්ලීම පහත පරිදි වේ:

පරිශීලක ID
120
65
205

අභ්‍යන්තර විමසුමකින් (IN පසු) කතුවරුන් තෝරා ගනී: චෙකොව්; ඉල්ෆ් සහ පෙට්රොව්. බාහිර විමසුම මෙම කතුවරුන් විසින් පොත් නිකුත් කර ඇති සියලුම පරිශීලකයින් තෝරා ගනී. EXISTS පුරෝකථනය මෙන් නොව, IN පුරෝකථනය තීරුවේ නමට පෙර ඇති බව අපට පෙනේ, මෙම අවස්ථාවෙහිදී - කර්තෘ.

පවතින අනාවැකි සහ අමතර කොන්දේසි සහිත විමසුම්

විමසුමේ EXISTS පුරෝකථනයට අමතරව, ඔබ අවම වශයෙන් එක් අමතර කොන්දේසියක් යොදන්නේ නම්, උදාහරණයක් ලෙස, භාවිතා කරමින් සඳහන් කර ඇත සමස්ථ කාර්යයන්, එවිට එවැනි විමසුම් සරල දත්ත විශ්ලේෂණය සඳහා සේවය කළ හැකිය. පහත උදාහරණයෙන් මෙය නිරූපණය කරමු.

උදාහරණ 5. Pasternak විසින් අවම වශයෙන් එක් පොතක් නිකුත් කර ඇති සහ පොත් 2 කට වඩා නිකුත් කර ඇති පරිශීලකයින්ගේ ID නිර්ණය කරන්න. අපි පහත විමසුම ලියන්නෙමු, එහි පළමු කොන්දේසිය EXISTS පුරෝකථනය මගින් කැදැලි විමසුමකින් නියම කර ඇති අතර, HAVING ක්‍රියාකරු සමඟ ඇති දෙවන කොන්දේසිය සෑම විටම කැදැලි විමසුමට පසුව පැමිණිය යුතුය:

ඉල්ලීමේ ප්‍රතිඵලය:

පරිශීලක ID
120

BOOKINUSE වගුවෙන් දැකිය හැකි පරිදි, Pasternak ගේ පොත ID 18 සහිත පරිශීලකයාට නිකුත් කරන ලදී, නමුත් ඔහුට ලබා දී ඇත්තේ එක් පොතක් පමණක් වන අතර එය නියැදියට ඇතුළත් කර නොමැත. ඔබ නැවතත් සමාන විමසුමකට COUNT ශ්‍රිතය යොදන්නේ නම්, නමුත් මෙවර තෝරාගත් පේළි ගණන් කිරීමට (මෙය ඔබම පුහුණු වන්න), පැස්ටර්නැක්ගේ පොත් කියවන පරිශීලකයින් කී දෙනෙකු වෙනත් කතුවරුන්ගේ පොත් කියවා ඇත්ද යන්න පිළිබඳ තොරතුරු ඔබට ලබා ගත හැකිය. මෙය දැනටමත් දත්ත විශ්ලේෂණ ක්ෂේත්රයේ සිට ඇත.

EXISTS සමඟ විමසුම් වගු දෙකක් මත පුරෝකථනය කරයි

EXISTS පුරෝකථනය සහිත විමසුම්වලට වගු එකකට වඩා දත්ත ලබා ගත හැක. එම ප්‍රතිඵලය භාවිතයෙන් බොහෝ ගැටලු විසඳාගත හැක ක්‍රියාකරුට සම්බන්ධ වන්න, නමුත් සමහර අවස්ථාවලදී EXISTS භාවිතා කිරීමෙන් ඔබට අඩු අපහසු විමසුමක් නිර්මාණය කිරීමට ඉඩ සලසයි. ලැබෙන වගුවේ එක් වගුවකින් පමණක් තීරු අඩංගු වන අවස්ථා වලදී EXISTS භාවිතා කිරීම වඩාත් සුදුසුය.

පහත උදාහරණයේ දී, එම දත්ත සමුදායෙන්, BOOKINUSE වගුවට අමතරව, ඔබට USER වගුවක් ද අවශ්‍ය වේ.

විමසුමේ ප්රතිඵලය පහත වගුව වනු ඇත:

කර්තෘ
චෙකොව්
මායාකොව්ස්කි
Parsnip

JOIN ක්‍රියාකරු භාවිතා කරන ආකාරයටම, වගු එකකට වඩා ඇති අවස්ථාවන්හිදී, වගු සම්බන්ධ කරන යතුරු වල අගයන් ගැළපේදැයි පරීක්ෂා කිරීමට වගු අන්වර්ථ භාවිතා කළ යුතුය. අපගේ උදාහරණයේ, වගුවේ අන්වර්ථයන් bk සහ අප වන අතර, වගු සම්බන්ධ කරන යතුර User_ID වේ.

EXISTS වගු දෙකකට වැඩි එකතු කිරීම් වල පුරෝකථනය කරයි

දැන් අපි වඩාත් විස්තරාත්මකව බලමු, ලැබෙන වගුවේ එක් වගුවකින් පමණක් තීරු අඩංගු වන අවස්ථා වලදී EXISTS භාවිතා කිරීම වඩාත් සුදුසු වන්නේ මන්දැයි.

අපි "නිශ්චල දේපල" දත්ත සමුදාය සමඟ වැඩ කරන්නෙමු. ගනුදෙනු වගුවේ ගනුදෙනු පිළිබඳ දත්ත අඩංගු වේ. අපගේ කාර්යයන් සඳහා, ගනුදෙනුවේ වර්ගය - විකිණීම හෝ බදු දීම පිළිබඳ දත්ත සහිත ටයිප් තීරුව මෙම වගුවේ වැදගත් වේ. වස්තු වගුවේ වස්තූන් පිළිබඳ දත්ත අඩංගු වේ. මෙම වගුවේ, අපට බූලියන් ආකෘතියෙන් ලොග්ජියා හෝ බැල්කනියක් තිබීම පිළිබඳ දත්ත අඩංගු කාමර (කාමර ගණන) සහ LogBalc තීරු වල අගයන් අවශ්ය වනු ඇත: 1 (ඔව්) හෝ 0 (නැත). සේවාලාභියා, කළමනාකරු සහ හිමිකරු වගු වල පිළිවෙලින් සේවාදායකයින්, සමාගම් කළමනාකරුවන් සහ දේපල හිමිකරුවන් පිළිබඳ දත්ත අඩංගු වේ. මෙම වගු වල FName සහ LName යනු පිළිවෙලින් පළමු සහ අවසාන නම් වේ.

උදාහරණ 7.ලොග්ජියා හෝ බැල්කනියක් නොමැති දේපල මිලදී ගත් හෝ කුලියට ගත් සේවාදායකයින් හඳුනා ගන්න. අපි පහත විමසුම ලියන්නෙමු, එහි EXISTS පුරෝකථනය වගු දෙකක් සම්බන්ධ කිරීමේ ප්‍රතිඵලයට ප්‍රවේශයක් නියම කරයි:

තරු ලකුණු ක්‍රියාකරු භාවිතයෙන් සේවාලාභී වගුවෙන් තීරු තෝරාගෙන ඇති බැවින්, මෙම වගුවේ සියලුම තීරු සංදර්ශණය වනු ඇත, EXISTS පුරෝකථනය මඟින් දක්වා ඇති කොන්දේසියට ගැලපෙන සේවාලාභීන් සිටින තරම් පේළි ගණනක් ඇත. උප විමසුම මගින් සම්බන්ධ වීමට ප්‍රවේශ වූ වගු වලින් කිසිදු තීරු ප්‍රතිදානය කිරීමට අපට අවශ්‍ය නොවේ. එබැවින්, යන්ත්‍ර කාලය ඉතිරි කර ගැනීම සඳහා, එක් තීරුවක් පමණක් ලබා ගනී. මෙය සිදු කිරීම සඳහා, SELECT යන වචනයට පසුව ඒකකයක් ලියා ඇත. පහත උදාහරණ වල විමසුම් වලදී එම තාක්ෂණයම භාවිතා වේ.

EXISTS ඔබම පුරෝකථනය කර SQL විමසුමක් ලියන්න, ඉන්පසු විසඳුම දෙස බලන්න

අපි EXISTS පුරෝකථනය සමඟ SQL විමසුම් දිගටම ලියන්නෙමු

උදාහරණ 9.බදු දී ඇති වස්තූන්ගේ අයිතිකරුවන් තීරණය කරන්න. අපි පහත විමසුම ලියන්නෙමු, එහි EXISTS පුරෝකථනය වගු දෙකක් සම්බන්ධ කිරීමේ ප්‍රතිඵලයට ප්‍රවේශයක් ද නියම කරයි:

පෙර උදාහරණයේ මෙන්, බාහිර විමසුම මගින් ප්‍රවේශ වූ වගුවේ ඇති සියලුම ක්ෂේත්‍ර ආපසු ලබා දෙනු ඇත.

උදාහරණ 10.කළමනාකරු Savelyev විසින් දේපල හසුරුවන ලද අයිතිකරුවන් සංඛ්යාව තීරණය කරන්න. බාහිර විමසුම වගු තුනක එකතුවකට ප්‍රවේශ වන විමසුමක් අපි ලියන අතර, EXISTS පුරෝකථනය මඟින් එක් වගුවකට පමණක් ප්‍රවේශය නියම කරයි:

පවතින දත්ත සමුදායකට එරෙහිව සියලුම විමසුම් පරීක්ෂා කෙරේ. සාර්ථක භාවිතය!

සම්බන්ධතා දත්ත සමුදායන් සහ SQL භාෂාව

Novosibirsk රාජ්ය ආර්ථික හා කළමනාකරණ ඇකඩමිය

විනය පිළිබඳ රසායනාගාර පුහුණුව

"දත්ත සමුදාය"

රසායනාගාර කටයුතු අංක 7

"පාදක භාෂාව SQL දත්ත: දත්ත හැසිරවීමේ විධාන»

NOVOSIBIRSK 2000

SQL යනු ව්‍යුහගත විමසුම් භාෂාව සඳහා කෙටි යෙදුමකි. භාෂාවේ නමෙන් පැහැදිලි වන්නේ එහි ප්‍රධාන අරමුණ දත්ත සමුදායකින් තොරතුරු ලබා ගැනීම සඳහා විමසුම් උත්පාදනය කිරීම බවයි. දත්ත ලබා ගැනීම සඳහා වන විධාන DML දත්ත හැසිරවීමේ භාෂාවේ පදනම වේ - SQL භාෂාවේ අනිවාර්ය අංගයකි. කෙසේ වෙතත්, DML සමන්විත වන්නේ දත්ත සමුදායකින් දත්ත ලබා ගැනීම සඳහා වන විධාන පමණක් නොවේ. දත්ත වෙනස් කිරීම, දත්ත කළමනාකරණය සහ වෙනත් අය සඳහා විධාන ද ඇත.

රසායනාගාර කාර්යය DML භාෂාවේ මූලික මෙවලම් පරීක්ෂා කරයි. ප්රගතියේ රසායනාගාර කටයුතුඅපි SQL2 ප්‍රමිතියට ඇලී සිටින්නෙමු.

SQL විශාල භාෂාවක් නිසා අපි මූලික විධාන පමණක් සලකා බලමු. විවිධ විශේෂිත SQL මෙවලම් පසුකාලීන රසායනාගාරවල ආවරණය කර ඇත.

රසායනාගාර කටයුතු සිදු කිරීම සඳහා, සම්බන්ධතා දත්ත ආකෘතියේ මූලික කරුණු, සම්බන්ධතා වීජ ගණිතයේ සහ සම්බන්ධතා ගණනය කිරීමේ මූලික කරුණු සහ MS SQL සේවාදායකය DBMS සමඟ වැඩ කිරීමේ මූලධර්ම පිළිබඳ දැනුම අවශ්ය වේ.

රසායනාගාර කටයුතු සම්පූර්ණ කිරීමේ ප්‍රතිඵලයක් ලෙස, ඔබ SQL භාෂා විධාන භාවිතයෙන් දත්ත හැසිරවීමේ ක්‍රම ප්‍රගුණ කරනු ඇත, MS SQL Server DBMS හි ක්‍රියාත්මක කර ඇති භාෂාවේ උපභාෂාව සලකා බලන්න.

හැදින්වීම

විමසුම් නිර්මාණය කිරීම සහ දත්ත සමුදාය යාවත්කාලීන කිරීම යන දෙකටම SQL පුළුල් පරාසයක දත්ත හැසිරවීමේ හැකියාවන් අඩංගු වේ. මෙම හැකියාවන් දත්ත සමුදායේ තාර්කික ව්‍යුහය මත පමණක් රඳා පවතී, එහි භෞතික ව්‍යුහය මත නොව, සම්බන්ධතා ආකෘතියේ අවශ්‍යතාවයන්ට අනුකූල වේ.

SQL වාක්‍ය ඛණ්ඩයේ මුල් ව්‍යුහය (හෝ අඩුම තරමින් පෙනෙන පරිදි) කෝඩ්ගේ සම්බන්ධතා ගණනය මත පදනම් විය. සම්බන්ධක වීජ ගණිතයේ ඇති එකම සහය දක්වන ක්‍රියාව එකමුතුවයි.

පෙර ප්‍රමිතියේ වර්ධනය වූ සම්බන්ධක කලනය වැනි වාක්‍ය ඛණ්ඩයට අමතරව, SQL2 සෘජුවම මෙහෙයුම් එකමුතුව, ඡේදනය, වෙනස සහ සම්බන්ධ කිරීම ක්‍රියාත්මක කරයි. තෝරා ගැනීම, ව්‍යාපෘතිය සහ නිෂ්පාදන මෙහෙයුම් සඳහා සෘජුවම වාගේ සහය ලබා දෙන අතර (සහ දිගටම පවතිනු ඇත), බෙදීම් සහ පැවරුම් මෙහෙයුම් වඩාත් අපහසු ආකාරයෙන් සහාය දක්වයි.

අපි මුලින්ම SQL විමසුම් භාෂාව සහ පසුව එහි දත්ත ඇතුළත් කිරීම් සහ වෙනස් කිරීමේ මෙහෙයුම් විස්තර කරන්නෙමු. දත්ත වෙනස් කිරීමේ මෙහෙයුම් අවසාන වශයෙන් විස්තර කෙරේ, මන්ද ඒවායේ ව්‍යුහය යම් ප්‍රමාණයකට විමසුම් භාෂාවේ ව්‍යුහය මත රඳා පවතී.

සරල විමසුම්

අපි වෙනුවෙන් සරල ඉල්ලීමදත්ත සමුදායේ එක් වගුවකට පමණක් ප්‍රවේශ වන විමසුමක් ඇත. SQL හි මූලික ව්‍යුහය නිදර්ශනය කිරීමට සරල විමසුම් අපට උපකාරී වනු ඇත.

සරල ඉල්ලීමක්.එක් දත්ත සමුදා වගුවකට පමණක් ප්‍රවේශ වන විමසුමකි.

ඉල්ලීම:ප්ලාස්ටර් ලෙස වැඩ කරන්නේ කවුද?

කොහෙද SKILL_TYPE = "ප්ලාස්ටර්"

ප්‍රතිඵලය:

G.Rickover

මෙම විමසුම වඩාත් පොදු තුන විදහා දක්වයි වාක්ය ඛණ්ඩ SQL: SELECT, FROM සහ කොහෙන්ද. අපගේ උදාහරණයේ අපි ඒවා විවිධ රේඛා මත තැබුවද, ඒවා සියල්ලම එකම පේළියක දිස්විය හැකිය. ඒවා වෙනස් ආකාරයකට ද ඇතුල් කළ හැකි අතර, වාක්‍ය ඛණ්ඩ තුළ ඇති වචන අත්තනෝමතික හිස් සංඛ්‍යාවකින් වෙන් කළ හැක. එක් එක් වාක්‍ය ඛණ්ඩයේ ලක්ෂණ දෙස බලමු.

තෝරන්න. SELECT වගන්තිය මඟින් ලැබෙන වගුවේ දිස්විය යුතු තීරු ලැයිස්තුගත කරයි. මේවා සැමවිටම යම් සම්බන්ධක වගුවක තීරු වේ. අපගේ උදාහරණයේ, ලැබෙන වගුව එක් තීරුවකින් (NAME) සමන්විත වේ, නමුත් පොදුවේ එහි තීරු කිහිපයක් අඩංගු විය හැක; එහි ගණනය කළ අගයන් හෝ නියතයන් ද අඩංගු විය හැක. මෙම එක් එක් විකල්පය සඳහා අපි උදාහරණ දෙන්නෙමු. ලැබෙන වගුවේ තීරු එකකට වඩා අඩංගු විය යුතු නම්, අවශ්‍ය සියලුම තීරු පසුව ලැයිස්තුගත කෙරේ විධාන තෝරන්නකොමා වලින් වෙන් කර ඇත. උදාහරණයක් ලෙස, SELECT WORKER_ID, NAME යන වාක්‍ය ඛණ්ඩය WORKER_ID සහ NAME තීරු වලින් සමන්විත වගුවක් ඇති කරයි.

තෝරන්න වගන්තිය.ලැබෙන වගුවේ තීරු නියම කරයි.

සිට. FROM වගන්තිය විමසුම මගින් ප්‍රවේශ වන වගු එකක් හෝ කිහිපයක් සඳහන් කරයි. SELECT සහ WHERE වගන්තිවල ලැයිස්තුගත කර ඇති සියලුම තීරු FROM විධානයේ ලැයිස්තුගත කර ඇති වගුවක තිබිය යුතුය. SQL2 හි, මෙම වගු මූලික වගු හෝ දත්ත දර්ශන ලෙස ක්‍රමලේඛනය තුළ සෘජුව අර්ථ දැක්විය හැක, නැතහොත් ඒවා SQL විමසුම්වල ප්‍රතිඵලයක් ලෙස නම් නොකළ වගු විය හැක. අවසාන අවස්ථාවෙහිදී, ඉල්ලීම පැහැදිලිවම FROM විධානය තුළ ලබා දී ඇත.

FROM වාක්‍ය ඛණ්ඩය.විමසුම මගින් ප්‍රවේශ වන පවතින වගු සඳහන් කරයි.

කොහෙද. WHERE වගන්තියේ කොන්දේසියක් අඩංගු වේ. වගුවේ (ය) පේළි තෝරා ගන්නා පදනම මත. අපගේ උදාහරණයේ දී, කොන්දේසිය නම්, SQL හි පෙළ නියතයන් සමඟ සෑම විටම සිදු කරනු ලබන පරිදි, SKILL_TYPE තීරුවේ අපෝස්ට්‍රොපිස්වල කොටා ඇති නියත "ප්ලාස්ටර්" අඩංගු විය යුතුය. WHERE වගන්තිය වඩාත්ම වාෂ්පශීලී SQL විධානයයි; එය විවිධ කොන්දේසි අඩංගු විය හැක. WHERE විධානයේ අවසර දී ඇති විවිධ නිර්මිතයන් නිදර්ශනය කිරීම සඳහා අපගේ සාකච්ඡාවේ වැඩි කොටසක් කැප කරනු ඇත.

කොහෙද වගන්තිය.නිශ්චිත වගු වලින් පේළි තෝරාගෙන ඇති කොන්දේසිය නියම කරයි.

ඉහත SQL විමසුම පද්ධතිය විසින් පහත අනුපිළිවෙලින් සකසනු ලැබේ: FROM, WHERE, SELECT. එනම්, FROM විධානයේ දක්වා ඇති වගුවේ පේළි සැකසීම සඳහා වැඩ කරන ප්රදේශයෙහි තබා ඇත. WHERE වගන්තිය එක් එක් පේළියට අනුපිළිවෙලින් යොදනු ලැබේ. WHERE කොන්දේසිය තෘප්තිමත් නොවන සියලුම පේළි සලකා බැලීමෙන් බැහැර කර ඇත. එවිට WHERE කොන්දේසිය තෘප්තිමත් කරන එම පේළි SELECT ප්‍රකාශය මඟින් සකසනු ලැබේ. අපගේ උදාහරණයේදී, එවැනි එක් එක් පේළියෙන් NAME තෝරාගෙන ඇති අතර, තෝරාගත් සියලුම අගයන් විමසුම් ප්‍රතිඵල ලෙස පෙන්වනු ලැබේ.

ඉල්ලීම:කාර්යාල ගොඩනැගිලි පිළිබඳ සියලු තොරතුරු සපයන්න.

කොහෙද වර්ගය = "කාර්යාලය"

ප්‍රතිඵලය:

BLDG IDADDRESSTYPEQLTY LEVELSTATUS

312 එල්ම් ශාන්ත, 123 කාර්යාලය 2 2

210 Berezovaya st. 1011 Office Z 1

111 Osinovaya st. 1213 ඔෆිස් 4 1

SELECT විධානයක තරු ලකුණක් (*) යනු "සම්පූර්ණ පේළිය" යන්නයි. මෙය අප නිතර භාවිතා කරන පහසු කෙටි යෙදුමකි.

ඉල්ලීම:සෑම විදුලි කාර්මිකයෙකුටම සතිපතා වැටුප කොපමණද?

NAME තෝරන්න, "සතිපතා වැටුප = ", 40 * HRLY_RATE

කොහෙද SKILL_TYPE = "විදුලි කාර්මිකයා"

ප්‍රතිඵලය:

M. ෆැරඩේ සතිපතා වැටුප = 500.00

H.Columbus සතිපතා වැටුප = 620.00

මෙම විමසුම මඟින් අක්ෂර නියතයන් දෙකම (අපගේ උදාහරණයේ "සතිපතා වැටුප් = ") සහ SELECT විධානයේ ගණනය කිරීම් විදහා දක්වයි. SELECT ප්‍රකාශය තුළ, ඔබට සංඛ්‍යාත්මක තීරු සහ සංඛ්‍යාත්මක නියතයන් මෙන්ම සම්මත අංක ගණිත ක්‍රියාකරුවන් භාවිතා කරන ගණනය කිරීම් සිදු කළ හැකිය ( +, -, *, /), වරහන් භාවිතයෙන් අවශ්‍ය පරිදි කාණ්ඩගත කර ඇත. අපි අලුත් එකක් ද ඇතුළත් කර ඇත ORDER විධානය BY, විමසුම වර්ග කරන ප්‍රතිඵලය නිශ්චිත තීරුවෙන් අක්ෂරාංක අනුපිළිවෙලට නැඟීමට හේතු වේ. ඔබට ප්‍රතිඵල අවරෝහණ අනුපිළිවෙලින් වර්ග කිරීමට අවශ්‍ය නම්, ඔබ විධානයට DESC එක් කළ යුතුය. ORDER BY වගන්තියට ප්‍රතිඵල තීරු කිහිපයකින්, සමහරක් ආරෝහණ අනුපිළිවෙලින් සහ තවත් ඒවා අවරෝහණ අනුපිළිවෙලින් වර්ග කළ හැක. වර්ගීකරණයේ මූලික යතුරු තීරුව පළමුව ලැයිස්තුගත කර ඇත.

අක්ෂර නියතය.අකුරු, අංක සහ "විශේෂ" අක්ෂර වලින් සමන්විත නියතයකි.

ඉල්ලීම:$10 සිට $12 දක්වා පැයකට ගාස්තුවක් ඇත්තේ කාටද?

HRLY_RATE > = 10 සහ HRLY_RATE කොහෙද< - 12

ප්‍රතිඵලය:

සේවක හැඳුනුම්පතනම HRLY_RATE SKILL_TYPE SUPV_ID

මෙම විමසුම WHERE ප්‍රකාශයේ අමතර විශේෂාංග කිහිපයක් විදහා දක්වයි: සංසන්දන ක්‍රියාකරුවන් සහ බූලියන් සහ ක්‍රියාකරු. සැසඳීමේ ක්‍රියාකරුවන් හය (=,<>(සමාන නොවේ)<, >, <=, >=). බූලියන් ක්‍රියාකරුවන් AND, OR, සහ NOT සංයුක්ත තත්ත්වයන් නිර්මාණය කිරීමට හෝ කොන්දේසියක් ප්‍රතික්ෂේප කිරීමට භාවිතා කළ හැක. ක්‍රමලේඛන භාෂා වල සාමාන්‍ය පරිදි කණ්ඩායම් කොන්දේසි සඳහා වරහන් භාවිතා කළ හැක.

සංසන්දන ක්‍රියාකරුවන් =,<>, <, >, <=, >=.

බූලියන් මෙහෙයුම් AND (AND), OR (OR) සහ NOT (HE) .

මෙම විමසුම සැකසීමට ඔබට BETWEEN (අතර) ක්‍රියාකරු ද භාවිතා කළ හැක:

HRLY_RATE 10 සහ 12 අතර

සංසන්දනය කරන ලද ප්‍රමාණය මෙම එක් එක් ප්‍රමාණවලට හෝ ඒ අතර ඇති ඕනෑම අගයකට සමාන විය හැකි නම්, අනෙක් ප්‍රමාණ දෙකක් සමඟ ප්‍රමාණයක් සංසන්දනය කිරීමට BETWEEN භාවිතා කළ හැක.

ඉල්ලීම: ප්ලාස්ටර්, සෙවිලි සහ විදුලි කාර්මිකයන් ලැයිස්තුගත කරන්න.

කොහෙද SKILL_TYPE IN ("ප්ලාස්ටර්", "රූෆර්", "විදුලි කාර්මිකයා")

ප්‍රතිඵලය:

WORKER_ID නම HRLY_RATE SKILL_TYPE SUPV_ID

1412 K.Nemo 13.75 ප්ලාස්ටර් 1520

2920 ආර්. ගැරට් 10.00 වහලය 2920

1520 G. Rickover 11.75 Plasterer 1520

මෙම විමසුම IN (B) සංසන්දන ක්‍රියාකරුගේ භාවිතය පැහැදිලි කරයි. පේළියේ විශේෂිත වර්ගය වරහන් තුළ දක්වා ඇති කට්ටලය තුළ පිහිටා තිබේ නම්, එනම්, විශේෂිත වර්ගය ප්ලාස්ටර්, වහලය හෝ විදුලි කාර්මිකයා නම්, WHERE තත්ත්වය සත්‍ය ලෙස සලකනු ලැබේ. අපි IN ක්‍රියාකරු නැවත උප විමසුම් වලින් දකිමු.

අපගේ විශේෂත්වයේ අක්ෂර වින්‍යාසය අපට හරියටම මතක නැති බව උපකල්පනය කරමු: "විදුලි කාර්මිකයා" හෝ "ඉලෙක්ට්‍රොනික ඉංජිනේරු" හෝ වෙනත් දෙයක්. නිර්වචනය නොකළ අක්ෂර තන්තු ප්‍රතිස්ථාපනය කරන වයිල්ඩ්කාඩ් අක්ෂර, විමසුමක සාවද්‍ය අක්ෂර වින්‍යාස සොයා ගැනීම පහසු කරයි.

රටා සංකේත.නිර්වචනය නොකළ අක්ෂර තන්තු ප්‍රතිස්ථාපනය කරන අක්ෂර.

ඉල්ලීම:"Elek" සමඟින් ආරම්භ වන විශේෂත්වය සහිත සේවකයින් ලැයිස්තුගත කරන්න.

කොහෙද SKILL_TYPE කැමති ("Elect%")

ප්‍රතිඵලය:

සේවක හැඳුනුම්පත නම HRLY_RATE SKILL_TYPE SUPV_ID

1235 එම්. ෆැරඩේ 12.50 විදුලි කාර්මිකයා 1311

1311 එච්. කොලම්බස් 15.50 විදුලි 1311

SQL හි වයිල්ඩ්කාඩ් අක්ෂර දෙකක් ඇත: % (ප්‍රතිශතය) සහ _ (යටි ඉරි). යටි ඉරි හරියටම එක් නිර්වචනය නොකළ අක්ෂරයක් ප්‍රතිස්ථාපනය කරයි. ප්‍රතිශතය බිංදුවෙන් ආරම්භ වන අත්තනෝමතික අක්ෂර සංඛ්‍යාවක් ප්‍රතිස්ථාපනය කරයි. වයිල්ඩ්කාඩ් අක්ෂර භාවිතා කරන විට, අක්ෂර විචල්‍යයන් නියතයන් සමඟ සංසන්දනය කිරීමට LIKE ක්‍රියාකරුවෙකු අවශ්‍ය වේ. වෙනත් උදාහරණ:

"__කොලොම්බස්" වැනි නම

"__K%" වැනි නම

NAME හි "Columbus" අක්ෂර දෙකකින් සමන්විත නම් පළමු උදාහරණයේ කොන්දේසිය සත්‍ය වේ. WORKER වගුවේ, සියලුම නම් පළමු මුලාරම්භයකින් සහ කාල පරිච්ඡේදයකින් ආරම්භ වේ. මේ අනුව, මෙම කොන්දේසිය භාවිතා කරමින් අපි. "කොලොම්බස්" යන අවසාන නම ඇති සියලුම සේවකයින් සොයා ගනිමු. දෙවන උදාහරණයේ කොන්දේසිය "K" අක්ෂරයෙන් ආරම්භ වන අවසාන නම් සහිත සියලුම සේවකයින් සොයා ගැනීමට අපට ඉඩ සලසයි.

ඉල්ලීම:ඉදිරි සති දෙක තුළ ආරම්භ වන සියලුම රැකියා සොයන්න.

CURRENT_DATE අතර START_DATE සහ

ප්‍රතිඵලය:(වර්තමාන දිනය වත්මන් දිනය = 10.10 යැයි උපකල්පනය කරන්න)

WORKER_ID BLDG_ID START_DATE NUM_DAYS

1235 312 10.10 5

1235 515 17.10 22

3231 111 10.10 8

1412 435 15.10 15

3231 312 24.10 20

1311 460 23.10 24

මෙම විමසුම මඟින් දින සහ විරාම අගයන් සමඟ BETWEEN ක්‍රියාකරු භාවිතා කිරීම නිදර්ශනය කරයි. CURRENT_DATE යනු සෑම විටම අද දිනය ලබා දෙන ශ්‍රිතයකි. ප්රකාශනය

CURRENT_DATE + INTERVAL "14" DAY

වත්මන් දිනයට සති දෙකක කාලයක් එකතු කරයි. මේ අනුව, එහි START_DATE තීරු අගය 10/10 සහ 10/24 අතර නම් ASSIGNMENT තෝරා ගනු ලැබේ (අද 10/10 යැයි උපකල්පනය කරයි). මෙයින් අපට පෙනෙන්නේ අපට දින ක්ෂේත්‍රවලට විරාම අගයන් එකතු කළ හැකි බවයි. එපමණක් නොව, අපට විරාමවල අගයන් පූර්ණ සංඛ්‍යා අගයන් මගින් ගුණ කළ හැක. උදාහරණයක් ලෙස, අපට නිශ්චිත සති ගණනකදී (NUM_WEEKS විචල්‍යයෙන් දැක්වෙන) අංකය කුමක්දැයි සොයා ගැනීමට අවශ්‍ය යැයි සිතමු. අපට එය මේ ආකාරයට කළ හැකිය:

CURRENT_DATE + INTERVAL "7" DAY * NUM_WEEKS

2. බහු වගු විමසුම්

තනි වගුවක සීමාවන් හරහා දත්ත මූලද්‍රව්‍ය සම්බන්ධ කිරීමේ හැකියාව ඕනෑම දත්ත සමුදා භාෂාවක් සඳහා වැදගත් වේ. සම්බන්ධක වීජ ගණිතයේදී, මෙම කාර්යය සිදු කරනු ලබන්නේ සම්බන්ධ කිරීමේ මෙහෙයුම මගිනි. SQL හි බොහෝමයක් සෘජුවම සම්බන්ධිත කලනය මත පදනම් වුවද, SQL විවිධ වගු වලින් දත්ත සම්බන්ධක වීජ ගණිතයේ සම්බන්ධ කිරීමේ ක්‍රියාවලියට සමාන ආකාරයකින් සම්බන්ධ කරයි. දැන් අපි පෙන්වන්නම් මේක කරන්නේ කොහොමද කියලා. ඉල්ලීම සලකා බලන්න:

ඉල්ලීම:

පිළිතුර සඳහා අවශ්‍ය දත්ත වගු දෙකකින් ඇත: සේවකයා සහ පැවරුම. SQL විසඳුම සඳහා FROM විධානයේ වගු දෙකම ලැයිස්තුගත කිරීම සහ විශේෂිත WHERE වගන්තියක් සඳහන් කිරීම අවශ්‍ය වේ:

SKILL_TYPE තෝරන්න

සේවකයාගෙන්, පැවරුම

WORKER.WORKER_ID = ASSIGNMENT.WORKER_ID

සහ BLDG_ID = 435

මොකද මෙතන වෙන්නෙ? පද්ධතිය මෙම ඉල්ලීම සකසන ආකාරය සම්බන්ධයෙන් අපි අදියර දෙකක් සලකා බැලිය යුතුය.

1. සුපුරුදු පරිදි, FROM වගන්තිය පළමුව සකසනු ලැබේ. කෙසේ වෙතත්, මෙම අවස්ථාවෙහිදී, විධානය වගු දෙකක් නියම කරන බැවින්, පද්ධතිය මෙම වගු වල පේළි වලින් කාටිසියානු නිෂ්පාදනයක් නිර්මාණය කරයි. මෙයින් අදහස් කරන්නේ එක් විශාල වගුවක් නිර්මාණය කර ඇති බවයි (තාර්කිකව) වගු දෙකේම තීරු වලින් සමන්විත වන අතර, එක් වගුවක එක් එක් පේළිය අනෙක් වගුවේ එක් එක් පේළිය සමඟ යුගල කර ඇත. අපගේ උදාහරණයේ, WORKER වගුවේ තීරු පහක් සහ ASSIGNMENT වගුවේ තීරු හතරක් ඇති නිසා, FROM විධානය මඟින් නිපදවන Cartesian නිෂ්පාදනයට තීරු නවයක් ඇත. Cartesian නිෂ්පාදනයේ මුළු පේළි ගණන m * n ට සමාන වේ, m යනු සේවක වගුවේ පේළි ගණනයි; සහ n යනු පැවරුම් වගුවේ ඇති පේළි ගණනයි. WORKER වගුවේ පේළි 7ක් සහ ASSIGNMENT වගුවේ පේළි 19ක් ඇති බැවින්, Cartesian නිෂ්පාදනයේ 7x19 හෝ 133 පේළි අඩංගු වේ. FROM විධානය වගු දෙකකට වඩා ලැයිස්තුගත කරන්නේ නම්, විධානයේ දක්වා ඇති සියලුම වගු වල Cartesian නිෂ්පාදනයක් සාදනු ලැබේ.

කාටිසියානු නිෂ්පාදනය. එක් වගුවක එක් එක් පේළිය සමඟ සම්බන්ධ වීමේ ප්‍රතිඵලය සෑමවෙනත් මේසයකින් පේළියක්.

2. යෝධ සම්බන්ධතා වගුව නිර්මාණය කිරීමෙන් පසු, පද්ධතිය පෙර පරිදිම WHERE විධානය භාවිතා කරයි. FROM විධානය මගින් සාදන ලද වගුවේ සෑම පේළියක්ම. WHERE කොන්දේසිය තෘප්තිමත් වේද යන්න පරීක්ෂා කරනු ලැබේ. කොන්දේසිය තෘප්තිමත් නොවන පේළි සලකා බැලීමෙන් බැහැර කරනු ලැබේ. SELECT වගන්තිය ඉතිරි පේළි වලට යොදනු ලැබේ.

අපගේ විමසුමේ WHERE වගන්තියේ කොන්දේසි දෙකක් අඩංගු වේ:

1. සේවකයා. WORKER_ID = ASSIGNMENT.WORKER_ID

2. BLDG_ID = 435

මෙම කොන්දේසි වලින් පළමුවැන්න ඒකාබද්ධ කොන්දේසියයි. WORKER සහ ASSIGNMENT වගු දෙකෙහිම WORKER_ID නමින් තීරුවක් අඩංගු වන බැවින්, ඔවුන්ගේ Cartesian නිෂ්පාදනයේ එම නම සහිත තීරු දෙකක් අඩංගු වන බව සලකන්න. ඒවා අතර වෙනස හඳුනා ගැනීම සඳහා, අපි තිතකින් වෙන් කරන ලද මූලාශ්‍ර වගුවේ නම සමඟ තීරු නාමයට පෙර.

පළමු කොන්දේසිය යනු තෝරාගත් ඕනෑම පේළියක, WORKER වගුවේ ඇති WORKER_ID තීරුවේ අගය ASSIGNMENT වගුවේ ඇති WORKER_ID තීරුවේ අගයට ගැළපිය යුතු බවයි. ඇත්ත වශයෙන්ම, අපි WORKER_ID විසින් වගු දෙකකට සම්බන්ධ වෙමු. මෙම තීරු දෙකේ අගයන් සමාන නොවන සියලුම පේළි නිෂ්පාදන වගුවෙන් බැහැර කර ඇත. සම්බන්ධක වීජ ගණිතයේ ස්වාභාවික සම්බන්ධක ක්‍රියාකාරිත්වය සිදු කිරීමේදී හරියටම එයම සිදු වේ. (කෙසේ වෙතත්, ස්වභාවික එකතුවකින් තවමත් යම් වෙනසක් ඇත: SQL අමතර WORKER_ID තීරුව ස්වයංක්‍රීයව ඉවත් නොකරයි). BLDG_ID = 435 අතිරේක කොන්දේසිය සහිත මෙම වගු දෙකෙහි සම්පූර්ණ එකතුව රූපයේ දැක්වේ. 1. SELECT විධානය භාවිතා කිරීමෙන් අවසානයේ පහත විමසුම් ප්රතිඵලය ලබා දෙනු ඇත:

කුසලතා වර්ගය

ප්ලාස්ටර්

වහලය

විදුලි කාර්මිකයා

සහල්. 1. සේවක සහ පැවරුම් වගු වලට සම්බන්ධ වීම

දැන් අපි පෙන්වන්නේ SQL හි වගුවක් තමන්ටම සම්බන්ධ කරගන්නා ආකාරයයි.

ඉල්ලීම:සේවකයින් ලැයිස්තුගත කරන්න, ඔවුන්ගේ කළමනාකරුවන්ගේ නම් සඳහන් කරන්න.

A.WORKER_NAME, B.WORKER_NAME තෝරන්න

A සේවකයාගෙන්, සේවක බී

B.WORKER_ID = A.SUPV_ID

මෙම උදාහරණයේ FROM වගන්තිය මඟින් WORKER වගුවේ "පිටපත්" දෙකක් සාදන අතර, ඒවාට A සහ ​​B යන අන්වර්ථ නාම ලබා දෙයි. අන්වර්ථයක් යනු වගුව සඳහා ලබා දී ඇති විකල්ප නාමයකි. එවිට WORKER වගුවේ A සහ ​​B පිටපත් WHERE විධානය මගින් B හි WORKER_ID සහ A හි SUPV_ID හි සමානාත්මතාවය මත පදනම් වේ. මේ අනුව, A සිට සෑම පේළියක්ම A පේළියේ කළමනාකරු පිළිබඳ තොරතුරු අඩංගු B පේළියට සම්බන්ධ වේ. (රූපය 2).

සහල්. 2. WORKER වගුවේ පිටපත් දෙකක් සම්බන්ධ කිරීම

එක් එක් පේළියෙන් සේවක නම් දෙකක් තේරීමෙන්, අපට අවශ්‍ය ලැයිස්තුව ලැබේ:

A.NAMEB.NAME

එම්. ෆැරඩේ එච්. කොලොම්බස්

K.Nemo G.Rickover R.Garrett R.Garrett

P. Mason P. Mason G. Rickover G. Rickover H. Columbus H. Columbus J. Barrister P. Mason

අන්වර්ථ නාමය.මේසයට විකල්ප නමක් ලබා දී ඇත.

A.WORKER_NAME සේවකයා නියෝජනය කරන අතර B.WORKER_NAME කළමනාකරු නියෝජනය කරයි. සමහර කම්කරුවන් ඔවුන්ගේම කළමනාකරුවන් බව කරුණාවෙන් සලකන්න, එය ඔවුන්ගේ පේළිවල WORKER_ID - SUPV_ID සමානාත්මතාවයෙන් අනුගමනය කරයි.

SQL හි, ඔබට වරකට වගු දෙකකට වඩා සම්බන්ධ කළ හැක:

ඉල්ලීම

සේවක_NAME තෝරන්න

සේවකයාගෙන්, පැවරුමෙන්, ගොඩනැඟිල්ලෙන්

WORKER.WORKER_ID = ASSIGNMENT.WORKER_ID සහ ASSIGNMENT.BLDG_ID = BUILDING.BLDG_ID සහ

TYPE = "කාර්යාලය"

ප්‍රතිඵලය:

එම්. ෆැරඩේ

G.Rickover

ජේ.බැරිස්ටර්

තීරු නාමයක් (WORKER_ID හෝ BLDG_ID වැනි) වගු එකකට වඩා දිස්වන්නේ නම්, අපැහැදිලි බව වළක්වා ගැනීම සඳහා අපි මුල් වගුවේ නම සමඟ තීරු නාමය පෙරට දැමිය යුතු බව සලකන්න. නමුත් අපගේ උදාහරණයේ TYPE වැනි තීරු නාමය එක් වගුවක පමණක් සිදුවේ නම්, එහි අපැහැදිලි බවක් නොමැත, එබැවින් වගුවේ නම සඳහන් කිරීමට අවශ්‍ය නොවේ.

මෙම විමසුමේ ඇති SQL විධානයන් සම්බන්ධිත දත්ත සමුදා වගු තුනකින් එක වගුවක් නිර්මාණය කරයි. පළමු වගු දෙක WORKER_ID විසින් සම්බන්ධ කර ඇති අතර, ඉන් පසුව තුන්වන වගුව BLDG_ID මගින් ලැබෙන වගුවට සම්බන්ධ වේ. තත්ත්වය

TYPE = "කාර්යාලය"

WHERE වගන්තිය කාර්යාල ගොඩනැගිලි සඳහා හැර අනෙකුත් සියලුම පේළි බැහැර කිරීමට හේතු වේ. මෙය ඉල්ලීමේ අවශ්‍යතා සපුරාලයි.

3. උප විමසුම්

උප විමසුම.විමසුමක් ඇතුළත විමසුම

විමසුමක WHERE වගන්තිය තුළ උප විමසුමක් තැබිය හැකි අතර එමඟින් WHERE වගන්තියේ හැකියාවන් පුළුල් කරයි. අපි උදාහරණයක් බලමු.

ඉල්ලීම: 435 ගොඩනැගීමට අනුයුක්ත කරන ලද සේවකයන්ගේ විශේෂතා මොනවාද?

SKTLL_TYPE තෝරන්න

WORKER_ID IN සිටින සේවකයාගෙන්

(WORKER_ID තෝරන්න

BLDG_ID කොහෙද = 435)

මෙම උදාහරණයේ උප විමසුම

(WORKER_ID තෝරන්න

BLDG_ID කොහෙද = 435)

උප විමසුමක් අඩංගු විමසුමක් ලෙස හැඳින්වේ බාහිර ඉල්ලීමහෝ ප්රධාන ඉල්ලීම. උප විමසුමේ ප්‍රතිඵලයක් ලෙස පහත සේවක හැඳුනුම්පත් කට්ටලයක් නිර්මාණය වේ:

සේවක හැඳුනුම්පත

බාහිර ඉල්ලීම.සියලුම උප විමසුම් අඩංගු ප්‍රධාන විමසුම.

මෙම හැඳුනුම්පත් කට්ටලය බාහිර විමසුමේ උප විමසුමක ස්ථානය ගනී. මෙතැන් සිට, උප විමසුම මගින් සාදන ලද කට්ටලය භාවිතයෙන් බාහිර විමසුම ක්රියාත්මක වේ. පිටත විමසුම WORKER වගුවේ සෑම පේළියක්ම WHERE වගන්තියට අනුව සකසයි. පේළියක WORKER_ID උප විමසුම මගින් සාදන ලද (IN) කට්ටලය තුළ පිහිටා තිබේ නම්, පේළියේ SKILL_TYPE තෝරා ඇති අතර ලැබෙන වගුවේ පෙන්වනු ලැබේ:

කුසලතා වර්ගය

ප්ලාස්ටර්

වහලය

විදුලි කාර්මිකයා

උප විමසුමේ SELECT වගන්තියේ WORKER_ID සහ WORKER_ID පමණක් අඩංගු වීම ඉතා වැදගත් වේ. එසේ නොමැති නම්, WORKER_ID සේවක හැඳුනුම්පත් කට්ටලයේ ඇති බව අදහස් වන පිටත විමසුමේ WHERE වගන්තියට තේරුමක් නැත.

ප්‍රධාන විමසුම මගින් අවම වශයෙන් එක් පේළියක් සලකා බැලීමට පෙර උප විමසුමක් තාර්කිකව ක්‍රියාත්මක කළ හැකි බව සලකන්න. එක් අර්ථයකින්, උප විමසුමක් ප්‍රධාන විමසුමෙන් ස්වාධීන වේ. එය සම්පූර්ණ විමසුමක් ලෙස ක්‍රියාත්මක කළ හැක. එවැනි උප ප්‍රශ්න කිරීමක් ප්‍රධාන විමසුම සමඟ සහසම්බන්ධ නොවන බව අපි කියමු. අපි ඉක්මනින් දකින පරිදි, උප විමසුම් සහසම්බන්ධ විය හැකිය.

සහසම්බන්ධ නොවන උප විමසුම.ඕනෑම බාහිර විමසුමකින් අගය ස්වාධීන වන උප විමසුමකි.

උප විමසුමක උප විමසුමක උදාහරණයක් මෙන්න.

ඉල්ලීම: කාර්යාල ගොඩනැගිලි සඳහා පවරා ඇති සේවකයින් ලැයිස්තුගත කරන්න.

නැවතත් අපි සම්බන්ධතාවය පරීක්ෂා කළ විමසුම දෙස බලමු.

WORKER_MAME තෝරන්න

WORKER_ID IN

(WORKER_ID තෝරන්න

BLDG_ID IN කොහෙද

වර්ගය = "කාර්යාලය"))

ප්‍රතිඵලය:

එම්. ෆැරඩේ

G.Rickover

ජේ.බැරිස්ටර්

සෑම උප විමසුමකින්ම එක වගුවක් පමණක් ක්‍රියාවට නංවන බැවින්, අපැහැදිලි භාවයක් ඇති විය නොහැකි බැවින්, අපට කිසිදු තැනක වගු නාම සමඟ තීරු නාම උපසර්ග කිරීමට අවශ්‍ය නොවන බව සලකන්න.

විමසුම් ක්‍රියාත්මක කිරීම ඇතුළත-පිටත අනුපිළිවෙලකට සිදු වේ. එනම්, අභ්‍යන්තර විමසුම (හෝ "පහළම") ප්‍රථමයෙන් ක්‍රියාත්මක වේ, පසුව එය අඩංගු උප විමසුම ක්‍රියාත්මක කරනු ලැබේ, පසුව පිටත විමසුම.

සහසම්බන්ධ උප විමසුම්. ඉහත සාකච්ඡා කරන ලද සියලුම උප විමසුම් ඒවා භාවිතා කරන ලද ප්‍රධාන විමසුම් වලින් ස්වාධීන විය. ස්වාධීන යන්නෙන්, අපි අදහස් කරන්නේ උප විමසුම් සම්පූර්ණ විමසුම් ලෙස තනිවම ක්‍රියාත්මක කළ හැකි බවයි. අපි දැන් ප්‍රධාන විමසුමෙන් සලකා බලන පේළිය මත ක්‍රියාත්මක කිරීමේ ප්‍රතිඵල රඳා පවතින උප විමසුම් පන්තියක් සලකා බැලීමට ඉදිරියට යන්නෙමු. එවැනි උප විමසුම් සහසම්බන්ධ උප විමසුම් ලෙස හැඳින්වේ.

සහසම්බන්ධ උප විමසුම. ප්‍රධාන විමසුම මගින් සලකා බලන පේළිය මත ප්‍රතිඵලය රඳා පවතින උප විමසුමකි.

ඉල්ලීම:ඔවුන්ගේ කළමනාකරුවන්ට වඩා පැයක ගාස්තු වැඩි සේවකයින් ලැයිස්තුගත කරන්න.

සේවක_NAME තෝරන්න

A.HRLY_RATE > කොහෙද

(තෝරන්න B.HRLY_RATE

B.WORKER_ID = A.SUPV_ID)

ප්‍රතිඵලය:

මෙම ඉල්ලීම ක්‍රියාත්මක කිරීම සඳහා තාර්කික පියවර වන්නේ:

1. පද්ධතිය විසින් WORKER වගුවේ පිටපත් දෙකක් නිර්මාණය කරයි: පිටපත් A සහ ​​පිටපත් B. අප ඒවා නිර්වචනය කළ ආකාරය අනුව, A යනු සේවකයා, B යනු කළමනාකරු වෙත ය.

2. පද්ධතිය පසුව A එක් එක් පේළිය සලකා බලයි. WHERE කොන්දේසිය තෘප්තිමත් කරන්නේ නම් ලබා දී ඇති පේළියක් තෝරා ගනු ලැබේ. මෙම කොන්දේසිය යනු පේළියක් එහි HRLY_RATE අගය උප විමසුම මගින් ජනනය කරන HRLY_RATE ට වඩා වැඩි නම් තෝරා ගන්නා බවයි.

3. උප විමසුම B පේළියෙන් HRLY_RATE අගය තෝරා ගනී, එහි WORKER_ID A පේළියේ SUPV_ID ට සමාන වේ, මේ මොහොතේප්රධාන ඉල්ලීම මගින් සලකා බලනු ලැබේ. මෙය කළමනාකරුගේ HRLY_RATE වේ.

A.HRLY_RATE සැසඳිය හැක්කේ එක් අගයකට පමණක් බැවින්, උප විමසුම එක් අගයක් පමණක් ලබා දිය යුතු බව සලකන්න. A සලකා බලන පේළිය අනුව මෙම අගය වෙනස් වේ. මේ අනුව, උප විමසුම ප්‍රධාන විමසුම සමඟ සහසම්බන්ධ වේ. අපි බිල්ට්-ඉන් කර්තව්‍යයන් අධ්‍යයනය කරන විට සහසම්බන්ධ උප විමසුම් සඳහා තවත් උදාහරණ පසුව දකිමු.

EXISTS සහ NOT EXISTS ක්‍රියාකරුවන්

යම් ගොඩනැඟිල්ලක වැඩ කිරීමට අනුයුක්ත නොකළ සේවකයන් හඳුනා ගැනීමට අපට අවශ්‍ය යැයි සිතමු. මතුපිටින් පෙනෙන පරිදි, ඉල්ලීමේ ස්ථිර අනුවාදය නිෂේධනය කිරීමෙන් එවැනි ඉල්ලීමක් පහසුවෙන් තෘප්තිමත් කළ හැකි බව පෙනේ. උදාහරණයක් ලෙස, අපි BLDG_ID 435 සහිත ගොඩනැගිල්ලක් ගැන උනන්දු යැයි සිතන්න. ඉල්ලීම සලකා බලන්න:

WORKER_ID තෝරන්න

BLDG_ID 435 නොවේ

අවාසනාවකට, මෙය විසඳුමේ වැරදි සූත්රගත කිරීමකි. ඉල්ලීම මගින් අපට වෙනත් ගොඩනැගිලිවල සේවය කරන සේවකයින්ගේ හැඳුනුම්පත ලබා දෙනු ඇත. නිසැකවම, ඔවුන්ගෙන් සමහරක් 435 ගොඩනැගීමට ද පැවරිය හැකිය.

නිවැරදිව සකස් කරන ලද විසඳුමක් නොපවතින ක්රියාකරු භාවිතා කරයි:

WORKER_ID තෝරන්න

කොහේද නොපවතියි

පැවරුම.WORKER_ID = WORKER.WORKER_ID සහ

ප්රතිඵලය:

WORKER_ID

EXISTS සහ NOT EXISTS ක්‍රියාකරුවන් සෑම විටම උප විමසුමට පෙර තබා ඇත. උප විමසුම මගින් ජනනය කරන ලද කට්ටලය හිස් නොවේ නම් EXISTS සත්‍ය ලෙස ඇගයීමට ලක් කරයි. උප විමසුම මගින් ජනනය කරන ලද කට්ටලය හිස් නම්, EXISTS "අසත්‍ය" අගය ගනී. NOT EXISTS ක්රියාකරු, ඇත්ත වශයෙන්ම, හරියටම ප්රතිවිරුද්ධව ක්රියා කරයි. උප විමසුමේ ප්‍රතිඵලය හිස් නම් එය සත්‍ය වන අතර එසේ නොමැති නම් අසත්‍ය වේ.

පවතින ක්‍රියාකරු. ප්‍රතිඵල කට්ටලය හිස් නොවේ නම් සත්‍ය ලබා දෙයි.

ක්‍රියාකරු නොමැත. ප්‍රතිඵල කට්ටලය හිස් නම් සත්‍ය ලබා දෙයි.

මෙම උදාහරණයේදී අපි භාවිතා කළේ NOT EXISTS ක්‍රියාකරුයි. උප විමසුම මඟින් ASSIGNMENT වගුවේ සියලුම පේළි තෝරන අතර එහි WORKER_ID හට ප්‍රධාන විමසුම මගින් සලකනු ලබන පේළියට සමාන අගයක් ඇති අතර BLDG_ID 435 ට සමාන වේ. මෙම කට්ටලය හිස් නම්, ප්‍රධාන විමසුම මගින් සලකනු ලබන සේවක පේළිය වේ තෝරා ඇත, මෙයින් අදහස් කරන්නේ මෙම සේවකයා 435 ගොඩනැගීමේ වැඩ නොකරන බවයි.

අප විසින් සපයන ලද විසඳුමෙහි, අපි සහසම්බන්ධ උප විමසුමක් භාවිතා කළෙමු. අපි NOT EXISTS වෙනුවට IN ක්‍රියාකරු භාවිතා කරන්නේ නම්, අපට සහසම්බන්ධ නොවන උප විමසුමකින් ලබා ගත හැක:

WORKER_ID තෝරන්න

WORKER_ID නොමැති තැන

(WORKER_ID තෝරන්න

BLDG_ID = 435)

මෙම විසඳුම EXISTS ක්‍රියාකරු සමඟ ඇති විසඳුමට වඩා සරල ය. ස්වාභාවික ප්‍රශ්නයක් පැන නගී: අපට පවතින ඒවා අවශ්‍ය වන්නේ ඇයි? පිළිතුර නම් කොන්දේසියේ "සෑම" යන වචනය අඩංගු විමසුම් විසඳීමට ඇති එකම ක්‍රමය NOT EXISTS බවයි. එවැනි විමසුම් බෙදීමේ මෙහෙයුම භාවිතා කරමින් සම්බන්ධතා වීජ ගණිතයේ සහ විශ්ව ප්‍රමාණාංකකය භාවිතා කරමින් සාපේක්ෂ කලනයේ දී විසඳනු ලැබේ. "සෑම" යන වචනය එහි තත්වයේ ඇති විමසුමක උදාහරණයක් මෙන්න:

ඉල්ලීම:එක් එක් ගොඩනැගිල්ලට පවරා ඇති සේවකයින් ලැයිස්තුගත කරන්න.

මෙම ප්‍රශ්නය ද්විත්ව නිෂේධන භාවිතයෙන් SQL හි ක්‍රියාත්මක කළ හැක. ද්විත්ව සෘණ ඇතුළත් කිරීමට අපි විමසුම නැවත සකස් කරන්නෙමු:

ඉල්ලීම:එවැනි සේවකයින් කවුරුන් සඳහාද යන්න ලැයිස්තුගත කරන්න නැතඔවුන්ට පවරා නැති ගොඩනැගිල්ලක් තිබේ.

අපි ද්විත්ව සෘණාත්මක අගය ඉස්මතු කළෙමු. මෙම ඉල්ලීම තර්කානුකූලව පෙර ඉල්ලීමට සමාන බව පැහැදිලිය.

දැන් අපි SQL හි විසඳුම සකස් කිරීමට අවශ්යයි. අවසාන විසඳුම තේරුම් ගැනීමට පහසු කිරීම සඳහා, අපි මුලින්ම මූලික ගැටලුවකට විසඳුමක් ලබා දෙන්නෙමු: උපකල්පිත සේවකයෙකු වන "1234" සඳහා වන සියලුම ගොඩනැගිලි හඳුනා ගැනීමේ ගැටලුව නැතපත් කළා.

(I) BLDG_ID තෝරන්න

කොහේද නොපවතියි

ASSIGNMENT.WORKER_ID = 1234)

අපි මෙම විමසුම (I) සලකුණු කර ඇති නිසා අපි එය පසුව යොමු කරමු. මෙම ඉල්ලීම තෘප්තිමත් කරන ගොඩනැගිල්ලක් නොමැති නම්, එක් එක් ගොඩනැගිල්ල සඳහා සේවක 1234 අනුයුක්ත කර ඇති අතර එම නිසා මුල් ඉල්ලීමේ කොන්දේසි තෘප්තිමත් කරයි. මුල් විමසුමට විසඳුමක් ලබා ගැනීම සඳහා, අපි නිශ්චිත සේවකයෙකු 1234 සිට WORKER_ID විචල්‍යයට විමසුම (I) සාමාන්‍යකරණය කළ යුතු අතර මෙම වෙනස් කළ විමසුම විශාල විමසුමේ උප විමසුමක් බවට පත් කළ යුතුය. මෙන්න විසඳුම:

(II) WORKER_ID තෝරන්න

කොහේද නොපවතියි

කොහේද නොපවතියි

පැවරුම්.BLDG_ID = BUILDING.BLDG_ID සහ

ASSIGNMENT.WORKER_ID = WORKER.WORKER_ID)

ප්‍රතිඵලය:

සේවක හැඳුනුම්පත

හතරවන විමසුම් පේළියේ (II) ආරම්භ වන උප විමසුම විමසුමට (I) සමාන වන බව සලකන්න, "1234" වෙනුවට WORKER.WORKER_ID. විමසුම (II) පහත පරිදි කියවිය හැකිය:

WORKER_ID පවරා නොමැති ගොඩනැගිල්ලක් නොමැති නම් WORKER වෙතින් WORKER_ID තෝරන්න.

මෙය මුල් ඉල්ලීමේ කොන්දේසි වලට ගැලපේ.

සම්බන්ධතා වීජ ගණිතයේ බෙදීමේ මෙහෙයුමක් අවශ්‍ය වූ එම විමසුම් සකස් කිරීමටත්, සාපේක්‍ෂ කලනයේ විශ්ව ප්‍රමාණාංකකයත් සැකසීමට NOT EXISTS ක්‍රියාකරු භාවිත කළ හැකි බව අපට පෙනේ. භාවිතයේ පහසු දෘෂ්ටි කෝණයකින්, NOT EXISTS ක්‍රියාකරු විශේෂ ප්‍රතිලාභයක් ලබා නොදේ, එයින් අදහස් වන්නේ, දෙවරක් නොපවතියි භාවිතා කරන SQL විමසුම්, බෙදීම් සහිත සම්බන්ධක වීජ ගණිත විසඳුම් හෝ විශ්ව ප්‍රමාණාංක සමඟ සම්බන්ධිත කලන විසඳුම් වලට වඩා තේරුම් ගැනීම පහසු නොවන බවයි. එවැනි විමසුම් වඩාත් ස්වාභාවික ලෙස විසඳා ගැනීමට ඉඩ සලසන භාෂා නිර්මාණ නිර්මාණය කිරීමට තවත් පර්යේෂණ අවශ්‍ය වනු ඇත.

ගොඩනඟන ලද කාර්යයන්

මෙම වර්ගයේ ප්රශ්න සලකා බලමු:

උපරිම සහ අවම පැයක ගාස්තු මොනවාද? 435 ගොඩනැගිල්ලේ සේවකයින් වැඩ කරන සාමාන්‍ය දින ගණන කීයද? 312 ගොඩනැගිල්ලේ කපරාරු වැඩ සඳහා වෙන් කර ඇති මුළු දින ගණන කොපමණද? විවිධ විශේෂතා කීයක් තිබේද?

මෙම ප්‍රශ්නවලට පිළිතුරු සැපයීම සඳහා වගුවක පේළි ගණනාවක් බලා තනි අගයක් ලබා දෙන සංඛ්‍යානමය ශ්‍රිත අවශ්‍ය වේ. SQL හි එවැනි ශ්‍රිත පහක් ඇත, ඒවා ගොඩනඟන ලද ශ්‍රිත හෝ කට්ටල ශ්‍රිත ලෙස හැඳින්වේ. මෙම කාර්යයන් SUM (එකතුව), AVG (සාමාන්‍යය), COUNT (ප්‍රමාණය), MAX (උපරිම) සහ MIN (අවම) වේ.

තිළැලි කාර්යය (සැකසුම් කාර්යය). බහු පේළි මත ක්‍රියාත්මක වන සංඛ්‍යානමය ශ්‍රිතයක්: SUM (එකතුව), AVG (සාමාන්‍යය), COUNT (ප්‍රමාණය), MAX (උපරිම), MIN (අවම).

ඉල්ලීම:උපරිම සහ අවම පැයක ගාස්තු මොනවාද?

MAX (HRLY_RATE), අවම (HRLY_RATE) තෝරන්න

ප්‍රතිඵලය: 17.40, 8.20

MAX කාර්යයන්සහ MIN එක වගු තීරුවක ක්‍රියාත්මක වේ. ඔවුන් මෙම තීරුවෙන් පිළිවෙලින් උපරිම හෝ අවම අගය තෝරා ගනී. අපගේ විමසුම් සැකසීමේ WHERE වගන්තියක් අඩංගු නොවේ. අපගේ ඊළඟ උදාහරණය පෙන්වන පරිදි බොහෝ විමසුම් සඳහා මෙය එසේ නොවිය හැක.

ඉල්ලීම: 435 ගොඩනැගිල්ලේ සේවකයින් වැඩ කරන සාමාන්‍ය දින ගණන කීයද?

AVG තෝරන්න(NUM_DAYS)

BLDG_ID =435 කොහෙද

ප්රතිඵලය: 12.33

ඉල්ලීම: 312 ගොඩනැගිල්ලේ කපරාරු වැඩ සඳහා වෙන් කර ඇති මුළු දින ගණන කොපමණද?

එකතුව තෝරන්න (NUM_DAYS)

පැවරුමෙන්, සේවකයා

WORKER.WORKER_ID = ASSIGNMENT.WORKER_ID සහ

SKILL_TYPE = "ප්ලාස්ටර්" සහ

ප්රතිඵලය: 27

විසඳුම ASSIGNMENT සහ WORKER වගු අතර සම්බන්ධයක් භාවිතා කරයි. SKILL_TYPE WORKER වගුවේ සහ BLDG_ID ASSIGNMENT වගුවේ ඇති නිසා මෙය අවශ්‍ය වේ.

ඉල්ලීම:විවිධ විශේෂතා කීයක් තිබේද?

COUNT තෝරන්න (DISTINCT SKILL_TYPE)

ප්රතිඵලය: 4

එකම විශේෂත්වය විවිධ පේළි කිහිපයකින් දිස්විය හැකි බැවින්, පද්ධතිය එකම විශේෂිත වර්ගය එක වරකට වඩා ගණන් කිරීම වැළැක්වීමට ඔබ මෙම විමසුමේ DISTINCT මූල පදය භාවිතා කළ යුතුය. DISTINCT ක්‍රියාකරු MAX සහ MIN ශ්‍රිතයන් සමඟ අනවශ්‍ය වුවද, ඕනෑම ගොඩනඟන ලද ශ්‍රිතයක් සමඟ භාවිතා කළ හැක.

DISTINCT. අනුපිටපත් රේඛා ඉවත් කරන ක්‍රියාකරුවෙක්.

SUM සහ AVG ශ්‍රිත භාවිත කළ යුත්තේ සංඛ්‍යාත්මක තීරු සමඟ පමණි. වෙනත් කාර්යයන් සංඛ්‍යාත්මක සහ අක්ෂර දත්ත යන දෙකම සමඟ භාවිතා කළ හැක. COUNT හැර අනෙකුත් සියලුම කාර්යයන් ගණනය කළ ප්‍රකාශන සමඟ භාවිතා කළ හැක. උදාහරණ වශයෙන්:

ඉල්ලීම:සාමාන්‍ය සතිපතා වැටුප කීයද?

AVG තෝරන්න (40 * HRLY_RATE)

ප්රතිඵලය: 509.14

COUNT ට තනි තීරුවකට වඩා සම්පූර්ණ පේළියකට යොමු විය හැක :

ඉල්ලීම: තත්ත්ව මට්ටම 3 ඇති ගොඩනැගිලි කීයක් තිබේද?

COUNT (*) තෝරන්න

තැනින් තැන

ප්රතිඵලය: 3

මෙම සියලු උදාහරණ පෙන්නුම් කරන පරිදි, SELECT විධානයක බිල්ට්-ඉන් ශ්‍රිතයක් තිබේ නම්, එම SELECT විධානයේ වෙනත් කිසිවක් දිස්විය නොහැක. මෙම රීතියට ඇති එකම ව්‍යතිරේකය වන්නේ GROUP BY වගන්තියයි, එය අපි දැන් බලමු.

කණ්ඩායම් අනුව සහ වගන්ති තිබීම

කළමනාකරණයේ දී, බොහෝ කණ්ඩායම්වල එක් එක් කණ්ඩායම පිළිබඳ සංඛ්යානමය තොරතුරු බොහෝ විට අවශ්ය වේ. උදාහරණයක් ලෙස, පහත විමසුම සලකා බලන්න:

ඉල්ලීම:එක් එක් කළමනාකරු සඳහා, ඔහුගේ යටත් නිලධාරීන් අතර උපරිම පැයක ගාස්තුව සොයා ගන්න.

මෙම ගැටළුව විසඳීම සඳහා, අපි සේවකයින් ඔවුන්ගේ කළමනාකරුවන් අනුව කණ්ඩායම් වලට බෙදිය යුතුය. එවිට අපි එක් එක් කණ්ඩායම තුළ උපරිම ලංසුව තීරණය කරන්නෙමු. SQL හි මෙය සිදු කරනු ලබන්නේ මේ ආකාරයට ය:

SUPV_ID අනුව GROUP

ප්රතිඵලය:

SUPV_IDMAX(HRLY RATE)

මෙම විමසුම සකසන විට, පද්ධතිය මුලින්ම පහත රීතිය භාවිතා කරමින් WORKER වගුවේ පේළි කණ්ඩායම් වලට බෙදයි. පේළි එකම SUPV_ID එක තිබේ නම් සහ එකම කණ්ඩායම තුළ තබා ඇත. SELECT වගන්තිය එක් එක් කණ්ඩායමට අදාළ වේ. මෙම සමූහයේ ඇත්තේ එක SUPV_ID අගයක් පමණක් බැවින්, සමූහයේ SUPV_ID අවිනිශ්චිතතාවයක් නොමැත. එක් එක් කණ්ඩායම සඳහා, SELECT වගන්තිය SUPV_ID ප්‍රතිදානය කරන අතර MAX(HRLY_RATE) අගය ගණනය කර ප්‍රතිදානය කරයි. ප්රතිඵලය ඉහත ඉදිරිපත් කර ඇත.

බිල්ට්-ඉන් ශ්‍රිත සහිත SELECT විධානයක, දිස්විය හැක්කේ GROUP BY වගන්තියට ඇතුළත් කර ඇති තීරු පමණි. SUPV_ID එය GROUP BY වගන්තියට ඇතුළත් කර ඇති නිසා SELECT විධානයක භාවිතා කළ හැකි බව සලකන්න.

වගන්තිය අනුව කණ්ඩායම. නිශ්චිත තීරු (ය) වල පොදු අගයන් සහිත පේළි කණ්ඩායම් වලට බෙදිය යුතු බව පෙන්නුම් කරයි.

GROUP BY වගන්තිය මඟින් ඔබට යම් සංකීර්ණ ගණනය කිරීම් සිදු කිරීමට ඉඩ සලසයි. උදාහරණයක් ලෙස, අපට මෙම උපරිම ලංසු වල සාමාන්‍යය සොයා ගැනීමට අවශ්‍ය විය හැක. කෙසේ වෙතත්, බිල්ට්-ඉන් කර්තව්‍යයන් සමඟ ගණනය කිරීම සීමා වන්නේ එය අනෙකුත් බිල්ට්-ඉන් ශ්‍රිතයන් තුළ බිල්ට් ශ්‍රිත භාවිතා කිරීමට ඉඩ නොදෙන අර්ථයෙනි. එබැවින් වැනි ප්රකාශනයක්

AVG(MAX(HRLY_RATE))

තහනම්. එවැනි ඉල්ලීමක් ක්රියාත්මක කිරීම අදියර දෙකකින් සමන්විත වේ. අපි මුලින්ම නව වගුවකට උපරිම ලංසු තැබිය යුතු අතර, දෙවන පියවරේදී, ඒවායේ සාමාන්යය ගණනය කරන්න.

GROUP BY විධානය සමඟ ඔබට WHERE වගන්තිය භාවිතා කළ හැකිය:

ඉල්ලීම:එක් එක් වර්ගයේ ගොඩනැඟිලි සඳහා සොයා ගන්න සාමාන්ය මට්ටමතත්වයේ ගොඩනැගිලි අතර ගුණාත්මකභාවය 1.

වර්ගය තෝරන්න, AVG(QLTY_LEVEL)

තත්ත්වය = 1

ප්රතිඵලය:

TYPEAVG(QLTY_LEVEL)

ගබඩා 1

නේවාසික ගොඩනැගිල්ල 3

ප්‍රකාශය මගින් GROUP ට පෙර WHERE වගන්තිය ක්‍රියාත්මක වේ. මේ අනුව, කිසිදු කණ්ඩායමකට 1 හැර වෙනත් තත්වයක් ඇති පේළියක් අඩංගු විය නොහැක. තත්ව 1 පේළි TYPE අගයෙන් කාණ්ඩ කර ඇති අතර, පසුව එක් එක් කණ්ඩායමට SELECT වගන්තියක් යොදනු ලැබේ.

වාක්‍ය ඛණ්ඩයක් තිබීම. කණ්ඩායම් මත කොන්දේසි තබයි.

GROUP BY වගන්තිය මගින් නිර්මාණය කරන ලද කණ්ඩායම් වලටද අපට කොන්දේසි යෙදිය හැක. මෙය HAVING වාක්‍ය ඛණ්ඩය භාවිතයෙන් සිදු කෙරේ. උදාහරණයක් ලෙස, අපි පෙර විමසුම් වලින් එකක් වඩාත් නිශ්චිත කිරීමට තීරණය කළෙමු යැයි සිතමු:

ඉල්ලීම: යටත් නිලධාරීන් එකකට වඩා සිටින සෑම කළමනාකරුවෙකු සඳහාම, ඔහුගේ යටත් නිලධාරීන් අතර උපරිම පැයක ගාස්තුව සොයා ගන්න.

සුදුසු HAVING විධානය සමඟ අපට මෙම තත්ත්වය පිළිබිඹු කළ හැකිය:

තෝරන්න SUPV_ID, MAX(HRLY_RATE)

SUPV_ID මගින් සේවක කණ්ඩායමෙන්

COUNT (*) > 1ක් තිබීම

ප්රතිඵලය:

SUPV_ID MAX(HRLY_RATE)

WHERE සහ HAVING වගන්ති අතර වෙනස වන්නේ WHERE පේළි සඳහා වන අතර HAVING කණ්ඩායම් සඳහා අදාළ වේ.

විමසුමක WHERE සහ HAVING වගන්ති දෙකම අඩංගු විය හැක. මෙම අවස්ථාවෙහිදී, කණ්ඩායම් කිරීමට පෙර එය ක්‍රියාත්මක කරන බැවින්, WHERE වගන්තිය පළමුව ක්‍රියාත්මක වේ. උදාහරණයක් ලෙස, පෙර විමසුමේ පහත වෙනස් කිරීම සලකා බලන්න:

ඉල්ලීම: එක් එක් වර්ගයේ ගොඩනැගිලි සඳහා, තත්ත්‍වයේ ගොඩනැගිලි අතර සාමාන්‍ය තත්ත්ව මට්ටම සොයා ගන්න 1. උපරිම තත්ත්ව මට්ටම 3 නොඉක්මවන ගොඩනැගිලි වර්ග පමණක් සලකා බලන්න.

වර්ගය තෝරන්න, AVG (QLTY_JLEVEL)

තත්ත්වය = 1

MAX (QLTY_LEVEL) තිබීම<= 3

ප්රතිඵලය:

TYPE AVG(QLTY_LEVEL)

ගබඩා 1

නේවාසික ගොඩනැගිල්ල 3

FROM වගන්තියෙන් පටන් ගෙන, වගන්ති අනුපිළිවෙලින් ක්‍රියාත්මක වන අතර, පසුව SELECT වගන්තිය යොදන බව සලකන්න. මේ අනුව, BUILDING වගුව සඳහා WHERE වගන්තිය යොදනු ලබන අතර, STATUS 1 ට වඩා වෙනස් වන සියලුම පේළි මකා දමනු ලැබේ. ඉතිරි පේළි TYPE අනුව කාණ්ඩගත කර ඇත; එකම TYPE අගයක් ඇති සියලුම පේළි එකම කණ්ඩායමක අවසන් වේ. මේ අනුව, කණ්ඩායම් කිහිපයක් නිර්මාණය කර ඇත, එක් එක් TYPE අගය සඳහා එකක්. ඉන්පසුව HAVING වගන්තිය එක් එක් කණ්ඩායම සඳහා යොදනු ලබන අතර, උපරිම තත්ත්ව මට්ටමේ අගය 3 ඉක්මවන කණ්ඩායම් ඉවත් කරනු ලැබේ. අවසාන වශයෙන්, SELECT වගන්තිය ඉතිරි කණ්ඩායම් සඳහා යොදනු ලැබේ.

7. ගොඩනඟන ලද කාර්යයන් සහ උප විමසුම්

ගොඩනඟන ලද කාර්යයන් භාවිතා කළ හැක්කේ SELECT වගන්තියක හෝ HAVING විධානයක පමණි. කෙසේ වෙතත්, පේළිගත ශ්‍රිතයක් අඩංගු SELECT වගන්තියක් උප විමසුමක කොටසක් විය හැක. එවැනි උප විමසුමක උදාහරණයක් බලමු:

ඉල්ලීම:සාමාන්‍ය පැයක අනුපාතයට වඩා වැඩි කම්කරුවන් මොනවාද?

සේවක_NAME තෝරන්න

HRLY_RATE > කොහෙද

(AVG(HRLY_RATE) තෝරන්න

ප්‍රතිඵලය:

එච් කොලම්බස්

උප විමසුම ප්‍රධාන විමසුම සමඟ සහසම්බන්ධ නොවන බව සලකන්න. උප විමසුම හරියටම එක් අගයක් ලබා දෙයි - සාමාන්‍ය පැයක අනුපාතය. ප්‍රධාන විමසුම සේවකයෙකු තෝරා ගන්නේ ඔහුගේ අනුපාතය ගණනය කළ සාමාන්‍යයට වඩා වැඩි නම් පමණි.

සහසම්බන්ධිත විමසුම්වලට ද ගොඩනඟන ලද කාර්යයන් භාවිතා කළ හැක:

විමසුම: එකම කළමනාකරුගේ යටත් නිලධාරීන් අතර සාමාන්‍ය පැයක අනුපාතයට වඩා වැඩි පැයක අනුපාතයක් ඇත්තේ කුමන සේවකයාටද?

මෙම අවස්ථාවෙහිදී, සියලුම සේවකයින් සඳහා එක් සාමාන්‍ය පැයක අනුපාතයක් ගණනය කිරීම වෙනුවට, අපි එකම කළමනාකරුට වාර්තා කරන එක් එක් සේවක කණ්ඩායම සඳහා සාමාන්‍ය අනුපාතය ගණනය කළ යුතුය. එපමනක් නොව, ප්රධාන විමසුම මගින් සලකා බලන සෑම සේවකයෙකු සඳහාම අපගේ ගණනය කිරීම අලුතින් සිදු කළ යුතුය:

A. WORKER_NAME තෝරන්න

SQL ඔබට එකිනෙකා තුළ විමසුම් කූඩු කිරීමට ඉඩ දෙයි. සාමාන්‍යයෙන් උප විමසුමක් තනි අගයක් ලබා දෙයි, එය පුරෝකථනය සත්‍ය දැයි බැලීමට පරීක්ෂා කෙරේ.

සෙවුම් පද වර්ග:
. උප විමසුමක ප්‍රතිඵලය සමඟ සැසඳීම (=, >=)
. උප විමසුමක (IN) ප්‍රතිඵලවලට අයත් දැයි පරීක්ෂා කිරීම
. පැවැත්ම පරීක්ෂා කිරීම (EXISTS)
. බහු (ප්‍රමාණාත්මක) සංසන්දනය (ඕනෑම, සියල්ල)

කැදලි විමසුම් පිළිබඳ සටහන්:
. උප විමසුමක් තෝරාගත යුත්තේ එක් තීරුවක් පමණි (EXISTS පුරෝකථනයක් සහිත උප විමසුමක් හැර), එහි ප්‍රතිඵල දත්ත වර්ගය පුරෝකතනයේ දක්වා ඇති අගයේ දත්ත වර්ගයට ගැළපිය යුතුය.
. සමහර අවස්ථා වලදී, ඔබට තනි අගයක් ලබා දීම සහතික කිරීමට DISTINCT මූල පදය භාවිතා කළ හැක.
. ඔබට උප විමසුමක නියෝගයක් හෝ UNION වගන්තියක් ඇතුළත් කළ නොහැක.
. උප විමසුම සෙවුම් තත්වයේ වමට හෝ දකුණට ස්ථානගත කළ හැක.
. උප විමසුම්වලට GROUP BY වගන්තියකින් තොරව එකතු කිරීමේ ශ්‍රිත භාවිතා කළ හැක, එමඟින් ඕනෑම පේළි ගණනකට විශේෂ අගයක්, විශේෂ IN පුරෝකථනයක් සහ තීරු-පාදක ප්‍රකාශන ස්වයංක්‍රීයව ලබා දෙයි.
. හැකි සෑම විටම, ඔබ උප විමසුම් වෙනුවට JOIN වගු සම්බන්ධ කිරීම් භාවිතා කළ යුතුය.

කැදලි විමසුම් සඳහා උදාහරණ:

* ඇණවුම් වලින් තෝරන්න
‍තෝරන්න * ඇනවුම් වලින් SNum IN කොහිද (SNum ‍තෝරන්න VHERE City='London')
* ඇණවුම් වලින් තෝරන්න
‍තෝරන්න * ඇණවුමේ සිට Amt>(Odate=10/04/1990 ඇණවුම් වලින් AVG(Amt) තෝරන්න)
* CNum පාරිභෝගිකයාගෙන් තෝරන්න

2) අදාළ උප විමසුම්

SQL හි, ඔබට බාහිර විමසුමකින් වගුවක් යොමු කරන උප විමසුම් සෑදිය හැක. මෙම අවස්ථාවෙහිදී, උප විමසුම බාහිර විමසුමෙන් එක් එක් වගු පේළිය සඳහා එක් වරක්, කිහිප වතාවක් ක්රියාත්මක වේ. එබැවින්, උප විමසුම දර්ශකය භාවිතා කිරීම වැදගත් වේ. උප විමසුමකට බාහිර එකකට සමාන වගුවකට ප්‍රවේශ විය හැක. බාහිර විමසුම සාපේක්ෂව කුඩා පේළි සංඛ්‍යාවක් ලබා දෙන්නේ නම්, සම්බන්ධිත උප විමසුම නොබැඳි එකට වඩා වේගවත් වනු ඇත. උප විමසුමක් පේළි කුඩා සංඛ්‍යාවක් ලබා දෙන්නේ නම්, අදාළ විමසුම සම්බන්ධ නොවූ විමසුමට වඩා මන්දගාමී වනු ඇත.

අදාළ උප විමසුම් සඳහා උදාහරණ:

තෝරන්න * විකුණුම් පුද්ගලයින් ප්‍රධාන ස්ථානය 1 (ඇණවුම් O2 සිට AVG(Amt) තෝරන්න O2.CNum=O1.CNum) // දී ඇති පාරිභෝගිකයෙකු සඳහා සාමාන්‍ය ඇණවුම් අගය ඉක්මවන සියලුම ඇණවුම් ආපසු ලබා දෙයි

3) Predicate EXISTS

වාක්ය ආකෘතිය: පවතිනවා ()

පුරෝකතනය උප ප්‍රශ්නය තර්කයක් ලෙස ගන්නා අතර උප ප්‍රශ්නයට ප්‍රතිදානය තිබේ නම් සත්‍ය ලෙසද වෙනත් ආකාරයකින් අසත්‍ය ලෙසද ඇගයීමට ලක් කරයි. උප විමසුම එක් වරක් ක්‍රියාත්මක වන අතර තීරු කිහිපයක් අඩංගු විය හැකිය, මන්ද ඒවායේ අගයන් පරීක්ෂා කර නොමැති නමුත් පේළි තිබීමේ ප්‍රති result ලය සරලව සටහන් වේ.

EXISTS පිළිබඳ සටහන් පුරෝකථනය කරයි:
. EXISTS යනු සත්‍ය හෝ අසත්‍ය ලබා දෙන පුරෝකථනයක් වන අතර එය තනිව හෝ වෙනත් බූලියන් ප්‍රකාශන සමඟ භාවිතා කළ හැක.
. EXISTS හට එහි උප විමසුමේ එකතු කිරීමේ ශ්‍රිත භාවිතා කළ නොහැක.
. සහසම්බන්ධ උප විමසුම් වලදී, පිටත වගුවේ එක් එක් පේළිය සඳහා EXISTS පුරෝකථනය ක්‍රියාත්මක වේ.
. ඔබට EXISTS පුරෝකථනය වගු එකතු කිරීම් සමඟ ඒකාබද්ධ කළ හැකිය.

EXISTS පුරෝකථනය සඳහා උදාහරණ:

තෝරා ගන්න * පවතින තැන පාරිභෝගිකයාගෙන් (තෝරන්න * පාරිභෝගිකයාගෙන් කොහේද සිටි ='සැන් ජෝස්') - ඔවුන්ගෙන් කවුරුන් හෝ සැන් ජෝස් හි ජීවත් වන්නේ නම්, සියලු ගනුදෙනුකරුවන් ආපසු ලබා දෙයි.
ප්‍රථමයෙන් පාරිභෝගිකයාගෙන් වෙන්වූ SNum නොපවතින තැන තෝරන්න (* තෝරා ගන්න පාරිභෝගිකයා යවන්න තැනට යවන්න
DISTINCT F.SNum, SName, F.City From SalesPeople F, Customer S හි සිටින තැන තෝරන්න (තෝරන්න * Customer T කොහෙද S.SNum=T.SNum සහ S.CNumT.CNum සහ F.SNum=S.S.Num) – ආපසු ගනුදෙනුකරුවන් කිහිප දෙනෙකුට සේවය කළ සියලුම විකුණුම්කරුවන්ගේ අංක, නම් සහ පදිංචි නගර.
පවතින තැන අලෙවිකරුවන් වෙතින් තෝරන්න

4) ප්‍රමාණාත්මක සංසන්දනය පුරෝකථනය කරයි

වාක්ය ආකෘතිය: (=|>|=|) ඕනෑම|සියල්ල ()

මෙම පුරෝකථන තර්කයක් ලෙස උප ප්‍රශ්නය භාවිතා කරයි, කෙසේ වෙතත්, EXISTS පුරෝකථනය හා සසඳන විට, ඒවා සම්බන්ධක පුරෝකථන (=,>=) සමඟ ඒකාබද්ධව භාවිතා වේ. මෙම අර්ථයෙන්, ඒවා IN පුරෝකථනයට සමාන වේ, නමුත් භාවිතා කරනු ලබන්නේ උප විමසුම් සමඟ පමණි. ප්‍රමිතියෙන් ඕනෑම මූල පදයක් වෙනුවට යම් මූල පදයක් භාවිතා කිරීමට ඉඩ සලසයි, නමුත් සියලුම DBMS එයට සහාය නොදක්වයි.

සංසන්දනය පිළිබඳ සටහන් පුරෝකථනය කරයි:
. උප විමසුම ක්‍රියාත්මක කිරීමේදී තෝරාගත් සෑම අගයක්ම බාහිර විමසුම් පුරෝකථනයේ දක්වා ඇති කොන්දේසිය තෘප්තිමත් කරන්නේ නම්, සියලුම පුරෝකථනය සත්‍ය ලෙස ඇගයීමට ලක් කරයි. එය බොහෝ විට අසමානතාවයන් සමඟ භාවිතා වේ.
. උප විමසුම ක්‍රියාත්මක කිරීමේදී තෝරාගත් අවම වශයෙන් එක් අගයක් බාහිර විමසුම් පුරෝකථනයේ දක්වා ඇති කොන්දේසිය තෘප්තිමත් කරන්නේ නම් ඕනෑම පුරෝකථනයක් සත්‍ය ලෙස ඇගයීමට ලක් කරයි. එය බොහෝ විට අසමානතාවයන් සමඟ භාවිතා වේ.
. උප විමසුම කිසිදු පේළියක් ලබා නොදුන්නේ නම්, සියල්ල ස්වයංක්‍රීයව සත්‍ය අගය ගනී (සැසඳීමේ කොන්දේසිය තෘප්තිමත් යැයි සැලකේ), සහ ඕනෑම දෙයක් සඳහා එය FALSE අගය ගනී.
. පේළි නොමැති සඳහා සංසන්දනය සත්‍ය නම් සහ NULL අගයක් සහිත පේළි එකක් හෝ කිහිපයක් තිබේ නම්, ඕනෑම එකක් UNKNOWN ලෙස ලබා දෙයි.
. කිසිදු පේළියක් සඳහා සංසන්දනය අසත්‍ය නම් සහ NULL අගයක් සහිත පේළි එකක් හෝ කිහිපයක් තිබේ නම්, සියල්ල UNKNOWN ලෙස ලබා දෙයි.

ප්‍රමාණාත්මක සංසන්දනයේ පුරෝකථනය සඳහා උදාහරණ:

තෝරන්න * විකුණුම් පුද්ගලයන්ගෙන් කොහේද නගරය = ඕනෑම (පාරිභෝගිකයෙකුගෙන් නගරයක් තෝරන්න)
ඇනවුම් වලින් * තෝරන්න ALL ALL (ගනුදෙනුකරුගෙන් ශ්‍රේණිගත කිරීම තෝරන්න

5) අද්විතීය පුරෝකථනය

UNIQUE|DISTINCT ()

උප විමසුමේ ප්‍රතිදාන දත්තවල සුවිශේෂත්වය (අනුපිටපත් නොමැතිකම) පරීක්ෂා කිරීමට පුරෝකථනය භාවිතා වේ. එපමණක් නොව, UNIQUT පුරෝකථනය තුළ, NULL අගයන් සහිත නූල් අද්විතීය ලෙස සලකනු ලබන අතර, DISTINCT පුරෝකථනය තුළ, නිර්වචනය නොකළ අගයන් දෙකක් එකිනෙකට සමාන ලෙස සලකනු ලැබේ.

6) තරඟ පුරෝකථනය කරන්න

තරගය ()

MATCH පුරෝකථනය විමසුම් තන්තුවක අගය උප විමසුමේ ප්‍රතිඵලයක් ලෙස ලැබෙන ඕනෑම තන්තුවක අගයට ගැලපේද යන්න පරීක්ෂා කරයි. මෙම උප විමසුම IN සහ ඕනෑම පුරෝකථනයකින් වෙනස් වන්නේ එය සමහර NULL අගයන් ඇති පේළි අතර ඇති විය හැකි "අර්ධ" (PARTIAL) ගැලපීම් සැකසීමට ඉඩ සලසයි.

7) FROM කොටසේ විමසුම්

ඇත්ත වශයෙන්ම, වගු යොමුවකට අවසර දී ඇති ඕනෑම තැනක උප විමසුමක් භාවිතා කිරීම නීත්‍යානුකූල වේ.

CName, Tot_Amt පාරිභෝගිකයාගෙන් තෝරන්න, (CNum, SUM(Amt) ලෙස Tot_Amt ලෙස CNum විසින් ඇණවුම් සමූහය තෝරන්න) නගරය='ලන්ඩන්' සහ පාරිභෝගිකයා.CNum=Orders.CNum
//උප විමසුම ලන්ඩනයේ සිට එක් එක් පාරිභෝගිකයා විසින් කරන ලද මුළු ඇණවුම් ප්‍රමාණය ආපසු ලබා දෙයි.

8) පුනරාවර්තන විමසුම්

Recursive සමග
Q1 තෝරන ලෙස ... සිට ... කොහෙන්ද ...
Q2 තෝරන ලෙස ... සිට ... කොහෙන්ද ...




ඉහල