mysql对所有id求积_MySQL学习笔记(二)—查询

本文介绍了SQL中的连接查询和子查询技术。包括内连接、外连接的不同形式及其应用场景,以及如何通过子查询进行复杂的数据筛选。对于理解SQL查询过程和进行SQL优化具有指导意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、多表连接查询

新建两张表t_user、t_order。

b0292c035aa7982ce5083b358b58b9f1.png      27a62803e9bfa5237331d1428faa3cea.png

1.内连接

返回满足条件的所有记录。

(1)显式内连接

使用inner join关键字,在on子句中设定连接条件。 SELECT

u.id,

u.name,

u.address,

o.orderno

FROM

t_user u

INNER JOIN t_order o ON u.id = o.userid;

结果:

a9adf26b5339771276bc82658efc47f6.png

(2)隐式内连接

不包含inner join和on关键字,在where子句中设定连接条件。

SELECT

u.id,

u.name,

u.address,

o.orderno

FROM

t_user u,

t_order o

WHERE

u.id = o.userid;

结果:

e208ca5aa1c67caea6896237bc8339cd.png

2.外连接

(1)左外连接

A:返回满足连接条件的所有记录,同时也返回左表中剩余的其他记录。

B:使用left outer join关键字,在on子句中设定连接条件,可加where子句。

SELECT

u.id,

u.name,

u.address,

o.orderno

FROM

t_user u

LEFT OUTER JOIN t_order o ON u.id = o.userid;

结果:

f5979e3542f8759f80225f2dda27d2be.png

(2)右外连接

A:返回满足连接条件的所有记录,同时也返回右表中剩余的其他记录。

B:使用right outer join关键字,在on子句中设定连接条件,可加where子句。

SELECT

u.id,

u.name,

u.address,

o.orderno

FROM

t_user u

RIGHT OUTER JOIN t_order o ON u.id = o.userid;

结果:

8c422a6d9c04275f958c68d18866335d.png

3.SQL查询的基本原理

(1)单表查询

根据where条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的)。然后根据select的选择列选择相应的列进行返回最终结果。

(2)两表连接查询

对两表求积(笛卡尔积)并用on条件和连接类型进行过滤形成中间表;然后根据where条件过滤中间表的记录,并根据select指定的列返回查询结果。

(3)多表连接查询

先对第一个和第二个表按照两表连接做查询,然后用查询结果和第三个表做连接查询,以此类推,直到所有的表都连接上为止,最终形成一个中间的结果表,然后根据where条件过滤中间表的记录,并根据select指定的列返回查询结果。

理解sql查询的过程是进行sql优化的理论依据。

(4)on条件和where条件的区别

on条件: 是过滤两个链接表笛卡尔积形成中间表的约束条件。where条件: 在有on条件的select语句中是过滤中间表的约束条件。在没有on的单表查询中,是限制物理表或者中间查询结果返回记录的约束。在两表或多表连接中是限制连接形成最终中间表的返回结果的约束。从这里可以看出,将where条件移入on后面是不恰当的。推荐的做法是: on只进行连接操作,where只过滤中间表的记录。

二、子查询

子查询也叫嵌套查询,是指在select子句或者where子句中又嵌入select查询语句。

1.where型子查询

把内层查询结果当作外层查询的比较条件。

#不用order by 来查询最新的商品

select goods_id,goods_name from goods where goods_id = (select max(goods_id) from goods);

#取出每个栏目下最新的产品(goods_id唯一)

select cat_id,goods_id,goods_name from goods where goods_id in(select max(goods_id) from goods group by cat_id);

2.from子查询

把内层的查询结果供外层再次查询。

###用子查询查出挂科两门及以上的同学的平均成绩###

#先查出哪些同学挂科两门以上

select name,count(*) as gk from stu where score < 60 having gk >=2;

#以上查询结果,我们只要名字就可以了,所以再取一次名字

select name from (select name,count(*) as gk from stu having gk >=2) as t;

#找出这些同学了,那么再计算他们的平均分

select name,avg(score) from stu where name in (select name from (select name,count(*) as gk from stu having gk >=2) as t) group by name;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值