程序员面试金典——解题总结:9.15数据库15.1编写SQL查询,列出租住不止一套公寓的承租人。问题:编写SQL查询,列出租住不止一套公寓的承租人。
每套公寓可能有多位承租人,而每位承租人可能租住多套公寓。每套公寓隶属移动大楼,而没动大楼属于一个综合体。
下面是各个表:
Apartments: Buildings:Tenants:
AptId int BuildingID intTenantID int
UnitNumber varcharComplexID intTenantName varchar
BuildingID intBuildingName varchar
Complexs: AptTenants:Requests:
ComplexID int TennantID int RequestID int
ComplexName intAptID intStatus varchar
AptID int
Description varchar
分析:Apartments属于Buildings,Buildings属于Complexes。AptTenants:是公寓和承租人表
根据公寓和承租人表中按照TenantId进行groug by之后,如果大于等于2,就找到承租人,然后找到承租人信息。
这个必须把group by之后的结果作为一张临时表,然后和Tenants进行一起操作
实现:
select Tenants.TenantID , TenantName from ( select count(*) as num , TenantID from AptTenants groug by TenantId ) as Table2 , Tenants
where Tenants.TenantId = Table2.TenantID and num >= 2;
关键:
1分组后的结果可以用having实现,group by是对某个属性进行分组
直接用having对count中结果>=2的筛选即可,
select TenantName from Tenants INNER JOIN (select TenantID from AptTenants group by TenantID having count(*) >= 2) TempTable ON TempTable.TenantID = Tenants.TenantID;
将查询结果重命名为表只需要 () TempTable 即可
2 连接分为:内连接,外链接,交叉连接。操作为: ON
内连接:等值连接,自然连接
等值连接:连接条件为“=”,例子: select * from students as s INNNER JOIN classes as c ON s.cno = c.cno
自然连接:连接条件为“=”,使用选择列表中的列,删除连接表中的重复列,例子:删除authors和publishers中重复列city和state
select a.* , p.country from authors as a INNER JOIN publishes as p on a.ciity = p.city;
外连接:左外连接,右外连接
左外连接:列出匹配lie(where中的列)和左表匹配的列,例子: select a.* , b.* fron LUNTAN as a LEFT JOIN user as b ON a.name = b.name
交叉连接:笛卡尔积,交叉结果,返回两个所有数据航的笛卡尔积。例子:select *type , pub_name fro titles CROSS JOIN publishes