1. MySQL NOT IN වාක්යය කුමක්ද? — දත්ත ඉවත් කිරීම වැඩි දියුණු කිරීම
MySQL දත්ත ගබඩා සමඟ වැඩ කරන විට, “ඉවත් කිරීම” යන විශේෂිත අගයන් හෝ කොන්දේසි සමඟ දත්ත ලබා ගැනීමට අවශ්ය වන තත්ත්වයන් බොහොමයක් ඇත. උදාහරණයක් ලෙස, ඔබට ලියාපදිංචි නොකළ පරිශීලකයන් හැර වෙනත් පරිශීලක ලැයිස්තුවක් පෙන්වීමට, හෝ කළු ලැයිස්තුවක (blacklist) පෙනෙන ID‑වලින් ඉවත් කර දත්ත එකතු කිරීමට අවශ්ය විය හැක. මෙම තත්ත්වයන් ව්යාපාරික සහ සංවර්ධන පරිසරයන්හි නිතර සිදුවේ. මෙහිදී NOT IN වාක්යය ඉතා ප්රයෝජනවත් වේ.
NOT IN වාක්යය යනු, නියමිත අගයන් හෝ උපවිමසුමේ (subquery) ප්රතිඵල සමඟ නොගැලපෙන දත්ත පමණක් පහසුවෙන් ලබා ගැනීමට ඉඩ දෙන ශක්තිමත් SQL කොන්දේසියකි. ලැයිස්තුවක් භාවිතා කර සරල ඉවත් කිරීමේ පමණක් නොව, ගතික උපවිමසුම් සමඟ ඒකතු කිරීමෙන් විවිධ ඉවත් කිරීමේ රටාවන් සකස් කළ හැක.
කෙසේ වෙතත්, එය භාවිතා කරන ආකාරය අනුව NOT IN සඳහා කිසිඳු සීමා සහ සම්භාව්ය ගැටළු ඇත. විශේෂයෙන්, NULL අගයන් ඇතුළත් වූ විට එහි හැසිරීම, විශාල දත්ත ගබඩා වල කාර්ය සාධන ගැටළු, සහ NOT EXISTS සමඟ වෙනස්කම් යන කරුණු ප්රායෝගික මට්ටමේ වැදගත් කරුණු වේ.
මෙම ලිපියේ, MySQL NOT IN වාක්යය – මූලික සිට උසස් භාවිතය දක්වා – අවධානම්, විකල්ප ඉවත් කිරීමේ ක්රම සමඟ සංසන්දනය, සහ ප්රායෝගික උදාහරණ සමඟ සවිස්තරාත්මකව පැහැදිලි කරමු. ඔබ SQL නවකයෙක් වුවත්, හෝ නිතර භාවිතා කරන අයෙක් වුවත්, මෙම මාර්ගෝපදේශය ඔබේ SQL කුසලතා වැඩිදියුණු කර, වැඩ ප්රවාහය සුමට කර ගැනීමට උපකාරී වේ. අවසානය දක්වා කියවා, මෙම දැනුම ඔබේ SQL කුසලතා වර්ධනයට සහ වැඩ ප්රවාහය සුමට කර ගැනීමට භාවිතා කරන්න.
2. NOT IN හි මූලික ව්යවස්ථාව සහ භාවිත උදාහරණ
MySQL හි NOT IN වාක්යය, ඔබට කිහිපයක් නියමිත අගයන් සමඟ නොගැලපෙන ලේඛන ලබා ගැනීමට අවශ්ය වන විට භාවිතා කරයි. ව්යවස්ථාවම සරලයි, නමුත් වාස්තු විශාල ලෝකයේ එය බොහෝ තත්ත්වයන්හි ප්රයෝජනවත් වේ. මෙහිදී, මූලික ව්යවස්ථාව සහ ප්රායෝගික උදාහරණ හඳුන්වා දෙමු.
[Basic Syntax]
SELECT column_name FROM table_name WHERE column_name NOT IN (value1, value2, ...);
සරල ලැයිස්තුවක් භාවිතා කර ඉවත් කිරීම
උදාහරණයක් ලෙස, “Yamada” හෝ “Sato” නම් නොවන පරිශීලකයන් ලබා ගැනීමට අවශ්ය නම්, පහත SQL ප්රකාශය ලියන්න:
SELECT * FROM users WHERE name NOT IN ('Yamada', 'Sato');
මෙම විමසුම ක්රියාත්මක කිරීමෙන් “Yamada” සහ “Sato” නම් ඇති පරිශීලක ලේඛන හැර සියලු පරිශීලක ලේඛන ලබා ගත හැක. ඉවත් කිරීමේ ලැයිස්තුව කොමා-වෙන් කරන අගයන් පමණක් අවශ්ය වන බැවින්, එය ලියීමට සහ තේරුම් ගැනීමට පහසුය.
උපවිමසුමක් භාවිතා කර ගතික ඉවත් කිරීම
NOT IN වාක්යය, ස්ථිර ලැයිස්තුවක් පමණක් නොව, වෘත්තීය තුළ උපවිමසුමක් (subquery) භාවිතා කළ හැක. විශේෂයෙන්, නියමිත කොන්දේසි සපුරන පරිශීලක ID‑වලින් ඉවත් කිරීමට අවශ්ය වන විට මෙය ඉතා ප්රයෝජනවත් වේ.
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blacklist WHERE is_active = 1);
මෙම උදාහරණයේ, blacklist වගුවේ (is_active = 1) සක්රිය ලෙස සලකුණු කර ඇති පරිශීලක ID‑වලින් ඉවත් කර, ඉතිරි පරිශීලකයන් users වගුවෙන් ලබා ගනී. NOT IN සමඟ උපවිමසුම් එකතු කිරීමෙන්, ව්යාපාරික තර්ක අවශ්යතා අනුව ස flexibilily අනුකූල කර ගත හැක.
බහු කොන්දේසි යෙදීම
ඔබට එකවර බහු තීරුවල (columns) ඉවත් කිරීමේ කොන්දේසි නියම කිරීමට අවශ්ය නම්, NOT IN ප්රධාන වශයෙන් එක තීරුවක් සඳහා නිර්මාණය කර ඇත. නමුත්, එය උපවිමසුම් හෝ සම්බන්ධතා (JOIN) සමඟ එකතු කිරීමෙන්, වඩා සංකීර්ණ කොන්දේසි හසුරවිය හැක. මෙම කරුණා අපි පසුගිය උසස් තාක්ෂණික කොටසෙහි විස්තරාත්මකව පැහැදිලි කරමු.
ඔබට දැකගත හැකි පරිදි, NOT IN වාක්යය, නියමිත ලැයිස්තුවක් හෝ උපවිමසුමේ ප්රතිඵලයක් තුළ ඇතුළත් නොවන සියලු ලේඛන ලබා ගැනීමට ඉතා ප්රයෝජනවත් වේ. ඔබට අවශ්ය දත්ත දෘශ්යමාන කර, සරල ඉවත් කිරීමේ ලැයිස්තු සහ උපවිමසුම් දෙකම ප්රායෝගිකව භාවිතා කර පුහුණු වන්න.
3. NULL අගයන් පවතින විට වැදගත් සටහන්
NOT IN වාක්යය භාවිතා කරන විට, සාමාන්යයෙන් නොසලකා හැරෙන ගැටළුවක් වන්නේ NULL අගයන් ඇතුළත් වූ විට එහි හැසිරීමයි. මෙය නවකයන්ට පමණක් නොව, පළපුරුදු SQL පරිශීලකයන්ටද වැරදි සිදු කරවිය හැකි සම්ප්රදායික “පිටුපස” ගැටළුවකි.
කාරණය වන්නේ NOT IN හි ඇගයීමේ තර්කය සාමාන්ය සංසන්දන වලින් වෙනස් වීමයි—NULL අගයන් ඇතුළත් වූ විට එය වෙනස් ලෙස ක්රියා කරයි.
NULL ඇතුළත් වූ විට හැසිරීම
අපට පහත වගු තිබේ යැයි සලකන්න:
-- users table
id | name
---+------
1 | Sato
2 | Yamada
3 | Suzuki
4 | Tanaka
-- blacklist table
user_id
--------
1
NULL
දැන් පහත SQL ප්රකාශය ක්රියාත්මක කිරීම ගැන සිතන්න:
SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM blacklist);
පළමු නරඹන විට, user_id = 1 හැර සියලු පරිශීලකයන් (උදාහරණként, id = 2, 3, 4) ආපසු ලැබෙන බව පෙනේ. නමුත්, වාස්තු විශේෂයෙන්, පේළි කිසිවක් ආපසු නොලැබේ.
පේළි කිසිවක් ආපසු නොලැබීමේ හේතුව කුමක්ද?
කාරණය SQL හි තුන්-අග තර්කය (TRUE / FALSE / UNKNOWN) තුළ පවතී.
NULL NOT IN ලැයිස්තුවේ ඇතුළත් වූ විට, සංසන්දන ප්රතිඵලය UNKNOWN වේ, සහ MySQL එම පේළි ප්රතිඵල කට්ටලයට ඇතුළත් නොකරයි.
අනෙක් වචනයෙන්, අගයක් ලැයිස්තුවේ කිසිදු අයිතමයකට නොගැලපේ යැයි නිශ්චිතව තීරණය කළ නොහැකි බැවින්, සමස්ත කොන්දේසිය වැරදි ලෙස ඇගයෙයි.
සාමාන්ය ගැටළු තත්ත්වයන්
මෙම ගැටළුව උපවිමසුම් (subqueries) භාවිතා කරන විට බොහෝ විට සිදුවේ. blacklist හෝ unsubscribe ලැයිස්තුවක NULL අගයන් පවතී නම්, දත්ත අපේක්ෂිත ලෙස ලබා නොගත හැක.
“දත්ත කිසිවක් ආපසු නොලැබේ” හෝ “ලේඛන නිසි ලෙස ඉවත් නොකෙරේ” යන ගැටළු බොහෝ විට සඟවා ඇති NULL අගයන්ට සම්බන්ධ වේ.
ප්රතිකාර සහ විසඳුම්
NULL අගයන් නිසා ඇතිවන ගැටළු වැළැක්වීමට, ඔබට NOT IN ලැයිස්තුවෙන් NULL ඉවත් කළ යුතුය. විශේෂයෙන්, උපවිමසුමේ IS NOT NULL කොන්දේසිය එක් කරන්න.
SELECT * FROM users
WHERE id NOT IN (
SELECT user_id FROM blacklist WHERE user_id IS NOT NULL
);
මෙම වෙනස්කම සමඟ, blacklist වගුවේ NULL අගයන් තිබුණත්, ප්රශ්නය නිවැරදිව blacklist හි නොමැති පරිශීලකයන් ලබා ගනී.
ප්රධාන කරුණු
NOT INලැයිස්තුවේ NULL පවතී නම්, ප්රශ්නය පේළි ශූන්යයක් ලබා දිය හැකNOT INභාවිතා කරන විට, උපවිමසුම් සමඟIS NOT NULLඑකතු කිරීම සෑම විටම කරන්න- දත්ත අනපේක්ෂිත ලෙස අඩු වන්නේ නම්, පළමුව සඟවා ඇති NULL අගයන් පරීක්ෂා කරන්න
4. NOT IN vs NOT EXISTS — විකල්ප සැසඳීම
MySQL හි ඉවත් කිරීමේ කොන්දේසි නියම කරන විට, NOT EXISTS යනු NOT IN සඳහා තවත් සාමාන්ය විකල්පයකි. දෙකම සමාන ප්රතිඵල ලබා දිය හැකි නමුත්, ඒවායේ හැසිරීම, NULL සැකසීම, සහ කාර්ය සාධන ලක්ෂණ වෙනස් වේ. මෙම කොටසේ, අපි NOT IN සහ NOT EXISTS සැසඳා, ඒවායේ වාසි හා අවාසි පැහැදිලි කරමු.
මූලික වාක්ය රචනා සැසඳීම
[Exclusion Using NOT IN]
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blacklist WHERE user_id IS NOT NULL);
[Exclusion Using NOT EXISTS]
SELECT * FROM users u
WHERE NOT EXISTS (
SELECT 1 FROM blacklist b WHERE b.user_id = u.id
);
දෙවන ප්රශ්න දෙකම blacklist හි ලියාපදිංචි නොවූ පරිශීලකයන් ලබා ගනී.
NULL අගයන් සැකසීම
NOT IN
- ලැයිස්තුවේ හෝ උපවිමසුමේ ප්රතිඵලයේ
NULLඇතුළත් නම්, ප්රශ්නය අපේක්ෂිත ලෙස ක්රියා නොකළ හැක (පේළි ශූන්යයක් ලබා දිය හැක) - ආරක්ෂක ලෙස
IS NOT NULLකොන්දේසිය අවශ්ය වේ
NOT EXISTS
- උපවිමසුමේ ප්රතිඵලයේ
NULLතිබුණත්, නිවැරදිව ක්රියා කරයි - සාමාන්යයෙන් ආරක්ෂිතයි, එය NULL අගයන්ගෙන් බලපෑම නොලැබේ
කාර්ය සාධන වෙනස්කම්
ඉතා හොඳ ක්රමය දත්ත ප්රමාණය සහ වගු ව්යුහය මත පදනම් වේ, නමුත් සාමාන්යයෙන්:
- කුඩා දත්ත කට්ටල හෝ ස්ථිර ලැයිස්තු සඳහා,
NOT INප්රමාණවත් ලෙස ක්රියා කරයි - විශාල උපවිමසුම් හෝ සංකීර්ණ කොන්දේසි සඳහා,
NOT EXISTSහෝLEFT JOINබොහෝ විට වඩා හොඳ කාර්ය සාධනය ලබා දෙයි
blacklist ලේඛන ගණන වැඩි වීමත් සමඟ, NOT EXISTS බොහෝ විට වැඩි කාර්යක්ෂම වේ. MySQL අනුවාදය සහ ඉන්ඩෙක්සි කිරීම අනුව, නිසි ඉන්ඩෙක්සි තිබේ නම්, NOT EXISTS ඉතා වේගවත් වේ, මන්ද එය සෑම පේළියක් සඳහාම පවතින බව පරීක්ෂා කරයි.
තේරීම සඳහා මාර්ගෝපදේශ
- NULL අගයන් පවතින හැක →
NOT EXISTSභාවිතා කරන්න - ස්ථිර ලැයිස්තුවක් හෝ සරල අගයන් ඉවත් කරන විට →
NOT INප්රමාණවත් වේ - කාර්ය සාධනය අත්යවශ්ය නම් → EXPLAIN සමඟ ක්රියාත්මක සැලැස්ම පරීක්ෂා කර, ඒ අනුව තේරන්න (JOIN හෝ
NOT EXISTSසලකා බලන්න)
නියැදි උදාහරණ
NOT IN භාවිතයෙන් ඇති ගැටළුවේ උදාහරණය
-- If blacklist.user_id contains NULL
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blacklist);
-- → May return zero rows
NOT EXISTS භාවිතයෙන් ආරක්ෂිත ඉවත් කිරීමේ උදාහරණය
SELECT * FROM users u
WHERE NOT EXISTS (
SELECT 1 FROM blacklist b WHERE b.user_id = u.id
);
-- → Correct results regardless of NULL values
සාරාංශය
NOT INසරලයි නමුත් NULL අගයන්ට පීඩනයට ලක් වේNOT EXISTSNULL වලට ප්රතිරෝධී වන අතර නිෂ්පාදන පරිසරවල පුළුල් ලෙස භාවිතා වේ- දත්ත ලක්ෂණ සහ අවශ්ය කාර්ය සාධනය අනුව තෝරන්න
5. කාර්ය සාධන සැලකිලි
SQL හි විශාල දත්ත කට්ටල සමඟ වැඩ කරන විට, විමසුම් කාර්ය සාධනය ඉතා වැදගත් වේ. කොන්දේසි සහ දත්ත ප්රමාණය අනුව NOT IN හෝ NOT EXISTS භාවිතය ක්රියාත්මක වේගයේ වැදගත් වෙනස්කම් ඇති කරයි. මෙම කොටසේ, අපි NOT IN වාක්යයේ කාර්ය සාධන බලපෑම, සමගින් සුදුසුකම් උපදෙස් සහ වැදගත් සැලකිලි පිළිබඳ අවධානය යොමු කරමු.
NOT IN හි කාර්ය සාධන ලක්ෂණ
NOT IN වාක්යය, නියමිත ලැයිස්තුවක් හෝ උපවිමසුම් ප්රතිඵලයක් තුළ කිසිදු අගයක් නොගැලපෙන ලේඛන ලබා ගනී. කුඩා ලැයිස්තු හෝ වගු සමඟ එය කාර්යක්ෂමව ක්රියා කරයි, නමුත් පහත සඳහන් අවස්ථා වලදී මන්දගාමී විය හැක:
- උපවිමසුම විශාල සංඛ්යාවක පේළි ලබා දෙන විට
- ඉවත් කරන තීරුව සූචිකරණය කර නොමැති විට
- උපවිමසුම් ප්රතිඵලයේ NULL අගයන් පවතින විට
විශේෂයෙන්, උපවිමසුම දස දහස් හෝ සිය දහස් ගණනක් පේළි අඩංගු කර, සූචිකරණයක් නොමැති නම්, MySQL සම්පූර්ණ සංසන්දන සිදු කරනු ඇත, එය වැදගත් මන්දගාමී බවට පත් වේ.
සූචිකරණයේ වැදගත්කම
ඉවත් කිරීම සඳහා භාවිතා වන තීරුවට (උදාහරණයක් ලෙස user_id) සූචිකරණයක් එක් කිරීමෙන් MySQL සංසන්දන සහ පෙරහන් කිරීම වැඩි කාර්යක්ෂමතාවෙන් සිදු කරයි. උපවිමසුම් හෝ සම්බන්ධතා (joins) තුළ භාවිතා වන තීරු සෑම විටම අවශ්ය නම් සූචිකරණය කළ යුතුය.
CREATE INDEX idx_blacklist_user_id ON blacklist(user_id);
මෙවැනි සූචිකරණයක් එක් කිරීමෙන් NOT IN සහ NOT EXISTS විමසුම් කාර්ය සාධනය විශාල ලෙස වැඩිදියුණු කළ හැක.

