表table代表了生活中一个主体,如部门表dept,员工表emp。表关联则代表了表之间的关系,如:部门和员工,商品和商品分类,老师和学生,教室和学生。
同时,也要知道,表并不都有关系,它们形成自己的小圈子。如商品和商品详情一圈,部门和员工一圈,出圈就可能没关系了,如商品和员工无关,商品和学生无关。
下面我们讨论表的关系分为四种:
多表查询是指基于两个和两个以上的表的查询。在实际应用中,查询单个表可能不能满足你的需求,如显示员工表emp中不只显示deptno,还要显示部门名称,而部门名称dname在dept表中。
笛卡尔积(Cartesian product),又称直积。一般笛卡尔积没有实际的业务意义,但多表查询都是先生成笛卡尔积,再进行数据的筛选过滤。
注意:实际开发中尽量少用多表联查,其根本原因就在这里,查询过程中,现在内存中构建一个大大的结果集,然后再进行数据的过滤。那这个构建过程,和所使用的内存资源,包括过滤时的判断,都是既耗费资源,又浪费时间。
SELECT * FROM students,scores #查询这两张表
WHERE students.id = scores.sid #两张表的关联关系
AND students.name = ‘柒‘ #查询条件
SELECT * FROM students
#inner join scores #两边都满足的交集
LEFT JOIN scores #左边的所有和右边满足了的
#right JOIN scores #右边的所有和左边满足了的
ON students.id = scores.sid #描述关联关系
WHERE students.name = ‘柒‘ #具体过滤条件
子查询是指嵌入在其他select语句中的select语句,也叫嵌套查询。子查询执行效率低慎用。记录少时效率影响不大、图方便直接使用,记录多时最好使用其它方式替代。
#查询学生名字为柒的成绩 名字为柒的只有一个返回的id只有一个值
select * from scores where id = (select id from students where name=‘柒‘);
#查询7086班级的所有学生信息
select * from students where id in (select id from classes where class=7086);
select * from students where id = any(select id from classes where class=7086);
常见报错:https://www.cnblogs.com/fangweicheng666/p/15133256.html
原文:https://www.cnblogs.com/fangweicheng666/p/15168072.html