• mysql 子查询 、 连接查询


    子查询的定义:

    子查询是一个查询语句嵌套着另外的查询语句,用来进行一定层次的查询,其中子查询相当于第一步查询过滤,外查询就是最后得到结果的查询。经常会用到关键字:ANY、SOME、ALL、IN、EXISTS(exist),注:在子查询语句的后面,必须起别名 //select name,price from (select * from car where powers = 130) as aa;必须起别名)

    学生表:

    成绩表:

    学生其他信息表

    1、where型子查询:把内层查询的结果作为外层查询的条件

    A、关键字ANY、SOME子查询:ANY/SOME都是表示满足其中一个条件即可。

        -- 在学生表中选择ID大于表课程表中ID的数据记录

    -- ID只需要大于ID中任何一个就满足条件

    SELECT * FROM name WHERE ID > ANY(SELECT ID FROM score1);

    B、ALL关键字查询

       ANY/SOME相反,是要满足所有的条件才行。

    SELECT * FROM score1 WHERE id> ALL(SELECT id FROM name) ;

    子查询的结果是查到name表中的id列,score1表中的id都要满足大于id(name的)的条件才能查询。

    C、IN关键字查询

          IN关键字查询:若外查询想要查询的结果在子查询中,则返回true,继续查询到结果,否则返回false,查询为NULL。

    注意:与ANY类似,但是很不相同,IN后面可以是子查询,也可以是给定的集合。ANY后面必须为子查询,且前面必须有运算符(<、>、=)

    from型子查询

       即把from后的表名换成查询语句,即把内查询的结果作为一张临时表

     select aa.id from (select * from score1 where id > all(select id from name))as aa;

    1、Exists型子查询:把外层的查询结果,拿到内层中,看是否成立

    关键字EXISTS查询:

    表示在EXISTS后面的查询结果是否有结果,而不在乎子查询返回什么样的结果。

    若子查询的结果至少有一行,则为True,若子查询结果为NULL,则返回False,进行下一次外层查询

     

    现在我要查询第一张表中有子项目的数据

    select cat_id,cat_name,parent_id from biao1 where (select * from biao2 where biao1.cat_id = biao2.cat_id);

    外层查询一次一次的执行,

    第一次取出一个cat_id = 1,带进子查询中的where biao1.cat_id = biao2.cat_id  因为cat_id = 1在biao2中不存在,所以 外层查询进行第二行的查询

    第二次取出cat_id = 2,带进子查询中的where biao1.cat_id = biao2.cat_id  因为cat_id =2在biao2中存在,所以 外层查询可以执行select cat_id,cat_name,parent_id 外层查询进行第三行的查询

    第三次取出cat_id = 3,带进子查询中的where biao1.cat_id = biao2.cat_id  因为cat_id =3在biao2中存在,所以 外层查询可以执行select cat_id,cat_name,parent_id

    查询结果跟子查询的结果没有关系,只要外层查询的结果在子查询中能够满足,就可以查询出外层查询的结果

    Union链接查询

    union 查询就是把 2 条或多条 sql 的查询结果 , 合并成 1 个结果集各语句取出的列数必须相同;如果不相同 , 会报错;

    sql1 返回 N 行

    sql2 返回 M 行

    sql1 union sql2 , 返回 N+M 行

    注意 :

    使用 union 时 , 完全相等的行 , 将会被合并 ,合并是比较耗时的操作 , 两行会在比较看是否完全相等,一半不让 union 进行合并 , 使用 "union all" 可以避免;在实际中 , 一般直接使用 union all 来合并查询,而不是用union;

     例如:(还是以上面三个图为例)

    select age,sex from exist union select id,name from name;

    union 的子句中 , 不用写 order by

    select * from a order by num desc union all select * from b order by num desc;

    运行以上sql语句,你会发现,order by 并没有发挥作用;这是因为每一条子句就算你排序了,但是合并以后的结果依然还是无序的;如果想对合并后的结果来排序,可以用order by;sql语句需要做一定的调整;以下是对合并后结果排序:推荐这种方式  还有limit 

    select * from a union all  select * from b   order by num desc;

    左链接查询

    以左表为准,去右表找匹配的数据,找不到用null补齐

    select * from score1 left join name on score1.id =name.id;

     取出特定元素:

    select course,name from score1 left join name on score1.id =name.id;

    右链接查询  ( 和左链接类似,不举例子了)

    以右表为准,去左表找匹配的数据,找不到用null补齐

    内连接查询

    查询左右表中都有的数据,去掉左右表中null的数据

    内连接是左右链接的交集

    select * from score1  join name on score1.id =name.id;

  • 相关阅读:
    windows查看和杀死占用端口的进程
    jenkins html报告不显示样式
    解决git一直输入用户名和密码的问题
    git中文乱码问题
    java环境变量配置
    web service
    sql 训练及总结
    js 及jQery
    [TYVJ] P1015 公路乘车
    GIT 基本用法
  • 原文地址:https://www.cnblogs.com/scw123/p/9569343.html
Copyright © 2020-2023  润新知