รับข้อมูลจากหลายตาราง
การแสดงข้อมูลจากหลายตาราง
ตารางที่เกี่ยวข้องของฐานข้อมูลขนาดใหญ่เชื่อมโยงกันผ่านการใช้คีย์ต่างประเทศและคีย์หลักหรือสิ่งที่มักเรียกว่าคอลัมน์ทั่วไป ความสามารถในการเข้าร่วมตารางจะช่วยให้คุณสามารถเพิ่มความหมายให้กับตารางผลลัพธ์ที่สร้างขึ้น สำหรับตารางตัวเลข 'n' ที่จะรวมในแบบสอบถามจำเป็นต้องมีเงื่อนไขการรวมขั้นต่ำ (n-1) ตามเงื่อนไขการเข้าร่วม Oracle จะรวมคู่ของแถวที่ตรงกันและแสดงแถวที่ตรงตามเงื่อนไขการรวม
การเข้าร่วมแบ่งออกเป็นด้านล่าง
Natural join (เรียกอีกอย่างว่า equijoin หรือการเข้าร่วมแบบธรรมดา) - สร้างการเข้าร่วมโดยใช้คอลัมน์ที่มีชื่อและกำหนดโดยทั่วไป
การรวมแบบไม่เสมอภาค - เข้าร่วมตารางเมื่อไม่มีแถวที่เท่ากันในตารางที่จะรวมเช่นเพื่อจับคู่ค่าในคอลัมน์หนึ่งของตารางที่มีช่วงของค่าในตารางอื่น
เข้าร่วมด้วยตนเอง - เข้าร่วมโต๊ะกับตัวเอง
การรวมภายนอก - รวมระเบียนของตารางในเอาต์พุตเมื่อไม่มีระเบียนที่ตรงกันในตารางอื่น
การรวมคาร์ทีเซียน (หรือที่เรียกว่าผลิตภัณฑ์คาร์ทีเซียนหรือการรวมแบบไขว้) - จำลองแต่ละแถวจากตารางแรกโดยทุกแถวจากตารางที่สองสร้างการรวมระหว่างตารางโดยการแสดงชุดระเบียนที่เป็นไปได้ทั้งหมด
เข้าร่วมตามธรรมชาติ
คีย์เวิร์ด NATURAL สามารถลดความซับซ้อนของไวยากรณ์ของ equijoin ได้ NATURAL JOIN เป็นไปได้เมื่อใดก็ตามที่สองตาราง (หรือมากกว่า) มีคอลัมน์ที่มีชื่อเดียวกันและคอลัมน์นั้นเข้ากันได้กล่าวคือคอลัมน์มีโดเมนที่ใช้ร่วมกันของค่า การดำเนินการรวมแถวจากตารางที่มีค่าคอลัมน์เท่ากันสำหรับคอลัมน์ที่มีชื่อเดียวกัน
พิจารณาความสัมพันธ์แบบหนึ่งต่อกลุ่มระหว่างตาราง DEPARTMENTS และ EMPLOYEES แต่ละตารางมีคอลัมน์ชื่อ DEPARTMENT_ID คอลัมน์นี้เป็นคีย์หลักของตาราง DEPARTMENTS และคีย์ต่างประเทศของตาราง EMPLOYEES
SELECT E.first_name NAME,D.department_name DNAME
FROM employees E NATURAL JOIN departments D;
FIRST_NAME DNAME
---------- ------
MILLER DEPT 1
JOHN DEPT 1
MARTIN DEPT 2
EDWIN DEPT 2
แบบสอบถาม SELECT ด้านล่างรวมสองตารางโดยระบุเงื่อนไขการรวมอย่างชัดเจนด้วยคำสำคัญ ON
SELECT E.first_name NAME,D.department_name DNAME
FROM employees E JOIN departments D
ON (E.department_id = D.department_id);
มีข้อ จำกัด บางประการเกี่ยวกับ NATURAL JOIN คุณไม่สามารถระบุคอลัมน์ LOB ด้วย NATURAL JOIN ได้นอกจากนี้คอลัมน์ที่เกี่ยวข้องในการรวมจะไม่สามารถผ่านการรับรองด้วยชื่อตารางหรือนามแฝงได้
การใช้ข้อ
การใช้การรวมแบบธรรมชาติ Oracle ระบุคอลัมน์โดยปริยายเพื่อสร้างพื้นฐานของการเข้าร่วม หลายสถานการณ์จำเป็นต้องมีการประกาศเงื่อนไขการเข้าร่วมอย่างชัดเจน ในกรณีเช่นนี้เราใช้ USING clause เพื่อระบุเกณฑ์การเข้าร่วม เนื่องจากการใช้อนุประโยครวมตารางตามความเท่าเทียมกันของคอลัมน์จึงเรียกอีกอย่างว่า Equijoin พวกเขาเรียกอีกอย่างว่าการรวมภายในหรือการรวมแบบธรรมดา
ไวยากรณ์:
SELECT <column list>
FROM TABLE1 JOIN TABLE2
USING (column name)
พิจารณาคำค้นหา SELECT ด้านล่างตาราง EMPLOYEES และตาราง DEPARTMENTS รวมเข้าด้วยกันโดยใช้คอลัมน์ทั่วไป DEPARTMENT_ID
SELECT E.first_name NAME,D.department_name DNAME
FROM employees E JOIN departments D
USING (department_id);
เข้าร่วมด้วยตนเอง
การดำเนินการ SELF-JOIN จะสร้างตารางผลลัพธ์เมื่อความสัมพันธ์ของความสนใจมีอยู่ระหว่างแถวที่เก็บไว้ในตารางเดียว กล่าวอีกนัยหนึ่งคือเมื่อรวมตารางเข้ากับตัวเองการเข้าร่วมจะเรียกว่าการเข้าร่วมด้วยตนเอง
พิจารณาตาราง EMPLOYEES ซึ่งมีพนักงานและผู้จัดการการรายงานของพวกเขาในการค้นหาชื่อผู้จัดการสำหรับพนักงานจะต้องมีการเข้าร่วมในตาราง EMP เอง นี่คือผู้สมัครทั่วไปสำหรับการเข้าร่วมด้วยตนเอง
SELECT e1.FirstName Manager,e2.FirstName Employee
FROM employees e1 JOIN employees e2
ON (e1.employee_id = e2.manager_id)
ORDER BY e2.manager_id DESC;
ไม่ใช่ Equijoins
การรวมแบบไม่เสมอภาคจะใช้เมื่อคอลัมน์ที่เกี่ยวข้องไม่สามารถเข้าร่วมด้วยความหมายเท่ากับเครื่องหมายเท่ากับไม่มีแถวที่เท่ากันในตารางที่จะเข้าร่วมการรวมแบบไม่เท่ากันช่วยให้คุณสามารถเก็บค่าต่ำสุดของช่วงในคอลัมน์เดียวได้ ของระเบียนและค่าสูงสุดในคอลัมน์อื่น ดังนั้นแทนที่จะค้นหาการจับคู่แบบคอลัมน์ต่อคอลัมน์คุณสามารถใช้การรวมที่ไม่เท่ากันเพื่อพิจารณาว่าสินค้าที่จัดส่งอยู่ระหว่างช่วงต่ำสุดและสูงสุดในคอลัมน์หรือไม่หากการรวมไม่พบช่วงที่ตรงกันสำหรับสินค้าการจัดส่งที่เกี่ยวข้อง สามารถคืนค่าธรรมเนียมได้ในผลลัพธ์ เช่นเดียวกับวิธีการรวมความเสมอภาคแบบดั้งเดิมการรวมแบบไม่เสมอภาคสามารถดำเนินการได้ในส่วนคำสั่ง WHERE นอกจากนี้ยังสามารถใช้คีย์เวิร์ด JOIN กับส่วนคำสั่ง ON เพื่อระบุคอลัมน์ที่เกี่ยวข้องสำหรับการเข้าร่วม
SELECT E.first_name,
J.job_hisal,
J.job_losal,
E.salary
FROM employees E JOIN job_sal J
ON (E.salary BETWEEN J.job_losal AND J.job_losal);
เราสามารถใช้พารามิเตอร์เปรียบเทียบทั้งหมดที่กล่าวถึงก่อนหน้านี้เช่นตัวดำเนินการความเท่าเทียมและอสมการระหว่างกันเป็นโมฆะไม่ใช่โมฆะและ RELATIONAL
การเข้าร่วมภายนอก
การรวมภายนอกใช้เพื่อระบุสถานการณ์ที่แถวในตารางหนึ่งไม่ตรงกับแถวในตารางที่สองแม้ว่าตารางทั้งสองจะเกี่ยวข้องกันก็ตาม
การรวมภายนอกมีสามประเภท: LEFT, RIGHT และ FULL OUTER JOIN พวกเขาทั้งหมดเริ่มต้นด้วย INNER JOIN จากนั้นเพิ่มแถวบางส่วนที่ถูกทิ้ง LEFT OUTER JOIN จะเพิ่มกลับแถวทั้งหมดที่หลุดจากตารางแรก (ซ้าย) ในเงื่อนไขการรวมและคอลัมน์เอาต์พุตจากตารางที่สอง (ขวา) จะถูกตั้งค่าเป็น NULL RIGHT OUTER JOIN จะเพิ่มแถวทั้งหมดที่หลุดออกจากตารางที่สอง (ขวา) ในเงื่อนไขการรวมและคอลัมน์เอาต์พุตจากตารางแรก (ซ้าย) จะถูกตั้งค่าเป็น NULL FULL OUTER JOIN จะเพิ่มแถวทั้งหมดที่หลุดจากทั้งสองตาราง
เข้าร่วมภายนอกขวา
RIGHT OUTER JOIN จะเพิ่มแถวทั้งหมดที่หลุดออกจากตารางที่สอง (ขวา) ในเงื่อนไขการรวมและคอลัมน์เอาต์พุตจากตารางแรก (ซ้าย) จะถูกตั้งค่าเป็น NULL หมายเหตุข้อความค้นหาด้านล่างจะแสดงรายการพนักงานและแผนกที่เกี่ยวข้อง นอกจากนี้ยังไม่มีการมอบหมายพนักงานให้กับแผนก 30.
SELECT E.first_name, E.salary, D.department_id
FROM employees E, departments D
WHERE E.DEPARTMENT_ID (+) = D.DEPARTMENT_ID;
FIRST_NAME SALARY DEPARTMENT_ID
---------- ---------- ----------
JOHN 6000 10
EDWIN 2000 20
MILLER 2500 10
MARTIN 4000 20
30
เข้าร่วมด้านนอกซ้าย
LEFT OUTER JOIN จะเพิ่มกลับแถวทั้งหมดที่หลุดจากตารางแรก (ซ้าย) ในเงื่อนไขการรวมและคอลัมน์เอาต์พุตจากตารางที่สอง (ขวา) จะถูกตั้งค่าเป็น NULL แบบสอบถามที่แสดงด้านบนสามารถใช้เพื่อแสดงการรวมภายนอกด้านซ้ายโดยการแลกเปลี่ยนตำแหน่งของเครื่องหมาย (+)
SELECT E.first_name, E.salary, D.department_id
FROM employees E, departments D
WHERE D.DEPARTMENT_ID = E.DEPARTMENT_ID (+);
FIRST_NAME SALARY DEPARTMENT_ID
---------- ---------- ----------
JOHN 6000 10
EDWIN 2000 20
MILLER 2500 10
MARTIN 4000 20
30
เข้าร่วมภายนอกเต็มรูปแบบ
FULL OUTER JOIN จะเพิ่มแถวทั้งหมดที่หลุดจากทั้งสองตาราง แบบสอบถามด้านล่างแสดงรายการพนักงานและแผนกของพวกเขา โปรดทราบว่าพนักงาน 'MAN' ยังไม่ได้รับมอบหมายแผนกใด ๆ จนถึงขณะนี้ (เป็น NULL) และไม่มีการมอบหมายแผนก 30 ให้กับพนักงาน
SELECT nvl (e.first_name,'-') first_name, nvl (to_char (d.department_id),'-') department_id
FROM employee e FULL OUTER JOIN department d
ON e. depARTMENT_ID = d. depARTMENT_ID;
FIRST_NAME DEPARTMENT_ID
---------- --------------------
MAN -
JOHN 10
EDWIN 20
MILLER 10
MARTIN 20
- 30
6 rows selected.
ผลิตภัณฑ์คาร์ทีเซียนหรือการเข้าร่วมข้าม
สำหรับสองเอนทิตี A และ B A * B เรียกว่าผลิตภัณฑ์คาร์ทีเซียน ผลิตภัณฑ์คาร์ทีเซียนประกอบด้วยชุดค่าผสมที่เป็นไปได้ทั้งหมดของแถวจากแต่ละตาราง ดังนั้นเมื่อตารางที่มี 10 แถวถูกรวมเข้ากับตารางที่มี 20 แถวผลิตภัณฑ์คาร์ทีเซียนคือ 200 แถว (10 * 20 = 200) ตัวอย่างเช่นการรวมโต๊ะของพนักงานด้วยแปดแถวและตารางแผนกที่มีสามแถวจะเกิดขึ้น ตารางผลิตภัณฑ์คาร์ทีเซียน 24 แถว (8 * 3 = 24)
การรวมข้ามหมายถึงผลคูณคาร์ทีเซียนของสองตาราง สร้างผลคูณระหว่างสองตาราง ข้อความค้นหาข้างต้นสามารถเขียนโดยใช้ประโยค CROSS JOIN
ตารางผลลัพธ์ผลิตภัณฑ์คาร์ทีเซียนโดยปกติไม่มีประโยชน์มากนัก ในความเป็นจริงตารางผลลัพธ์ดังกล่าวอาจทำให้เข้าใจผิดได้อย่างมาก หากคุณดำเนินการค้นหาด้านล่างสำหรับตารางพนักงานและแผนกตารางผลลัพธ์แสดงว่าพนักงานทุกคนมีความสัมพันธ์กับทุกแผนกและเรารู้ดีว่านี่ไม่ใช่กรณี!
SELECT E.first_name, D.DNAME
FROM employees E,departments D;
การเข้าร่วมข้ามสามารถเขียนเป็น
SELECT E.first_name, D.DNAME
FROM employees E CROSS JOIN departments D;