MySQL的高级查询

高级查询:
1.连接查询      指把2张表或者多张表之间做一个连接,所有数据放在一个表里显示。适用于有外键关系的2张表或多张表。如果没有加外键关系,但是这2张表有联系,也可以加连接查询。
select * from Info,Nation
形成笛卡尔积    第1张表有5条数据,第2张表有10条数据,显示出来的表就会有50条数据。

 

select * from Info,Nation where Info.nation=Nation.code    筛选符合条件的数据(info表里的nation和nation表里的code一样)

select Info.code,Info.name,Info.sex,Nation.name as '民族',Info.birthday from Info,Nation where Info.nation=Nation.code

(在表中显示info表和nation表中的Info表的code列,Info表的name列,Info表的sex列,Nation表的name列,并且把name显示为'民族',Info表的birthday列,同时要满足条件info中的nation值和nation表中的code值相等)

 

select * from Info join Nation on Info.nation=Nation.code

info表和nation表连接,后面是连接条件。

没有任何关系的表是无法连接的,能够连接的表肯定是有关系的,即使关系没有加。

 

2.联合查询

连接查询是扩展的表的列,增加列的数目。联合查询是对表的行扩展,增加行的列数。
select code,name from Info
union
select code,name from Nation

选择info表里的code列和name列,再选择nation表里的code列和name列,中间用union连接。两个表查询的列的数量一定要相等。

 

3.子查询

子查询也称里层查询。
子查询查询的结果作为父查询的条件

(1)无关子查询:子查询执行的时候和父查询没有关系。子查询可以单独执行,它在执行的时候和外层查询没有任何关系。
查民族为'汉族'的所有学生信息
select * from Info where nation=(select code from nation where name='汉族')

()里面的是内查询,查询出的结果作为外层查询的条件。

查询生产厂商为'一汽大众'的所有汽车信息
select * from car where brand=()
select brand_code from brand where prod_code=()
select prod_code from productor where prod_name='一汽大众'


select * from car where brand in(select brand_code from brand where prod_code=(select prod_code from productor where prod_name='一汽大众'))

  查询顺序为:prod_code——brand_code——所有汽车信息。最外层的不能用=,因为括号里面可能出现多个值,所以要用in。如果很确定括号里面只有1个值,可以用=,不确定的可以用in。

 

(2)相关子查询
子查询在执行的时候需要用到父查询的内容

查询汽车表中,汽车油耗小于该系列平均油耗的所有汽车信息

select * from car where oil<(该系列平均油耗)
select avg(oil) from car where brand =(该系列)

select * from car a where oil<(select avg(oil) from car b where b.brand =a.brand)

   把外层查询的表取名为a,里层的表取名为b,a和b是同一个表,但是为了区分外层和里层,取名a、b。里面的表在求平均油耗的时候系列代号应该等于外面的表的系列代号。a.brand取的不是所有的系列代号,因为外面的表先进行,当判断条件时无法继续进行,再进行里面的表,所以里面的表取的系列代号是外面的进行的系列代号的值,不是所有的系列代号。

posted @ 2016-10-17 15:41  Strive-count  阅读(339)  评论(0编辑  收藏  举报