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;
相关推荐
HackTwoHub4 小时前
AI大模型网关存在SQL注入、附 POC 复现、影响版本LiteLLM 1.81.16~1.83.7(CVE-2026-42208)
数据库·人工智能·sql·网络安全·系统安全·网络攻击模型·安全架构
l1t4 小时前
DeepSeek总结的DuckLake构建基于 SQL 原生表格式的下一代数据湖仓
数据库·sql
KmSH8umpK4 小时前
Redis分布式锁从原生手写到Redisson高阶落地,附线上死锁复盘优化方案进阶第八篇
数据库·redis·分布式
TDengine (老段)4 小时前
从施工监测到运营预警,桥科院用 TDengine 提升桥梁数据管理能力
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
S1998_1997111609•X6 小时前
论mysql国盾shell-sfa犯罪行为集团下的分项工程及反向注入原理尐深度纳米算法下的鐌檵鄐鉎行为
网络·数据库·网络协议·百度·开闭原则
KmSH8umpK6 小时前
Redis分布式锁从原生手写到Redisson高阶落地,附线上死锁复盘优化方案进阶第七篇
数据库·redis·分布式
yaodong5187 小时前
不会Python也能数据分析:Gemini 3.1 Pro解决办公问题的SQL自动生成
python·sql·数据分析
BU摆烂会噶7 小时前
【LangGraph】持久化实现的三大能力——时间旅行
数据库·人工智能·python·postgresql·langchain
l1t8 小时前
DeepSeek总结的DuckLake 入门
数据库
Joseph Cooper8 小时前
RAG 与 AI Agent:智能体真的需要检索增强生成吗?
数据库·人工智能·ai·agent·rag·上下文工程