加入没有where子句的查询

时间:2017-09-04 17:39:32

标签: mysql sql

以下两个查询输出相同的结果。我理解第一个,但有人可以解释第二个查询是如何工作的。

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)

2 个答案:

答案 0 :(得分:3)

这两个查询只能巧合地给出相同的结果,只是在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 |

答案 1 :(得分:1)

  

主键和外键的主要原因是强制执行数据   一致性。

     

主键强制执行值唯一性的一致性   一列或多列。如果ID列具有主键,那么它就是   不可能有两行具有相同的ID值。没有那个   主键,许多行可以具有相同的ID值,您不会   能够仅根据ID值来区分它们。

     

外键强制指向其他位置的数据的一致性。   它确保指向的数据实际存在。在一个   典型的亲子关系,外键确保每一个   child始终指向父级,父级实际存在。   如果没有外键,你可能会有“孤儿”这一点   在不存在的父母身上。

由于您只有一条记录并且只检索了一列,因此您不会看到数据不一致。

假设我们有这些表格和列以及记录。

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