高频 SQL 50 题(基础版)连接部分

1、使用唯一标识码替换员工ID

sql 复制代码
# Write your MySQL query statement below
SELECT 
    b.unique_id, a.name
FROM 
    Employees as a
LEFT JOIN 
    EmployeeUNI as b
ON 
    a.id = b.id;

2、产品销售分析 I

sql 复制代码
# Write your MySQL query statement below
SELECT
    p.product_name, s.year, s.price
FROM 
    Sales s
JOIN
    Product p
ON
    s.product_id = p.product_id

总结

  • INNER JOIN:仅返回匹配的记录。
  • LEFT JOIN:返回左表的所有记录,即使右表没有匹配的记录。
  • RIGHT JOIN:返回右表的所有记录,即使左表没有匹配的记录。
  • FULL JOIN :返回左表和右表的所有记录,没匹配的部分用 NULL 填充。
  • CROSS JOIN:返回两张表的笛卡尔积,生成所有可能的组合。
  • SELF JOIN:将表与自身进行连接,常用于表示层级关系。
  • NATURAL JOIN:自动根据同名列进行连接。

在MySQL中,JOIN操作默认使用的是INNER JOIN。INNER JOIN是MySQL默认的JOIN类型。它返回两个表中符合条件的行。INNER JOIN使用ON关键字来指定连接条件,将两个表中符合条件的记录合并在一起,生成一个新的结果集。

3、进店却未进行过交易的顾客

sql 复制代码
# Write your MySQL query statement below
SELECT
    v.customer_id,count(v.customer_id)count_no_trans
FROM
    Visits v
LEFT JOIN 
    Transactions t
ON 
    v.visit_id = t.visit_id
WHERE
    transaction_id is NULL
GROUP BY
    v.customer_id

4、上升的温度

sql 复制代码
SELECT 
    a.id
FROM 
    Weather as a
CROSS JOIN
    Weather as b
WHERE
    datediff(a.recordDate,b.recordDate) = 1 
AND
    a.Temperature >b.Temperature

5、每台机器的进程平均运行时间

sql 复制代码
# Write your MySQL query statement below
SELECT
    machine_id, round(sum(if(activity_type = 'start', -timestamp, timestamp)) / count(*)*2, 3) as processing_time
FROM 
    Activity
GROUP BY
    machine_id

6、员工奖金

sql 复制代码
# Write your MySQL query statement below
SELECT
    e.name, b.bonus
FROM 
    Employee e
LEFT JOIN
    Bonus b
ON
    e.empId = b.empId
WHERE
    b.bonus is NULL OR b.bonus < 1000

7、学生们参加各科测试的次数

sql 复制代码
SELECT 
    s.student_id, s.student_name, sub.subject_name, IFNULL(grouped.attended_exams, 0) AS attended_exams
FROM 
    Students s
CROSS JOIN 
    Subjects sub
LEFT JOIN (
    SELECT student_id, subject_name, COUNT(*) AS attended_exams
    FROM Examinations
    GROUP BY student_id, subject_name
) grouped 
ON s.student_id = grouped.student_id AND sub.subject_name = grouped.subject_name
ORDER BY s.student_id, sub.subject_name;

8、至少有5名直接下属的经理

sql 复制代码
# Write your MySQL query statement below
SELECT 
    b.name
FROM 
    Employee a
LEFT JOIN
    Employee b
ON 
    a.managerId = b.id
GROUP BY
    a.managerId
HAVING 
    COUNT(b.id)>=5  

9、确认率

sql 复制代码
# Write your MySQL query statement below
SELECT
    T1.user_id,round(count(if(T2.action = "confirmed",true,null)) / count(*),2) AS confirmation_rate
FROM
    Signups as T1 
JOIN 
    confirmations AS T2
ON 
    T1.user_id = T2.user_id
GROUP BY
    T1.user_id;
相关推荐
2401_897190553 分钟前
宝塔面板SSH提示连接被拒绝_检查服务器端口开关
jvm·数据库·python
2401_871696523 分钟前
MySQL无法通过网络连接服务器_检查bind-address与访问权限
jvm·数据库·python
2401_887724505 分钟前
SQL注入的安全架构设计_将数据库置于内网隔离区
jvm·数据库·python
m0_678485456 分钟前
如何配置文件描述符限制_limits.conf中Oracle用户配置
jvm·数据库·python
我科绝伦(Huanhuan Zhou)7 分钟前
Oracle BBED 工具部署全流程:Linux 64位环境实操指南
linux·数据库·oracle
2401_835956818 分钟前
HTML5中Canvas局部刷新区域重绘的算法优化
jvm·数据库·python
marsh020610 分钟前
34 openclaw事件溯源:实现可追溯的业务流程
数据库·ai·编程·技术
coderlin_10 分钟前
LangGraph项目二 同步数据仓库信息到元数据库并且建立向量索引
数据库·数据仓库
weixin_4087177711 分钟前
如何导入带系统变量修改的SQL_确保SUPER权限并规避只读变量报错
jvm·数据库·python
m0_6784854513 分钟前
c++怎么编写多线程安全的跨平台文件日志库_无锁队列与异步IO【附源码】
jvm·数据库·python