数据库部分---高级查询;

例子;


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)

原文地址:https://www.cnblogs.com/xingyue1988/p/6130409.html