数据库——(10)联合查询和子查询
2017-07-25 13:02
176 查看
联合查询
将多次查询(多条select语句),在纪录上进行拼接(字段不会增加)。
基本语法:多条select语句构成,每一条select语句获取的字段数必须严格一致(但是字段类型无关)。
select 语句1 union[union 选项] select 语句2…….;
union选项:与select选项一样有两个,但默认的有区别
联合查询的意义:分为两种
注意:联合查询使用order by 时需要对查询语句加括号
子查询
子查询:sub query,查询是在某个查询结果之上进行的(一条select语句内部包含了另外一条select语句)。
子查询有两种分类:按位置分类和按结果分类
按位置分类:子查询(select语句)在外部查询(select语句)中出现的位置。
按结果分类:根据子查询得到的数据进行分类(理论上讲任何一个查询得到的结果都可以理解为二维表)。
标量子查询
列子查询
列子查询返回的结果会比较多,需要使用in作为条件匹配:其实在MySQL中还有几个类型的条件:all,some,any
行子查询
但通过构造行元素的方式比较好:(行元素由多个字段构成)
表子查询
表子查询:from 子查询,得到的结果作为from的数据源
将多次查询(多条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;
相关文章推荐
- 数据库中联合查询和连接查询的区别…
- 05、MySQL外键、联合查询和子查询
- 15.6数据库(6):SQL语句进阶2:多表联合查询
- 讲义9:联合查询、子查询
- 数据库的联合查询及服务器时间登陆错误时间的间隔
- Lucene4.10.4实践 索引联合查询数据库实现查询更快
- MySQL的联合查询和子查询
- 浅谈数据库联合查询
- MySQL数据高级查询之连接查询、联合查询、子查询
- 数据库联合查询—小知识大攻略
- 数据库的联合查询
- 跨服务器、数据库、表联合查询
- 关联数据库字典表的多表联合查询
- SQL怎么将2个数据库联合查询
- MySQL数据高级查询之连接查询、联合查询、子查询
- Visual C# 2008+SQL Server 2005 数据库与网络开发--4.4.3 联合查询
- 同一数据库中hive之双表join联合查询
- 跨服务器、数据库、表联合查询
- 一文让你读懂数据库联合查询(sql joins)的原理,笛卡尔积
- sql server联合查询内使用子查询