• 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;
  • 相关阅读:
    链表栈
    C# TCP应用编程二 同步TCP应用编程
    C# TCP应用编程一 概述
    C# 网络流
    远程连接 出现身份验证错误,要求的函数不受支持(这可能是由于CredSSP加密Oracle修正)
    C#线程Thread类
    C# 通过Internet搜索网络资源
    正则表达式
    C#文件的读写
    微服务实战
  • 原文地址:https://www.cnblogs.com/yangang2013/p/5675194.html
Copyright © 2020-2023  润新知