当前位置 : 主页 > 手机开发 > ROM >

多表查询

来源:互联网 收集:自由互联 发布时间:2021-06-10
多表查询 查询语法: select * from emp,dept; --会出现笛卡尔积 多表查询分类: 1.内连接查询 隐式内连接查询:(使用)外键是空就会导致查询不了所有的数据 select * from emp,dept where emp.de

多表查询

  查询语法:

    select * from emp,dept;   --会出现笛卡尔积

  多表查询分类:

    1.内连接查询

      隐式内连接查询:(使用)外键是空就会导致查询不了所有的数据

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

-- 正确的写法(用别名替换表,还有需要哪些字段查询哪些字段)
select
  t1.name,t1.gender,t2.name,t2.id
from
  emp t1,dept t2   -- 给表起别名
where
  emp.dept_id=dept.id

      显示的内连接查询

        语法:select 字段列表 from table_name inner join table_name1 on table_name.字段=table_name1.字段 

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

    注意事项:从哪些表中查询,条件什么(内连接的条件),查询哪些字段

    2.外连接查询

      左外连接:查询的是左表所有数据,以及其交集部分。

        语法:select 字段列表 from 表1 left [outer] join 表2 on 条件    

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

      右外连接:查询的是右表所有数据,以及其交集部分

        语法:select 字段列表 from 表1 right[outer] join 表2 on 条件

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

 注意多张表的时候需要使用显示的内连接(减少字段的扫描),但是隐式的内连接显然更好理解。

    3.子查询

    查询工资最高的员工

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

    子查询的结果是单行单列的:

      子查询可以作为条件使用运算符去判断(><=)

      查询工资小于平均工资少的人

            select * from emp where emp.salary<(select avg(salary) from emp);

 

    子查询的结果是多行单列的:

      子查询可以作为条件,使用运算符in来判断

      查询财务部和市场部所有员工的信息

      select * from emp where dept_id in (select * from dept where name in (财务部,市场部));

    子查询的结果是多行多列的:

      子查询是多行多列的时候可以当做一个虚拟的表参与查询

      查询所有入职日期在2011-11-11之后入职的员工所有信息

      select * from dept t1,(select * from emp where emp.join_date>2011-11-11) t2 where t1.id=t2.dept_id;

      或者使用普通查询

      select * from emp t1,dept t2 where t1.dept_id=t2.id and dept.join_date>2011-11-11;
网友评论