多表查询

等值连接:

  表先做笛卡尔积,在进行筛选,筛选条件为等值筛选

  查询员工名字以及部门

    select s1.last_name,s2.name from s_emp s1,s_dept s2 where s1.dept_id=s2.id;

    (量表的公共字段必须声明表名,非公共字段可以不写,为提高可读性,建议都写)

不等值连接

  where后面条件用非等于号连接(<,>,<>,!=,>=,<=)

自连接

  自己连接自己

    select s1.last_name,s2.last_name manager from s_emp s1,s_emp s2 where s1.manager_id=s2.id;

外连接(sql92):

  左外连接

    select s1.last_name,s2.name from s_emp s1,s_dept s2 where s1.dept_id=s2.id(+);

    显示所有员工名字与其对应的部门,以及没有部门的员工名字(s1单独存在,在s2中没有id与s1中的dept_id对应)

  右外连接

    select s1.last_name,s2.name from s_emp s1,s_dept s2 where s1.dept_id(+)=s2.id;

    显示所有员工名字与其对应的部门,以及没有员工的部门名字(s2单独存在,在s1中没有dept_id与s2中的id对应)

自然连接(sql99):

  笛卡尔积:(cross join 专门用来查看笛卡尔积)

    select * from s_emp cross join s_dept;

  筛选:

  等值筛选(要筛选的字段名必须相同)

    (natural join 按照两表所有同名同值字段进行筛选)

    select * from s_emp natural join s_dept;

  (inner join…using(字段))按照指定字段名相同去筛选

    select * from s_emp inner join s_dept using (id);

    按照两表的id值相同进行筛选

  (inner join…on 字段a=字段b)按照指定字段进行筛选(字段名不需要相同)

    select  * from s_dept s1 inner join s_emp s2 on s1.id=s2.dept_id;

    查找s_emp的idept_id与s_dept的id

外连接(outer join)outer可以省略

  左外连接

    select  * from s_dept s1 left outer join s_emp s2 on s1.id=s2.dept_id;

    显示所有员工名字与其对应的部门,以及没有部门的员工名字(s1单独存在,在s2中没有id与s1中的dept_id对应)

  右外连接

    select  * from s_dept s1 right outer join s_emp s2 on s1.id=s2.dept_id;

    显示所有员工名字与其对应的部门,以及没有员工的部门名字(s2单独存在,在s1中没有dept_id与s2中的id对应)

  全外连接

    select  * from s_dept s1 full outer join s_emp s2 on s1.id=s2.dept_id;

       显示所有员工名字与其对应的部门,以及没有员工的部门名字和没有部门的员工名字

posted @ 2019-09-10 10:26  七月流星丶  阅读(107)  评论(0编辑  收藏  举报