MySQL ฟังก์ชัน: สตริง, ตัวเลข, กำหนดโดยผู้ใช้, จัดเก็บ

⚡ สรุปอย่างชาญฉลาด

MySQL ฟังก์ชันจะแปลงข้อมูลก่อนที่จะจัดเก็บหรือเรียกใช้ โดยส่งคืนผลลัพธ์ที่คำนวณแล้วเพียงรายการเดียว บทความนี้จะอธิบายฟังก์ชันสตริง ตัวเลข และวันที่ที่มีอยู่แล้วในระบบ จากนั้นจะแสดงวิธีที่ฟังก์ชันที่จัดเก็บไว้และฟังก์ชันที่ผู้ใช้กำหนดเองช่วยขยายขีดความสามารถของกลไกฐานข้อมูล

  • 🔤 ฟังก์ชันสตริง: ฟังก์ชัน UCASE, LCASE และ CONCAT ปรับเปลี่ยนรูปแบบข้อความขณะทำการค้นหาข้อมูล และตั้งชื่อเล่นให้กับคอลัมน์ที่คำนวณได้ด้วย AS เพื่อให้ชุดผลลัพธ์มีส่วนหัวที่อ่านง่าย
  • 🔢 เป็นตัวเลข Operaทอร์: คำสั่ง DIV ใช้สำหรับหารจำนวนเต็ม คำสั่ง / ใช้สำหรับแสดงผลหารที่เป็นทศนิยม และคำสั่ง % (หรือ MOD) ใช้สำหรับแสดงผลเศษเหลือจากการหาร
  • 📅 ฟังก์ชั่นวันที่: ฟังก์ชัน DATE_FORMAT จะแปลงค่า YYYY-MM-DD ที่จัดเก็บไว้ให้เป็นรูปแบบการแสดงผลใดๆ ก็ได้ เช่น %d-%m-%Y โดยไม่ต้องแก้ไขโค้ดแอปพลิเคชันแม้แต่บรรทัดเดียว
  • 🛠️ ฟังก์ชันที่จัดเก็บไว้: CREATE FUNCTION ลงทะเบียนตรรกะที่นำกลับมาใช้ใหม่ได้ภายในเซิร์ฟเวอร์ ประกาศให้เป็น NOT DETERMINISTIC ทุกครั้งที่ body เรียกใช้ CURDATE() หรือ NOW()
  • ⚙️ ฟังก์ชันที่ผู้ใช้กำหนดเอง: รูทีนภายนอกที่เขียนด้วยภาษา C หรือ C++ ฟังก์ชันเหล่านี้จะถูกคอมไพล์เข้าไปในเซิร์ฟเวอร์ จากนั้นก็จะทำงานเหมือนกับฟังก์ชันดั้งเดิมทุกประการ
  • 🚀 ผลกระทบด้านประสิทธิภาพ: การส่งการคำนวณเข้าไปในฐานข้อมูลจะช่วยลดตรรกะที่ซ้ำซ้อนในแอปพลิเคชันไคลเอ็นต์ทุกตัว และลดจำนวนการรับส่งข้อมูลผ่านเครือข่าย

สิ่งที่เป็น MySQL ฟังก์ชัน?

MySQL สามารถทำได้มากกว่าการจัดเก็บและดึงข้อมูล. นอกจากนี้ยังสามารถ ดำเนินการจัดการข้อมูล ก่อนที่จะดึงข้อมูลหรือบันทึกข้อมูลนั้น นั่นคือจุดเริ่มต้น MySQL ฟังก์ชันเข้ามามีบทบาท ฟังก์ชันเป็นเพียงส่วนของโค้ดที่ทำการประมวลผลบางอย่างแล้วส่งคืนผลลัพธ์ ฟังก์ชันบางฟังก์ชันรับพารามิเตอร์ ในขณะที่ฟังก์ชันบางฟังก์ชันไม่รับพารามิเตอร์ใดๆ

