MySql多表查询的几种方法
- 连接查询——join
- 自连接查询
- 子查询——🛠in
- 合并查询——Union
认识MySQL数据库
的多表查询,在对大量数据进行查询时仅仅使用一些基本的SQL
语句已经无法满足我们日益增长的需求,如果要对多表进行查询就不得不认识以下几种方法,常见的查询方法是使用笛卡尔积
,相信学过数据库的小伙伴肯定听过这个专业名词,那么数据库中的笛卡尔积是什么?
。
笛卡尔积:对于一个或多个表进行排列组合得到的一张新的表。
意思就是如果有两张表:
tb_1
id | name | class_id |
---|---|---|
1 | 张三 | 1 |
2 | 李四 | 2 |
tb_2
class_id | class |
---|---|
1 | 2023班 |
2 | 2022班 |
两个表的笛卡尔积:
id | name | class_id | id | class |
---|---|---|---|---|
1 | 张三 | 1 | 1 | 2023班 |
1 | 张三 | 1 | 2 | 2022班 |
2 | 李四 | 2 | 1 | 2023班 |
2 | 李四 | 2 | 2 | 2022班 |
根据上面的例子可以看出其实两个表的笛卡尔积就是tb_1
xtb_2
,两个表相乘得到的结果。
SQL语法也比较简单:
#上面例子的语句
SELECT * FROM tb_1,tb_2;
#笛卡尔积语句格式
SELECT column1, column2, ... FROM table1(表1),table2(表2);
查询数据时的步骤:
① 提取出题目中关键信息并找到对应的表
② 对表进行计算笛卡尔积
③ 对表中数据进行筛选
连接查询——join
- 内连接
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进行匹配。
- 外连接
left join
和right 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):
id | name | class_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(条件);
其中,t1
和t2
是同一张表,它们之间的连接条件通过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] in (SELECT 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] EXISTS(SELECT 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゚)ノ