Postgresql基础实践教程(二)

发布时间:2026/5/22 0:01:07

Postgresql基础实践教程(二) 十三、查询会员的预订开始时间题目如何列出名为"David Farrell"的会员的所有预订开始时间?预期结果starttime2012-09-18 09:00:002012-09-18 17:30:002012-09-18 13:30:002012-09-18 20:00:002012-09-19 09:30:002012-09-19 15:00:002012-09-19 12:00:002012-09-20 15:30:002012-09-20 11:30:002012-09-20 14:00:002012-09-21 10:30:002012-09-21 14:00:002012-09-22 08:30:002012-09-22 17:00:002012-09-23 08:30:002012-09-23 17:30:002012-09-23 19:00:002012-09-24 08:00:002012-09-24 16:30:002012-09-24 12:30:002012-09-25 15:30:002012-09-25 17:00:002012-09-26 13:00:002012-09-26 17:00:002012-09-27 08:00:002012-09-28 11:30:002012-09-28 09:30:002012-09-28 13:00:002012-09-29 16:00:002012-09-29 10:30:002012-09-29 13:30:002012-09-29 14:30:002012-09-29 17:30:002012-09-30 14:30:00[答案与解析]selectbks.starttimefromcd.bookings bksinnerjoincd.members memsonmems.memid=bks.memidwheremems.firstname='David'andmems.surname='Farrell';INNER JOIN(内连接)是最常用的连接方式。它的作用是根据连接条件把两张表组合起来——在这个例子里,我们会拿 members 表中的每个会员 ID 去 bookings 表中找匹配的记录。找到匹配后,就会返回一行包含两张表数据的组合记录。注意这里给每张表都起了个别名(bks 和 mems)。这么做有两个好处:一是写起来方便,二是如果同一张表要被连接多次,就能区分不同次连接产生的列。先别管 SELECT 和 WHERE 子句,咱们重点看看 FROM 语句生成了什么。之前的例子里,FROM 后面就是简单的一张表,但现在呢?是另一张表这张表是由 bookings 和 members 两张表组合而成的。下面能看到连接后的部分输出结果:对于 members 表里的每个会员,连接操作都会在 bookings 表中找出所有匹配的会员 ID。每找到一个匹配,就会生成一行,把 members 表和 bookings 表的对应行拼在一起。显然,光这样出来的信息太多了,实际问题都需要进一步筛选。在咱们的查询里,用 SELECT 子句开头部分来选需要的列,用 WHERE 子句来筛选行,如下图所示:这样就能找到 David 的预订记录了总的来说,建议大家记住一点:FROM 子句的输出本质上就是一张大表,然后你从里面筛选出需要的信息。听起来可能觉得效率不高,但别担心,数据库底层可聪明了,不会真这么笨 😃.最后提一下:内连接有两种写法。我给大家展示的是我个人偏好的那种,跟其他连接类型的写法更一致。不过你也经常会看到下面这种写法:selectbks.starttimefromcd.bookings bks,cd.members memswheremems.firstname='David'andmems.surname='Farrell'andmems.memid=bks.memid;这种写法和标准答案功能完全一样。如果你觉得这种写法更顺手,用它也完全没问题。十四、查询网球场的预订开始时间题目如何列出 2012-09-21 这一天网球场的预订开始时间?返回开始时间和设施名称的配对列表,按时间排序。预期结果startname2012-09-21 08:00:00Tennis Court 12012-09-21 08:00:00Tennis Court 22012-09-21 09:30:00Tennis Court 12012-09-21 10:00:00Tennis Court 22012-09-21 11:30:00Tennis Court 22012-09-21 12:00:00Tennis Court 12012-09-21 13:30:00Tennis Court 12012-09-21 14:00:00Tennis Court 22012-09-21 15:30:00Tennis Court 12012-09-21 16:00:00Tennis Court 22012-09-21 17:00:00Tennis Court 12012-09-21 18:00:00Tennis Court 2[答案与解析]selectbks.starttimeasstart,facs.nameasnamefromcd.facilities facsinnerjoincd.bookings bksonfacs.facid=bks.facidwherefacs.namein('Tennis Court 2'

相关新闻