zoukankan      html  css  js  c++  java
  • mysql--浅谈多表查询1

    这是对自己学习燕十八老师mysql教程的总结,非常感谢燕十八老师。

    依赖软件:mysql5.6

    系统环境:win

    连接查询

    在谈连接查询之前我们需要对数学上的笛卡尔积有一定的了解

    现在有两个集合m和n

    m = (m1,m2,.....mx)

    n =(n1,n2,.....ny)

    m*n得到的笛卡尔积有多少个元素?

    答:m*n有x*y个元素

    连接查询有以下类型

    1、左连接

    2、右连接

    3、内连接

    连接查询的作用

    从2张或多张表中取出有关联的数据

    3种连接查询的详细说明

    1、左连接

    A left join B on 条件;
    这样形成了一个结果集,可以看成一张表 设为C
    C表有A,B中的所有列;可以做所有表的操作

    考虑到兼容问题和理解上的容易程度都推荐用左连接

    # 语法
    Select 查询项
    from 
    表名 left join 表名 on 表名.列名 = 表名.列名 
    
    # 我是这样理解左连接的:左表不动,右表来匹配
    
    # 示例
    # 用左连接取出两表cat_id 对应的cat_name 
    select goods_id,goods.cat_id,category.cat_id,cat_name,goods_name
    from 
    goods left join category on goods.cat_id=category.cat_id;

    2、右连接

    左右连接可以互换

    A left join B <==> B right join A

    A right join B on 条件;
    这样形成了一个结果集,可以看成一张表 设为C
    C表有A,B中的所有列;可以做所有表的操作

    # 语法
    Select 查询项
    from 
    表名 right join 表名 on 表名.列名 = 表名.列名 
    
    # 我是这样理解右连接的:右表不动,左表来匹配
    
    # 示例
    # 用右连接取出两表cat_id 对应的cat_name 
    select goods_id,goods.cat_id,category.cat_id,cat_name,goods_name 
    from 
    category right join goods on category.cat_id=goods.cat_id;

    3、内连接

    B inner join A on 条件;
    这样形成了一个结果集,可以看成一张表 设为C
    C表有A,B中的所有列;可以做所有表的操作

    # 语法
    Select 查询项
    from 
    表名 inner join 表名 on 表名.列名 = 表名.列名 
    
    # 我是这样理解内连接的:右左连接的交集
    
    # 示例
    # 用内连接取出两表cat_id 对应的cat_name 
    select goods_id,goods.cat_id,category.cat_id,cat_name,goods_name 
    from 
    goods inner join category on category.cat_id=goods.cat_id;

    小练习

    要求:

    Match的hostTeamID与guestTeamID都与Team中的teamID关联
    查出 2006-6-1 到2006-7-1之间举行的所有比赛,并且用以下形式列出:
    拜仁 2:0 不来梅 2006-6-21

    建表时特别主要match是mysql的关键字

    select t1.teamName,match_Result,t2.teamName,match_Time 
    from
    match1 left join Team as t1
    on match1.hostTeamID=t1.teamID
    left join Team as t2 
    on match1.guestTeamID =t2.teamID
    where match_Time  between  '2006-06-01 and '2006-07-01';

    联合查询

    union查询

    使用条件:只要列数一样即可合并(唯一要求)

    语法:

    sql1 union sql2 表操作

    union对重复行的处理:union会去重,union all 不去重复

    # 示例1
    # 用union取出第4个栏目的商品,第5个栏目的商品,并按价格升序排列
    
    select cat_id,shop_price,goods_name from goods where cat_id=4
    union
    select cat_id,shop_price,goods_name from goods where cat_id=5
    order by shop_price asc;

    内层的order by 如果没有影响结果集的结果则将被优化过滤掉

    # 示例2
    # 用union查出第三个栏目下价格前三高的商品,和第四个栏目下价格前2高的商品
    (select cat_id,shop_price,goods_name from goods 
    where cat_id=3 order by shop_price desc limit 3)
    union 
    (select cat_id,shop_price,goods_name from goods
    where cat_id=4 order by shop_price desc limit 2);

     小练习

    要求:

    将两张结构一样的表相同id的值相加,返回所有id和值

    # 第一步 将两表合并成一张表,即表c
    select id,num from a
    union all
    select id,num from b
    
    # 第二步对表c from型子查询操作,
    select id,sum(num) as num 
    from (select id,num from a
    union all
    select id,num from b) as c
    group by id;
    打破当前不满足的方式就是当下默默努力!!!
  • 相关阅读:
    hd2068错排+组合
    POJ 1061 青蛙的约会 扩展欧几里得
    POJ 2115 C Looooops扩展欧几里得
    扩展欧几里得算法
    欧拉函数模板
    高精度模板
    快速幂模板
    HDU 4445 Crazy Tank 高中物理知识忘得差不多了
    POJ 3087 Shuffle'm Up 模拟,看着不像搜索啊
    HDU 4452 Running Rabbits 模拟
  • 原文地址:https://www.cnblogs.com/Pang-Jie/p/10914939.html
Copyright © 2011-2022 走看看