MySQL学习笔记(二)—查询

一、多表连接查询

新建两张表t_user、t_order。

     image      image

 

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;
结果:

       image

 

(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;

结果:

image

 

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;

结果:

     image

 

(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;

结果:

image

 

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;
posted @ 2016-07-16 03:45  ✈✈✈  阅读(335)  评论(0编辑  收藏  举报