您现在的位置是:首页 >技术交流 >MySQL查询——joininunion网站首页技术交流

MySQL查询——joininunion

将船买酒白云边 2024-06-17 11:26:41
简介MySQL查询——joininunion

认识MySQL数据库的多表查询,在对大量数据进行查询时仅仅使用一些基本的SQL语句已经无法满足我们日益增长的需求,如果要对多表进行查询就不得不认识以下几种方法,常见的查询方法是使用笛卡尔积,相信学过数据库的小伙伴肯定听过这个专业名词,那么数据库中的笛卡尔积是什么?

笛卡尔积:对于一个或多个表进行排列组合得到的一张新的表。

意思就是如果有两张表:

tb_1

idnameclass_id
1张三1
2李四2

tb_2

class_idclass
12023班
22022班

两个表的笛卡尔积:

idnameclass_ididclass
1张三112023班
1张三122022班
2李四212023班
2李四222022班

根据上面的例子可以看出其实两个表的笛卡尔积就是tb_1xtb_2,两个表相乘得到的结果。

SQL语法也比较简单:

#上面例子的语句
SELECT * FROM tb_1,tb_2;
#笛卡尔积语句格式
SELECT column1, column2, ... FROM  table1(1),table2(表2;

查询数据时的步骤:

① 提取出题目中关键信息并找到对应的表

② 对表进行计算笛卡尔积

③ 对表中数据进行筛选

连接查询——join

  1. 内连接join语法格式如下:
SELECT column1, column2, ... FROM table1 join table2
#添加条件时使用on连接
SELECT column1, column2, ... FROM table1 join table2 on (条件1) 

选择你需要查询的列名,当然也可以是*(全部数据),后面使用on连接表示两个表之间数据关联的条件。

例如上面的两个表,查询学生的姓名和班级:

select name,class from tb_1 join tb_2 on tb_1.class_id=tb_2.id;

解读:将需要查询的条件从两个表之间获取,然后使用连接查询,将两个表连接然后使用id这个筛选条件将属于张三的班级id和每个班级对应的id进行匹配。

在这里插入图片描述

  1. 外连接left joinright join语法格式和内连接一样:
SELECT column1, column2, ... FROM table1 [left | right] join table2
#添加条件时使用on连接
SELECT column1, column2, ... FROM table1 [left | right]join table2 on (条件1) 

使用left join时只会针对左表进行查询。如果右表有一个数据,左表并没有,就不会显示在结果中。反之。使用right join也是如此。

比如将上面的tb_1修改一下(将李四的班级id修改为3):

idnameclass_id
1张三1
2李四3

此时使用查询学生的班级和姓名其结果:

select name,class from tb_1 left join tb_2 on tb_1.class_id=tb_2.id;
#只针对tb_1(左边的表)所存在的列,对其他连接的数据是否存在无关

在这里插入图片描述

select name,class from tb_1 right join tb_2 on tb_1.class_id=tb_2.id;
#只针对tb_2(右边的表)所存在的列,对其他连接的数据是否存在无关

在这里插入图片描述

自连接查询

自连接是指在同一个表中进行连接查询,连接的主键和外键都是来自同一个表,自身进行连接。

MySQL自连接查询可以用于解决一些特定的需求,例如查询一个表中和张三同一个班的同学、查询商品的相似商品信息等。

自连接查询的一般语法如下:

SELECT t1.column_name1, t1.column_name2, ..., t2.column_name 
FROM table_name t1, table_name t2 
WHERE condition(条件);

其中,t1t2是同一张表,它们之间的连接条件通过WHERE子句指定。

下面举一个部门表的例子,在班级表中,一个班级有一个班主任,一个班级有多名学生,一个班主任可以管理多个班级,SQL语句如下:

SELECT 学生姓名,学生班级 FROM 班级表  t1,班级表 t2
WHERE t1.班主任id = t2.班级所属班主任Id 
AND t1.班主任姓名 = "张三";

自连接查询能够提高查询效率减少数据库的访问次数,但是也容易出现查询错误,因此,在实际应用时需要仔细考虑连接条件和查询语句的编写。

子查询——?in

子查询是通过多个查询语句而后得到的查询结果,由最外层的查询语句返回最终结果,里面的查询语句是将数据范围缩小,可以对单表使用,也可以对多表使用。

MySQL自连接查询可以用于解决一些特定的需求,例如查询一个表中和张三同一个班的同学、查询商品的相似商品信息等。

子查询的一般语法如下:

SELECT t1.column_name1, t1.column_name2, ..., t2.column_name 
FROM table_name 
WHERE column_name 
[NOT] inSELECT column_name1 FROM table_name WHERE condition)#后面也可以再接in语句

其中,查询结果的返回值由另一个查询语句进行返回,相对于一个套娃?过程。

一般on是与join一起使用,而且on返回是单行结果查询,意思是只能返回一个结果。而in可以返回一个或多个结果。

比如说,查询张三这个班级中其他的所有成员:(ps:我们先在表中添加几条数据)

select name from tb_1 where class in (select class from tb_1 where name='张三')

在这里插入图片描述

当然,多行子查询不仅有in还有exist,意思是存在,也是一个套娃的过程……

语法格式如下:

SELECT t1.column_name1, t1.column_name2, ..., t2.column_name 
FROM table_name 
WHERE column_name 
[NOT] EXISTSSELECT column_name1 FROM table_name WHERE condition)#后面也可以再接exist语句

合并查询——Union

在实际应用中,对同一个数据如果有多个条件只需要满足其中一个,可以使用Union(联合体)来对数据进行查询操作。单独使用union可以针对相同的结果进行去重操作

语法格式如下:

#注意在查询结果时需要注意结果的字段名一致(如果不同表一般需要指定字段名)
SELECT t1.column_name1 FROM table_name where condition
union[ALL]#union all 取消去重操作
SELECT t1.column_name1 FROM table_name where condition
#使用 or 来实现
SELECT t1.column_name1 FROM table_name where condition or condition

虽然看起来可以使用or来替换,这两个查询语句的区别在union可以联合多个表,or一般是对同一个表进行操作。

查询姓名为李四或者ID号为1的学生信息:

select * from tb_1 where name='李四'
union
select * from tb_1 where id = 1;

在这里插入图片描述

以上就是一些常用的Mysql联合查询语句,希望可以帮助到小伙伴们!(o゚v゚)ノ

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。