多表查询
多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。
第一节:笛卡尔积
笛卡尔乘积是一个数学运算。假设我有两个集合 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) |
A | 90 | 100 |
B | 70 | 89 |
C | 60 | 69 |
D | 0 | 59 |
语句:
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;