• Mysql多表设计


    前言

    多表查询中要给每一表起别名

    • tableA as 别名1 , tableB as 别名2 ; (111111推荐)

    • tableA 别名1 , tableB 别名2 ;

    例子:

    1. select emp.name , dept.name
    2. from tb_emp emp inner join tb_dept dept
    3. on emp.dept_id = dept.id;

    一对一

    在任意一方加入对方表的主键

    一对多的一中)

    一对多

    连接查询

    • 在(t1)多的一方加入 一(t2)的主键 

      例:select * from t1,t2 where t1.t2_id=t2.id;

    • 内连接 查询A,B交集部分数据

      • 隐式内连接
          1. select tb_emp.name , tb_dept.name -- 分别查询两张表中的数据
          2. from tb_emp , tb_dept -- 关联两张表
          3. where tb_emp.dept_id = tb_dept.id; -- 消除笛卡尔积
      • 显示内连接
          1. select tb_emp.name , tb_dept.name
          2. from tb_emp inner join tb_dept
          3. on tb_emp.dept_id = tb_dept.id;

    • 外连接(左右连接可以切换)

      • 左外连接(推荐)
        • 左外连接相当于查询表1(左表)的所有数据,当然也包含表1和表2交集部分的数据。即使表2中没有与之对应的数据该数据也会被查询出来
        • select  字段列表   from   表1  left  [ outer ]  join 表2  on  连接条件 ... ;
          1. -- 左外连接:以left join关键字左边的表为主表,查询主表中所有数据,
          2. 以及和主表匹配的右边表中的数据
          3. select emp.name , dept.name
          4. from tb_emp AS emp left join tb_dept AS dept
          5. on emp.dept_id = dept.id;
      • 右外连接
        • select  字段列表   from   表1  right  [ outer ]  join 表2  on  连接条件 ... ;
    • 子查询

      • SQL语句中嵌套select语句,称为嵌套查询,又称子查询。
      • SELECT * FROM t1 WHERE column1=( SELECT column1 FROM t2 ... );
        • 标量子查询
          • 子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询。

          • 常用的操作符: = <> > >= < <

            1. -- 1.查询"教研部"部门ID
            2. select id from tb_dept where name = '教研部'; #查询结果:2
            3. -- 2.根据"教研部"部门ID, 查询员工信息
            4. select * from tb_emp where dept_id = 2;
            5. -- 合并出上两条SQL语句
            6. select * from tb_emp where dept_id = (select id from tb_dept where name = '教研部');
        • 列子查询
          • (子查询结果为一列,但可以是多行)

          • 操作符描述
            IN在指定的集合范围之内,多选一
            NOT IN不在指定的集合范围之内
            1. -- 1.查询"销售部""市场部"的部门ID
            2. select id from tb_dept where name = '教研部' or name = '咨询部'; #查询结果:3,2
            3. -- 2.根据部门ID, 查询员工信息
            4. select * from tb_emp where dept_id in (3,2);
            5. -- 合并以上两条SQL语句
            6. select * from tb_emp where dept_id in (select id from tb_dept where name = '教研部' or name = '咨询部');

        • 行子查询(子查询结果为一行,但可以是多列)
        • 表子查询(子查询结果为多行多列[相当于子查询结果是一张表])
            1. -- 1.查询"方东白"的入职日期
            2. select entrydate from tb_emp where name = '方东白'; #查询结果:2012-11-01
            3. -- 2.查询指定入职日期之后入职的员工信息
            4. select * from tb_emp where entrydate > '2012-11-01';
            5. -- 合并以上两条SQL语句
            6. select * from tb_emp where entrydate > (select entrydate from tb_emp where name = '方东白');
      • 子查询可以书写的位置
        • where之后

        • from之后

        • select之后

  • 相关阅读:
    2022牛客多校联赛第九场 题解
    C++ opencv 图像读取与显示
    这次的PMP考试(6月25日),有人欢喜有人忧,原因就在这...
    python实战故障诊断之CWRU数据集(五):线性判别模型及二次判别模型的应用
    扒一扒你不知道的《经济学人》大家族,其中一款重磅产品被严重忽略
    Java中数组的实际经典案例
    【MySQL】事务管理
    IM同步服务
    Netty Review - 核心组件扫盲
    ssm+vue+elementUI 协同过滤算法的电影推荐系统-#毕业设计
  • 原文地址:https://blog.csdn.net/qq_57667629/article/details/134277182