mysql多表查询

1. 多表的关系

多个表之间是有关系的,多表之间的关系约束是通过外键列来完成的。

1.1 一对多/多对一的关系

  • 比如:部门和员工,班级和学生,省份和城市
  • 一对多和多对一仅仅是视角不同而已,如班级和学生,班级是1、学生是多,因此
    一对多是班级对学生,反过来多对一就是学生对班级,因此也是双向一对多。
  • 一对多建表原则:在多方创建一个属性,该属性作为外键指向一方的主键

1.2 多对多的关系

  • 比如一门课程有多个学生,而且每个学生学了多门课程
  • 多对多建表原则:需要创建第三张表这种表中至少有两个属性,分别作为外键指向两个多方的主键。

问: 为什么建立外键列会降低效率?如何解决该问题?既能保证数据正确又可以不用人工检查?

1.3 一对一的关系

  • 实际应用并不多,因为可以直接创建成一张表。
  • 一对一有两种建表原则:
    1. 在任意一个一方建立一个外键指向另外一个一方的主键,且将这个外键设置为unique
    2. 让一对一的双方的主键建立关系

2. 多表查询

多表查询主要有如下几种:

  1. 合并结果集:union、union all

  2. 连接查询:

    • 内连接:

    • 外连接:

      • 左外连接:
      • 右外连接
      • 全外连接:
    • 自然连接:

  3. 子查询

2.1 合并结果集

  • 作用:将两个select语句的执行结果合并;这将导致结果的行(实体)增加

  • 被合并的两个结果:列数、列类型必须相同;

  • 关键字 union 是将结果合并并去重,关键字 union all 是将结果合并但不去重

  • 用法

    -- 将table1和table2的查询结果合并并且去重(table2的查询结果添加到table1的查询结果上)
    select * from table1 union 
    select * from table2;
    
    -- 将table1和table2的查询结果合并
    select * from table1 union all
    select * from table2;
    
    -- 错误写法, 显然各select查询的结果列数不一致,无法合并
    select attr1, attr2 from table1 union all
    select attr3 from table2;
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值