ลองมาดูตัวอย่างสั้นๆ กัน โดยค่าเริ่มต้นแล้ว MySQL บันทึกข้อมูลวันที่ในรูปแบบ “YYYY-MM-DD” สมมติว่าเราได้สร้างแอปพลิเคชันขึ้นมา และผู้ใช้ต้องการให้แสดงวันที่ในรูปแบบ “DD-MM-YYYY” เราสามารถใช้... MySQL มีฟังก์ชันในตัวชื่อ DATE_FORMAT ที่ช่วยให้ทำเช่นนี้ได้ DATE_FORMAT เป็นหนึ่งในฟังก์ชันที่ใช้บ่อยที่สุดใน MySQLและเราจะมาพิจารณารายละเอียดเพิ่มเติมในบทเรียนนี้กัน

ไม่ว่าจะเป็นประเภทใดก็ตาม ฟังก์ชัน ส่งคืนค่าเดียวเสมอ, อาจรับพารามิเตอร์ได้ตั้งแต่ศูนย์ตัวขึ้นไป ภายในวงเล็บ และ สามารถใช้ได้ทุกที่ที่อนุญาตให้ใช้การแสดงออก — ในรายการ SELECT, เงื่อนไข WHERE หรือเงื่อนไข ORDER BY

ทำไมต้องใช้ MySQL ฟังก์ชัน?

เมื่อเรารู้แล้วว่าฟังก์ชันคืออะไร คำถามต่อไปคือ ทำไมเราจึงควรบันทึกงานนี้ลงในฐานข้อมูล

ทำไมต้องใช้ MySQL ฟังก์ชั่น

ดังที่แผนภาพด้านบนแสดง ฟังก์ชันจะรับค่าอินพุต ประมวลผลตรรกะภายในระบบฐานข้อมูล และส่งผลลัพธ์เดียวกลับไปยังทุกแอปพลิเคชันที่ร้องขอ

โปรแกรมเมอร์อาจคิดว่า “จะเสียเวลาทำไปทำไม” MySQL ฟังก์ชัน? ผลลัพธ์เดียวกันนี้สามารถทำได้ด้วยการเขียนสคริปต์หรือภาษาโปรแกรม” จริงอยู่ที่เราสามารถทำเช่นนั้นได้โดยการเขียนขั้นตอนในโปรแกรมแอปพลิเคชัน

กลับมาที่ตัวอย่างเรื่องวันที่ของเราอีกครั้ง เพื่อให้ผู้ใช้ได้รับข้อมูลในรูปแบบที่ต้องการ เลเยอร์ทางธุรกิจจะต้องทำการประมวลผลที่จำเป็นด้วยตนเอง

สิ่งนี้จะกลายเป็นปัญหาเมื่อแอปพลิเคชันต้องรวมเข้ากับระบบอื่น เมื่อเราใช้ MySQL ฟังก์ชันต่างๆ เช่น DATE_FORMAT นั้นถูกฝังอยู่ในฐานข้อมูล และแอปพลิเคชันใดๆ ที่ต้องการข้อมูลก็จะได้รับข้อมูลในรูปแบบที่ต้องการ ช่วยลดการทำงานซ้ำซ้อนในส่วนของตรรกะทางธุรกิจและลดความไม่สอดคล้องกันของข้อมูล.

อีกเหตุผลหนึ่งที่ต้องพิจารณา MySQL หน้าที่ของมันคือการช่วยลดปริมาณการรับส่งข้อมูลเครือข่ายในแอปพลิเคชันไคลเอ็นต์/เซิร์ฟเวอร์เลเยอร์ธุรกิจเพียงแค่เรียกใช้ฟังก์ชันที่จัดเก็บไว้ โดยไม่ต้องดึงข้อมูลดิบผ่านเครือข่ายมาประมวลผล โดยเฉลี่ยแล้ว การใช้ฟังก์ชันสามารถช่วยปรับปรุงประสิทธิภาพโดยรวมของระบบได้อย่างมาก

ประเภทของ MySQL ฟังก์ชั่น

