Mysql子查询

子查询

当一个查询是另一个查询的条件时,称之为子查询。

嵌套在select语句中的SQL语句只能是单行或单列。
现有:
t_account:ID(bigint pk),账户名称(varchar(20) not null),登录名称(varchar(20) unique not null),密码(varchar(32)),性别(int),出生日期(date),数据创建时间(datetime)
t_goods:ID(bigint pk), 商品名称(varchar(20) not null),商品类型(int not null),商品描述(varchar(200)),商品价格(decimal(8,2)),数据创建时间(datetime)
客户购买商品,就存在下订单
t_order:ID(bigint pk),订单编号(varchar(20) unique not null),账户信息(外键 not null),商品信息(外键 not null),数据创建时间(datetime)
创建t_account,t_goods,t_order表,并添加数据。
数据如下:
t_account
Mysql子查询_第1张图片
t_goods
Mysql子查询_第2张图片

t_order
Mysql子查询_第3张图片

子查询的应用位置:

1.在select 中嵌套子查询
如:查询用户编号为20181002的名称和订单号

select id,(select accout_name from t_account where id=20181002) as '名称' from t_order where account_id=20181002;

执行结果如下:
Mysql子查询_第4张图片

2.在from子句中嵌套子查询
即在from后只有子查询作为数据源

3.在where子句中嵌套子查询
如:查询订单表中订单号为20181021103的用户的所有信息


SELECT * from t_account a where a.id=(select account_id from t_order where id=20181021103);

执行结果如下:
Mysql子查询_第5张图片

SQL in 和exists

确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。

购买了物品的用户信息,具体sql语句如下:
使用in:
select * from t_account where id in (select account_id from t_order);
执行结果如下:
Mysql子查询_第6张图片

使用exists

select * from t_account a where EXISTS  (select account_id from t_orderlist o where a.id=o.account_id);

Mysql子查询_第7张图片

通过上述操作,我们发现结果都是一致的,那么它们的区别在哪里呢?

in 适合于外查询比内查询对应的表,数据量更大的情况下。
exists 适合于外查询比内查询对应的表,数据量更小的情况下。
当两表数据一致差不多时,查询效率几乎一致。

**

嵌套子查询在其他子句的要求

**
group by 嵌套
要求子查询只能返回单行单列值
having 中嵌套
只能用到聚合参数
order中嵌套
要求子查询只能返回单行值

你可能感兴趣的:(mysql数据库)