• MySQL的查询,子查询,联结查询,联合查询



    MySQL的查询,子查询,联结查询,联合查询

    一.mysql查询的五种子句
    where(条件查询)、having(筛选)、group by(分组)、order by(排序)、limit(限制结果数)

    二.子查询
    1.where 子查询
    SELECT * FROM tb1 WHERE cat_id IN (SELECT max(id) FROM tb2 GROUP BY cat_id);

    2.from 子查询
    SELECT t2_id FROM (SELECT t2_id FROM tb2 ORDER BY t2_id DESC);

    3.exists子查询(把外层查询结果拿到内层,看内层的查询是否成立,成立就返回外层查询的数据)
    SELECT * FROM test5 WHERE EXISTS (SELECT id FROM test2 where test2.id=test5.id);

    查询test5中的第一行id=1, 然后执行SELECT id FROM test2 where test5.id=1;如果存在,就返回这行数据,不存在,就不返回

    三.UNION用法,联合查询(纵向/行联结)
    (把两次或多次的查询结果合并起来,要求查询的列数一致,推荐查询的对应的列类型一致,可以查询多张表,多次查询语句时如果列名不一样,则取第一次的列名!如果不同的语句中取出的行的每个列的值都一样,那么结果将自动会去重复,如果不想去重复则要加all来声明,即union all)

    SELECT * from test2 UNION SELECT * FROM test5;
    对test2结果集和test5结果集行联合起来(去重)

    SELECT * from test2 UNION ALL SELECT * FROM test5;
    对test2结果集和test5结果集的行联合起来(不去重)

    四.联结查询(横向/列联结)
    1.内联结(INNER JOIN,INNER可以省略,以下三种写法等效)
    SELECT * FROM test2,test5 WHERE test2.id=test5.id;
    SELECT * FROM test2 JOIN test5 ON test2.id=test5.id;
    SELECT * FROM test2 JOIN test5 USING(id);//如果两个表的列名相同,可以用USING代替ON

    将test2和test5的结果集的列按条件联结起来,是并集

    2.左联结
    SELECT * FROM test2 LEFT JOIN test5 ON test2.id=test5.id;

    以左表test2为准,和test5联结,test2中的数据会被全部取出.

    3.右联结
    SELECT * FROM test2 RIGHT JOIN test5 ON test2.id=test5.id;

    以右表test5为准,和test2联结,test5中的数据会被全部取出.

    日常使用固定一种,用左联结代替右联结.

    内联结和左联结的区别:

    内联结取出了两个表都有的记录,如果一个表有.另一个表没有,则不取出

    左联结取出了左表中所有的记录,不管有表有没有该对应记录

    参考:

    http://www.cnblogs.com/rollenholt/archive/2012/05/15/2502551.html 

  • 相关阅读:
    前端总结数据结构与算法基础
    Linux 常用命令
    mariadb下载二进制包源码包地址(使用清华)
    centos7添加永久静态路由
    登录普通用户会报错-bash: ulimit: open files: cannot modify limit: Operation not permitted
    编写二进制安装mariadb10.2的ansible-playbook剧本
    su
    URL后面加不加“/”有区别吗?
    RocketMQ在面试中那些常见问题及答案+汇总
    通过实现网站访问计数器带你理解 轻量级锁CAS原理,还学不会算我输!!!
  • 原文地址:https://www.cnblogs.com/itfenqing/p/6883454.html
Copyright © 2020-2023  润新知