เมื่อเราได้ข้อสรุปเกี่ยวกับ “อะไร” และ “ทำไม” แล้ว เราก็สามารถมาดูฟังก์ชันทั้งสามประเภทได้แล้ว MySQL มีให้เลือกใช้ทั้งฟังก์ชันในตัว ฟังก์ชันที่บันทึกไว้ และฟังก์ชันที่ผู้ใช้กำหนดเอง

ฟังก์ชั่น Built-in

MySQL มาพร้อมกับฟังก์ชันในตัวจำนวนหนึ่ง ซึ่งเป็นฟังก์ชันที่ได้ถูกนำไปใช้งานแล้วในโปรแกรม MySQL เซิร์ฟเวอร์ช่วยให้เราสามารถดำเนินการจัดการข้อมูลได้หลายประเภท และแบ่งออกเป็นกลุ่มที่ใช้กันทั่วไปดังต่อไปนี้

  • ฟังก์ชันสตริง – ดำเนินการกับชนิดข้อมูลแบบสตริง
  • ฟังก์ชันตัวเลข – ดำเนินการกับชนิดข้อมูลตัวเลข
  • ฟังก์ชั่นวันที่ – ดำเนินการกับชนิดข้อมูลวันที่
  • ฟังก์ชันรวม – ดำเนินการกับประเภทข้อมูลทั้งหมดข้างต้น และสรุปชุดผลลัพธ์
  • ฟังก์ชั่นอื่น ๆ - MySQL นอกจากนี้ยังรองรับฟังก์ชันในตัวประเภทอื่นๆ อีกด้วย แต่ในบทเรียนนี้เราจะจำกัดเฉพาะกลุ่มที่กล่าวถึงข้างต้นเท่านั้น

ต่อไปนี้เราจะมาดูรายละเอียดของแต่ละกลุ่มที่กล่าวถึงข้างต้นกัน เราจะอธิบายฟังก์ชันที่ใช้บ่อยที่สุดโดยใช้ฐานข้อมูลตัวอย่าง “Myflixdb” ของเรา

ฟังก์ชันสตริง

ฟังก์ชันสตริงทำงานกับค่าข้อความ ในตารางภาพยนตร์ของเรา ชื่อเรื่องถูกจัดเก็บโดยใช้ตัวอักษรพิมพ์เล็กและพิมพ์ใหญ่ผสมกัน สมมติว่าเราต้องการคำสั่งค้นหาที่ส่งคืนชื่อเรื่องในรูปแบบตัวพิมพ์ใหญ่ ฟังก์ชัน “UCASE” รับสตริงเป็นพารามิเตอร์และแปลงตัวอักษรทุกตัวเป็นตัวพิมพ์ใหญ่ ดังที่สคริปต์ด้านล่างแสดงให้เห็น

SELECT `movie_id`, `title`, UCASE(`title`) AS `upper_case_title` FROM `movies`;

ที่นี่

  • UCASE(`title`) เป็นฟังก์ชันในตัวที่รับชื่อเรื่องเป็นพารามิเตอร์และส่งคืนค่าเป็นตัวพิมพ์ใหญ่
  • AS `upper_case_title` กำหนดชื่อเล่นให้กับคอลัมน์ที่คำนวณได้ เพื่อให้ชุดผลลัพธ์มีส่วนหัวที่อ่านง่าย แทนที่จะเป็นนิพจน์ดิบๆ

ดำเนินการสคริปต์ข้างต้นใน MySQL การทดสอบด้วย Workbench กับ Myflixdb ให้ผลลัพธ์ดังที่แสดงด้านล่าง

