SQL Academy · บทเรียน

การค้นหาภายในอาร์เรย์

ตัวดำเนินการ ANY, contains และ overlap

บทเรียน 2 จาก 413 ขั้นตอน

การค้นหาภายในอาร์เรย์ เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

อาร์เรย์เก็บค่าหลายค่า

ใน PostgreSQL คอลัมน์อาร์เรย์สามารถเก็บค่าหลายค่าไว้ในเซลล์เดียว ก่อนที่จะค้นหาภายในอาร์เรย์ การทำความเข้าใจก่อนว่าอาร์เรย์มีลักษณะอย่างไรจะช่วยได้

แบบสอบถามด้านล่างสร้างตารางที่แต่ละผลิตภัณฑ์อยู่ได้หลายหมวดหมู่ ซึ่งจัดเก็บเป็นอาร์เรย์ข้อความ

CREATE TABLE products (
  id      SERIAL PRIMARY KEY,
  name    TEXT,
  tags    TEXT[]
);

INSERT INTO products (name, tags) VALUES
  ('Laptop',     ARRAY['electronics', 'computers', 'sale']),
  ('T-Shirt',    ARRAY['clothing', 'summer', 'sale']),
  ('Coffee Mug', ARRAY['kitchen', 'gifts']),
  ('Headphones', ARRAY['electronics', 'audio']),
  ('Notebook',   ARRAY['stationery', 'office']);

การตรวจสอบการเป็นสมาชิกด้วย ANY

ตัวดำเนินการ ANY ช่วยให้คุณตรวจสอบว่าค่าปรากฏอยู่ที่ใดก็ตามในอาร์เรย์หรือไม่ ไวยากรณ์คือ value = ANY(array_column)

แบบสอบถามนี้ค้นหาผลิตภัณฑ์ทั้งหมดที่มีแท็ก อุปกรณ์อิเล็กทรอนิกส์

SELECT name, tags
FROM products
WHERE 'electronics' = ANY(tags);

ANY ไม่ได้ใช้เฉพาะกับข้อความ

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

CREATE TABLE students (
  student TEXT,
  scores  INT[]
);

INSERT INTO students VALUES
  ('Alice', ARRAY[88, 95, 100]),
  ('Bob',   ARRAY[70, 80, 90]),
  ('Carol', ARRAY[100, 100, 99]);

SELECT student, scores
FROM students
WHERE 100 = ANY(scores);

การตัดแถวออกด้วย NOT + ANY

หากต้องการค้นหาแถวที่ค่า ไม่ ปรากฏอยู่ในอาร์เรย์ ให้ใช้ NOT ร่วมกับ ANY โปรดทราบว่า value <> ANY(arr) มีความหมายต่างกัน — นิพจน์นี้จะเป็นจริงหากมีองค์ประกอบใด ๆ แตกต่างกัน ซึ่งแทบจะเป็นจริงเสมอ

ใช้ NOT (value = ANY(arr)) เพื่อการตรวจสอบการตัดออกที่เชื่อถือได้

-- Find products that are NOT tagged as 'sale'
SELECT name, tags
FROM products
WHERE NOT ('sale' = ANY(tags));

ตัวดำเนินการบรรจุ @>

ตัวดำเนินการ @> ตรวจสอบว่าอาร์เรย์หนึ่ง บรรจุ องค์ประกอบทั้งหมดของอีกอาร์เรย์หนึ่งหรือไม่

ลองคิดว่าเป็นคำถามว่า อาร์เรย์ด้านซ้ายมีองค์ประกอบทุกตัวที่ระบุไว้ด้านขวาหรือไม่

แบบสอบถามนี้ค้นหาผลิตภัณฑ์ที่มีทั้งแท็ก อุปกรณ์อิเล็กทรอนิกส์ และแท็ก ลดราคา

SELECT name, tags
FROM products
WHERE tags @> ARRAY['electronics', 'sale'];

ตัวดำเนินการอยู่ภายใน <@

ตัวดำเนินการ <@ เป็นการกลับด้านของ @> โดยตรวจสอบว่าอาร์เรย์ด้านซ้ายอยู่ ภายใน อาร์เรย์ด้านขวาทั้งหมดหรือไม่

แบบสอบถามนี้ค้นหาผลิตภัณฑ์ที่รายการแท็กทั้งหมดเป็นสับเซตของชุด อุปกรณ์อิเล็กทรอนิกส์ คอมพิวเตอร์ ลดราคา

SELECT name, tags
FROM products
WHERE tags <@ ARRAY['electronics', 'computers', 'sale'];

ตัวดำเนินการซ้อนทับ &&

ตัวดำเนินการ && จะส่งคืนค่าเป็นจริงเมื่ออาร์เรย์สองชุดมีองค์ประกอบร่วมกัน อย่างน้อยหนึ่งรายการ ตัวดำเนินการนี้เทียบเท่ากับการถามว่า รายการสองรายการนี้มีอะไรที่เหมือนกันหรือไม่

แบบสอบถามด้านล่างค้นหาผลิตภัณฑ์ที่มีแท็กอย่างน้อยหนึ่งรายการร่วมกับรายการซื้อของที่กำหนด

