LeetCode数据库175

本文通过一个具体的案例演示了如何使用SQL的左外连接来整合两个表的数据,即使其中一个表的部分记录在另一个表中没有匹配项也能确保所有记录被包含在最终结果集中。

175组合两个表

表1: Person

+-------------+---------+
| 列名         | 类型     |
+-------------+---------+
| PersonId    | int     |
| FirstName   | varchar |
| LastName    | varchar |
+-------------+---------+
PersonId 是上表主键

表2: Address

+-------------+---------+
| 列名         | 类型    |
+-------------+---------+
| AddressId   | int     |
| PersonId    | int     |
| City        | varchar |
| State       | varchar |
+-------------+---------+
AddressId 是上表主键

 

编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:

 

FirstName, LastName, City, State

分析:因为两个表想要组合有笛卡尔乘积,但是题目说了,因为不管是否有person地址,都要提供person数据,也就是说,有null的哪一个元祖也要留下,这个时候,左外连接是最好的选择,但是直接做连接也是可以通过的

select FirstName, LastName,City,State
    from  Person left join Address
    on Person.PersonId = Address.PersonId;



### LeetCode 数据库问题解答 #### 获取第二高薪员工的信息 为了获取并返回 `Employee` 中第二高的薪水,可以采用如下 SQL 查询语句: ```sql SELECT MAX(Salary) AS SecondHighestSalary FROM Employee WHERE Salary < (SELECT MAX(Salary) FROM Employee); ``` 这条命令首先找到最高的工资数额,接着在外层查询里寻找小于该最大值的最大工资数即为次高工资[^3]。 对于更复杂的场景比如要找出每个部门前三名最高薪资者及其所在部门名称,则可利用子查询来实现: ```sql SELECT d.Name Department, e1.Name Employee, e1.Salary FROM Department d INNER JOIN Employee e1 ON e1.DepartmentId = d.Id WHERE ( SELECT COUNT(DISTINCT(e2.Salary)) FROM Employee e2 WHERE e1.Salary <= e2.Salary AND e1.DepartmentId = e2.DepartmentId ) <= 3 ORDER BY d.Id, salary DESC; ``` 这段代码通过内部关联操作以及条件过滤实现了预期功能,并按照指定顺序排列结果集[^4]。 #### 组合两个的数据展示 当涉及到多张格之间的联合操作时,例如将两张独立存在的按某些共同字段合并成一张新显示出来,下面是一个简单的例子用于说明如何完成这项任务: ```sql CREATE TABLE tableA( id INT PRIMARY KEY NOT NULL, name TEXT NOT NULL); INSERT INTO tableA VALUES(1,'Alice'), (2,'Bob'); CREATE TABLE tableB( id INT PRIMARY KEY NOT NULL, age INT NOT NULL); INSERT INTO tableB VALUES(1,25), (2,30); -- 使用 INNER JOIN 进行连接 SELECT a.id, a.name, b.age FROM tableA a JOIN tableB b ON a.id=b.id; ``` 这里创建了两个测试用 `tableA` 和 `tableB` 并插入了几条记录作为演示用途,在最后一步执行了一个基于 ID 字段相等性的内联接查询从而得到所需的结果集合[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值