mysql高级查询与子查询区别_MySQL高级查询之子查询,联合查询,连接查询

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

子查询分类

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

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

From子查询: 子查询跟在from之后

Where子查询: 子查询出现where条件中

Exists子查询: 子查询出现在exists里面

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

标量子查询: 子查询得到的结果是一行一列

列子查询: 子查询得到的结果是一列多行

行子查询: 子查询得到的结果是多列一行(多行多列) (1,2,3出现的位置都是在where之后)

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

标量子查询

需求: 找到分类为科技的所有文章标题

ad621d00a4fa5912cd3831c42c21de1b.png

46901b4ef2fd90fc81ddc52752b4f156.png

7a23436481bdb0503dce5ac279774153.png

select title from t2 where category_id=(select category_id from t1 where name='科技');

列子查询

这个时候我就想起以前面试的情形,当时有一道题,给我一个表,让我找出语文和数学都及格人的名字。表是这样的:

5fb607790d1ead5e9b9b9318c8a46244.png

e77e30a67ca2836bdc3ff0b341183548.png

select distinct name from t3 where name not in (select name from t3 where score<60);

行子查询

行子查询: 返回的结果可以是多行多列(一行多列)

需求:找出年龄最大且身高最高的人

5cf177b7e495632004a8a8ef32e96a5c.png

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

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

表子查询

表子查询: 子查询返回的结果是多行多列的二维表: 子查询返回的结果是当做二维表来使用

需求:找出每个人最好的成绩

4b0dcefbf77ca55bfa793abea8c29f37.png

select * from(select * from t3 group by name,score desc)as a group by name;

Exists子查询

Exists: 是否存在的意思, exists子查询就是用来判断某些条件是否满足(跨表), exists是接在where之后: exists返回的结果只有0和1.

需求:如果存在的话身高大于2米的人,列出表中所有数据

5d1994a12c01702a745426f41ae68a63.png

select * from t3 where exists(select * from t3 where height>200);

联合查询

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

主要用于将两个或更多查询的结果组合为单个结果集。

select * from t1 union select  * from t2 union select * from t3;

Union与Union all的区别是Union可以去除重复的行而Union all保留重复的行。

连接查询

连接查询: 将多张表(>=2)进行记录的连接(按照某个指定的条件进行数据拼接)。

连接查询的意义: 在用户查看数据的时候,需要显示的数据来自多张表.

连接查询: join, 使用方式: 左表 join 右表;左表: 在join关键字左边的表;右表: 在join关键字右边的表

内连接:只有左表和右表同时存在数据,才会在表中显示

inner join 简写成join

左外连接:

left join 将左表所有的数据在结果中显示:

右外连接:

right join 将右表所有的数据在结果中显示:

select * from product as t1 join product_type as t2 on t1.protype_id=t2.protype_id

where 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值