SELECT name, tags
FROM products
WHERE tags && ARRAY['audio', 'summer', 'gifts'];

ความแตกต่างสำคัญระหว่างการซ้อนทับกับการบรรจุ

เป็นเรื่องง่ายที่จะสับสนระหว่าง @> กับ && ต่อไปนี้คือการเปรียบเทียบที่ชัดเจน:

  • tags @> ARRAY['a','b'] — แถวต้องมีทั้ง สองรายการ คือ 'a' และ 'b'
  • tags && ARRAY['a','b'] — แถวต้องมี 'a' หรือ 'b' อย่างน้อยหนึ่งรายการ
-- Contains: must have BOTH 'electronics' AND 'sale'
SELECT name FROM products WHERE tags @> ARRAY['electronics', 'sale'];

-- Overlap: must have AT LEAST ONE of 'electronics' or 'sale'
SELECT name FROM products WHERE tags && ARRAY['electronics', 'sale'];

การใช้ array_length เพื่อกรองตามขนาด

บางครั้งคุณอาจต้องการค้นหาแถวที่อาร์เรย์มีองค์ประกอบตามจำนวนที่กำหนด array_length(arr, 1) จะส่งคืนจำนวนองค์ประกอบในมิติแรก

แบบสอบถามนี้ค้นหาผลิตภัณฑ์ที่มีแท็กพอดีสามรายการ

SELECT name, tags
FROM products
WHERE array_length(tags, 1) = 3;

การรวมการค้นหาอาร์เรย์กับเงื่อนไขอื่น

ตัวดำเนินการอาร์เรย์ทำงานร่วมกับเงื่อนไขเอสคิวแอลทั่วไปได้ คุณสามารถใช้ร่วมกับ AND, OR และเงื่อนไขอื่น ๆ ในส่วนคำสั่ง WHERE เพื่อสร้างตัวกรองที่แม่นยำ

-- Products tagged 'sale' AND whose name starts with a letter before 'N'
SELECT name, tags
FROM products
WHERE 'sale' = ANY(tags)
  AND name < 'N'
ORDER BY name;

การทำดัชนีอาร์เรย์เพื่อเพิ่มความเร็ว

สำหรับตารางขนาดใหญ่ การค้นหาอาร์เรย์อาจช้าหากไม่มีดัชนี ดัชนี GIN (ดัชนีผกผันแบบทั่วไป) ของ PostgreSQL ได้รับการออกแบบมาสำหรับคอลัมน์อาร์เรย์ และรองรับตัวดำเนินการ @>, <@ และ && ได้อย่างมีประสิทธิภาพ

ANY ไม่ได้ใช้ดัชนี GIN โดยตรง แต่ตัวดำเนินการซ้อนทับและบรรจุใช้ดัชนีนี้ได้

-- Create a GIN index on the tags array column
CREATE INDEX idx_products_tags ON products USING GIN (tags);

-- This query can now use the index
SELECT name FROM products WHERE tags @> ARRAY['electronics'];

ตรวจสอบความเข้าใจ: ตัวดำเนินการอาร์เรย์

ทดสอบความเข้าใจเกี่ยวกับตัวดำเนินการค้นหาอาร์เรย์ของ PostgreSQL

สรุปบทเรียน

ในบทนี้ คุณได้เรียนรู้วิธีหลักสามแบบในการค้นหาภายในอาร์เรย์ของ PostgreSQL:

  • = ANY(arr) — ตรวจสอบว่าค่าเดียวมีอยู่ที่ใดก็ตามในอาร์เรย์หรือไม่
  • @> (บรรจุ) — ตรวจสอบว่าอาร์เรย์มีองค์ประกอบที่ระบุไว้ ทั้งหมด
  • && (ซ้อนทับ) — ตรวจสอบว่าอาร์เรย์มีองค์ประกอบร่วมกับอีกอาร์เรย์หนึ่ง อย่างน้อยหนึ่งรายการ

นอกจากนี้ คุณยังได้เห็น <@ สำหรับการตรวจสอบการอยู่ภายในแบบย้อนกลับ array_length สำหรับการกรองตามขนาด และ ดัชนี GIN เพื่อเร่งการค้นหาอาร์เรย์ในชุดข้อมูลขนาดใหญ่ การรวมตัวดำเนินการเหล่านี้เข้ากับเงื่อนไข WHERE มาตรฐานช่วยให้คุณควบคุมข้อมูลหลายค่าได้อย่างแม่นยำและยืดหยุ่น

เริ่มต้นได้ฟรี

เรียนรู้ SQL ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
46
บทเรียน
183

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

บทเรียน “การค้นหาภายในอาร์เรย์” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การค้นหาภายในอาร์เรย์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การค้นหาภายในอาร์เรย์”

ตัวดำเนินการ ANY, contains และ overlap คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การค้นหาภายในอาร์เรย์” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม

ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐานคอลัมน์อาร์เรย์
  2. การค้นหาภายในอาร์เรย์
  3. UNNEST และการรวมค่า
  4. อาร์เรย์เทียบกับตารางแบบทำให้เป็นมาตรฐาน
← กลับไปที่ SQL Academy