PostgreSQL มีอยู่จริงด้วยการเลือก Operaทอร์ (ตัวอย่าง)

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

PostgreSQL EXISTS เป็นตัวดำเนินการบูลีนที่ใช้ตรวจสอบว่าซับเควรีที่สัมพันธ์กันส่งคืนแถวใด ๆ หรือไม่ ทำให้คำสั่ง SELECT, INSERT, UPDATE และ DELETE สามารถกรองข้อมูลตามการมีอยู่หรือไม่มีอยู่ของระเบียนที่ตรงกันได้อย่างมีประสิทธิภาพ

  • 📋 ไวยากรณ์: คำสั่ง WHERE EXISTS (subquery) จะคืนค่า true เมื่อ subquery ให้ผลลัพธ์อย่างน้อยหนึ่งแถว
  • 🔗 แบบสอบถามย่อยที่สัมพันธ์กัน: คำสั่ง EXISTS เชื่อมโยงการค้นหาภายในและภายนอก โดยจับคู่แถวตามคีย์ที่ใช้ร่วมกัน
  • ไฟฟ้าลัดวงจร: คำสั่ง EXISTS จะหยุดที่แถวแรกที่ตรงกัน ดังนั้นจึงทำงานได้ดีกับตารางขนาดใหญ่
  • 🔁 สี่ข้อความ: ตัวดำเนินการนี้ทำงานภายในคำสั่ง SELECT, INSERT, UPDATE และ DELETE
  • 🛡️ ไม่มีอยู่จริง: ยกเว้นแถวได้อย่างปลอดภัยและหลีกเลี่ยงข้อผิดพลาด NULL ที่ทำให้คำสั่ง NOT IN ทำงานผิดพลาด
  • 🤖 คำถามจาก AI: ผู้ช่วยจะสร้างเงื่อนไข EXISTS และแจ้งเตือนความเสี่ยงด้านประสิทธิภาพของซับเควรีที่สัมพันธ์กัน

PostgreSQL มีอยู่ด้วยการเลือก OperaTor

สิ่งที่มีอยู่จริงใน PostgreSQL?

การขอ PostgreSQL มีอยู่ ตัวดำเนินการ EXISTS ตรวจสอบว่ามีแถวอยู่ในซับควอรีหรือไม่ ซึ่งหมายความว่าตัวดำเนินการนี้ใช้ร่วมกับซับควอรี ตัวดำเนินการ EXISTS จะถือว่าตรงตามเงื่อนไขเมื่อพบอย่างน้อยหนึ่งแถวในซับควอรี คุณสามารถใช้การดำเนินการนี้ร่วมกับคำสั่ง SELECT, UPDATE, INSERT และ DELETE ได้

PostgreSQL ไวยากรณ์การค้นหา EXISTS

นี่คือไวยากรณ์สำหรับ PostgreSQL คำสั่งที่มีอยู่:

WHERE EXISTS (subquery);

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

PostgreSQL มีอยู่จริงด้วยคำสั่ง SELECT

มาดูกันว่าวิธีการใช้คำสั่ง SELECT ร่วมกับตัวดำเนินการ EXISTS เป็นอย่างไร เรามีตารางดังต่อไปนี้:

หนังสือ:

PostgreSQL มีอยู่จริงด้วยคำสั่ง SELECT

ราคา:

PostgreSQL มีอยู่จริงด้วยคำสั่ง SELECT

รันคำสั่งต่อไปนี้:

SELECT *
FROM Book
WHERE EXISTS (SELECT *
              FROM Price
              WHERE Book.id = Price.id);

สิ่งนี้ส่งคืนสิ่งต่อไปนี้:

PostgreSQL มีอยู่จริงพร้อมผลลัพธ์จากคำสั่ง SELECT

คำสั่งดังกล่าวควรส่งคืนระเบียนทั้งหมดในตาราง Book ซึ่งมี id ตรงกับ id ของระเบียนใด ๆ ตามแบบสอบถามย่อย มีรหัสเดียวเท่านั้นที่ตรงกัน จึงมีการส่งกลับเพียงบันทึกเดียวเท่านั้น

PostgreSQL มีอยู่แล้วด้วยคำสั่ง INSERT

เราสามารถใช้ตัวดำเนินการ EXISTS ได้ใน คำสั่ง INSERT. เรามีตารางอยู่ 3 ตารางดังต่อไปนี้:

หนังสือ:

PostgreSQL มีอยู่แล้วด้วยคำสั่ง INSERT

ราคา:

PostgreSQL มีอยู่แล้วด้วยคำสั่ง INSERT

ราคา2:

PostgreSQL มีอยู่แล้วด้วยคำสั่ง INSERT

จากนั้นเราสามารถรันคำสั่งต่อไปนี้ได้:

