高频 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;
相关推荐
倔强的石头_1 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
云技纵横1 天前
唯一索引 INSERT 死锁实战:5 秒复现交叉插入的 S 锁循环等待
sql·mysql
冬奇Lab2 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
ClouGence2 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
无响应de神2 天前
三、用户与权限管理
数据库·mysql
麦聪聊数据3 天前
数据服务化时代:企业数据能力输出的核心路径
数据库
shushangyun_3 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
DARLING Zero two♡3 天前
【MySQL数据库】数据类型与表约束
数据库·mysql
曹牧3 天前
Oracle EXPLAIN PLAN
数据库·oracle
BD_Marathon3 天前
SQL学习指南——视图
数据库·sql