movie_id ชื่อเรื่อง ชื่อเรื่องตัวพิมพ์ใหญ่
16 67% มีความผิด มีความผิด 67%
6 เทวดาและปีศาจ เทวดาและปีศาจ
4 Code ชื่อ แบล็ค รหัสลับ แบล็ค
5 สาวน้อยของพ่อ ลูกสาวตัวน้อยของพ่อ
7 Davinci Code รหัสดาวินชี
2 ลืมซาราห์ มาร์แชล ลืมซาร่าห์ มาร์แชล
9 Honey moonERS น้ำผึ้ง MOONERS
19 ภาพยนตร์ 3 ภาพยนตร์ภาค 3
1 โจรสลัดแห่งแคริบเบียน 4 โจรสลัดแห่งทะเลแคริบเบียน 4
18 ตัวอย่างภาพยนตร์ ตัวอย่างภาพยนตร์
17 มหาราชจอมบงการ จอมเผด็จการผู้ยิ่งใหญ่
3 X-Men X-MEN

นอกจาก UCASE แล้ว ยังมีอีกสององค์กรที่ควรค่าแก่การจดจำ: แอลเคส แปลงสตริงให้เป็นตัวพิมพ์เล็ก และ คอนแคต รวมสตริงสองสตริงขึ้นไปเข้าเป็นสตริงเดียว สำหรับรายการทั้งหมด โปรดดูที่... MySQL การอ้างอิงฟังก์ชันสตริง.

ฟังก์ชันตัวเลข

ดังที่กล่าวไว้ก่อนหน้านี้ ฟังก์ชันเชิงตัวเลขจะทำงานกับชนิดข้อมูลตัวเลข นอกจากนี้เรายังสามารถทำการคำนวณทางคณิตศาสตร์กับข้อมูลตัวเลขโดยตรงในคำสั่ง SQL ของเราได้อีกด้วย

ตัวดำเนินการเลขคณิต

MySQL รองรับตัวดำเนินการทางคณิตศาสตร์ต่อไปนี้ ซึ่งสามารถใช้ในการคำนวณในคำสั่ง SQL ได้

ชื่อ Descriptไอออน
DIV การหารจำนวนเต็ม
/ การแบ่ง
- ตtracการ
+ นอกจากนี้
* การคูณ
% หรือ MOD โมดูลัส

ตัวอย่างของการใช้งานตัวดำเนินการแต่ละตัวมีดังต่อไปนี้

การหารจำนวนเต็ม (DIV) — คำสั่ง DIV จะตัดส่วนที่เป็นเศษส่วนทิ้งและแสดงเฉพาะจำนวนเต็มเท่านั้น

SELECT 23 DIV 6;

การรันสคริปต์ข้างต้นจะให้ผลลัพธ์ดังนี้ 3.

ตัวดำเนินการหาร (/) — ต่างจากคำสั่ง DIV ตรงที่ตัวดำเนินการหารจะคงค่าทศนิยมของผลลัพธ์ไว้

SELECT 23 / 6;

การรันสคริปต์ข้างต้นจะให้ผลลัพธ์ดังนี้ 3.8333.

ตtracตัวดำเนินการ (-)

SELECT 23 - 6;

การรันสคริปต์ข้างต้นจะให้ผลลัพธ์ดังนี้ 17.

ตัวดำเนินการบวก (+)

SELECT 23 + 6;

การรันสคริปต์ข้างต้นจะให้ผลลัพธ์ดังนี้ 29.

ตัวดำเนินการคูณ (*)

SELECT 23 * 6 AS `multiplication_result`;

ผลลัพธ์:

การคูณ_ผลลัพธ์
138

ตัวดำเนินการโมดูลัส (% หรือ MOD)

ตัวดำเนินการโมดูลัสหาร N ด้วย M แล้วให้ผลลัพธ์เป็นเศษเหลือ ลองดูตัวอย่างการใช้ตัวดำเนินการโมดูลัส โดยใช้ค่าเดียวกันกับตัวอย่างก่อนหน้านี้

SELECT 23 % 6;
-- OR, equivalently:
SELECT 23 MOD 6;

การเรียกใช้สคริปต์ใดสคริปต์หนึ่งจะให้ผลลัพธ์ดังนี้ 5.

ตอนนี้เรามาดูฟังก์ชันตัวเลขทั่วไปบางส่วนกัน MySQL.

