正确使用join语句

正确使用join语句

常见的SQL语句类型有这么几种,DDL(数据定义语言),TPL(事务处理语言),DCL(数据控制语言),DML(数据操作语言),DML就是我们常说的增删改查。由架构通过对象生成的数据库语句往往比较低效,而正确使用SQL可以减少数据库服务器的负载,增加服务器稳定性,减少服务器间通讯的流量等(带宽成本很大)。这里我们主要讲一下join语句。
join从句可以分为5种:内连接(inner),全外连接(full outer),左外连接(left outer),右外连接(right outer),交叉连接(cross)

内连接

举这样一个例子,假设有两张表A和B,一张表存放者你的家庭成员和你自己,另一张表存放你的工作同事和你自己,他们都有一个user_name字段存放名字和一个position字段存放在群体中的位置。
内连接Inner join基于连接谓词将两张表(如A和B)的列组合在一起,产生新的结果表,找出两个表的公共部分(交集)

   select a.'user_name',a.'position',b.'position'
   from user1 a 
   inner join user2 b
   on a.'user_name' = b.'user_name' 

使用user_name作为连接谓词,执行完之后会发现新生成的表只有你的user_name和你在两个群体中position,找出了公共部分

左外连接

如果我们想查询家人表中是否有同事,即从左表中找出右表中有的数据,就可以使用左外连接

   select a.'user_name', a.'position', b.'position'
   from user1 a
   left join user2 b
   on a.'user_name' = b.'user_name'
   where b.'user_name' is null

执行之后,这里如果没有使用where筛选,我们会发现左表中的数据全部被保留,筛选出的家庭成员表的第二个position字段就会为空。如果我们想过滤掉这些没有筛选成功的数据,就可以使用where

右外连接

使用right join和left join正好相反,一样要如果想过滤的话,可以使用where

全外连接

   select a.'user_name', a.'position', b.'position'
   from user1 a
   full join user2 b
   on a.'user_name' = b.'user_name'

我们发现报错了,我们查阅文档会发现SQL并不支持full join。那我们要怎么实现左连接和右连接的合集呢?
可以通过union all

   select a.'user_name', a.'position', b.'position'
   from user1 a
   left join user2 b
   on a.'user_name' = b.'user_name'
   union all 
   //注意这里是b,右连接如果继续使用a有可能出现空值
   select b.'user_name', a.'position', b.'position'
   from user1 a
   right join user2 b
   on a.'user_name' = b.'user_name'

交叉连接

交叉连接(cross join),又成为笛卡尔连接。如果A和B是两个集合,它们的交叉连接就记为A x B

   select a.'user_name', a.'position', b.'position'
   from user1 a 
   cross join user2 b

这里没有连接谓词on

与join相关的SQL技巧

如何更新使用过滤条件中包括自身的表。如在这个例子中,把同时存在在表a和表b中的position更新为’top’

   update user1
   set position = 'top'
   where user1.'user_name' in (
       //结果集中
       select a.'user_name',a.'position',b.'position'
       from user1 a 
       inner join user2 b
       on a.'user_name' = b.'user_name' 
   )

在mysql会发现报错了,那么我们可以通过这样的方式

   update user1 a inner join user2 b on a.user_name = b.user_name 
   set a.position = 'top';
