Python 41 多表查询 和 子查询

一:多表查询

1、什么是多表查询?

       在多个表中查询需要的数据
       例如:有班级表 和学生表
        给你已给班级名称  请查询所有的学员数据
        先查班级表 得到一个班级的id  再根据id去学院表查询对应的学员

准备数据:
    create table emp (id int,name char(10),sex char,dept_id int);
     insert emp values(1,"大黄","m",1);
     insert emp values(2,"老王","m",2);
     insert emp values(3,"老李","w",30);

    create table dept (id int,name char(10));
    insert dept values(1,"市场");
    insert dept values(2,"财务");
    insert dept values(3,"行政");
多表查询小练习

2、多表查询的方式


         1.笛卡尔积查询
                   什么是笛卡尔积,用坐标中的一条记录 去链接另一张表的所有记录
                   就像是把 两张表的数据做了一个乘法
                   这将导致 产生大量的无用重复数据

                           我们要的效果是:员工表中的部门id 与 部门表中的id相同 就拼接在一起        

                           用 where 筛选出正确的数据       

                           select *from emp,dept where emp.dept_id = dept.id;

                          on关键字        

                         作用: 用于多表查询是 进行条件限制        

             select *from emp,dept on emp.dept_id = dept.id;  这是错误的语法 ,因为 on 它只能用在专门多表查询语句中

          2.内连接查询        

                  inner join        

                  select *from emp inner join dept  on emp.dept_id = dept.id;# 查询 所有的员工以及他们所属的部门信息      

          3.左外连接        

                    left join   左边表中的数据完全显示   右边表中的数据匹配上才显示       

                    select *from emp left join dept  on emp.dept_id = dept.id; # 查询 所有的部门以及他们所有的员工信息      

          4 .右外连接        

                   right join         左边表中的数据匹配上才显示   右边表中的数据完全显示        

                   select *from emp right join dept  on emp.dept_id = dept.id;# 在一个表中 显示多个表中的所有数据     

         5. 全外链接        

                   full join  mysql不支持  oracle支持        

                   可以通过union 间接实现

                        union  表示合并查询  意思是把多个查询结果合并在一起显示,

                        要求是 被合并的表结构必须相同,默认去除重复

                        合并但是不去除重复  union all

       select *from emp right join dept  on emp.dept_id = dept.id

       union

       select *from emp left join dept  on emp.dept_id = dept.id;

总结:多表链接 在书写时 按照填空来书写   如果左边要全部显示 用left join

            右边全部显示 用right join

            全部显示 把左链接的结果和右链接的结果 合并

            当然 也可以更多表一起查 但是 没有意义  并且你要尽量避免 太多表 一起查

            最多三张 在多对多的时候

    select *from emp left join dept left join xxtable on emp.dept_id = dept.id;

二:子查询

什么是子查询:将上一次查询的结果 作为本次查询的原始数据(或是查询条件)

需求 查询出工资最高的人的信息     先查询出 财务部 最高工资是多少     拿着最高工资 去表中看 谁的工资和最高工资匹配    

select *from emp where salary = (select max(salary) from emp);

猜你喜欢

转载自www.cnblogs.com/zedong/p/9649154.html