ตารางขึ้นอยู่กับ

ทีนี้มาทำให้คำถามของเราซับซ้อนขึ้นเล็กน้อย มาเพิ่มตาราง งาน ใหม่ ในฐานข้อมูลของเราพร้อมงานสำหรับพนักงานของเรา และมาดูกันว่ามีรายการอะไรบ้าง:

SELECT * FROM task

ผลลัพธ์ของคำขอดังกล่าว:

รหัส พนักงาน_id ชื่อ วันกำหนดส่ง
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 (โมฆะ) ทำความสะอาดสำนักงาน (โมฆะ)
7 4 ใช้ชีวิตให้สนุก (โมฆะ)
8 6 ใช้ชีวิตให้สนุก (โมฆะ)

ตารางนี้มีเพียง 4 คอลัมน์:

  • id — หมายเลขงานเฉพาะ (และแถวในตาราง);
  • Employee_id — ID ของพนักงานจากตารางพนักงานที่ได้รับมอบหมายงาน
  • ชื่อ — ชื่อและคำอธิบายของงาน
  • เส้นตาย - เวลาที่ต้องทำงานให้เสร็จ

ให้ความสนใจกับความแตกต่างเล็กน้อย งาน N6 ไม่มี Employee_id เราไม่มีตัวทำความสะอาด งานอยู่ที่นั่น แต่นักแสดงไม่อยู่ มันเกิดขึ้น.

นอกจากนี้ งาน 6-9 ยังไม่มีกำหนดเวลา สิ่งนี้เกิดขึ้นเมื่องานต้องทำอย่างสม่ำเสมอและต่อเนื่อง ตัวอย่างเช่น สำนักงานต้องทำความสะอาดทุกวัน แต่คุณก็ต้องสนุกกับชีวิตทุกวันด้วย :)

หากตารางหนึ่งใช้รหัสจากอีก ตารางหนึ่ง ตารางดังกล่าวจะเรียกว่าอิงอาศัย

สอบถามกับหลายตาราง

เราเห็นในตารางงานว่ามีสองงาน "สนุกกับชีวิต" เราจะรู้ได้อย่างไรว่าใครคือผู้โชคดีเหล่านี้?

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

SELECT columns
FROM Table 1, table 2, tableN

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

นั่นคือ ถ้าคุณมี 5 แถวในตารางแรก และ 10 แถวในตารางที่สอง คุณก็จะมีทั้งหมด 50 แถว ใน Java แบบสอบถามนี้จะมีลักษณะดังนี้:

for (String row1 : table1)
{
	for (String row2 : table2)
   {
  	System.out.println(row1 + row2);
   }
}

ลองเขียนแบบสอบถามของเราไปยังสองตารางพร้อมกันและดูว่าเกิดอะไรขึ้น:

SELECT * FROM employee, task

และผลลัพธ์ของแบบสอบถามนี้:

รหัส ชื่อ อาชีพ เงินเดือน อายุ รหัส พนักงาน _รหัส ชื่อ วันกำหนดส่ง
1 อีวานอฟ อีวาน โปรแกรมเมอร์ 100,000 25 1 1 แก้ไขข้อบกพร่องในส่วนหน้า 2022-06-01
2 เปตรอฟ เปตรอฟ โปรแกรมเมอร์ 80000 23 1 1 แก้ไขข้อบกพร่องในส่วนหน้า 2022-06-01
3 อีวานอฟ เซอร์เกย์ เทสเตอร์ 40000 สามสิบ 1 1 แก้ไขข้อบกพร่องในส่วนหน้า 2022-06-01
4 ราบิโนวิช มอยชา ผู้อำนวยการ 200,000 35 1 1 แก้ไขข้อบกพร่องในส่วนหน้า 2022-06-01
5 คิเรียนโก อนาสตาเซีย ผู้จัดการสำนักงาน 40000 25 1 1 แก้ไขข้อบกพร่องในส่วนหน้า 2022-06-01
6 วาสก้า แมว 1,000 3 1 1 แก้ไขข้อบกพร่องในส่วนหน้า 2022-06-01
1 อีวานอฟ อีวาน โปรแกรมเมอร์ 100,000 25 2 2 แก้ไขข้อบกพร่องในส่วนหลัง 2022-06-15
2 เปตรอฟ เปตรอฟ โปรแกรมเมอร์ 80000 23 2 2 แก้ไขข้อบกพร่องในส่วนหลัง 2022-06-15
3 อีวานอฟ เซอร์เกย์ เทสเตอร์ 40000 สามสิบ 2 2 แก้ไขข้อบกพร่องในส่วนหลัง 2022-06-15
4 ราบิโนวิช มอยชา ผู้อำนวยการ 200,000 35 2 2 แก้ไขข้อบกพร่องในส่วนหลัง 2022-06-15
5 คิเรียนโก อนาสตาเซีย ผู้จัดการสำนักงาน 40000 25 2 2 แก้ไขข้อบกพร่องในส่วนหลัง 2022-06-15

