高频SQL50题(基础版)——连接篇

1378. 使用唯一标识码替换员工ID - 力扣(LeetCode)高频 SQL 50 题(基础版) - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台

sql中的连接查询分为,inner join内连接,outer join外连接,full join全连接,cross join交叉连接,self join自连接

内连接(INNER JOIN)

  • 返回两个表中满足连接条件的行。
  • 如果一个表中的某行在另一个表中没有匹配的行,则这行不会被包含在结果集中。
  • 交集

示例:

SELECT A.column1, B.column2  
FROM TableA A  
INNER JOIN TableB B ON A.key = B.key;

左连接(LEFT JOIN 或 LEFT OUTER JOIN)

  • 返回左表中的所有行,以及右表中匹配的行。
  • 如果在右表中没有匹配的行,则结果集中对应的列将包含NULL。
  • 以左表为主表(查询全部),右表为辅表(没有的显示NULL)

示例:

SELECT A.column1, B.column2  
FROM TableA A  
LEFT JOIN TableB B ON A.key = B.key;

右连接(RIGHT JOIN 或 RIGHT OUTER JOIN)

  • 与左连接相反,返回右表中的所有行,以及左表中匹配的行。
  • 如果在左表中没有匹配的行,则结果集中对应的列将包含NULL。
  • 以右表为主表(查询全部), 左表为辅表(没有的显示null)

示例:

SELECT A.column1, B.column2  
FROM TableA A  
RIGHT JOIN TableB B ON A.key = B.key;

全连接(FULL JOIN 或 FULL OUTER JOIN)

  • 返回左表和右表中的所有行。
  • 如果某一边的表中没有匹配的行,则结果集中对应的列将包含NULL。
  • 没有的显示null

示例:

SELECT A.column1, B.column2  
FROM TableA A  
FULL JOIN TableB B ON A.key = B.key;

交叉连接(CROSS JOIN)

  • 返回左表中的每一行与右表中的每一行的组合。
  • 不需要ON子句,因为会生成左表与右表的所有可能的行组合。
SELECT A.column1, B.column2  
FROM TableA A  
CROSS JOIN TableB B;

自连接(SELF JOIN)

  • 一个表与其自身进行连接。
  • 通常用于比较表中的行或查找表内的相关行。

示例:

SELECT A.column1, B.column2  
FROM TableA A, TableA B  
WHERE A.key = B.related_key;

 1378. 使用唯一标识码替换员工ID - 力扣(LeetCode)

# Write your MySQL query statement below
SELECT unique_id,name
FROM Employees
LEFT JOIN EmployeeUNI
ON Employees.id=EmployeeUNI.id;
  • LEFT JOIN 一种外连接方法,确保将所有 Employees 表中的行都包含在结果中
  • ON on筛选和where筛选的差别主要在于执行顺序上,只针对outer join,也就是平时最常使用的left join和right join。

    outer join 的执行过程分为4步

    1、先对两个表执行交叉连接(笛卡尔积)
    2、应用on筛选器
    3、添加外部行
    4、应用where筛选器

  • 说到执行顺序,这是SQL的执行顺序

1068. 产品销售分析 I - 力扣(LeetCode)

这个题目用内连接(inner join)或左连接(left join)都可以:因为两张表之间存在外键约束。外键约束了两张表数据的完整性,所以不会出现null的情况。
(a. 外键只是约束作用,并不起关联作用。表和表的关联是通过关联语句实现的。
b. 外键消耗资源,可能会造成死锁,一般不使用。

inner join 等价于 join。
using 在 ①查询是等值连接 ②等值连接的两列具有相同的列名和数据类型 时,等价于on语句。
from 后面两个表,通过逗号连接:自然连接。返回两张表的笛卡尔乘积(返回m*n行),一般不推荐使用。

作者:无污染无公害-
链接:https://leetcode.cn/problems/product-sales-analysis-i/solutions/2324414/nei-lian-jie-de-liang-chong-xie-fa-by-no-lyu4/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

# Write your MySQL query statement below
SELECT product_name,year,price
FROM Sales JOIN Product
ON Sales.product_id = Product.product_id;

1581. 进店却未进行过交易的顾客 - 力扣(LeetCode)

 左连接,然后找出transaction_id为NULL的行,以v.customer_id对这些行进行分组计数

SELECT v.customer_id, count(*) as count_no_trans
FROM Visits as v
LEFT JOIN Transactions as t
ON v.visit_id=t.visit_id
WHERE t.transaction_id IS NULL
GROUP BY v.customer_id

197. 上升的温度 - 力扣(LeetCode)

内连接,分别让表为W1和W2,把它们连结在一块

使用DATEDIFF找出DATE之间差了1天的所有行数据。比如W1.id=1和W2.id=2,其他的行数据像是W1.id=1和W2.id=3都筛掉了

然后再看这些行里面哪些的温度满足条件。

# Write your MySQL query statement below
SELECT w1.id
FROM Weather W1
JOIN Weather W2
ON DATEDIFF(W1.recordDate, W2.recordDate) = 1
WHERE W1.temperature>W2.temperature;

1661. 每台机器的进程平均运行时间 - 力扣(LeetCode)

内连接,然后把每台机器每个process的start和end的挑出来放在一行里,方便计算平均时间

SELECT a1.machine_id,round(avg(a2.timestamp -a1.timestamp ),3) as processing_time 
FROM  Activity as a1 
JOIN Activity as a2
ON a1.machine_id=a2.machine_id
AND a1.process_id=a2.process_id
AND a1.activity_type ='start'
AND a2.activity_type ='end'
GROUP BY machine_id;

  • 15
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值