முக்கிய உள்ளடக்கத்திற்குச் செல்லவும்
தொகுதி 7 · பாடம் 1 இன் 4பாடத்திட்டத்தில் 25/57~12 min
தொகுதி பாடங்கள் (1/4)

CTE: உடன் பல-படி வினவல்கள்

உண்மையான வினவல்கள் வளரும்: மூன்று JOINவி, ஒரு GROUP BY, ஒரு துணைவினவல், மற்றொரு துணைவினவல்… மேலும் அவை படிக்க முடியாததாகிவிடுகிறது. CTEகள் ("பொது அட்டவணை வெளிப்பாடுகள்", WITH பிரிவு) ஒரு பெயரைக் கொடுக்க அனுமதிக்கிறது இடைநிலை படி மற்றும் அதை முக்கிய வினவலில் ஒரு அட்டவணை போல் பயன்படுத்தவும்.

அடிப்படை தொடரியல்

SQL
WITH nome_cte AS (
  SELECT …    -- query interna
)
SELECT …      -- query principale, usa nome_cte come fosse una tabella
FROM   nome_cte;

ஒரு CTE செல்லுபடியாகும் அதைப் பின்தொடரும் வினவலுக்கு மட்டுமே: அது பிழைக்காது மரணதண்டனை.

உதாரணம்

அதிக செலவு செய்த 3 வாடிக்கையாளர்களைக் கண்டறியவும் (டெலிவரி செய்யப்பட்ட ஆர்டர்களின் தொகை):

SQL
WITH total_spent AS (
  SELECT o.customer_id,
         SUM(oi.quantity * oi.unit_price) AS total
  FROM   orders      o
  JOIN   order_items oi ON oi.order_id = o.id
  WHERE  o.status = 'delivered'
  GROUP BY o.customer_id
)
SELECT c.email,
       s.total
FROM   total_spent s
JOIN   customers c ON c.id = s.customer_id
ORDER BY s.total DESC
LIMIT  3;

ஆங்கிலத்தில் படிக்கவும்: *"முதலில் ஒரு வாடிக்கையாளருக்கான செலவைக் கணக்கிடுங்கள்; பிறகு சேரவும் வாடிக்கையாளர்கள் மற்றும் முதல் 3"*ஐப் பெறுங்கள். CTE இல்லாமல் உங்களுக்கு இன்லைன் தேவை FROM இல் உள்ள துணை வினவல் (சட்டமானது, ஆனால் சத்தமானது).

அடுக்கில் பல CTEகள்

காற்புள்ளிகளால் பிரிக்கப்பட்ட பல CTEகளை நீங்கள் வரையறுக்கலாம், மேலும் ஒவ்வொன்றும் குறிப்பிடலாம் முந்தையவற்றிற்கு:

SQL
WITH total_spent AS (
  SELECT customer_id, SUM(quantity * unit_price) AS total
  FROM   order_items oi
  JOIN   orders      o ON oi.order_id = o.id
  WHERE  o.status = 'delivered'
  GROUP BY customer_id
),
average AS (
  SELECT AVG(total) AS total_average
  FROM   total_spent
)
SELECT c.email, s.total
FROM   total_spent s
JOIN   customers c ON c.id = s.customer_id
CROSS JOIN average
WHERE  s.total > average.total_average
ORDER BY s.total DESC;

CROSS JOIN average ஏனெனில் average எப்போதும் ஒற்றை வரிசை: தி கார்ட்டீசியன் தயாரிப்பு முடிவின் ஒவ்வொரு வரிசையிலும் total_average சேர்க்கிறது.

CTE vs subquery: எதை எப்போது பயன்படுத்த வேண்டும்

CTEகள் பிரகாசிக்கும்போது:

  • அதே துணை வினவல் முக்கிய வினவலில் இரண்டு அல்லது அதற்கு மேற்பட்ட முறை பயன்படுத்தப்படுகிறது;
  • நீங்கள் பெயரிடப்பட்ட படிகளில் (சுய ஆவணமாக்கல்) கட்டமைப்பை தெளிவாக்க விரும்புகிறீர்கள்;
  • அவை ** சுழல்நிலை CTE களுக்கு ** முன்நிபந்தனை** (WITH RECURSIVE, இந்த தொகுதியின் அடுத்த பாடம்).

இன்லைன் துணை வினவல் ஒரு முறை மட்டுமே பயன்படுத்தப்படும் ஒரு படிக்கு மிகவும் சுருக்கமானது.

முயற்சி செய்து பாருங்கள்

உடற்பயிற்சி#sql.m7.l1.e1
முயற்சிகள்: 0ஏற்றுகிறது…

டெலிவரி செய்யப்பட்ட ஆர்டர்களில் ஒவ்வொரு வாடிக்கையாளருக்கும் மொத்த செலவை (SUM(அளவு * அலகு_விலை)) கணக்கிடும் 'total_spent' என்ற CTE ஐப் பயன்படுத்தவும். பின்னர் முக்கிய வினவலில் மின்னஞ்சல் மற்றும் முதல் 3 செலவு செய்பவர்களுக்கான மொத்தத்தைக் காட்டவும். மொத்த இறங்குமுறை மூலம் ஆர்டர், வரம்பு 3.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

CTE தொகையின் உள்ளே * அலகு_விலை. முக்கிய வினவலில், ஐடியில் வாடிக்கையாளர்களுடன் சேரவும்.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

மதிப்பாய்வு பயிற்சி

உடற்பயிற்சி#sql.m7.l1.e2
முயற்சிகள்: 0ஏற்றுகிறது…

முந்தைய பயிற்சியின் அதே 'total_sent' CTE. முக்கிய வினவலில், சராசரி செலவினத்தை விட அதிகமாக செலவழித்த வாடிக்கையாளர்களுக்கான மின்னஞ்சல் மற்றும் மொத்தம் (குறைந்தது ஒரு டெலிவரி ஆர்டரைக் கொண்ட அனைத்து வாடிக்கையாளர்களுக்கும்). மொத்தமாக இறங்குவதன் மூலம் ஆர்டர் செய்யவும்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

Scalar subquery in WHERE: தேர்ந்தெடு AVG(மொத்தம்) மொத்த_செலவில் இருந்து.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்