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的执行顺序
这个题目用内连接(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
内连接,分别让表为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;