කාර්ය සාධන සැසඳීම: NOT IN vs NOT EXISTS
- කුඩා, ස්ථිර ලැයිස්තු:
NOT INසාමාන්යයෙන් වේගවත් වේ - විශාල උපවිමසුම්:
NOT EXISTSහෝLEFT JOINසාමාන්යයෙන් වැඩි කාර්යක්ෂමතාවක් ලබා දෙයි
MySQL හි ක්රියාත්මක සැලැස්ම (EXPLAIN ප්රතිඵල) අනුවාදය සහ වගු සැලසුම අනුව වෙනස් වන බැවින්, කාර්ය සාධන සුදුසුකම් සැමවිටම සැබෑ පරීක්ෂණයක් සමඟ සිදු කළ යුතුය.
EXPLAIN සමඟ ක්රියාත්මක සැලැස්ම පරීක්ෂා කිරීම
කොයි විමසුම වඩා හොඳින් ක්රියා කරන්නේදැයි තීරණය කිරීමට, MySQL හි EXPLAIN විධානය භාවිතා කරන්න:
EXPLAIN SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM blacklist WHERE user_id IS NOT NULL);
මෙය ඔබට කුමන සූචිකරණ භාවිතා කර ඇතිද, වගු කිසිවක් සම්පූර්ණයෙන් පරික්ෂා කරමින් තිබේද යන්න දැක ගැනීමට ඉඩ සලසයි—කාර්ය සාධනයට සෘජු බලපෑමක් ඇති තොරතුරු.
විශාල දත්ත කට්ටල සඳහා සුදුසුකම් වැඩිදියුණු කිරීමේ උපාය මාර්ග
- මධ්යස්ථ ප්රතිඵල තාවකාලික වගුවක සුරකිමින් උපවිමසුම් භාරය අඩු කරන්න
- කාර්ය සාධනය තවමත් ප්රමාණවත් නොවේ නම් කණ්ඩායම් සැකසීම හෝ කෑෂ් කිරීම භාවිතා කරන්න
LEFT JOIN ... IS NULLභාවිතයෙන් නැවත ලියන්න (කොටස් කිහිපයකදී මෙය වේගය වැඩි කරයි)
ප්රධාන කරුණු
NOT INඋපවිමසුම් විශාල හෝ සූචිකරණ නොමැති විට මන්දගාමී විය හැක- සුදුසු සූචිකරණ සැලසුම සහ විමසුම් සමාලෝචනය කාර්ය සාධනය වැදගත් ලෙස වැඩිදියුණු කරයි
NOT EXISTSහෝLEFT JOINගැන සිතන්න, සහ EXPLAIN භාවිතයෙන් ප්රතිඵල සැමවිටම තහවුරු කරන්න
නිෂ්පාදන පරිසරවල, දත්ත පරිමාණය සහ භාවිතා අනුපාතය අනුව සැමවිටම සුදුසුම විමසුම තෝරන්න.
6. සාමාන්ය භාවිතා සහ උසස් තාක්ෂණ
NOT IN වාක්යය සරල ඉවත් කිරීම් වලට පමණක් සීමා නොවේ. උසස් තාක්ෂණ සමඟ ඔබට වඩා ලවච්ච දත්ත උපුටා ගැනීම සිදු කළ හැක. මෙහිදී අපි සාමාන්යයෙන් භාවිතා වන රටා සහ ප්රායෝගික තාක්ෂණ හඳුන්වා දෙමු.
බහු තීරු ඉවත් කිරීම (සංයුක්ත යතුරු ඉවත් කිරීම)
NOT IN සාමාන්යයෙන් එක් තීරුවක් සඳහා භාවිතා කරන නමුත්, බහු තීරු සංයුතයන් ඉවත් කිරීමට අවශ්ය අවස්ථා ඇත. එවැනි අවස්ථා වලදී NOT EXISTS හෝ LEFT JOIN වඩා සුදුසු වේ.
[උදාහරණය: orders වගුවේ customer_id සහ product_id හි විශේෂ සංයෝජන ඉවත් කිරීම]
SELECT * FROM orders o
WHERE NOT EXISTS (
SELECT 1 FROM blacklist b
WHERE b.customer_id = o.customer_id
AND b.product_id = o.product_id
);
මෙය blacklist හි ලියාපදිංචි කර ඇති සියලු “customer_id × product_id” සංයෝජන ඉවත් කරයි.
කොටස් ගැලපීම ඉවත් කිරීම (NOT LIKE භාවිතා කිරීම)
NOT IN සම්පූර්ණ ගැලපීම් සඳහා පමණක් ක්රියා කරන බැවින්, විශේෂ 문자열 රටා ඉවත් කිරීමේදී NOT LIKE භාවිතා කරන්න. උදාහරණයක් ලෙස, “test@” යන අකුරින් ආරම්භ වන ඊමේල් ලිපින ඇති පරිශීලකයන් ඉවත් කිරීමට:
SELECT * FROM users WHERE email NOT LIKE 'test@%';
එකවර බහු රටා ඉවත් කිරීමට, කොන්දේසි AND සමඟ එකතු කරන්න:
SELECT * FROM users
WHERE email NOT LIKE 'test@%'
AND email NOT LIKE 'sample@%';
විශාල ඉවත් කිරීමේ ලැයිස්තු කළමනාකරණය
NOT IN තුළ සෘජුවම සිය ගණනක් හෝ දහස් ගණනක් අගයන් ලැයිස්තුගත කිරීම කියවීමට අඩු කරයි සහ කාර්ය සාධනයට අඩුපාඩු ඇති කරයි.
එවැනි අවස්ථාවල, ඉවත් කිරීමේ ලැයිස්තුව වඩා පිරිසිදු ලෙස කළමනාකරණය කිරීම සඳහා කැපවූ වගුවක් හෝ උපවිමසුමක් (subquery) භාවිතා කරන්න:
-- Example: Store exclusion list in blacklist table
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blacklist WHERE user_id IS NOT NULL);
එකතු කිරීම සමඟ සංග්රහ ක්රියා (Aggregate Functions)
සංග්රහ කොන්දේසි (aggregate conditions) අඩංගු උපවිමසුම් (subqueries) සමඟ NOT IN භාවිතා කළ හැක.
[උදාහරණය: මේ මාසයේ ඇණවුම් නොකළ පාරිභෝගිකයන් ලබා ගැනීම]
SELECT * FROM customers
WHERE id NOT IN (
SELECT customer_id FROM orders
WHERE order_date >= '2025-06-01'
AND order_date < '2025-07-01'
);
උපවිමසුම වෙනුවට JOIN භාවිතා කිරීම
සමහර අවස්ථාවල, LEFT JOIN සමඟ IS NULL එකතු කිරීමෙන් ඒම ප්රතිඵලය ලබා ගත හැක.
Choose the most appropriate method based on performance and readability.
SELECT u.*
FROM users u
LEFT JOIN blacklist b ON u.id = b.user_id
WHERE b.user_id IS NULL;
මෙම ක්රමය විශේෂයෙන් ප්රයෝජනවත් වේ כאשר උපවිමසුම් කාර්ය සාධනය අසපසු වන විට හෝ දර්ශක (indexes) ප්රයෝජනවත් වන විට.
ප්රධාන කරුණු
- බහු-තීරුව (multi-column) ඉවත් කිරීම සඳහා
NOT EXISTSහෝ JOIN භාවිතා කරන්න - කොටස් 문자열 (partial string) ඉවත් කිරීමට
NOT LIKEසමඟ එකතු කරන්න - වගු හෝ උපවිමසුම් (subqueries) භාවිතා කර විශාල ඉවත් කිරීමේ ලැයිස්තු කළමනාකරණය කරන්න
JOIN + IS NULLකාර්ය සාධනය වැඩිදියුණු කරනු ඇත
7. FAQ (නිතර අසන ප්රශ්න)
MySQL NOT IN කොටස සම්බන්ධයෙන් නිතර අසන ප්රශ්න සහ සාමාන්ය ගැටළු මෙහි ඇත. පිළිතුරු ප්රායෝගික ගැටළු මත කේන්ද්රගත වේ, ඒවා වාස්තුකාලීන (real‑world) අවස්ථා වල බොහෝවිට සෙවෙයි.
Q1. NOT IN සහ IN අතර වෙනස කුමක්ද?
A.
IN නියමිත ලැයිස්තුවේ ඕනෑම අගයක් සමඟ ගැලපෙන දත්ත ලබා ගනී, එත් NOT IN ලැයිස්තුවේ කිසිදු අගයක් සමඟ ගැලපෙන දත්ත නොලබායි. ඒවායේ වාක්ය රචනය (syntax) සමාන වුවත්, ඔබට විශේෂ අගයන් ඉවත් කිරීමට අවශ්ය නම් NOT IN භාවිතා කළ යුතුය.
Q2. NOT IN භාවිතා කරන විට NULL අගයන් පවතී නම් කුමක් වේ?
A.
ලැයිස්තුවේ හෝ උපවිමසුමේ NULL අගයන් ඇතුළත් නම්, NOT IN පේළි ශූන්යයක් ලබා දිය හැකි අතර අනපේක්ෂිත ප්රතිඵල ලබා ගත හැක. NULL අගයන් IS NOT NULL භාවිතා කර පැහැදිලිව ඉවත් කිරීම ආරක්ෂිතම ක්රමයයි.
Q3. NOT IN සහ NOT EXISTS අතර කුමන එක තෝරා ගත යුතුද?
A.
- NULL අගයන් ඇති විය හැකි හෝ උපවිමසුමක් ඇතුළත් නම්,
NOT EXISTSවඩා විශ්වාසදායක වේ. - ස්ථිර ලැයිස්තු හෝ සරල ඉවත් කිරීම් සඳහා,
NOT INහොඳින් ක්රියා කරයි. - ක්රියාත්මක සැලසුම් (execution plans) සහ දත්ත ප්රමාණය අනුව කාර්ය සාධනය වෙනස් විය හැකි බැවින්, ඔබේ විශේෂ අවස්ථාව අනුව තෝරන්න.
Q4. NOT IN භාවිතා කරන විමසුම් කාලයක් මන්දගාමී වේ. මට මොනවා කළ හැකිද?
A.
- ඉවත් කිරීමේ කොන්දේසියට භාවිතා කරන තීරුවට දර්ශක (index) එකක් එක් කරන්න
- උපවිමසුමේ ප්රතිඵල ප්රමාණය අඩු කරන්න හෝ දත්ත තාවකාලික වගුවකට සංවිධානය කරන්න
NOT EXISTSහෝLEFT JOIN ... IS NULLභාවිතා කර විමසුම නැවත ලිවීමට සිතන්න- EXPLAIN භාවිතා කර ක්රියාත්මක සැලසුම විශ්ලේෂණය කර bottleneck (අඩුපාඩු) හඳුනා ගන්න
Q5. බහු තීරුවල (multiple columns) පදනම්ව ඉවත් කිරීම කෙසේද?
A.
NOT IN එකක් තනි කොලම් භාවිතය සඳහා නිර්මාණය කර ඇති නිසා, බහු කොලම් හරහා සංයුක්ත ඉවත් කිරීමක් අවශ්ය වන විට NOT EXISTS හෝ LEFT JOIN භාවිතා කරන්න. උප ප්රශ්නය තුළ බහු කොලම් තත්ත්වයන් ඒකාබද්ධ කරන්න.
ප්රශ්න 6. උප ප්රශ්නය බොහෝ පේළි ආපසු ලබා දෙන විට මම සැලකිලිමත් විය යුත්තේ කුමක්ද?
ඒ.
උප ප්රශ්නය විශාල ප්රමාණයක පේළි ආපසු ලබා දෙන විට, NOT IN කාර්ය සාධනය අඩු වීමෙන් බලපෑම් ලැබිය හැක. සුචිකරණය, තාවකාලික වගු, හෝ ප්රශ්නය නැවත ව්යුහගත කිරීම භාවිතා කරන්න උප ප්රශ්නය කුඩාව තබා ගැනීමට.
ප්රශ්න 7. මට අපේක්ෂිත ප්රතිඵල නොලැබෙන විට, මම පරීක්ෂා කළ යුත්තේ කුමක්ද?
ඒ.
- අනවශ්යව NULL වලංගු ඇතුළත් වී නැති බව තහවුරු කරන්න
- එහි ප්රතිඵල තහවුරු කිරීමට උප ප්රශ්නය ස්වාධීනව ධාවනය කරන්න
- WHERE තත්ත්වයන්හි හෝ JOIN තර්කයේ දෝෂ සඳහා පරීක්ෂා කරන්න
- අවශ්ය නම් MySQL සංස්කරණ-විශේෂිත හැසිරීම සහ නිල ලේඛනගොනු පරීක්ෂා කරන්න
8. නිගමනය
MySQL NOT IN කොටස යනු විශේෂිත තත්ත්වයන් සපුරාලන්නේ නැති දත්ත කාර්යක්ෂමව ලබා ගැනීම සඳහා ඉතා උපකාරී ගොඩනැගීමකි. සරල ඉවත් කිරීම් ලැයිස්තුවලින් උප ප්රශ්න සමඟ නම්යශීලී පෙරණය දක්වා, එය බොහෝ ප්රායෝගික තත්ත්වයන්හි යෙදිය හැක.
කෙසේ වෙතත්, යථාර්ථ ලෝක භාවිතයේදී වැදගත් සලකා බැලීම් තිබේ, උදාහරණයක් ලෙස NULL වලංගු හැසිරවීම සහ විශාල දත්ත සෙට්වල කාර්ය සාධනය අඩු වීම. NULL වලංගු නිසා අනපේක්ෂිත ශුන්ය-ප්රතිඵල ප්රශ්න හෝ විශාල උප ප්රශ්න නිසා මන්දගාමී ධාවනය වැනි ගැටලු ආරම්භකයන් සහ අත්දැකීම් සහිත සංවර්ධකයන් දෙකෙනාගෙන් අවධානය අවශ්ය වේ.
NOT EXISTS සහ LEFT JOIN ... IS NULL වැනි විකල්ප ක්රම තේරුම් ගැනීමෙන් ද, ඔබට ආරක්ෂිත සහ කාර්යක්ෂම SQL ප්රශ්න ලියන්න පුළුවන්. ඔබේ අරමුණු සහ දත්ත පරිමාණය මත පදනම්ව වඩාත් සුදුසු ක්රමය තෝරන්න.
ප්රධාන ඉගෙනීම්
NOT INසරල ඉවත් කිරීම් තත්ත්වයන් සඳහා ඵලදායී වේ- සැමවිටම NULL වලංගුවලට එරෙහිව ආරක්ෂා වන්න (
IS NOT NULLපුරුද්දක් කරන්න) - කාර්ය සාධනය ගැටලුවක් නම්, සුචිකරණ උපාය මාර්ග හෝ
NOT EXISTSසහ JOIN විකල්ප භාවිතා කිරීම සලකන්න - සැමවිටම ධාවන යෝජනාව (EXPLAIN) භාවිතා කරමින් ඵලදායිතාව තහවුරු කරන්න
SQL “ගැටලු” වළක්වන්න සහ මෙම ලිපියේ ආවරණය කරන සංකල්ප ඔබේ දෛනික කාර්යය සහ ඉගෙනීමට යෙදීමෙන් බුද්ධිමත් දත්ත නිංදනය පුරුදු කරන්න.


