数据库中多表查询

63 阅读2分钟

​本文已参与「新人创作礼」活动,一起开启掘金创作之路

多表查询

多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。

 

第一节:笛卡尔积

 

笛卡尔乘积是一个数学运算。假设我有两个集合 X 和 Y,那么 X 和 Y 的笛卡尔积就是 X 和 Y 的所有可能组合,也就是第一个对象来自于 X,第二个对象来自于 Y 的所有可能。组合的个数即为两个集合中元素个数的乘积数。

 

比如:a表中2两条数据,b表中两条数据,组合起来就是4条数据。

 

第二节:多表查询分类

 

2.1 等值连接

 

为了避免笛卡尔积, 可以在 WHERE 加入有效的连接条件。比如student表中stu_id(主键),student_info表中有stu_id(外键),语法如下:

 

Select  * from student,student_info where student.stu_id=student_info.stu_id

 

规则:

 

-- 多个条件用and去链接;

-- 区分重复的列名,可在列表前面加上表名;

-- 表可以加别名可以简化查询,如:from student a,student_info b where .....;

 

2.2 非等值连接

 

表与表之间没有相同项(或有相同但是不能用),但是表之间某个或某些项直接存在着一定的关系。

 

比如:学生分数等级表格式(grade):

等级(gra)最低分(lowest)最高分(highest)
A90100
B7089
C6069
D059

 

语句:

Select  b.gra gra,a.name name from stu a,gra b where a.id=b.id and a.score between b.lowest and a.highest;

 

2.3 自连接

 

mysql有时在信息查询时需要进行对自身连接(自连接),所以我们需要为表定义别名。

 

比如:需要查询表中大于“张三的”分数;

 

步骤一:select  score  from stu where name=’张三’; #返回10

步骤二:select  * from where score>60;

 

内连接的方式:

Select b.* from stu a,stu b where a.name=’张三’ and a.score<b.score

 

2.4 内连接

 

关键词:inner join

组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集(阴影)部分。

 

语法:select * from info a inner join grade b on a.id=b.id;

 

2.4 外链接

 

2.4.1 左外链接 left join


全称是左外连接,是外连接中的一种。 左(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。

 

语法:select * from info a left join grade b on a.id=b.id;

 

2.4.2 右连接 right join

 

全称是右外连接,是外连接中的一种。与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。

 

语法:select * from info a right join grade b on a.id=b.id;