FLOOR – ฟังก์ชันนี้จะลบทศนิยมออกจากตัวเลขและปัดเศษลงให้เป็นจำนวนเต็มที่ใกล้ที่สุด สคริปต์ที่แสดงด้านล่างนี้แสดงวิธีการใช้งาน

SELECT FLOOR(23 / 6) AS `floor_result`;

ผลลัพธ์:

ผลลัพธ์พื้น
3

รอบที่ – ฟังก์ชันนี้จะปัดเศษตัวเลขให้เป็นจำนวนเต็มที่ใกล้ที่สุด เนื่องจาก 23 / 6 มีค่าเท่ากับ 3.8333 ดังนั้นฟังก์ชัน ROUND จะคืนค่า 4 ในขณะที่ฟังก์ชัน FLOOR จะคืนค่า 3 — สองฟังก์ชันนี้ไม่สามารถใช้แทนกันได้

SELECT ROUND(23 / 6) AS `round_result`;

ผลลัพธ์:

ผลลัพธ์รอบ
4

RAND – ฟังก์ชันนี้สร้างตัวเลขสุ่ม ค่าของตัวเลขสุ่มจะเปลี่ยนไปทุกครั้งที่เรียกใช้ฟังก์ชัน ตัวอย่างสคริปต์ด้านล่างแสดงวิธีการใช้งาน

SELECT RAND() AS `random_result`;

ฟังก์ชั่นวันที่

ฟังก์ชันเกี่ยวกับวันที่ทำงานกับข้อมูลประเภทวันที่และเวลา ฟังก์ชัน DATE_FORMAT เป็นฟังก์ชันที่ช่วยแก้ปัญหา "YYYY-MM-DD เทียบกับ DD-MM-YYYY" ที่กล่าวถึงในบทนำ

รูปแบบวันที่ ฟังก์ชันนี้รับพารามิเตอร์สองตัว ได้แก่ ค่าวันที่ที่จะจัดรูปแบบ และสตริงรูปแบบที่สร้างจากตัวยึดตำแหน่ง สคริปต์ด้านล่างจะส่งคืนวันที่วางจำหน่ายแต่ละรายการในรูปแบบ วัน-เดือน-ปี ตามที่ผู้ใช้ของเราต้องการ

SELECT `title`, DATE_FORMAT(`date_released`, '%d-%m-%Y') AS `formatted_date`
FROM `movies`;

ตัวอย่างรูปแบบที่ใช้บ่อยที่สุดมีดังต่อไปนี้

ตัวยึด ความหมาย ตัวอย่างผลลัพธ์
%d วันที่ของเดือน (เลขสองหลัก) 04
%m เดือน (เลขสองหลัก) 08
%Y ปี สี่หลัก 2012
%M ชื่อเดือนแบบเต็ม สิงหาคม
%ของเขา Hoursนาที วินาที 14:35:09

ฟังก์ชันเกี่ยวกับวันที่อีกสามฟังก์ชันนั้นปรากฏให้เห็นอยู่บ่อยครั้งในงานประจำวัน:

  • CURDATE() ส่งคืนวันที่ปัจจุบันในรูปแบบ YYYY-MM-DD
  • NOW () ส่งคืนวันที่ปัจจุบัน และ เวลา
  • DATEDIFF(d1, d2) ฟังก์ชันนี้จะส่งคืนจำนวนวันระหว่างสองวันที่กำหนด ซึ่งเป็นพื้นฐานของรายงานค่าเช่าค้างชำระใดๆ

ดูรายชื่อทั้งหมดได้ที่ MySQL ข้อมูลอ้างอิงฟังก์ชันวันที่และเวลา.

ฟังก์ชั่นที่เก็บไว้

ฟังก์ชันสำเร็จรูปครอบคลุมกรณีทั่วไปอยู่แล้ว แต่เมื่อกฎทางธุรกิจมีความเฉพาะเจาะจงมากขึ้น เราจะต้องเขียนฟังก์ชันของเราเอง ซึ่งนั่นคือหน้าที่ของฟังก์ชันที่จัดเก็บไว้

