您的位置:首页 > 数据库

数据库——(10)联合查询和子查询

2017-07-25 13:02 176 查看
联合查询

将多次查询(多条select语句),在纪录上进行拼接(字段不会增加)。

基本语法:多条select语句构成,每一条select语句获取的字段数必须严格一致(但是字段类型无关)。

select 语句1 union[union 选项] select 语句2…….;

union选项:与select选项一样有两个,但默认的有区别

all:保留所有
distinct:去除重复(默认的)


select * from my_class union select * from my_class;
select * from my_class union all select * from my_class;


联合查询的意义:分为两种

1.查询同一张表,但是需求不同:如查询学生信息,男生身高升序,女生身高降序。
2.多表查询:多张表的结构是完全一样的,保存的数据(结构)也是一样的。


注意:联合查询使用order by 时需要对查询语句加括号

(select * from my_stu where sex='男' order by height asc limit 9999999)
union
(select * from my_stu where sex='女' order by height desc limit 9999999);


子查询

子查询:sub query,查询是在某个查询结果之上进行的(一条select语句内部包含了另外一条select语句)。

子查询有两种分类:按位置分类和按结果分类

按位置分类:子查询(select语句)在外部查询(select语句)中出现的位置。

form子查询:子查询跟在from之后
where子查询:子查询跟在where之后
exists子查询:子查询跟在exists之后


按结果分类:根据子查询得到的数据进行分类(理论上讲任何一个查询得到的结果都可以理解为二维表)。

标量子查询:子查询得到的结果是一行一列(出现的位置在where之后)。
列子查询:子查询得到的结果是多行一列(出现的位置在where之后)。
行子查询:子查询得到的结果是一行多列(出现的位置在where之后)。
表子查询:子查询得到的结果是多行多列(出现的位置在from之后)。


标量子查询

需求:知道班级名字为P1,想获取该班的所有学生。
1.确定数据源:获取所有学生
select * from my_stu where c_id =?;
2.获取班级id:可以通过班级名字确定
select id from my_class where name = 'P1';


select * from my_stu where c_id =(select id from my_class where name = 'P1');


列子查询

需求:查询所有在读班级的学生
1.确定数据源:学生
select * from my_stu where c_id in(?);
2.确定有效班级的id
select id from my_class;


select * from my_stu where c_id in(select id from my_class);


列子查询返回的结果会比较多,需要使用in作为条件匹配:其实在MySQL中还有几个类型的条件:all,some,any

=any等价in
any等价some
=all等价全部


行子查询

需求:要求查询整个学生中,年龄最大且身高最高的学生
1.确定数据源:学生
select * from my_stu where age = ? and height= ?;
2.确定最大的年龄和身高
select max(age),max(height) from my_stu;


select * from my_stu where age = (select max(age)from my_stu)
and height= (select max(height) from my_stu);


但通过构造行元素的方式比较好:(行元素由多个字段构成)

select * from my_stu where (age,height)=
(select max(age),max(height) from my_stu);


表子查询

需求:找出每个班中最高的一个学生
1.确定数据源:先将学生按照身高进行降序排序
select * from my_stu order by height desc;
2.从每个班选出第一个学生:
select * from my_stu group by c_id;


表子查询:from 子查询,得到的结果作为from的数据源

select * from (select * from my_stu order by height desc)as student group by c_id;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: