sql join

sql 复制代码
-- 创建事实表
CREATE TABLE product_facts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    product_name VARCHAR(255),
    price DECIMAL(10, 2)
);

-- 插入数据
INSERT INTO product_facts (product_name, price) VALUES ('Product A', 100.00);
INSERT INTO product_facts (product_name, price) VALUES ('Product B', 150.50);
INSERT INTO product_facts (product_name, price) VALUES ('Product C', 200.25);
INSERT INTO product_facts (product_name, price) VALUES ('Product D', 75.80);
INSERT INTO product_facts (product_name, price) VALUES ('Product E', 300.00);

-- 创建产品维度表
CREATE TABLE product_dimension (
    product_name VARCHAR(255) PRIMARY KEY,
    product_attribute VARCHAR(255),
    product_source VARCHAR(255)
);

-- 插入数据
INSERT INTO product_dimension (product_name, product_attribute, product_source) 
VALUES ('Product A', 'Attribute 1', 'Source 1');
INSERT INTO product_dimension (product_name, product_attribute, product_source) 
VALUES ('Product B', 'Attribute 2', 'Source 2');
INSERT INTO product_dimension (product_name, product_attribute, product_source) 
VALUES ('Product C', 'Attribute 3', 'Source 3');
INSERT INTO product_dimension (product_name, product_attribute, product_source) 
VALUES ('Product F', 'Attribute 6', 'Source 6');
  • product_facts

  • product_dimension

  • inner join

sql 复制代码
SELECT * from product_facts t1 inner join product_dimension t2 on t1.product_name=t2.product_name;
  • left join
sql 复制代码
SELECT * from product_facts t1 left join product_dimension t2 on t1.product_name=t2.product_name;
  • right join
sql 复制代码
SELECT * from product_facts t1 RIGHT join product_dimension t2 on t1.product_name=t2.product_name;
  • full join
sql 复制代码
SELECT * from product_facts t1 FULL JOIN product_dimension t2 on t1.product_name=t2.product_name;

--在MySQL中,没有FULL JOIN关键字,而是使用LEFT JOIN和RIGHT JOIN的组合来模拟FULL JOIN
SELECT * 
FROM product_facts t1 
LEFT JOIN product_dimension t2 ON t1.product_name = t2.product_name
UNION
SELECT * 
FROM product_facts t1 
RIGHT JOIN product_dimension t2 ON t1.product_name = t2.product_name;
  • 使用LEFT SEMI JOIN时,通常是为了获取左表中存在于右表的数据,但不需要右表的数据
sql 复制代码
--MySQL
SELECT
	t1.* 
FROM
	product_facts t1
	LEFT JOIN product_dimension t2 ON t1.product_name = t2.product_name 
WHERE
	t2.product_name IS NOT NULL;

-- 子查询中的EXISTS子句会检查表B中是否存在与表A中的行相匹配的数据。如果存在匹配的数据,那么这些行就会被包含在结果集中。
SELECT *
FROM product_facts t1
WHERE EXISTS (
    SELECT 1
    FROM product_dimension t2
    WHERE t1.product_name = t2.product_name 
);

-- hive sql
-- 这个查询使用LEFT SEMI JOIN从表A中选择那些在表B中存在匹配的行的数据。LEFT SEMI JOIN只返回左表中存在于右表的行,而不返回右表的数据。
SELECT A.*
FROM table_a A
LEFT SEMI JOIN table_b B ON A.column = B.column;
相关推荐
计算机毕设VX:Fegn08953 小时前
计算机毕业设计|基于springboot + vue医院设备管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
Mr__Miss3 小时前
保持redis和数据库一致性(双写一致性)
数据库·redis·spring
Knight_AL4 小时前
Spring 事务传播行为 + 事务失效原因 + 传播行为为什么不用其他模式
数据库·sql·spring
倔强的石头_4 小时前
时序数据时代的“存储与分析困局”解析及金仓解决方案
数据库
计算机毕设VX:Fegn08954 小时前
计算机毕业设计|基于springboot + vue小型房屋租赁系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
倔强的石头_5 小时前
场景化落地指南——金仓时序数据库在关键行业的应用实践
数据库
SelectDB5 小时前
驾驭 CPU 与编译器:Apache Doris 实现极致性能的底层逻辑
运维·数据库·apache
zbguolei5 小时前
MySQL根据身份证号码计算出生日期和年龄
数据库·mysql
马克学长6 小时前
SSM校园图书借阅服务系统jd2z8(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·图书管理系统·ssm 框架·ssm 校园图书借阅系统
软件派6 小时前
高斯数据库使用心得——从性能优化到行业实践的深度解析
数据库·oracle