多表查询的分类:
面对问题:select * from student ,school; 这条语句查询出来的结果是个数是”笛卡尔积“。
笛卡尔积:
1,有两个集合A,B。取这两个集合的所有组成情况
2,要完成多表查询,需要消除无用的数据
1,内连接查询:
-
1,隐式内连接:使用where条件消除无用数据
例子:若有student和school两表(存在外键关联), 语法:select * from student,school where select.id=school.id; (一般查询几行列表,所以:select student.name,school.name FROM student,school WHERE select.id=school.id;)
-
2,显示内连接:
语法:select 字段列表 FROM 表名1 [INNER] JOIN 表名2 ON 条件;([]表示可写可不写)
内连接查询:
1,从哪些表中查询数据
2,条件是什么
3,查询哪些字段
2,外连接查询:
---1,左外连接:
语法:select 字段列表 from 表1 left [outer] join 表2 on 条件;
查询:查询的是左表所有数据以及交集部分
---1,右外连接:
语法:select 字段列表 from 表1 right [outer] join 表2 on 条件;
查询:查询的是右表所有数据以及交集部分
注意:学一个就可以了,因为把表1和表2的位置调换之后也就变成另一个方向外连接。
3,子查询:
概念:查询中嵌套查询,称嵌套查询为子查询
事例:查询表中的最高成绩:
select max(math) from student; – 假设最高数学成绩为90
select * from student where math=90;
(需要两个步骤完成)
语法:select * from student where math=(select max(math) from student);
子查询不同的情况:
1,子查询的结果是单行单列的:
子查询可以作为条件,使用运算符去判断。
2,子查询的结果是多行单列的
子查询可以作为条件,使用运算符in去判断
3,子查询的结果是多行多列的
子查询可以作为一张虚拟表。
例子:select school,(select * from student where>60) t1 where school.id=t1.id;