目录
联合查询
内连接
外连接
自连接
子查询
单行子查询: 内部的查询sql返回单条记录的查询编辑
多行子查询:内部嵌套的查询sql返回多条记录的查询
联合查询
实际开发中往往数据来自不同的表,所以需要多表联合查询。多表查询是对多张表的数据取笛卡尔积:
注意:关联查询可以对关联表使用别名。
就两步:
a.先试验下笛卡尔积的结果.
b.按照条件一步步筛选
举例:
学生表
班级表
查询在 天庭班 里面的所有 同学名称
一个在 班级表中, 一个在 学生表中
在一条SQL语句中同时查出这两个属性,就需要两张表一起查询。
联合查询其实就是在进行两张表的笛卡尔积:本质上就是两个表的排列组合
select stu.name, stu.class_id, class.name, class.id from stu, class ;
遍历第一张表,取出一条记录和第二张表的每一条记录进行组合,得到一个更大的表
多表查询,就是多张表的排列组合 数目是 乘积 关系。
多表查询得到的结果是两张表的组合
列数:多表的列数之和 + 相加
行数:多表的行数之积 * 乘积
接下来就是对数据进行筛选
很简单,我们判断一个数据是否合理就是学生表的班级id和班级id一致
stu.class_id = class.id 即可
现在再进行进一步的筛选,选择是 天庭班 的学生 class.name = '天庭'
select stu.name, stu.class_id, class.name, class.id from stu, class where stu.class_id = class.id and class.name = '天庭';
如果是只想查询 天庭班 的所有同学名称 ,就把前面改一改
select stu.name from stu,class where stu.class_id = class.id and class.name = '天庭';
注释:多表查询和子查询切忌不要想着一步到位,想一次就把正确的sql写出来,往往事倍功半
上面的问题,还有另一种写法,就是 内连接
内连接
内连接:就是多表的笛卡尔积根据关联关系严格筛选结果
内连接的结果两张表的数据都不为空
语法:
select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;
select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;
还是刚刚那个问题:查询在 天庭班 中所有学生的名字
这是之前写的
用内连接写个同样效果的
注释: inner join 后面写需要连接的另一个表名称
on 后面写 内连接的条件,两张表的关联关系
where 是 具体想要得到的筛选条件
比较推荐第二种用 内连接的方法,比较清晰 。
连接条件和筛选条件分开,逻辑比较清楚。
案例:
内连接一定都是多个表同时都存在关联数据的情况
不会出现假设表1存在数据,表2没有数据,此时这条记录关联之后就不会显示。
如果想要显示,那就要用到外连接。
外连接
两张表查询时,若某个表存在空数据,仍然显示出来
外连接分为左外连接和右外连接。
如果联合查询,左侧的表完全显示我们就说是左外连接;右侧的表完 全显示我们就说是右外接。
from tb_name1 left join tb_name2 on 条件
from tb_name1 right join tb_name2 on 条件
先用内连接查看
---左外连接,讲左表数据完全显示,右表中不存在的显示为null
select user.* , account.* from user left join account on account.id = user.id;
---右外连接,将右表数据完全显示,左表中不存在的显示为null
select user.* , account.* from user right join account on account.id = user.id;
自连接
一般MySQL筛选数据时都是不同行的列之间进行数据的比较,涉及到同一张表中行数据的筛选,用到自连接
子查询
子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询
单行子查询: 内部的查询sql返回单条记录的查询
多行子查询:内部嵌套的查询sql返回多条记录的查询
举例:查询语文或英文的成绩信息



