ตารางขึ้นอยู่กับ
ทีนี้มาทำให้คำถามของเราซับซ้อนขึ้นเล็กน้อย มาเพิ่มตาราง งาน ใหม่ ในฐานข้อมูลของเราพร้อมงานสำหรับพนักงานของเรา และมาดูกันว่ามีรายการอะไรบ้าง:
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 เสร็จสิ้น
GO TO FULL VERSION