例子;
1.链接查询(查询多张表的数据,有外键关系的),是对查询后列的扩展
select * from 表名1,表名2; #会形成笛卡尔积,几张表的数据挨个匹配,数据的数量是每张的数量相乘,会产生冗余;
select * from 表名1,表名2 where 表名1.列名=表名2.列名;这样就去掉了冗余的数据;
上边的两个表结合后,有title和code重复的列,去掉多余的列:select 表1.列1,表1.列2,表1.列3....表2.列2.. from 表名1,表名2 where 表名1.列名=表名2.列名;
select * from 表1 join 表2 on 表1.列名=表2.列名;
上边的两个表结合后,有title和code重复的列,去掉多余的列:select 表1.列1,表1.列2,表1.列3....表2.列2.. from 表名1 join 表名2 on表名1.列名=表名2.列名;
2.联合查询,对查询后行的扩展,把多张表的数据放到一起显示,查询的列的数量要相同
select name,firm from family
union
select code,name from title
3.子查询
父查询:外层查询
子查询:里层查询
子查询先执行,子查询的结果作为父查询的条件
(1)无关子查询
子查询在执行的时候和父查询没有关系子查询可以单独执行
1.查询民族为汉族的所有人员信息
父查询:select * from info where nation=()
子查询:select code from nation where name='汉族' nation与code是有外键关系的列
把子查询的语句放到父查询的括号内
结合起来:select * from info where nation=(select code from nation where name='汉族') 相当于nation=(code)
2.查询系列名为宝马5的所有汽车信息
(2)相关子查询
子查询在执行的时候和父查询有关系,子查询不可以单独执行
1.查询汽车表中油耗小于该系列平均油耗的所有汽车信息
父查询:select * from car where oil<(该系列平均油耗)
子查询:select avg(oil) from car where brand=该系列
select * from car where oil<(select avg(oil) from car where brand=该系列)
由于父查询和子查询都是查询的一张表,所以我们给父查询查询的表名,子查询查询的表名进行命名,
select * from car as aa where oil<(select avg(oil) from car as bb where brand=该系列)
然后再确定‘该系列’,
select * from car as aa where oil<(select avg(oil) from car as bb where bb.brand=aa.brand)