多表SQL select语句

16

给定以下两个表:

Person table 
id (pk) 
first 
middle 
last 
age

Address table 
id(pk) 
person_id (fk person.id) 
street 
city 
state 
zip

我该如何创建一个SQL语句,返回所有邮编为97229的人员信息?


我不确定从哪里开始。我知道如何从单个表中进行选择,例如SELECT * FROM Person WHERE first = "John",但是在合并表格方面,我感到困惑。 - user1420913
5个回答

45
Select * from people p, address a where  p.id = a.person_id and a.zip='97229';

或者你必须尝试使用JOIN,因为像评论中的Gordon Linoff所说,这是一种更有效、更好的方法,你需要学习这个。

SELECT p.*, a.street, a.city FROM persons AS p
JOIN address AS a ON p.id = a.person_id
WHERE a.zip = '97299';

这里的p.*表示将显示PERSONS表中的所有列。


你的第一个 where 是不正确的(基于你实际的 JOIN - 我已经编辑过了)。 - Andy Brown
1
如果两个表之间没有关系,我们只想逐个获取记录,该怎么办? - SAR
@SAR 这就是我想做的。你最终解决了吗? - Anupam
@SAR,补充一下我的评论,我不想使用UNION,因为这意味着在查询中多次复制相同的值(例如上面示例中的邮政编码)。 - Anupam
@Anupam,我很久以前就有这个评论了,但你的意思是从一个表中获取一条记录,从另一个表中获取一条记录,而这两个表之间没有关系,或者先从一个表中获取所有行,然后再从另一个表中获取所有行! - SAR
我的意思是在两个表中查找相同的内容(例如“person_name”),这两个表之间没有关系(即没有外键),我们只想从两个表中依次获取记录(假设列数相同)。我们可以使用UNION,但这意味着在查询中多次重复表达式person_name = 'John'(例如)。我想避免这种情况,但我想这是不可能的。 - Anupam

4

您需要将这两个表进行连接:

select p.id, p.first, p.middle, p.last, p.age,
       a.id as address_id, a.street, a.city, a.state, a.zip
from Person p inner join Address a on p.id = a.person_id
where a.zip = '97229';

这将从两个表中选择所有列。当然,您可以通过在select子句中选择不同的列来限制列数。


1

就像这样:

SELECT p.*, a.street, a.city FROM persons AS p
JOIN address AS a ON p.id = a.person_id
WHERE a.zip = '97299'

1

首先从 person 表中选择所有记录,然后将这些记录与另一个名为“Address”的表连接起来...现在你拥有了所有地址表中有地址的人的记录...最后通过邮政编码筛选你的记录。

 select * from Person as P inner join Address as A on 
    P.id = A.person_id Where A.zip='97229'

0
select P.*,
A.Street,
A.City,
A.State
from Preson P
inner join Address A on P.id=A.Person_id
where A.Zip=97229
Order by A.Street,A.City,A.State

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接