INSERT INTO Price
SELECT id, price
FROM Price2
WHERE EXISTS (SELECT id
              FROM Book
              WHERE Book.id = Price2.id);

ตารางราคาตอนนี้เป็นดังนี้:

PostgreSQL ผลลัพธ์ของคำสั่ง EXISTS ที่มี INSERT

แถวที่มีรหัส 5 ในตารางชื่อ Price2 ตรงกัน จากนั้นบันทึกนี้จะถูกแทรกลงในตารางราคา

PostgreSQL มีอยู่แล้วพร้อมคำสั่งอัปเดต

เราสามารถใช้ตัวดำเนินการ EXISTS ในคำสั่ง UPDATE ได้

เรียกใช้แบบสอบถามต่อไปนี้:

UPDATE Price
SET price = (SELECT price
              FROM Price2
              WHERE Price2.id = Price.id)
WHERE EXISTS (SELECT id, price
FROM Price2
WHERE Price2.id = Price.id);

PostgreSQL มีอยู่แล้วพร้อมคำสั่งอัปเดต

เรากำลังอัปเดตคอลัมน์ราคาของตารางราคา เป้าหมายของเราคือการมีราคาของสินค้าที่ใช้รหัสเดียวกัน ตรงกันเพียงแถวเดียวเท่านั้น นั่นคือ 5

อย่างไรก็ตาม เนื่องจากราคาเท่ากัน นั่นคือ 205 จึงไม่มีการอัพเดต หากมีความแตกต่างจะมีการอัพเดต

PostgreSQL มีอยู่แล้วด้วยคำสั่งลบ

A PostgreSQL คำสั่ง DELETE สามารถใช้ตัวดำเนินการ EXISTS ได้ ต่อไปนี้คือตัวอย่าง:

DELETE FROM Price
WHERE EXISTS (SELECT *
              FROM Price2
              WHERE Price.id = Price2.id);

ตารางราคาตอนนี้เป็นดังนี้:

PostgreSQL มีอยู่แล้วด้วยคำสั่งลบ

ลบแถวที่มีรหัส 5 แล้ว

PostgreSQL คำสั่ง EXISTS โดยใช้ pgAdmin

นอกเหนือจากการใช้ SQL shell แล้ว เรายังสามารถเรียกใช้คำสั่ง EXISTS เดียวกันนี้ได้ผ่านทางอินเทอร์เฟซ pgAdmin ต่อไปนี้คือวิธีการดำเนินการเหล่านี้โดยใช้ pgAdmin:

ด้วยคำสั่ง SELECT

ด้านล่างนี้คือขั้นตอนการใช้คำสั่ง EXISTS ใน PostgreSQL โดยใช้คำสั่ง SELECT ผ่าน pgAdmin:

ขั้นตอน 1) เข้าสู่ระบบบัญชี pgAdmin ของคุณ เปิด pgAdmin แล้วเข้าสู่ระบบบัญชีของคุณโดยใช้ข้อมูลประจำตัวของคุณ

ขั้นตอน 2) สร้างฐานข้อมูลสาธิต

  1. จากแถบนำทางด้านซ้าย คลิกฐานข้อมูล
  2. คลิกสาธิต

PostgreSQL คำสั่ง EXISTS โดยใช้ pgAdmin

ขั้นตอน 3) พิมพ์แบบสอบถามด้านล่างในตัวแก้ไขแบบสอบถาม:

SELECT *
FROM Book
WHERE EXISTS (SELECT *
              FROM Price
              WHERE Book.id = Price.id);

ขั้นตอน 4) คลิกปุ่มดำเนินการ

PostgreSQL คำสั่ง EXISTS โดยใช้ pgAdmin

ควรส่งคืนสิ่งต่อไปนี้:

PostgreSQL คำสั่ง EXISTS โดยใช้ pgAdmin

ด้วยคำสั่ง INSERT

หากต้องการบรรลุผลเช่นเดียวกันผ่าน pgAdmin ให้ทำดังนี้:

ขั้นตอน 1) เข้าสู่ระบบบัญชี pgAdmin ของคุณ

ขั้นตอน 2)

  1. จากแถบนำทางด้านซ้าย คลิกฐานข้อมูล
  2. คลิกสาธิต

คำสั่ง EXISTS ใน PostgreSQL โดยใช้ pgAdmin

ขั้นตอน 3) พิมพ์แบบสอบถามในตัวแก้ไขแบบสอบถาม:

INSERT INTO Price
SELECT id, price
FROM Price2
WHERE EXISTS (SELECT id
              FROM Book
              WHERE Book.id = Price2.id);

ขั้นตอน 4) คลิกปุ่มดำเนินการ

คำสั่ง EXISTS ใน PostgreSQL โดยใช้ pgAdmin

ตอนนี้ตารางราคาควรเป็นดังนี้:

