Part สุดท้ายแล้วนะครับ
ต่อจาก Post ที่แล้ว
คราวนี้เรามาดูวิธีใช้ Linq สำหรับ Order By, Group By และ Set Operation กัน
ORDER BY – Simple
ใน SQL เราสามารถจัดเรียงตาม Field ที่เราต้องการได้ โดยคำสั่ง ORDER BY
ใน Linq ก็แทบเหมือนกันทุกประการเลยครับ
จากตัวอย่างคือ เรียก Customer ทั้งหมด โดยเรียงตาม CustomerID
ORDER BY – Multiple
คราวนี้เรามาดูกันต่อว่า การจัดเรียงจากมากไปน้อย
และการจัดเรียงหลาย ๆ Field เขียนอย่างไร
การเรียงจากมากไปน้อย ก็แค่ใส่คำสั่งตามหลังว่า DESC
และการเรียงมากกว่า 1 Field ก็คั่นด้วย , (Comma)
และขึ้น Field ถัดไป
ใน Linq ก็คล้าย ๆ กัน
การเรียงจากมากไปน้อยใน Linq ใช้คำสั่ง descending
และ Field ถัดไปก็ใช้ , (Comma) เช่นเดียวกัน
และผลลัพธ์จาก Query ด้านบนคือ เรียก Customer ทุกรายการ
โดยเรียงตาม City เรียงจากมากไปน้อย และถ้าอยู่ใน City เดียวกัน
ก็เรียงตาม ContactName
GROUP BY – Single
คำสั่ง GROUP BY คือ การจัดกลุ่ม
โดย Field ที่ต้องการจัดกลุ่มต้องอยู่ในคำสั่ง GROUP BY
และ Field อื่น ๆ ที่ไม่ได้จัดกลุ่ม ต้องมีการทำ Aggregation เช่น SUM, COUNT
ใน SQL GROUP BY เขียนอย่างนี้ครับ
ผลลัพธ์คือ ดูว่า แต่ละเมืองมีลูกค้าอยู่กี่คน
ใน VB และ C# ต่างกันนิดหน่อยเรื่องการทำ Aggregation
Code VB ดังนี้
Aggregation จะอยู่หลัง Into คล้าย ๆ กับ GROUP JOIN ในบทที่แล้ว
ส่วน C# เขียนอย่างนี้ครับ
C# จะค่อนข้างซับซ้อนหน่อย
ระหว่างคำว่า group และ by
เราต้องกำหนดว่า สิ่งที่เราเลือกมาอยู่ใน group คืออะไร
ในที่นี้ผมใส่ c หมายถึง Customer แต่ละคน
และหลัง into ก็ต้องกำหนด variable สำหรับ Group ของแต่ละ City ในที่นี้คือ g
และในส่วนของ select เราจะไม่สามารถใช้ c ได้อีกต่อไป
เพราะ c โดน group ไปแล้ว เราต้องใช้ g แทน
โดย g.Key หมายถึง key ของ Group นั้น ๆ ในที่นี้ หมายถึง City ต่าง ๆ
และเราสามารถใส่ Aggregate function ผ่าน g ได้ เช่น g.Count(), g.Sum()
GROUP BY – Multiple
เราสามารถ GROUP ได้มากกว่า 1 Field
SQL เขียนอย่างนี้ครับ
ก็แค่ใช้ , (Comma) คั่นชื่อ Field ถัดไป
ใน VB ก็คล้าย ๆ กัน
ใช้ , (Comma) คั่นเช่นเดียวกัน
แต่ใน C# จะเพิ่มอีกนิดหน่อย
ใน group by เราต้องประกาศ Anonymous Type เช่นเดียวกับ คำสั่ง select
และผลลัพธ์ของ Query ข้างบนคือ จัดกลุ่มลูกค้าตามภาคและเมือง
โดยเลือกผลลัพธ์คือ ภาค, เมือง, และลูกค้าคนแรก
GROUP BY – Having
อีกนิดนึงสำหรับ GROUP BY คือ เราสามารถ Filter สิ่งที่เรา GROUP ไปแล้ว
ผ่านคำสั่ง HAVING ครับ
HAVING คล้าย ๆ กับ WHERE
แต่เป็นการกรองคำสั่งที่เป็น Aggregration เช่น SUM, COUNT
Query ด้านบนคือ เรียกเมืองต่าง ๆ ที่มีลูกค้ามากกว่า 3 คน
ใน VB เขียนอย่างนี้ครับ
ง่าย ๆ ก็แค่ใช้คำสั่ง Where ไปเลย
ไม่ต้องมีคำสั่ง Having ให้ยุ่งยาก
C# ก็เช่นเดียวกันครับ
ใช้ where แทน having ไปเลย
UNION ALL
ใน SQL เราสามารถรวมผลลัพธ์ของ 2 Query ได้ ด้วยคำสั่ง UNION ALL
คุณสามารถเอาคำสั่ง UNION ALL มาคั่นระหว่าง 2 Query
เพื่อรวม Result ทั้ง 2 Query
จากตัวอย่างคือ เลือก CustomerID ที่มีรหัสไปรษณีย์ขึ้นต้นด้วย 123 และ 456
ใน Linq เขียนอย่างนี้ครับ
เราสามารถใช้คำสั่ง Concat แทนคำว่า UNION ALL
โดยตัว Query เราสามารถแยกไปใส่ตัวแปรได้เลย
UNION/INTERSECT/EXCEPT
ใน SQL เราสามารถรวมผลลัพธ์ของ Query ในรูปแบบของ Set Operation
โดย UNION คือ การรวมผลลัพธ์ทั้งสอง Query ไว้ด้วยกัน
ซึ่งต่างจาก UNION ALL ตรงที่ผลลัพธ์ที่มีค่าเท่ากันจะแสดงเพียงครั้งเดียว
INTERSECT คือ การแสดงเฉพาะผลลัพธ์ที่มีค่าเท่ากัน
EXCEPT คือ การแสดงผลลัพธ์ของ Query แรก ที่ไม่มีค่าที่เท่ากันใน Query ที่สอง
ใน SQL เราเขียนอย่างนี้
ในส่วนของ UNION, INTERSECT, EXCEPT ให้ใส่เพียงคำสั่งเดียว ไม่ต้องมีเครื่องหมายวงเล็บ <> และเครื่องหมาย /
ใน Linq ก็ใช้คำสั่งชื่อเดียวกัน
ผลลัพธ์ของ Union คือ ลูกค้าที่อยู่ในกรุงเทพฯ หรือ มีรหัสไปรษณีย์ขึ้นต้นด้วย 123
ผลลัพธ์ของ Intersect คือ ลูกค้าที่อยู่ในกรุงเทพฯ และมีรหัสไปรษณีย์ขึ้นต้นด้วย 123
ผลลัพธ์ของ Except คือ ลูกค้าที่อยู่ในกรุงเทพฯ ที่ไม่มีรหัสไปรษณีย์ที่ขึ้นต้นด้วย 123
จบแล้วครับ หวังว่าคุณที่เพิ่งหัด SQL จะเข้าใจ SQL เพิ่มขึ้นบ้าง
และผู้ที่เขียนหัดเขียน Linq อยู่จะเข้าใจ Linq มากขึ้นครับ 