ฟังก์ชันที่จัดเก็บไว้ทำงานเหมือนกับฟังก์ชันพื้นฐานทั่วไป เพียงแต่คุณเป็นผู้กำหนดเอง เมื่อสร้างแล้ว ฟังก์ชันที่จัดเก็บไว้สามารถนำไปใช้ในคำสั่ง SQL ได้เหมือนกับฟังก์ชันอื่นๆ ทั่วไป ไวยากรณ์พื้นฐานแสดงไว้ด้านล่าง

CREATE FUNCTION sf_name ([parameter(s)])
RETURNS data_type
[DETERMINISTIC | NOT DETERMINISTIC]
BEGIN
    -- procedural statements
END

ที่นี่

  • “สร้างฟังก์ชัน sf_name ([พารามิเตอร์])” เป็นสิ่งที่บังคับและบอกให้ทราบ MySQL เซิร์ฟเวอร์จะสร้างฟังก์ชันชื่อ `sf_name` โดยมีพารามิเตอร์เสริมที่กำหนดไว้ภายในวงเล็บ
  • “ส่งคืนประเภทข้อมูล” เป็นสิ่งที่จำเป็นและระบุประเภทข้อมูลที่ฟังก์ชันส่งคืน
  • “กำหนด” ระบุว่าฟังก์ชันจะส่งคืนค่าเดียวกันเสมอเมื่อมีการป้อนอาร์กิวเมนต์เดียวกัน “ไม่ใช่สิ่งที่แน่นอนตายตัว” ประกาศสิ่งที่ตรงกันข้าม
  • “เริ่มต้น … สิ้นสุด” ห่อหุ้มโค้ดขั้นตอนการทำงานที่ฟังก์ชันนั้นดำเนินการ

สมมติว่าเราต้องการทราบว่าภาพยนตร์ที่เช่าเรื่องใดบ้างที่เลยกำหนดส่งคืนแล้ว เราสามารถสร้างฟังก์ชันที่จัดเก็บไว้ซึ่งรับวันที่ส่งคืนเป็นพารามิเตอร์และเปรียบเทียบกับวันที่ปัจจุบันบนเซิร์ฟเวอร์ หากวันที่ปัจจุบันมากกว่าวันที่ส่งคืน แสดงว่าภาพยนตร์เรื่องนั้นเลยกำหนดส่งคืนแล้ว และเราจะส่งคืนค่า "ใช่" มิเช่นนั้นเราจะส่งคืนค่า "ไม่ใช่"

DELIMITER |
CREATE FUNCTION sf_past_movie_return_date (return_date DATE)
RETURNS VARCHAR(3)
NOT DETERMINISTIC
BEGIN
    DECLARE sf_value VARCHAR(3);
    IF CURDATE() > return_date THEN
        SET sf_value = 'Yes';
    ELSEIF CURDATE() <= return_date THEN
        SET sf_value = 'No';
    END IF;
    RETURN sf_value;
END|
DELIMITER ;

⚠️ คำเตือน — ห้ามติดป้ายกำกับฟังก์ชันนี้ว่า DETERMINISTIC เนื้อหาเรียกใช้ CURDATE() ดังนั้นอาร์กิวเมนต์เดียวกันจึงสามารถคืนค่า “ไม่” ในวันนี้และ “ใช่” ในวันพรุ่งนี้ได้ การประกาศฟังก์ชันที่ขึ้นอยู่กับเวลาเป็น DETERMINISTIC จะทำให้ตัวปรับแต่งประสิทธิภาพเข้าใจผิดและไม่ปลอดภัยสำหรับการจำลองแบบตามคำสั่ง ใช้ ไม่ใช่สิ่งที่กำหนดไว้ เมื่อใดก็ตามที่ฟังก์ชัน body เรียกใช้ CURDATE(), NOW() หรือ RAND()

