SQL中的右连接体会多对一、全连接、笛卡尔积连接

在这里插入图片描述

问题如下,解释这一行SQL语句


"RIGHT JOIN %s ON %s.%s=%s.%s "

一、 RIGHT JOIN 语法解释
  1. RIGHT JOIN 是 SQL 中的一种连接操作,它与 LEFT JOIN 相对。RIGHT JOIN 会返回右表(即 RIGHT JOIN 关键字右边的表,上述代码未指明左边的表)中的所有行,即使在左表(RIGHT JOIN 关键字左边的表)中没有匹配的行。对于左表中没有匹配的行,结果集中对应的列会被填充为 NULL
  2. RIGHT JOIN %s ON %s.%s=%s.%s 是一个 SQL 语句模板,其中 %s 是占位符,在 Java 里常使用 String.format 方法来填充这些占位符。
  3. RIGHT JOIN %s:指定要连接的右表,%s 会被替换为实际的表名。
  4. ON %s.%s=%s.%s:指定连接条件,ON 关键字后跟着一个条件表达式,用于明确如何将左表和右表的行进行匹配。四个 %s 分别会被替换成左表名左表中的列名右表名右表中的列名。连接条件一般是两个表中具有相同含义的列,通过比较这些列的值来确定哪些行应该组合在一起。

二、例子

假设存在两个表:orders(订单表)和 customers(客户表),它们之间是多对一的关系,即多个订单可以属于同一个客户。

订单表(orders

order_idorder_amountcustomer_id
1200101
2300102
3150101

客户表(customers

customer_idcustomer_name
101客户 A
102客户 B
103客户 C

使用Java,构造对应的 SQL 语句:

String leftTable = "orders";
String rightTable = "customers";
String join = String.format("RIGHT JOIN %s ON %s.%s=%s.%s ", rightTable, leftTable, "customer_id", rightTable, "customer_id");
// 这里假设将占位符填充后的完整 SQL 查询语句
String sql = "SELECT * FROM " + leftTable + " " + join;

生成的 SQL 语句如下:

SELECT * FROM orders RIGHT JOIN customers ON orders.customer_id = customers.customer_id;
三、 结果
order_idorder_amountcustomer_id (from orders)customer_id (from customers)customer_name
1200101101客户 A
3150101101客户 A
2300102102客户 B
NULLNULLNULL103客户 C

从结果可以看出,即使客户 C 没有对应的订单,他仍然出现在结果集中,订单信息部分显示为 NULL。这就是 RIGHT JOIN 的作用,保证右表中的所有行都被包含在结果集中。

四、总结

右连接,主要照顾右表的数据。从查询的结果表来看,右表冗余的数据,结果表保持存在,剩余左表字段为空;左表冗余的数据,在结果表直接删除。

在实际应用中,RIGHT JOIN 有时可以用 LEFT JOIN 替代,只需交换表的顺序即可,这两条查询语句的结是相同,例如上面的查询可以用 LEFT JOIN 改写为:

SELECT * FROM customers LEFT JOIN orders ON customers.customer_id = orders.customer_id;
五、补充全连接和笛卡尔积连接
全连接:

对于上述例子,我们使用如下SQL语句

SELECT * FROM orders FULL JOIN customers ON orders.customer_id = customers.customer_id;

查询结果如下

order_idorder_amountcustomer_id (from orders)customer_id (from customers)customer_name
1200101101客户 A
3150101101客户 A
2300102102客户 B
NULLNULLNULL103客户 C

并非所有数据库都支持 FULL JOIN 语法,例如 MySQL 不直接支持 FULL JOIN,但可通过 UNION 操作将 LEFT JOINRIGHT JOIN 的结果合并来实现类似效果:

SELECT * FROM orders 
JOIN customers
ON orders.customer_id = customers.customer_id 
UNION 
SELECT * FROM orders RIGHT 
JOIN customers
ON orders.customer_id = customers.customer_id;
笛卡尔积连接(并集):

对于上述例子,我们使用如下SQL语句

SELECT * FROM orders CROSS JOIN customers;

查询结果如下,结果将包含 3 * 3 = 9 行,每一行都是 orders 表中的一行和 customers 表中的一行的组合

order_idorder_amountcustomer_id (from orders)customer_id (from customers)customer_name
1200101101客户 A
1200101102客户 B
1200101103客户 C
2300102101客户 A
2300102102客户 B
2300102103客户 C
3150101101客户 A
3150101102客户 B
3150101103客户 C
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值