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;
相关推荐
小白银子1 分钟前
零基础从头教学Linux(Day 60)
linux·数据库·mysql·oracle
瀚高PG实验室21 分钟前
数据库安全配置指导
服务器·数据库·瀚高数据库
憋问我,我也不会24 分钟前
MYSQL 命令
数据库·mysql
驾数者1 小时前
Flink SQL入门指南:从零开始搭建流处理应用
大数据·sql·flink
24K老游1 小时前
postgres15 flink cdc同步测试
数据库
无泡汽水2 小时前
MySQL入门练习50题
数据库·mysql
JIngJaneIL2 小时前
助农惠农服务平台|助农服务系统|基于SprinBoot+vue的助农服务系统(源码+数据库+文档)
java·前端·数据库·vue.js·论文·毕设·助农惠农服务平台
云外天ノ☼2 小时前
待办事项全栈实现:Vue3 + Node.js (Koa) + MySQL深度整合,构建生产级任务管理系统的技术实践
前端·数据库·vue.js·mysql·vue3·koa·jwt认证
小光学长3 小时前
基于Vue的智慧楼宇报修平台设计与实现066z15wb(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库·vue.js
CodeBlossom3 小时前
Spring Cache快速入门
java·数据库·spring