การเรียกใช้สคริปต์ข้างต้นจะสร้างฟังก์ชันที่จัดเก็บไว้ชื่อ `sf_past_movie_return_date` ตอนนี้เรามาทดสอบกันดู

SELECT `movie_id`, `membership_number`, `return_date`, CURDATE(),
       sf_past_movie_return_date(`return_date`) AS `is_overdue`
FROM `movierentals`;

ดำเนินการสคริปต์ข้างต้นใน MySQL การทดสอบด้วย Workbench กับ myflixdb ให้ผลลัพธ์ดังต่อไปนี้

movie_id หมายเลขสมาชิก กลับ_วันที่ CURDATE() ค้างชำระ
1 1 NULL 04-08-2012 NULL
2 1 25-06-2012 04-08-2012 มี (ใบกำกับภาษีเต็มรูปแบบ)
2 3 25-06-2012 04-08-2012 มี (ใบกำกับภาษีเต็มรูปแบบ)
2 2 25-06-2012 04-08-2012 มี (ใบกำกับภาษีเต็มรูปแบบ)
3 3 NULL 04-08-2012 NULL

สังเกตว่ามีสองแถวที่เป็นค่า NULL เมื่อ `return_date` เป็น NULL การเปรียบเทียบทั้งสองจะให้ผลลัพธ์เป็น NULL แทนที่จะเป็น TRUE หรือ FALSE ดังนั้นเงื่อนไข IF ทั้งสองจึงทำงาน และฟังก์ชันจะส่งคืนค่า NULL ซึ่งเป็นผลลัพธ์ที่คาดหวังไว้ เนื่องจากภาพยนตร์ที่ไม่ได้ส่งคืนจะไม่มีวันที่ส่งคืนให้เปรียบเทียบ

ฟังก์ชันที่ผู้ใช้กำหนด

เมื่อ SQL เพียงอย่างเดียวไม่เร็วพอ MySQL ซึ่งเป็นทางเลือกที่สาม ฟังก์ชันที่ผู้ใช้กำหนดเอง (UDF) เขียนด้วยภาษาคอมไพล์ เช่น C or C++ฟังก์ชันที่ผู้ใช้กำหนดเอง (UDF) ถูกสร้างขึ้นในไลบรารีที่ใช้ร่วมกัน และลงทะเบียนกับเซิร์ฟเวอร์ เมื่อเพิ่มแล้ว ก็สามารถเรียกใช้งานได้เหมือนฟังก์ชันอื่นๆ เนื่องจาก UDF ทำงานเป็นโค้ดเนทีฟภายในกระบวนการของเซิร์ฟเวอร์ จึงเหมาะสำหรับการคำนวณที่ซับซ้อน แต่หากมีข้อผิดพลาดใน UDF ก็อาจทำให้เซิร์ฟเวอร์ล่มได้ ดังนั้น UDF จึงถูกใช้งานน้อยกว่าฟังก์ชันที่จัดเก็บไว้มาก

ฟังก์ชันในตัว ฟังก์ชันที่จัดเก็บไว้ และฟังก์ชันที่ผู้ใช้กำหนดเอง: คุณควรใช้ฟังก์ชันแบบใด?

ทั้งสามตระกูลฟังก์ชันนี้ส่งค่ากลับเพียงค่าเดียวและสามารถเรียกใช้ได้จากคำสั่ง SQL ใดๆ ก็ได้ แต่มีความแตกต่างกันในเรื่องผู้เขียน ฟังก์ชันทำงานที่ใด และระดับความเสี่ยง ตารางด้านล่างสรุปความแตกต่างเหล่านั้น

