LeetCode数据库篇|175组合两个表

首发公众号:早起Python

系列导读

LeetCode176|第二高的薪水

大家好,从今天起我们将对Leetcode中数据库相关题目进行讲解,如果对SQL相关操作还不是很了解的读者可以点击万字Mysql学习笔记复习。

通过做题来学习是最有效的方式,阅读的同时一定要思考每种解法的异同,最好能够敲一遍。

本文为第175题:组合两个表

题目与SQL架构

 

Create table Person (PersonId int, FirstName varchar(255), LastName varchar(255));
Create table Address (AddressId int, PersonId int, City varchar(255), State varchar(255));
Truncate table Person;
insert into Person (PersonId, LastName, FirstName) values ('1''Wang''Allen');
Truncate table Address;
insert into Address (AddressId, PersonId, City, State) values ('1''2''New York City''New York');

 

第一种解法

从题意上判断很简单,无论person是否有地址信息,说明地址信息(City, State)的查询结果允许为NULL。但是,姓名(FirstName, LastName)必须有

直观的解法是基于Person表的左连接。

注:写SQL语句的时候尽量按照执行顺序去写

FROM...
JOIN...
ON...
WHERE...
GROUP BY...
SELECT...
HAVING...
ORDER BY...
LIMIT...

先给出最简单直接的解法:

SELECT P.FirstName, P.LastName, A.City, A.State
FROM Person P 
LEFT JOIN Address A
ON P.PersonID = A.PersonID

第二种解法

另一种解法是将Address换成子查询临时表

SELECT P.FirstName, P.LastName, A.City, A.State
FROM Person P
LEFT JOIN (SELECT DISTINCT PersonId, City, State 
           FROM Address) A
on P.PersonId = A.PersonId;

这种解法针对于大数据、建立合适索引的情况下速度会加快,但是如果数据量太小,由于子查询会再产生临时表,有时候执行速度不一定有提升,见仁见智。主流的做法就是JOIN连表,如果用WHERE或者建立多个子查询也可以解决这道题。个人认为相对而言意义偏小。

posted @   刘早起  阅读(124)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥
点击右上角即可分享
微信分享提示