[英]Join query without where clause
下面的兩個查詢輸出相同的結果。 我理解第一個查詢,但是有人可以解釋第二個查詢的工作原理如何。
SELECT p0_.name AS name_0
FROM patient p0_ INNER JOIN consultant c1_
ON c1_.id = p0_.consultant_id
WHERE c1_.id=1;
SELECT p0_.name AS name_0
FROM patient p0_ INNER JOIN consultant c1_
ON (c1_.id = 1)
僅在patients
表中只有1行的情況下,這兩個查詢只能通過巧合得出相同的結果。
這些查詢是不同的,並且給出不同的結果。
請檢查這個簡單的演示: http : //sqlfiddle.com/#!9/1987a/1
CREATE TABLE patient (
patient_id int,
name varchar(20),
consultant_id int
);
insert into patient values(1,'Patient 1', 1);
insert into patient values(2,'Patient 2', 2);
CREATE TABLE consultant(
id int
);
insert into consultant values(1),(2);
SELECT p0_.name AS name_0
FROM patient p0_ INNER JOIN consultant c1_
ON c1_.id = p0_.consultant_id
WHERE c1_.id=1;
| name_0 |
|-----------|
| Patient 1 |
SELECT p0_.name AS name_0
FROM patient p0_ INNER JOIN consultant c1_
ON (c1_.id = 1)
| name_0 |
|-----------|
| Patient 1 |
| Patient 2 |
主鍵和外鍵的主要原因是強制數據一致性。
主鍵可在一個或多個列上強制值唯一性的一致性。 如果ID列具有主鍵,則不可能有兩行具有相同的ID值。 沒有該主鍵,許多行可能具有相同的ID值,您將無法僅根據ID值來區分它們。
外鍵可增強指向其他位置的數據的一致性。 它確保所指向的數據確實存在。 在典型的父子關系中,外鍵可確保每個孩子始終指向父母,並且父母實際存在。 沒有外鍵,您可能會有“孤立的”孩子指向一個不存在的父母。
您將不會看到數據不一致的情況,因為您只有一條記錄並且僅檢索到一列。
假設我們有這些表和列以及記錄。
CREATE TABLE patient (
patient_id INT,
name VARCHAR(20),
consultant_id INT
);
INSERT INTO patient VALUES(100,'Patient 1', 1);
INSERT INTO patient VALUES(200,'Patient 2', 1);
INSERT INTO patient VALUES(300,'Patient 3', 1);
INSERT INTO patient VALUES(400,'Patient 4', 2);
INSERT INTO patient VALUES(500,'Patient 5', 2);
INSERT INTO patient VALUES(600,'Patient 6', 3);
CREATE TABLE consultant(
id INT,
name VARCHAR(20)
);
INSERT INTO consultant VALUES(1,'Consultant 1');
INSERT INTO consultant VALUES(2,'Consultant 2');
INSERT INTO consultant VALUES(3,'Consultant 3');
看到我們也有顧問的名字,我們想看看哪個顧問參加了病人
SELECT p0_.name AS patientname_0,
c1_.name AS consultantname_0
FROM patient p0_
INNER JOIN consultant c1_
ON c1_.id = p0_.consultant_id
WHERE (c1_.id = 1);
結果
patientname_0 consultantname_0
Patient 1 Consultant 1
Patient 2 Consultant 1
Patient 3 Consultant 1
但是,對於在ON子句中沒有鍵的查詢
SELECT p0_.name AS patientname_0,
c1_.name AS consultantname_0
FROM patient p0_
INNER JOIN consultant c1_
ON (c1_.id = 1);
導致其他顧問不是1的患者的顧問名數據不一致
patientname_0 consultantname_0
Patient 1 Consultant 1
Patient 2 Consultant 1
Patient 3 Consultant 1
Patient 4 Consultant 1
Patient 5 Consultant 1
Patient 6 Consultant 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.