แบบสอบถามย่อยส่งคืนตาราง

และสุดท้าย ตัวเลือกที่สามคือเมื่อแบบสอบถามย่อยส่งคืนทั้งตาราง นี่เป็นตัวเลือกที่พบบ่อยที่สุด

บ่อยครั้งที่มีสถานการณ์ที่เราต้องการปรับแต่งตารางเล็กน้อย จากนั้นเข้าร่วม (โดยใช้ตัวดำเนินการ 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