คำสั่ง EXISTS ใน PostgreSQL โดยใช้ pgAdmin

ด้วยคำสั่ง UPDATE

หากต้องการบรรลุผลเช่นเดียวกันผ่าน pgAdmin ให้ทำดังนี้:

ขั้นตอน 1) เข้าสู่ระบบบัญชี pgAdmin ของคุณ

ขั้นตอน 2)

  1. จากแถบนำทางด้านซ้าย คลิกฐานข้อมูล
  2. คลิกสาธิต

คำสั่ง EXISTS ใน PostgreSQL โดยใช้ pgAdmin

ขั้นตอน 3) พิมพ์แบบสอบถามในตัวแก้ไขแบบสอบถาม:

UPDATE Price
SET price = (SELECT price
              FROM Price2
              WHERE Price2.id = Price.id)
WHERE EXISTS (SELECT id, price
FROM Price2
WHERE Price2.id = Price.id);

ขั้นตอน 4) คลิกปุ่มดำเนินการ

PostgreSQL คำสั่ง EXISTS โดยใช้ pgAdmin

ตอนนี้ตารางราคาควรเป็นดังนี้:

PostgreSQL คำสั่ง EXISTS โดยใช้ pgAdmin

ด้วยคำสั่ง DELETE

หากต้องการบรรลุผลเช่นเดียวกันผ่าน pgAdmin ให้ทำดังนี้:

ขั้นตอน 1) เข้าสู่ระบบบัญชี pgAdmin ของคุณ

ขั้นตอน 2)

  1. จากแถบนำทางด้านซ้าย คลิกฐานข้อมูล
  2. คลิกสาธิต

PostgreSQL คำสั่ง EXISTS โดยใช้ pgAdmin

ขั้นตอน 3) พิมพ์แบบสอบถามในตัวแก้ไขแบบสอบถาม:

DELETE FROM Price
WHERE EXISTS (SELECT *
              FROM Price2
              WHERE Price.id = Price2.id);

ขั้นตอน 4) คลิกปุ่มดำเนินการ

PostgreSQL คำสั่ง EXISTS โดยใช้ pgAdmin

ตอนนี้ตารางราคาควรเป็นดังนี้:

PostgreSQL คำสั่ง EXISTS โดยใช้ pgAdmin

ดาวน์โหลดฐานข้อมูลที่ใช้ในบทช่วยสอนนี้

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

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

คำสั่ง NOT IN อาจส่งคืนผลลัพธ์เป็นศูนย์แถวเมื่อซับควอรีมีค่า NULL เนื่องจากผลการเปรียบเทียบจะไม่แน่นอน ส่วนคำสั่ง NOT EXISTS จะไม่สนใจค่า NULL และประเมินแต่ละแถวอย่างถูกต้อง ทำให้เป็นตัวเลือกที่น่าเชื่อถือสำหรับการใช้ anti-join

ซับเควรีแบบสัมพันธ์จะอ้างอิงถึงคอลัมน์จากเควรีภายนอก เช่น WHERE Book.id = Price.id ฟังก์ชัน EXISTS จะตรวจสอบซ้ำสำหรับแต่ละแถวในเควรีภายนอก และจะส่งคืนค่า true เมื่อพบการจับคู่

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

ไม่ครับ คำสั่ง EXISTS ตรวจสอบเพียงว่าซับควอรีส่งคืนแถวหรือไม่ ดังนั้น SELECT *, SELECT 1 หรือ SELECT id จึงทำงานเหมือนกัน รายชื่อคอลัมน์ภายในซับควอรีไม่มีผลต่อผลลัพธ์

สร้างดัชนีให้กับคอลัมน์ที่เชื่อมต่อกันภายในซับเควรี เก็บเงื่อนไขความสัมพันธ์ไว้ในรูปแบบ sargable และเรียกใช้ EXPLAIN ANALYZE PostgreSQL มักจะเขียน EXISTS ใหม่ให้เป็น semi-join ที่มีประสิทธิภาพมากขึ้นเมื่อดัชนีรองรับ

ผู้ช่วย AI จะแปลงกฎภาษาอังกฤษธรรมดาให้เป็นข้อความ EXISTS สร้างซับเควรีที่สัมพันธ์กัน และเตือนเกี่ยวกับข้อผิดพลาด NOT IN NULL นอกจากนี้ยังแนะนำดัชนีและคำแนะนำ EXPLAIN สำหรับการปรับแต่งอีกด้วย

ใช่แล้ว AI Copilot จะตรวจจับรูปแบบของซับเควรีและเขียน IN ใหม่เป็น EXISTS หรือ NOT IN เป็น NOT EXISTS เพื่อเพิ่มความปลอดภัยจากค่า NULL และเพิ่มประสิทธิภาพการทำงานบนตารางขนาดใหญ่

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