แบบสอบถามย่อยส่งคืนตาราง
และสุดท้าย ตัวเลือกที่สามคือเมื่อแบบสอบถามย่อยส่งคืนทั้งตาราง นี่เป็นตัวเลือกที่พบบ่อยที่สุด
บ่อยครั้งที่มีสถานการณ์ที่เราต้องการปรับแต่งตารางเล็กน้อย จากนั้นเข้าร่วม (โดยใช้ตัวดำเนินการ JOIN ON) กับตารางที่แก้ไขแล้วเท่านั้น
เริ่มจากกรณีที่ง่ายที่สุด ที่เรารวมสองตารางด้วย JOIN:
SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id
และอย่างที่คุณคงจำได้ มีงานในตารางงานที่ไม่ได้มอบหมายให้ใครเลย: Employee_idเป็นNULL
มาสร้างตารางที่แก้ไขแล้วกันโดยที่เรามอบหมายงานแขวนทั้งหมดให้กับผู้กำกับ (ID ของเขา = 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 | อีวานอฟ อีวาน | โปรแกรมเมอร์ | 100,000 | 25 | 2555-06-30 | 1 | 1 | แก้ไขข้อบกพร่องในส่วนหน้า |
2 | เปตรอฟ เปตรอฟ | โปรแกรมเมอร์ | 80000 | 23 | 2013-08-12 | 2 | 2 | แก้ไขข้อบกพร่องในส่วนหลัง |
4 | ราบิโนวิช มอยชา | ผู้อำนวยการ | 200,000 | 35 | 2015-05-12 | 6 | 4 | ทำความสะอาดสำนักงาน |
4 | ราบิโนวิช มอยชา | ผู้อำนวยการ | 200,000 | 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 | วาสก้า | แมว | 1,000 | 3 | 2018-11-11 | 8 | 6 | ใช้ชีวิตให้สนุก |
ผู้อำนวยการของเรามีหน้าที่ "ทำความสะอาดสำนักงาน" ฉันคิดว่าเขาจะหาคนมามอบหมายให้ได้อย่างรวดเร็ว :) การใช้ตัวดำเนินการ WITH
อย่างไรก็ตาม เริ่มต้นด้วยเวอร์ชัน 8 ของ MySQL คุณไม่จำเป็นต้องใส่ข้อความค้นหาย่อยทั้งหมดลงในข้อความค้นหาสุดท้ายอีกต่อไป สามารถดำเนินการแยกกันได้ สำหรับสิ่งนี้ จะใช้ คำสั่ง 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:
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