### 回答1: MySQL的JOIN语句用于将两个或多个表中的数据行连接起来,生成一个结果集。JOIN语句的基本语法如下: SELECT 列名1, 列名2, ... FROM 表名1 JOIN 表名2 ON 连接条件 其中,列名是要查询的字段名称,表名是要连接的表名称,连接条件是连接两个表的条件,可以使用“=”、“<”、“>”、“<=”、“>=”等运算符进行比较。 JOIN语句可以使用不同的连接类型,包括INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL OUTER JOIN等。INNER JOIN是最常用的连接类型,它只返回两个表中匹配的行。 例如,如果有两个表A和B,它们有一个共同的字段id,那么可以使用INNER JOIN将它们连接起来: SELECT A.id, A.name, B.address FROM A INNER JOIN B ON A.id = B.id; 这个查询语句将返回表A和表B中id字段相等的行,并且返回A表的name字段和B表的address字段。 除了INNER JOIN之外,还可以使用LEFT JOIN和RIGHT JOIN等连接类型。LEFT JOIN返回左表中所有的行和右表中匹配的行,如果右表中没有匹配的行,则返回NULL值;RIGHT JOIN则返回右表中所有的行和左表中匹配的行,如果左表中没有匹配的行,则返回NULL值。 注意,在使用JOIN语句时,需要确保连接条件正确,否则可能会返回错误的结果。 ### 回答2: MySQL的JOIN语句用于从多个表中检索数据,并根据指定的关联条件将它们连接在一起。JOIN操作可以按需从表中选取相应的字段组合成新的结果集。 JOIN语句的基本语法如下: SELECT 对应字段 FROM 表1 JOIN 表2 ON 条件; JOIN语句中的关键字有INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL OUTER JOIN。这些关键字决定了连接类型。 1. INNER JOIN(内连接):返回两个表中的匹配记录。 语法:SELECT 对应字段 FROM 表1 INNER JOIN 表2 ON 条件; 2. LEFT JOIN(左连接):返回左表中的所有记录以及右表中匹配的记录。 语法:SELECT 对应字段 FROM 表1 LEFT JOIN 表2 ON 条件; 3. RIGHT JOIN(右连接):返回右表中的所有记录以及左表中匹配的记录。 语法:SELECT 对应字段 FROM 表1 RIGHT JOIN 表2 ON 条件; 4. FULL OUTER JOIN(全外连接):返回左右表中的所有记录。 语法:SELECT 对应字段 FROM 表1 FULL OUTER JOIN 表2 ON 条件; 在条件(ON 子句)中,可以使用等于(=)、大于(>)、小于(<)、不等于(<>)等操作符进行比较,还可以使用AND和OR逻辑运算符组合多个条件。 表1和表2之间的连接条件可以是简单的列名比较,也可以是复杂的条件表达式。JOIN语句还可以连接多个表,在FROM子句中通过逗号分隔表名,并按照连接顺序指定JOIN关键字和条件。 JOIN语句使用可以根据具体的需求确定,通过合理使用连接类型和连接条件可以灵活处理各种数据关联需求,实现数据的表之间的联接。 ### 回答3: MySQL中的JOIN语句用于将两个或多个表中的行连接在一起,以便可以根据它们之间的关系检索相关数据。JOIN语句通过共享数据列将表连接在一起,以便在查询结果中能够使用关联的数据。 常见的JOIN类型包括: 1. INNER JOIN:表示只返回两个表中匹配的行,即两个表中连接列的值相等的行。 2. LEFT JOIN:返回左表中的所有行,并包括与右表中匹配的行。如果右表中没有匹配的行,则返回NULL值。 3. RIGHT JOIN:与LEFT JOIN相反,返回右表中的所有行,并包括与左表中匹配的行。如果左表中没有匹配的行,则返回NULL值。 4. FULL OUTER JOIN:返回两个表中的所有行,如果没有匹配的行,则返回NULL值。 JOIN语句的基本语法如下: SELECT 列名 FROM 表1 JOIN 表2 ON 表1.列 = 表2.列; 例如,假设有两个表students和grades,students表包含学生的ID、姓名和年龄,grades表包含学生的ID和考试成绩。要找出每个学生的姓名和考试成绩,可以使用以下SQL查询: SELECT students.姓名, grades.考试成绩 FROM students JOIN grades ON students.ID = grades.ID; 这将返回一个结果集,其中包含每个学生的姓名和对应的考试成绩。 需要注意的是,为了避免数据冗余和提高查询性能,JOIN操作应该尽量避免表之间的重复数据,确保连接列上有正确的索引,并使用适当的JOIN类型来满足查询需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值