เรามีบรรทัดผลลัพธ์ทั้งหมด 48 รายการ แต่ที่นี่ฉันให้เพียง 11 รายการ มิฉะนั้นจะไม่มีพื้นที่เพียงพอ

ให้ความสนใจกับสามสิ่ง:

  • คอลัมน์ที่มีชื่อเดียวกัน: id นี่คือรหัสจากตารางพนักงานและรหัสจาก ตาราง งาน
  • แถวของแต่ละตารางซ้ำกัน ในคอลัมน์ด้านซ้าย ID 6 ตามด้วย ID = 1 อีกครั้ง
  • เรามีแถวไร้สาระที่ เช่น id (จากตารางพนักงาน) คือ 6 และในแถวพนักงานเดียวกันคือ 1

การลบบรรทัดที่ไม่มีความหมาย

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

ตามหลักเหตุผล ถ้าแถว Employee_id เป็น 3 ก็ควรจะยึดเฉพาะแถวจากตารางพนักงานที่มี ID เป็น 3 มาลองแก้ไขความเข้าใจผิดนี้ด้วย WHERE

ลองเขียนแบบสอบถามดังนี้:

SELECT * FROM employee, task 
WHERE emploee.id = task.emploee_id 

และผลลัพธ์ของแบบสอบถามนี้:

รหัส ชื่อ อาชีพ เงินเดือน อายุ รหัส พนักงาน_id ชื่อ วันกำหนดส่ง
1 อีวานอฟ อีวาน โปรแกรมเมอร์ 100,000 25 1 1 แก้ไขข้อบกพร่องในส่วนหน้า 2022-06-01
2 เปตรอฟ เปตรอฟ โปรแกรมเมอร์ 80000 23 2 2 แก้ไขข้อบกพร่องในส่วนหลัง 2022-06-15
4 ราบิโนวิช มอยชา ผู้อำนวยการ 200,000 35 7 4 ใช้ชีวิตให้สนุก (โมฆะ)
5 คิเรียนโก อนาสตาเซีย ผู้จัดการสำนักงาน 40000 25 3 5 ซื้อกาแฟ 2022-07-01
5 คิเรียนโก อนาสตาเซีย ผู้จัดการสำนักงาน 40000 25 4 5 ซื้อกาแฟ 2022-08-01
5 คิเรียนโก อนาสตาเซีย ผู้จัดการสำนักงาน 40000 25 5 5 จะซื้อกาแฟ 2022-09-01
6 วาสก้า แมว 1,000 3 8 6 ใช้ชีวิตให้สนุก (โมฆะ)

ข่าวดีก็คือบรรทัดที่ไม่มีความหมายหายไปแล้ว: id จากคอลัมน์แรกจะเท่ากับ Employee_id เสมอ

ข่าวร้ายคืองานที่ไม่มีใครมอบหมายเช่นการทำความสะอาดสำนักงานหายไป รหัสพนักงานของพวกเขาเป็น NULL ดังนั้นพวกเขาจึงถูกยกเลิกหลังจาก WHERE เสร็จสิ้น