【问题标题】:How Do I Write a MySQL Query that Includes a row that Has Null Data?如何编写包含具有空数据的行的 MySQL 查询?
【发布时间】:2020-06-26 12:49:08
【问题描述】:

下面是我试图解决的场景的描述。

我有两张桌子。下面显示了一个称为显示的表。

id(INT) name(VARCHAR) start_date(DATE) end_Date(DATE) person_id(INT)
5       Whales        2019-01-01       2019-05-31     7
19      Universe      2019-02-01       2019-03-31     13
25      Grizzlies     2019-03-01       2019-06-30     7 
46      Homosapiens?  2019-07-01       2019-09-31     13

另一个名为 people 的表如下所示。

id(INT) name(VARCHAR) background(TEXT)
7       Ron Swanson   Nonconformist
13      Tom Haverford Hustler
71      Andy Dwyer    Goofball

我正在寻找编写一个 SQL 查询来查找所有显示器的所有名称以及与显示器相关联的人员的姓名。如果显示没有人,则显示不应出现在结果中。即使一个人没有显示器,这个人的名字也应该出现在最终结果中。正确的查询应显示以下结果(见下表)。

Ron Swanson   Whales
Tom Haverford Universe
Ron Swanson   Grizzlies
Tom Haverford Homosapiens?
Andy Dwyer             

我想出的查询是

SELECT p.name, d.name from displays d, people p WHERE d.person_id = p.id; 

减去 Andy Dwyer 后得到正确结果。我对如何包括 Andy Dwyer 感到困惑,我错过了什么?

【问题讨论】:

  • 这是一个常见问题解答。在考虑发布之前,请阅读手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:stackoverflow.com 和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。修正你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。
  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出您可以给出的最少代码,即您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。

标签: mysql sql select inner-join where-clause


【解决方案1】:

您需要使用从peopledisplaysLEFT JOIN

SELECT p.name, d.name
FROM people p
LEFT JOIN displays d ON d.person_id = p.id

输出(用于您的样本数据)

name            name
Ron Swanson     Whales
Tom Haverford   Universe
Ron Swanson     Grizzlies
Tom Haverford   Homosapiens?
Andy Dwyer      (null)

Demo on SQLFiddle

【讨论】:

  • 尼克,感谢您提到左连接!我没有想到,我需要复习其他连接。另外,感谢您在 SQLFiddle 上分享演示!我不知道它存在,在浏览器中测试您的查询很酷!谢谢你这么棒的回答!
  • @Ravi 不用担心 - 我很高兴能帮上忙。 SQLFiddle 的一个优点是它的“Text to DDL”功能,它可以将您在问题中的表格输出转换为 DDL 语句。然后创建和测试查询就容易多了。还有几个其他站点:dbfiddle.ukdb-fiddle.com,它们也不错,dbfiddle.uk 有非常广泛的 DBMS 可以运行查询。
猜你喜欢
  • 1970-01-01
  • 2011-09-01
  • 2013-02-16
  • 2022-06-28
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 2012-12-13
  • 2011-05-06
相关资源
最近更新 更多