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;
相关推荐
会编程的林俊杰18 分钟前
MySQL中的锁有哪些
数据库·mysql
cts61820 分钟前
Milvus分布式数据库工作职责
数据库·分布式·milvus
周胡杰20 分钟前
鸿蒙加载预置数据库-关系型数据库-如何读取本地/预制数据库
数据库·华为·harmonyos·鸿蒙
布朗克16824 分钟前
java常见的jvm内存分析工具
java·jvm·数据库
胡八一31 分钟前
SQLite / LiteDB 单文件数据库为何“清空表后仍占几 GB”?——原理解析与空间回收实战
jvm·数据库·sqlite
2401_831501732 小时前
Linux之Zabbix分布式监控篇(二)
数据库·分布式·zabbix
秋林辉3 小时前
Jfinal+SQLite处理 sqlite数据库执行FIND_IN_SET报错
jvm·数据库·sqlite
巴里巴气6 小时前
MongoDB复杂查询 聚合框架
数据库·mongodb
scheduleTTe9 小时前
SQL增查
数据库·sql
浮生带你学Java9 小时前
2025Java面试题及答案整理( 2025年 7 月最新版,持续更新)
java·开发语言·数据库·面试·职场和发展