เกณฑ์ ฟังก์ชั่น Built-in ฟังก์ชั่นที่เก็บไว้ ฟังก์ชันที่ผู้ใช้กำหนดเอง (UDFs)
ใครเป็นผู้เขียน จัดส่งด้วย. MySQL คุณ ใน SQL คุณ ใน C หรือ C++
ที่มันอาศัยอยู่ ภายในเซิร์ฟเวอร์ ภายในฐานข้อมูลที่สร้างขึ้นด้วยคำสั่ง CREATE FUNCTION ไลบรารีที่ใช้ร่วมกันที่คอมไพล์แล้วซึ่งโหลดโดยเซิร์ฟเวอร์
การใช้งานทั่วไป การจัดรูปแบบ, คณิตศาสตร์, การรวมกลุ่ม กฎทางธุรกิจที่นำกลับมาใช้ซ้ำได้ เช่น เช็คค้างชำระ SQL ไม่สามารถแสดงตรรกะที่ใช้ CPU หนักหรือเฉพาะทางได้
ความเสี่ยงหลัก ไม่มี จะช้าหากเรียกใช้ทีละแถวบนตารางขนาดใหญ่ ข้อผิดพลาดในไลบรารีอาจทำให้เซิร์ฟเวอร์ล่มได้

โดยทั่วไปแล้ว ให้เริ่มต้นด้วยฟังก์ชันสำเร็จรูปก่อน หากไม่มีฟังก์ชันใดเหมาะสม ให้เขียนฟังก์ชันที่จัดเก็บไว้เพื่อให้กฎนั้นอยู่ในที่เดียวกัน ควรใช้ฟังก์ชันที่ผู้ใช้กำหนดเอง (UDF) ก็ต่อเมื่อฟังก์ชันที่จัดเก็บไว้ทำงานช้าเกินไปอย่างเห็นได้ชัดเท่านั้น

คำถามที่พบบ่อย

ฟังก์ชันต้องส่งคืนค่าเพียงค่าเดียวและสามารถใช้ภายในนิพจน์ SELECT, WHERE หรือ ORDER BY ได้ ในขณะที่โพรซีเดอร์ที่จัดเก็บไว้จะส่งคืนชุดผลลัพธ์ศูนย์ชุดหรือหลายชุด ไม่สามารถฝังอยู่ในนิพจน์ได้ และเรียกใช้ด้วยคำสั่ง CALL

เรียกใช้คำสั่ง DROP FUNCTION IF EXISTS sf_name; จากนั้นสร้างมันขึ้นมาใหม่ MySQL ไม่มีฟังก์ชัน CREATE หรือ REPLACE และฟังก์ชัน ALTER จะเปลี่ยนแปลงเฉพาะคุณลักษณะ เช่น ความคิดเห็นหรือประเภทความปลอดภัยเท่านั้น ไม่สามารถเปลี่ยนแปลงเนื้อหาได้

พวกเขาสามารถทำได้ ฟังก์ชันที่ครอบคอลัมน์ที่มีดัชนีในส่วน WHERE จะช่วยป้องกันได้ MySQL จากการใช้ดัชนีนั้น บังคับให้ทำการสแกนแบบเต็ม กรองตามคอลัมน์ดิบและใช้ฟังก์ชันเฉพาะในรายการ SELECT เท่านั้น

ใช่แล้ว ผู้ช่วย AI สามารถร่างโค้ด CREATE FUNCTION จากกฎภาษาอังกฤษธรรมดาได้ โปรดตรวจสอบเนื้อหาที่สร้างขึ้นอีกครั้งเพื่อให้แน่ใจว่ามีลักษณะ DETERMINISTIC ที่ถูกต้อง การจัดการค่า NULL และชนิดข้อมูลของพารามิเตอร์ถูกต้อง ก่อนที่จะนำไปใช้งานบนเซิร์ฟเวอร์จริง

ไม่ โมเดล AI อาจสร้างชื่อฟังก์ชันขึ้นเอง มองข้ามกรณีค่าว่าง หรือละเลยความแตกต่างของเวอร์ชัน ทดสอบฟังก์ชันที่สร้างขึ้นทุกฟังก์ชันกับสำเนาของข้อมูล และยืนยันผลลัพธ์กับแบบสอบถามที่คุณเขียนและตรวจสอบด้วยตนเองแล้ว

สรุปโพสต์นี้ด้วย: