துணை வினவல் அட்டவணையை வழங்குகிறது
இறுதியாக, துணை வினவல் முழு அட்டவணையையும் திரும்பப் பெறும்போது மூன்றாவது விருப்பம். இது மிகவும் பொதுவான விருப்பமாகும்.
ஒரு குறிப்பிட்ட அட்டவணையை சிறிது மாற்ற விரும்பும் சூழ்நிலைகள் பெரும்பாலும் உள்ளன. பின்னர் தான் (JOIN ON operator ஐப் பயன்படுத்தி) திருத்தப்பட்ட அட்டவணையை மற்றொன்றுடன் இணைக்கவும்.
ஒரு சேர்ப்புடன் இரண்டு அட்டவணைகளை இணைத்த எளிய வழக்கில் தொடங்குவோம்:
SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id
நீங்கள் நினைவில் வைத்திருப்பது போல், பணி அட்டவணையில் யாருக்கும் ஒதுக்கப்படாத பணிகள் உள்ளன : Employee_id என்பது NULL .
ஒரு திருத்தப்பட்ட அட்டவணையை உருவாக்குவோம் , அங்கு அனைத்து தொங்கும் பணிகளையும் இயக்குனருக்கு ஒதுக்குவோம் (அவரது ஐடி = 4).
இதைச் செய்ய, IFNULL() செயல்பாட்டைப் பயன்படுத்துகிறோம் :
SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline FROM task
மற்றும் இந்த வினவலின் முடிவு:
ஐடி | பணியாளர்_ஐடி | பெயர் | காலக்கெடுவை |
---|---|---|---|
1 | 1 | முகப்பில் ஒரு பிழையை சரிசெய்யவும் | 2022-06-01 |
2 | 2 | பின்தளத்தில் ஒரு பிழையை சரிசெய்யவும் | 2022-06-15 |
3 | 5 | காபி வாங்கு | 2022-07-01 |
4 | 5 | காபி வாங்கு | 2022-08-01 |
5 | 5 | காபி வாங்கு | 2022-09-01 |
6 | 4 | அலுவலகத்தை சுத்தம் செய்யுங்கள் | (ஏதுமில்லை) |
7 | 4 | வாழ்க்கையை அனுபவிக்கவும் | (ஏதுமில்லை) |
8 | 6 | வாழ்க்கையை அனுபவிக்கவும் | (ஏதுமில்லை) |
திருத்தப்பட்ட செல் சிவப்பு நிறத்தில் குறிக்கப்பட்டுள்ளது.
இப்போது நமது திருத்தப்பட்ட அட்டவணையை வினவலில் மாற்றுவோம்:
SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id
பணி அட்டவணைக்கு பதிலாக .
அத்தகைய கோரிக்கை இதுபோன்றதாக இருக்கும்:
SELECT * FROM employee e JOIN (
SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline
FROM task
) t ON e.id = t.emploee_id
டாஸ்க் என்ற வார்த்தைக்குப் பதிலாக அடைப்புக்குறிகளை எழுதி அதில் கோரிக்கைப் பகுதியை வைத்தோம் .
மூலம், உள்ளமை வினவலுக்கான மாற்றுப்பெயர் t (மாற்றுப்பெயர்) மிகவும் பயனுள்ளதாக இருந்தது. உள்ளமைக்கப்பட்ட வினவல், அட்டவணையைப் போலல்லாமல், அதன் சொந்தப் பெயரைக் கொண்டிருக்கவில்லை, எனவே மாற்றுப்பெயர் மிகவும் இடமில்லாமல் உள்ளது.
அத்தகைய வினவலின் முடிவு இங்கே:
ஐடி | பெயர் | தொழில் | சம்பளம் | வயது | சேரும் நாள் | ஐடி | பணியாளர்_ஐடி | பெயர் |
---|---|---|---|---|---|---|---|---|
1 | இவனோவ் இவான் | புரோகிராமர் | 100000 | 25 | 2012-06-30 | 1 | 1 | முகப்பில் ஒரு பிழையை சரிசெய்யவும் |
2 | பெட்ரோவ் பெட்ர் | புரோகிராமர் | 80000 | 23 | 2013-08-12 | 2 | 2 | பின்தளத்தில் ஒரு பிழையை சரிசெய்யவும் |
4 | ரபினோவிச் மொய்ஷா | இயக்குனர் | 200000 | 35 | 2015-05-12 | 6 | 4 | அலுவலகத்தை சுத்தம் செய்யுங்கள் |
4 | ரபினோவிச் மொய்ஷா | இயக்குனர் | 200000 | 35 | 2015-05-12 | 7 | 4 | வாழ்க்கையை அனுபவிக்கவும் |
5 | கிரியென்கோ அனஸ்தேசியா | அலுவலக மேலாளர் | 40000 | 25 | 2015-10-10 | 4 | 5 | காபி வாங்கு |
5 | கிரியென்கோ அனஸ்தேசியா | அலுவலக மேலாளர் | 40000 | 25 | 2015-10-10 | 5 | 5 | காபி வாங்கு |
5 | கிரியென்கோ அனஸ்தேசியா | அலுவலக மேலாளர் | 40000 | 25 | 2015-10-10 | 3 | 5 | காபி வாங்கு |
6 | வாஸ்கா | பூனை | 1000 | 3 | 2018-11-11 | 8 | 6 | வாழ்க்கையை அனுபவிக்கவும் |
எங்கள் இயக்குனருக்கு "அலுவலகத்தை சுத்தம் செய்யும்" பணி உள்ளது, அவர் விரைவில் அதை ஒப்படைக்க யாரையாவது கண்டுபிடிப்பார் என்று நினைக்கிறேன் :) உடன் ஆபரேட்டரைப் பயன்படுத்துதல்
மூலம், MySQL இன் பதிப்பு 8 இல் தொடங்கி, உங்கள் அனைத்து துணை வினவல்களையும் இறுதி வினவலுக்குள்ளேயே வைக்க வேண்டியதில்லை. அவை தனித்தனியாக செய்யப்படலாம். இதற்கு, WITH அறிக்கை பயன்படுத்தப்படுகிறது .
இது ஒரு மெய்நிகர் அட்டவணையை (வினவல் என்று பெயரிடப்பட்டது) உருவாக்க உங்களை அனுமதிக்கிறது மற்றும் அதன் தோற்றம் ஒரு டெம்ப்ளேட்டால் வழங்கப்படுகிறது:
WITH Name AS (request)
உங்கள் துணை வினவலில் COUNT(*) போன்ற பெயரிடப்படாத நெடுவரிசைகள் இருக்கும் போது, நீங்கள் தனிப்பட்ட பெயரை ஒதுக்காத நேரங்கள் உள்ளன. இந்த நிலையில், துணை வினவலுக்கு புதிய நெடுவரிசைப் பெயர்களைக் குறிப்பிட WITH அறிக்கையில் விருப்பம் உள்ளது.
அதன் இரண்டாவது வடிவம் டெம்ப்ளேட்டால் வழங்கப்படுகிறது:
WITH Name(column1, column2, …) AS (request)
நீங்கள் விரும்பும் பல மெய்நிகர் அட்டவணைகளை (என்ற வினவல்கள்) பயன்படுத்தலாம் மற்றும் அவற்றில் ஒன்றையொன்று குறிப்பிடலாம். உங்கள் கோரிக்கையின் பொதுவான வடிவம் இது போன்ற ஒன்றைக் கொண்டிருக்கும்:
WITH name1 AS (request1),
name2 AS (request2),
name3 AS (request3)
SELECT * FROM name1 JOIN name2 ON …
இப்போது நமது பயங்கரமான கேள்வியை எடுத்துக் கொள்வோம்:
SELECT * FROM employee e JOIN (
SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline
FROM task
) t ON e.id = t.emploee_id
அறிக்கையுடன் அதை மீண்டும் எழுதவும்:
WITH task2(id, employee_id, name, deadline)
AS (SELECT id, IFNULL(employee_id, 4), name, deadline FROM task)
SELECT * FROM employee e JOIN task2 t ON e.id = t.emploee_id
அல்லது நீங்கள் நெடுவரிசைப் பெயர்கள் இல்லாமல் செய்யலாம், ஆனால் நீங்கள் IFNULL() செயல்பாட்டிற்கு மாற்றுப்பெயரைக் குறிப்பிட வேண்டும்:
WITH task2 AS (
SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline FROM task
)
SELECT * FROM employee e JOIN task2 t ON e.id = t.emploee_id
GO TO FULL VERSION