Join语句

      

       一、Join语句几种方式

 

       1.内连接(INNER)

 

SELECT a.username,a.over,b.over
FROM user1 a
INNER JOIN user2 b
ON a.username = b.username;

 

 

          查询结果:a、b两表的公共数据

         

        2.左外连接(LEFT OUTER)

 

SELECT a.username,a.over,b.over
FROM user1 a
LEFT JOIN user2 b
ON a.username = b.username
WHERE b.username IS NOT NULL;

 

 

             查询结果:a表的所有数据 

 

         3.右外连接(RIGHT OUTER )

 

SELECT b.username,b.over,a.over
FROM user1 a
RIGHT JOIN user2 b
ON a.username = b.username
WHERE a.username IS NULL;

 

 

 

              查询结果:b表的所有数据 - ab两个表的公共数据

 

         4.全外连接(FULL OUTER)

 

SELECT a.username,a.over,b.over
FROM user1 a
FULL JOIN user2 b
ON a.username = b.username
WHERE a.username IS NULL OR b.username IS NULL;

 

  

                MySQL中不支持FULL OUTER JOIN 连接,故上面查询会出现错误

    

                   

SELECT a.username,a.over,b.over
FROM user1 a
LEFT JOIN user2 b  ON a.username = b.username
UNION  ALL
SELECT b.username,b.over,a.over
FROM user1 a
RIGHT JOIN user2 b  ON a.username = b.username
WHERE a.username IS NULL OR b.username IS NULL;

  

               查询结果:a,b表的所有数据 - a,b表的公共数据

 

          5.交叉连接(CROSS)或笛卡尔连接(cartesian)或叉乘(Product)

                   

SELECT a.username,a.over,b.over
FROM user1 a
CROSS JOIN user2 b
ON a.username = b.username

                 

                    一般要避免使用此查询

 

 

               

            二、Join语句的使用

               

             1.使用join更新表

                    

UPDATE  user1
SET over = '齐天大圣'
WHERE user1.username IN(
   SELECT b.username
   FROM user1 a  
   JOIN user2 b 
   ON a.username = b.username
);

  

                  MySQL不支持UPDATE操作,故上面更新操作会出现错误

                

                      

UPDATE user1  a   JOIN (
   SELECT b.username    
   FROM user1 a  JOIN user2 b  
   ON a.username = b.username
   ) b    ON  a.username = b.username
SET  a.over='齐天大圣';

                    

                    更新结果:将over字段的数据更新为‘齐天大圣’

 

              2.使用join优化子查询

                      

SELECT a.username,a.over,
(
   SELECT over FROM user2 b
   WHERE  a.username = b.username
   ) AS  over2  
 FROM user1 a;

               

                       查询结果:对a表中的每一条数据都进行子查询,很慢

                    

                  优化后:

                          

SELECT a.username,a.over,b.over  AS over2
FROM user1 a
LEFT JOIN user2 b  ON 
a.username = b.username

                         

                         优化后和优化前结果相同则为有效优化

                         查询结果:对a表中的每一条数据都进行子查询,较快

            

                 3.使用join优化聚合子查询

                         

SELECT a.username,b.timestr,b.kills
FROM user1 a  JOIN userkills b
ON a.id = b.userid
WHERE b.kills = (
   SELECT MAX(c.kills)
   FROM userkills c   WHERE c.userid = b.userid
);

                        

                          查询结果:各个username打怪(kills)最多的日期

 

                     避免子查询:

                               

SELECT a.username,b.timestr,b.kills
FROM user1 a
JOIN userkills b ON a.id = b.userid
JOIN userkills c ON c.userid = b.userid
GROUP BY a.username,b.timestr,b.kills
HAVING b.kills = MAX(c.kills);      

 

 

 

 

 

 

 

 

### SQL JOIN 语句概述 SQL `JOIN` 语句用于根据两个或多个表中的列之间的关系组合来自不同表格的数据。常见的 `JOIN` 类型有四种:INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL OUTER JOIN。 ### INNER JOIN 示例与解释 当需要获取两个表中满足连接条件的匹配记录时,可以使用 `INNER JOIN`: ```sql SELECT orders.order_id, customers.customer_name FROM orders INNER JOIN customers ON orders.customer_id = customers.customer_id; ``` 此查询返回订单表和客户表中存在关联的所有订单及其对应的客户名称[^2]。 ### LEFT JOIN 示例与解释 如果希望即使右侧表没有匹配项也保留左侧表的所有记录,则应采用 `LEFT JOIN`: ```sql SELECT employees.name AS employee_name, departments.name AS department_name FROM employees LEFT JOIN departments ON employees.department_id = departments.id; ``` 这段代码会列出所有员工的名字以及他们所属部门的信息;如果有员工未分配至任何部门,则该字段显示为空值(NULL)[^1]。 ### RIGHT JOIN 示例与解释 为了确保右边表内的全部数据都能被展示出来而不管左边是否有对应条目,可以选择 `RIGHT JOIN` : ```sql SELECT * FROM Table1 t1 RIGHT OUTER JOIN Table2 t2 ON t1.Col1 = t2.Col1 WHERE t1.Col1 IS NULL; ``` 上述命令用来找出仅存在于Table2但不在Table1里的那些行[^3]。 ### FULL OUTER JOIN 示例与解释 最后一种情况是想要得到两张表所有的记录集合——无论它们之间是否存在交集部分,这时就需要运用到 `FULL OUTER JOIN` 。不过需要注意的是,并不是所有的数据库都支持这种类型的联接操作。 ```sql SELECT * FROM tableA a FULL OUTER JOIN tableB b ON a.common_field = b.common_field; ``` 这条指令将会把tableA和tableB里所有的记录都提取出来并按照指定的关键字进行配对,对于找不到匹配的对象则填充NULL作为占位符。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值