MYSQL之join语句使用

SQL语句类型:

DDL数据定义语言 create alter负责数据结构定义与数据库对象定义
TPL 事务处理语言 确保被DML语句影响的表和行得以及时更新,包括开始事务、提交事务、回滚
DCL 数据控制语言 用来设置数据库用户或角色权限,包括GRANT,DENY,REMOVE
DML 数据操作语言 增删改查

/*用到的表*/
DROP TABLE IF EXISTS `friends`;/*悟空朋友表*/
CREATE TABLE `friends` (
  `id` int(3) NOT NULL,/*sql server中不能指定int长度*/
  `user_name` varchar(30) default NULL,
  `type` varchar(30) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `friends` VALUES ('1', '孙悟空', 'friends');
INSERT INTO `friends` VALUES ('2', '牛魔王', 'friends');
INSERT INTO `friends` VALUES ('3', '蛟魔王', 'friends');
INSERT INTO `friends` VALUES ('4', '鹏魔王', 'friends');
INSERT INTO `friends` VALUES ('5', '狮驼王', 'friends');

DROP TABLE IF EXISTS `qujing`;/*取经表*/
CREATE TABLE `qujing` (
  `id` int(3) NOT NULL,
  `user_name` varchar(30) default NULL,
  `type` varchar(30) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `qujing` VALUES ('1', '唐僧', 'qujing');
INSERT INTO `qujing` VALUES ('2', '猪八戒', 'qujing');
INSERT INTO `qujing` VALUES ('3', '孙悟空', 'qujing');
INSERT INTO `qujing` VALUES ('4', '沙僧', 'qujing');

如何使用Join语句
分为5种:内连接(INNER)、全外连接(FULL OUTER)、左外连接(LEFT OUTER)、右外连接(RIGHT OUTER)、交叉连接(CROSS)

内连接:就是抽取两张表的公共部分。

这里写图片描述

select  a.id,b.user_name
from four_team  a,friends_wikong b
where a.user_name=b.user_name;

注意inner join与非join的区别

select a.user_name,b.id
from friends a
inner join qujing b
on a.user_name=b.user_name;

select a.id,b.user_name
from friends a,qujing b
where a.user_name=b.user_name;

外连接之左外连接:
包含左表中的所有数据,当某个连接维持不在右表中时,新生成的表的右表字段为null,对左表数据的信息进行拓展,增加右表中的字段,当某个连接谓词不在右表中时,新生成的表的右表字段为null

这里写图片描述

left join 以左表为基础查询。

select *
from qujing a
left join friends b
on a.user_name=b.user_name   
//左外连接,包含左表全部信息,当满足条件时显示右表的信息

where b.user_name is null;   //not in关键字不会使用索引,所以用left join
加上关键字null查找只存在A表而不存在B表的数据

查询时左表中的内容为基准,可以查询左表中特有的数据,例如:查询出民族表中民族名为空的学生的姓名、民族;

select a.name,b.nation  from student a left join nation b on 
a.nation_id=b.id where b.nation is null;

left outer join:包含左表中的所有数据,当某个连接谓词不在右表中时,新生成的表的右表字段为null。做坐标数据的信息进行拓展,增加右表中的字段,当某个连接谓词不在右表时,新生成的表deep右表字段为null

使用left outer join对not in进行优化

select select_expressions
from table a left outer join table b on A.key=B.key
where B.key is null;

表A中不包含表B中的数据。

select select_expression
from table A left outer join table B on A.key=B.key
where B.key is not null;

表A与表B的交集,相当于Inner join

右外连接:
作用与left join相似,但是以右表为基准,包括右表的全部信息

这里写图片描述

全连接
full join 全连接,可以查出A表和B表的数据集,如果连接谓词在A表中没有找到对应数据,则A表的字段用NULL填充,反之B也一样
除此之外full join可以用来查询两个表交集之外的所有数据,相应的会有很多字段为NULL

这里写图片描述

重点:Full join是left outer join与right outer join的合集,显示出两张表中的所有数据,当一张表的连接谓词无法满足时,则另一张表的字段在该表中为null。

注意:MYSQL不支持full join
解决方法:通过union将做连接和右连接的结果合并
例:

select  select_expressions
  from table A left outer join table B on A.key=B.key
union all
select  select_expressions
from table A right outer join table B on A.key=B.key;

union会自动删除重复项,刷选出来部分字段的时候要注意了,如果刷选出来得两个字段的值完全相同就会剩下一个。
union all和union不同之处在于union all 会将左右两个查询的结果的所有的资料都列出来,无论资料值有无重复。

交叉连接:
cross join,笛卡尔连接,如果A和B是两个集合,它们的交叉连接就记为A X B。一个表的每个记录与另一个表的所有记录进行连接,形成A.length*B.length个数据项的表。(无需提供ON)

select a.user_name,a.over,b.user_name,b.over
from user1  a
cross  join user2  b

注意:在实际的使用中,要尽量避免产生笛卡尔积的查询,因为很少情况我们会使用到笛卡尔积的查询结果,但是在一些特定的情况下,我们需要笛卡尔积查询我们需要的结果。

使用join更新表:
问题1:如何更新from中的表
/更新过滤条件包含自身的表(在这里是更新两个表都存在的用户‘孙悟空’)/

使用jpin的方式进行联合更新

update  user1
set  over=’齐天大圣’
where  user1.user_name in(
select  b.user_name
from  user1  a  inner  join user2  b  on
a.user_name=b.user_name);  报错,mysql报错,而在sql和oracle中通过

以下代码在mysql通过运行

update  user1  a  join(
select  b.user_name
from  user1  a   join user2  b  on
a.user_name=b.user_name)  b  on  a.user_name=b.user_name set
a.over=’齐天大圣’;
update user1 a inner join user2 b on a.user_name = b.user_name 
set a.over='齐天大圣';

用join优化子查询:
一般子程序写法数据小时,没有多大的影响,如果数据量大,则要消耗大量的查询

优化前:

select  a.user_name,a.over,(select  over from user2  b  where  
a.user_name=b.user_name)  as  over2  from  user1  a;

如果这两张表的记录相当多,那么这个子查询相当于对A标的每一条记录都要进行一次子查询

优化后:

select  a.user_name,a.over,b.over   as  over2
from user1 a
left  join  user2  b  on
a.user_name=b.user_name;

select查询字段中包含子查询,就相当于查询出的每条数据都和子查询字段结合,效率低。
优化方法是用left join将子查询表放右侧,取代掉子查询。

使用join优化聚合查询

问题:如何查询出四人组中打怪最多的日期?

select a.user_name,b.timestr,b.kills
from user1  a  join  user_kills  b
on  a.id=b.user_id
where b.kills=(select max(c.kills) from  user_kills c where  c.user_id=b.user_id)
select * from killscount b join tangtang a on b.user_id = a.id 
order by kills DESC 
select a.user_name,b.timestr,max(b.kills) from tangtang a join killscount b 
on a.id = b.user_id  group by  a.user_name,b.timestr;

优化后的结果:(避免子查询的方式)

select a.user_name,b.timestr,b.kills 
from user1 a 
join user_kills b on a.id = b.user_id 
join user_kills c on c.user_id = b.user_id
GROUP BY a.user_name,b.timestr,b.kills
HAVING b.kills = max(c.kills);

参考视频:http://www.imooc.com/learn/398

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MySQLJOIN语句用于将两个或多个表中的数据行连接起来,生成一个结果集。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: MySQLJOIN语句用于从多个表中检索数据,并根据指定的关联条件将它们连接在一起。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、付费专栏及课程。

余额充值