内连接查询_三表内连接查询 - CSDN
精华内容
参与话题
  • 连接查询内连接

    2020-02-16 14:23:07
    1.什么是连接查询? 实际开发中,大部分情况下都不是从单表中查询数据,一般都是多张表联合起来查询取出最终结果。 实际开发中,一般一个业务都会对应多张表,比如:学生和班级,起码两张表。 2.连接查询的分类? ...

    1.什么是连接查询?
    实际开发中,大部分情况下都不是从单表中查询数据,一般都是多张表联合起来查询取出最终结果。
    实际开发中,一般一个业务都会对应多张表,比如:学生和班级,起码两张表。

    2.连接查询的分类?
    根据语法出现的年代来划分的,包括:
    SQL92
    SQL99(比较新的语法)

    根据表的连接方式来划分,包括:
    内连接:
    	等值连接
    	非等值连接
    	自连接
    外连接:
    	左外连接(左连接)
    	右外连接(右连接)
    全练级(这个用的少)
    

    2.3、在表的连接查询方面有一种现象被称为:笛卡尔积现象。(笛卡尔乘积现象)

    案例:找出每一个员工部门名称,要求显示员工和部门名称
    EMP表
    select ename,deptno from emp;
    +--------+--------+
    | ename  | deptno |
    +--------+--------+
    | SMITH  |     20 |
    | ALLEN  |     30 |
    | WARD   |     30 |
    | JONES  |     20 |
    | MARTIN |     30 |
    | BLAKE  |     30 |
    | CLARK  |     10 |
    | SCOTT  |     20 |
    | KING   |     10 |
    | TURNER |     30 |
    | ADAMS  |     20 |
    | JAMES  |     30 |
    | FORD   |     20 |
    | MILLER |     10 |
    +--------+--------+
    DEPT表
    select * from dept;
    +--------+------------+----------+
    | DEPTNO | DNAME      | LOC      |
    +--------+------------+----------+
    |     10 | ACCOUNTING | NEW YORK |
    |     20 | RESEARCH   | DALLAS   |
    |     30 | SALES      | CHICAGO  |
    |     40 | OPERATIONS | BOSTON   |
    +--------+------------+----------+
    
    select ename,dname from emp,dept;  
    因为后续没有调节限制,这样结果会得到56条,每个ename都会分别和四条dname结合。这称为笛卡尔乘积现象
    
    笛卡尔积现象主要是让我们知道两个表联合查询的时候,是表中的一项和另外表中的匹配粘连。
    
    
    关于表的别名:
    	select e.ename,d.dname from emp e,dept d;
    	第一:执行效率高
    		如果不加别名,对'ename'系统会去emo和dept两张表里去寻找,降低了程序执行的效率
    	第二:可读性好

    2.4怎么避免笛卡尔积现象?当然是加条件进行过滤
    思考:避免了笛卡尔积现象,会减少记录的匹配次数吗?
    不会,次数还是56次,只不过显示的是有效记录。

    案例:找出每一个员工部门名称,要求显示员工和部门名称
    	select 
    		e.ename,d.ename
    	from
    		emp e,dept d
    	where  //加上过滤条件,就会显示想要显示的
    		e.deptno = d.deptno;
    		以上是92语法,不用!!! 主要是了解
    

    2.5 内连接 中的 等值连接
    最大的特点是条件是等量关系。

    案例:查询每个员工的部门名称,要求显示员工名和部门名
    SQL99:
    	select
    		e.name,d.name
    	from 
    		emp e
    	join 
    		dept d
    	on
    		e.deptno = d.deptno;   //连接的条件是相等,故为等值连接
    	语法:
    	...
    		A
    	join
    		B
    	on
    		连接条件
    	where 
    		...
    
    SQL99语法结构更清晰一些:表的连接调节和后来的where条件分离了。
    
    带inner可以明确知道是等值连接,inner可以省略
     select
     	 e.name,d.name
     from 
     	 emp e
    inner join 
    	  dept d
     on
     	 e.deptno = d.deptno;   //连接的条件是相等,故为等值连接
     语法:
     
    

    6.内连接之非等值连接:最大的特点是:连接条件中的关系是非等量关

    案例:找出每个员工的工资等级,要求显示员工名,工资,工资等级
    第一步:先看每个员工的薪资
    	+--------+---------+
    	| ename  | sal     |
    	+--------+---------+
    	| SMITH  |  800.00 |
    	| ALLEN  | 1600.00 |
    	| WARD   | 1250.00 |
    	| JONES  | 2975.00 |
    	| MARTIN | 1250.00 |
    	| BLAKE  | 2850.00 |
    	| CLARK  | 2450.00 |
    	| SCOTT  | 3000.00 |
    	| KING   | 5000.00 |
    	| TURNER | 1500.00 |
    	| ADAMS  | 1100.00 |
    	| JAMES  |  950.00 |
    	| FORD   | 3000.00 |
    	| MILLER | 1300.00 |
    	+--------+---------+
    	第二步找到工资的等级
    	+-------+-------+-------+
    	| GRADE | LOSAL | HISAL |
    	+-------+-------+-------+
    	|     1 |   700 |  1200 |
    	|     2 |  1201 |  1400 |
    	|     3 |  1401 |  2000 |
    	|     4 |  2001 |  3000 |
    	|     5 |  3001 |  9999 |
    	+-------+-------+-------+
    	工资等级是分区间的,比如1等级为工资:700-1200
    	
    	则联系起来
    	select 
    		e.name ,e.sal,s.grade
    	from
    		emp e
    	join 
    		salgrade s
    	on
    		e.sal between s.losal and s.hisal;
    		+--------+---------+-------+
    		| ename  | sal     | grade |
    		+--------+---------+-------+
    		| SMITH  |  800.00 |     1 |
    		| ALLEN  | 1600.00 |     3 |
    		| WARD   | 1250.00 |     2 |
    		| JONES  | 2975.00 |     4 |
    		| MARTIN | 1250.00 |     2 |
    		| BLAKE  | 2850.00 |     4 |
    		| CLARK  | 2450.00 |     4 |
    		| SCOTT  | 3000.00 |     4 |
    		| KING   | 5000.00 |     5 |
    		| TURNER | 1500.00 |     3 |
    		| ADAMS  | 1100.00 |     1 |
    		| JAMES  |  950.00 |     1 |
    		| FORD   | 3000.00 |     4 |
    		| MILLER | 1300.00 |     2 |
    		+--------+---------+-------+
    	

    7.自连接:最大特点:一张表看作两张表。自己连接自己

    案例:找出每个员工的上级领导,要求显示员工名和对应的领导名
    mysql> select ename,empno,mgr from emp;
    emp a 员工表
    +--------+-------+------+
    | ename  | empno | mgr  |
    +--------+-------+------+
    | SMITH  |  7369 | 7902 |
    | ALLEN  |  7499 | 7698 |
    | WARD   |  7521 | 7698 |
    | JONES  |  7566 | 7839 |
    | MARTIN |  7654 | 7698 |
    | BLAKE  |  7698 | 7839 |
    | CLARK  |  7782 | 7839 |
    | SCOTT  |  7788 | 7566 |
    | KING   |  7839 | NULL |
    | TURNER |  7844 | 7698 |
    | ADAMS  |  7876 | 7788 |
    | JAMES  |  7900 | 7698 |
    | FORD   |  7902 | 7566 |
    | MILLER |  7934 | 7782 |
    +--------+-------+------+
    emp b 领导表(领导也是员工)
    +--------+-------+
    | ename  | empno |
    +--------+-------
    | JONES  |  7566 |
    | BLAKE  |  7698 | 
    | CLARK  |  7782 | 
    | KING   |  7839 | 
      FORD   |  7902 |
    +--------+-------+------+
    
    员工的领导编号 = 领导的员工编号
    	select
    		e.name '员工名',b.ename '领导名'    //从这里可以看出为啥要给表起别名
    	from
    		emp a
    	inner join 
    		emp b
    	on 
    		a.mgr = b.empno;
    		+--------+--------+
    	| 员工名      | 领导名     |
    	+--------+--------+
    	| SMITH  | FORD   |
    	| ALLEN  | BLAKE  |
    	| WARD   | BLAKE  |
    	| JONES  | KING   |
    	| MARTIN | BLAKE  |
    	| BLAKE  | KING   |
    	| CLARK  | KING   |
    	| SCOTT  | JONES  |
    	| TURNER | BLAKE  |
    	| ADAMS  | SCOTT  |
    	| JAMES  | BLAKE  |
    	| FORD   | JONES  |
    	| MILLER | CLARK  |
    	+--------+--------+
    
    
    展开全文
  • SQL的连接分为三种:内连接、外连接、交叉连接。

    万次阅读 多人点赞 2018-03-31 20:18:04
    先给出两张表:一、内连接: 内连接(INNER JOIN):有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的链接表就是数据库在做查询形成的中间表)。1、等值连接 概念:在连接条件中...

    先给出两张表:


    一、内连接:

        内连接(INNER JOIN):有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的链接表就是数据库在做查询形成的中间表)。

    1、等值连接

         概念:在连接条件中使用等于号(=)运算符,其查询结果中列出被连接表中的所有列,包括其中的重复列。

    例子:

    select  * 

    from T_student s,T_class c 

    where s.classId = c.classId

    等价于

    select  * 

     from T_student s inner join T_class c on s.classId = c.classId

    2、不等连接

       概念:在连接条件中使用除等于号之外运算符(>、<、<>、>=、<=、!>和!<)

    select * from T_student s inner join T_class c on s.classId <> c.classId

    二、外连接

        外连接分为左连接(LEFT JOIN)或左外连接(LEFT OUTER JOIN)、右连接(RIGHT JOIN)或右外连接(RIGHT OUTER JOIN)、全连接(FULL JOIN)或全外连接(FULL OUTER JOIN)。我们就简单的叫:左连接、右连接和全连接。

    1、左连接:

        概念:返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值。

    例如:

    select  *

    from T_student s left join T_class c on s.classId = c.classId

    检索结果:

      总结:左连接显示左表全部行,和右表与左表相同行。

    2、右连接:

       概念:恰与左连接相反,返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值。

    例如:

         select * from  T_student s right join T_class c on s.classId = c.classId

    检索结果:

     总结:右连接恰与左连接相反,显示右表全部行,和左表与右表相同行。

    3、全连接:

      概念:返回左表和右表中的所有行。当某行在另一表中没有匹配行,则另一表中的列返回空值。

         select * from  T_student s full join T_class c on s.classId = c.classId

       总结:返回左表和右表中的所有行。

    三、交叉连接(CROSS JOIN):也称迪卡尔积

    概念:不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积(例如:T_student和T_class,返回4*4=16条记录),如果带where,返回或显示的是匹配的行数。

    1、不带where:

    1.    select *from T_student cross join T_class    //cross join 可以省略不写
    2.   等于
    3.    select *from T_student, T_class
    总结:相当与笛卡尔积,左表和右表组合。

    2、有where子句,往往会先生成两个表行数乘积的数据表,然后才根据where条件从中选择。

    1. select * from T_student s cross join T_class c where s.classId = c.classId   
    2.    (注:cross join后加条件只能用where,不能用on)  
          查询结果跟等值连接的查询结果是一样。


    展开全文
  • SQL多表连接查询(详细实例) http://www.xker.com/page/e2012/0708/117368.html 本文主要列举两张和三张表来讲述多表连接查询。 新建两张表: 表1:student 截图如下: 表2:course 截图如下: ...

    SQL多表连接查询(详细实例)

    http://www.xker.com/page/e2012/0708/117368.html

    展开全文
  • SQL中的内连接查询和外连接查询

    千次阅读 2019-03-14 21:35:08
    在项目开发中,单表的查询肯定无法满足所有的业务,所以很多时候都是多表的连接查询。接下来总结一下SQL中的多表关联查询,以MySQL为例。 前期准备 在数据库中创建以下几张表并添加一些数据。 1、部门表(tb_dept)...

    在项目开发中,单表的查询肯定无法满足所有的业务,所以很多时候都是多表的连接查询。接下来总结一下SQL中的多表关联查询,以MySQL为例

    前期准备

    在数据库中创建以下几张表并添加一些数据。

    1、部门表(tb_dept),如下

    2、员工表(tb_emp),如下。可以看到后勤中心是没有员工的,一会看区别。

    3、工资表(tb_salary),如下

    三张表的关系是,一个部门有多个员工,一个员工有多个工资条。

    内连接查询

    内连接查询的关键字是inner join 或者 join(不建议省略inner)。返回的是表中存在至少一个匹配的数据,那么不匹配的数据肯定就不返回了,如果都不匹配,就是空。

    在这里说一下,写多表关联查询的SQL一般分四步走:1、确定要连接的表;2、确定要查询的字段;3、确定连接方式;4、确定关联条件。

    1、查询所有部门及其下面的员工。(用员工表去连接部门表,结果也是一样的,因为上面说了,内连接的方式,返回的结果一定是匹配条件的结果)

    SELECT td.dept_id,td.dept_name,te.emp_name 
    FROM tb_dept td
    INNER JOIN tb_emp te
    ON td.dept_id = te.dept_id;

    可以看到,因为后勤中心下面没有员工,所以查询结果中就没有后勤中心(这里省略inner也可以,但是不建议这么做)。

    平时,下面这种写法也是内连接,但是可读性没有上面的强,所以,忘记这样的写法吧。

    SELECT td.dept_id,td.dept_name,te.emp_name 
    FROM tb_dept td , tb_emp te
    WHERE td.dept_id = te.dept_id ;

    2、查询所有部门及部门下的员工和员工工资(3张表关联)

    SELECT td.dept_id,td.dept_name,te.emp_name, ts.salary_sum
    	FROM tb_dept td
    	INNER JOIN tb_emp te
    	INNER JOIN tb_salary ts
    	ON td.dept_id = te.dept_id AND te.emp_id = ts.emp_id;

    查询结果

    外连接之左外连接(也称左连接)

    左外连接关键字是LEFT OUTER JOIN 或LEFT JOIN(还是不建议省略outer,可读性不强)。左外连接查询是以左边的表为基准,去匹配要连接的表,不管是否匹配条件都会以基准表的条数返回结果(这里明显不同于内连接),匹配到的数据就显示匹配到的数据,没有匹配条件的数据就显示为null。

    1、查询所有部门及下面的员工

    SELECT td.dept_id,td.dept_name,te.emp_name  
    FROM tb_dept td
    LEFT OUTER JOIN tb_emp te
    ON td.dept_id = te.dept_id ;

    查询结果

    2、查询所有部门及部门下的员工和员工工资(3张表关联)

        SELECT td.dept_id,td.dept_name,te.emp_name, ts.salary_sum
    	FROM tb_dept td
    	LEFT OUTER JOIN tb_emp te 
    	ON td.dept_id = te.dept_id
    	LEFT OUTER JOIN tb_salary ts
    	ON  te.emp_id = ts.emp_id;

    查询结果

    外连接之右外连接(也称右连接)

    右连接和左连接的理论是一样的,只是基准表发生了变化,以右边被关联表为基准(将左连接的基准表和被关联表交换位置就等价于右连接)。右连接的关键字是RIGHT OUTER JOIN或RIGHT JOIN(还是不建议省略OUTER )。

    1、查询所有部门及下面的员工

    SELECT td.dept_id,td.dept_name,te.emp_name 
    FROM tb_dept td
    RIGHT OUTER JOIN tb_emp te
    ON td.dept_id = te.dept_id; 

    查询结果(虽然和上面的内连接结果是一样的,但是要注意区别,两种方式根本不一样,假如有一个员工没有部门

    2、查询所有部门及部门下的员工和员工工资(3张表关联)

    SELECT td.dept_id,td.dept_name,te.emp_name ,ts.salary_sum
    FROM tb_dept td
    RIGHT OUTER JOIN tb_emp te
    ON td.dept_id = te.dept_id
    RIGHT OUTER JOIN tb_salary ts
    ON  te.emp_id = ts.emp_id;

    外连接之全连接查询

    全连接就是返回目标表的所有数据,有匹配的就显示,没有匹配的就为null。

    mysql没有全连接的关键字,oracle有full outer join关键字。根据全连接的定义,可以使用UNION(去重并集)关键字

    SELECT td.dept_id,td.dept_name,te.emp_name  
    FROM   tb_dept td
    LEFT OUTER JOIN tb_emp te
    ON td.dept_id = te.dept_id ;
    UNION
    SELECT td.dept_id,td.dept_name,te.emp_name  
    FROM tb_dept td 
    RIGHT OUTER JOIN tb_emp te
    ON td.dept_id = te.dept_id ;

     查询结果

    自连接查询

    自连接查询一般用作表中的某个字段的值是引用另一个字段的值。

    将tb_emp改造一下,添加一个领导字段,由于领导也是员工,所以直接用emp_id关联,如下

    张三丰有七个弟子,宋远桥和张翠山分别有个儿子(^_^)

    关键点在于虚拟出一张领导表,由于领导也是员工,所以属性都一样。

    1、查询所有员工及其直属领导的id和姓名

    SELECT te.emp_id ,te.emp_name,tleader.emp_id as leader_id, tleader.emp_name as leader_name 
    FROM tb_emp te
    LEFT OUTER JOIN tb_emp tleader
    ON te.emp_leader = tleader.emp_id;

    查询结果


    上面的工资表好像设计得不是很好,可以多增加几条数据,并给一个月份的字段标记区别一下,再做一下上面的示例,这里偷个懒不改了。

    总之,写多表关联查询的SQL的思路就分四步走:1、确定要连接的表;2、确定要查询的字段;3、确定连接方式;4、确定关联条件

    此篇完结

    展开全文
  • 内连接和并列查询

    2019-05-07 10:31:04
    内查询格式 select 属性 from 表1 inner join 表2 on 判断条件 并列查询格式 select 属性 from 表1 and 表2 where 判断条件 两种查询方式的结果是一致的,但推荐使用第一种。 ...
  • SQL查询左连接、右连接、内连接

    万次阅读 多人点赞 2018-10-02 11:28:05
    1、左连接的定义:是以左表为基础,根据ON后给出的两表的条件将两表连接起来。结果会将左表所有的查询信息列出,而右表只列出ON后条件与左表满足的部分。左连接全称为左外连接,是外连接的一种。 下边以A表和B表为...
  • Mysql中的关联查询(内连接,外连接,自连接)

    万次阅读 多人点赞 2017-12-26 19:14:25
    一,内连接查询 是指所有查询出的结果都是能够在连接的表中有对应记录的。 以t_employee(员工表)和t_dept(部门表)为例: t_employee表中的记录如下:dept代表该员工所在的部门 t_dept表中记录
  • Mysql—— 内连接、左连接、右连接以及全连接查询

    万次阅读 多人点赞 2019-08-14 10:44:52
    一、内连接查询 inner join 关键字:inner join on 语句:select * from a_table a inner join b_table b on a.a_id = b.b_id; 说明:组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集...
  • 本文要用到的样例表① vendors表:存储销售产品的供应商。供应商ID(vend_id)列用来匹配产品和供应商 vend_id为主键,且为自动增量字段 products表:包含产品目录,每行一个产品。每个产品有唯一的ID(prod_...
  • 我用内连接查询和外连接查询的结果是一样的,两者有什么不同? 需要查找两张表同时存在的数据,使用内连接需要查找两张表中一张表存在,另一张表不存在的时候使用左外链接 或 右外链接内连接的查询结果都是满足...
  • DB2内连接查询和外连接查询

    千次阅读 2017-01-25 09:14:50
    DB2内连接查询返回连接表中符合连接条件和查询条件的数据行,下面就为你详细介绍DB2内连接查询的方法,供您参考学习。  DB2内连接查询(INNER JOIN):  DB2内连接查询有两种,显式的和隐式的,返回连接表中符合...
  • MySQL高级查询——连接查询实例详解

    万次阅读 多人点赞 2016-05-16 20:39:53
    常见的高级查询包括多表连接查询、内连接查询、外连接查询与组合查询等,今天我们先来学习最常用、面试也很容易被问到的连接查询。 我们今天以一个简单的学生信息表(学生ID、学生姓名、学生性别)与一个学生成绩表...
  • 三个表内连接查询创建视图

    万次阅读 2010-08-10 13:17:00
    三个表内连接查询创建视图 create or replace view lili_memberInfo (会员编号,会员卡编号,会员姓名,会员性别,会员生日,会员电话,会员地址,证件类型,证件号码,加入日期,卡内余额,卡内积分,会员卡类型,会员卡级别...
  • 在做文本分析过程中,需要实现将两个Excel文件中的数据完成合并操作,数据合并的要求与SQL中的内连接查询的功能一致。具体要求见如下图所示:1.表一中的数据如下所示:2.表二中的数据如下所示:3.最后需要合并成的...
  • 内连接查询结果都是满足连接条件的元组。但有时我们也希望输出那些不满足连接条件的元组信息。比如,我们想知道每个学生的选课情况,包括已经选课的学生(这部分学生的学号在学生表中有,在选课表中也有,是满足...
  • 可运行SQL文件: /* Navicat MySQL Data Transfer Source Server : 练习数据库 Source Server Version : 50717 Source Host : localhost:3306 Source Database : day Target Server Type : M...
  • 多表连接查询中最常用的事内连接内连接中最常用的是等值连接,即在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。例如: select * from tb_evt_mail_...
  • 连接查询 内连接查询 外连接查询
  • HQL内连接查询,去重

    千次阅读 2017-09-04 09:47:03
    因为查询条件需要对 连接的表中的两个字段 or 条件查询 导致查询出来的记录,有重复 一. 使用 group by 主键(用这种可以 再 SELECT COUNT(*) 进行分页,记录数的统计) @Override public List getOrderList(int...
  • 之前学习mysql的时候对于老师说的左连接,右连接…之类的概念一直不清楚,模模糊糊的。工作之后理解这些名词一概念,现在把它记录一下。也希望能够帮助对于mysql中join不太清晰的朋友。这样可以根据自己的业务场景...
1 2 3 4 5 ... 20
收藏数 642,460
精华内容 256,984
关键字:

内连接查询