连接查询
连接就是指两个或2个以上的表(数据源)“连接起来成为一个数据源”。
实际上,两个表的完全的连接是这样的一个过程:
左边的表的每一行,跟右边的表的每一行,两两互相“横向对接”后所得到的所有数据行的结果。
连接之后,并非形成了一个新的数据表,而只是一种“内存形态”。
1.交叉连接
from 表1 join 表2
2.内连接
from 表1 join 表2 on 表1.字段1=表2.字段2
例如:select * from student join sorce on student.id=sorce.id
3.左外连接
from 表1 left join 表2 on 连接条件
含义是:内连接的结果基础上,加上左边表中所有不符合连接条件的数据,相应放右边表的字段的位置就自动补为“null”值。
4.右外连接
from 表1 right 表2 on 连接条件
含义是:内连接的结果基础上,加上右边表中所有不符合连接条件的数据,相应放左边表的字段的位置就自动补为“null”值。
5.全外连接
from 表1 full [outer] join 表2 on 连接条件
含义是:其实是左右连接的“并集”(消除重复项),即内连接的结果,加上左表中不满足条件的所有行(右边对应补null),再加上,右表中不满足条件的所有行(左边对应补null)。{mysql不认此语法,了解即可}
6.子查询:子查询就是把一个查询的结果当作另一个查询的条件。
可以使用in子查询:
select * from product where protype_id in (
select protype_id from product_type where protype_name like '%电%')
7.联合查询
联合查询就是将两个select语句的查询结果“层叠”到一起成为一个“大结果”。
两个查询结果的能够进行“联合”的先觉条件是:结果字段数相等。
1,两个select语句的输出段(结果字段)数目一样,应用中通常类型一样才有意义。
2,结果集中的字段以第一个select语句的字段为准。
3,第一个select语句的字段可以做别名,但如果做别名,则后续的where,group,order等子句应该用该别名。
4,如果要对整个联合结果进行排序或limit,则应该对各自的select语句加括号:
(select 语句1)
union
(select 语句2)
order by ..... limit ....;
例如:select name,age from student union select grade,sex from teacher