自连接查询_mysql 自然连接查询 - CSDN
精华内容
参与话题
  • Mysql自连接查询

    万次阅读 多人点赞 2017-01-07 17:05:04
    自连接查询 假想以下场景:某一电商网站想要对站内产品做层级分类,一个类别下面有若干子类,子类下面也会有别的子类。例如数码产品这个类别下面有笔记本,台式机,智能手机等;笔记本,台式机,智能手机又可以按照...

    自连接查询

    假想以下场景:某一电商网站想要对站内产品做层级分类,一个类别下面有若干子类,子类下面也会有别的子类。例如数码产品这个类别下面有笔记本,台式机,智能手机等;笔记本,台式机,智能手机又可以按照品牌分类;品牌又可以按照价格分类,等等。也许这些分类会达到一个很深的层次,呈现一种树状的结构。那么这些数据要怎么在数据库中表示呢?我们可以在数据库中创建两个字段来存储id和类别名称,使用第三个字段存储类别的子类或者父类的id,最后通过自连接去查询想要的结果。
    自连接查询其实等同于连接查询,需要两张表,只不过它的左表(父表)和右表(子表)都是自己。做自连接查询的时候,是自己和自己连接,分别给父表和子表取两个不同的别名,然后附上连接条件。看下面的例子:

    1. 创建数据表:
    create table tdb_cates(
    	id smallint primary key auto_increment,
    	cate_name varchar(20) not null,
    	parent_id smallint not null
    );
    注:cate_name表示分类的名称,parent_id表示父类的id。

    2. 插入数据:
    insert into tdb_cates(cate_name, parent_id) values('数码产品', 0);
    insert into tdb_cates(cate_name, parent_id) values('家用产品', 0);
    insert into tdb_cates(cate_name, parent_id) values('笔记本', 1);
    insert into tdb_cates(cate_name, parent_id) values('智能手机', 1);
    insert into tdb_cates(cate_name, parent_id) values('电器', 2);
    insert into tdb_cates(cate_name, parent_id) values('家具', 2);
    insert into tdb_cates(cate_name, parent_id) values('冰箱', 5);
    insert into tdb_cates(cate_name, parent_id) values('洗衣机', 5);
    insert into tdb_cates(cate_name, parent_id) values('汽车品牌', 0);
    insert into tdb_cates(cate_name, parent_id) values('别克', 9);
    insert into tdb_cates(cate_name, parent_id) values('宝马', 9);
    insert into tdb_cates(cate_name, parent_id) values('雪佛兰', 9);
    insert into tdb_cates(cate_name, parent_id) values('家纺', 0);
    查询结果:


    3. 查询所有分类以及分类的父类:假想有左右两张表(都是tdb_cates),左表是子表,右表是父表;查询子表的id,子表的cate_name,父表的cate_name;连接条件是子表的parent_id等于父表的id。
    select s.id, s.cate_name, p.cate_name from tdb_cates s left join tdb_cates p on s.parent_id=p.id;
    查询结果:


    4.  查询所有分类以及分类的子类:还是假想有左右两张表(都是tdb_cates),左表是子表,右表是父表;查询子表的id,子表的cate_name,父表的cate_name;连接条件是子表的id等于父表的parent_id。
    select s.id, s.cate_name, p.cate_name from tdb_cates s left join tdb_cates p on p.parent_id=s.id;
    查询结果:




    展开全文
  • 要求查询所有员工的姓名及其直接上级的姓名,没有领导的员工也需要查询 先看‘要求查询所有员工的姓名及其直接上级的姓名’: SELECT * from emp t1,emp t2 where t1.mgr=t2.id 结果: 说明这个语句是复制...

    emp表:

     

    要求查询所有员工的姓名及其直接上级的姓名,没有领导的员工也需要查询

     

    先看‘要求查询所有员工的姓名及其直接上级的姓名’:

    SELECT * from emp t1,emp t2 where t1.mgr=t2.id

    结果:

     

    说明这个语句是复制成两份表

    1.以t1.mgr为主,从1004开始匹配t2.id里相同的值(即找到1004这个id),就是进行类似笛卡尔积,相合并成一行

    2.第一个1004完成匹配后,在进行下一行的mgr即1006匹配等号右边的t2.id,匹配成功

    3.在进行下一行匹配,直至完成所有匹配,即得出如上图所示结果

    以下无关了,把题目做完而已

    然后没有领导的员工也需要查询,既左连接

    	SELECT t1.ename,t2.ename mgr from emp t1 left join emp t2 on t1.mgr=t2.id

     

    展开全文
  • 连接、外连接和自连接查询

    万次阅读 多人点赞 2012-02-20 00:42:26
    表1:teacher +----+--------+ | id | name | +----+--------+ | 1 | 刘德华 | | 2 | 张学友 | | 4 | 黎明 | +----+--------+ 表2:student +----+------+--------+ ...+----+------+----
    表1:teacher
    +----+--------+
    | id | name   |
    +----+--------+
    |  1 | 刘德华 |
    |  2 | 张学友 |
    |  4 | 黎明   |
    +----+--------+
    表2:student
    +----+------+--------+
    | id | name | tea_id |
    +----+------+--------+
    |  1 | 张三 |      1 |
    |  2 | 李四 |      1 |
    |  3 | 王五 |      1 |
    |  4 | 赵六 |      2 |
    |  5 | 孙七 |      2 |
    +----+------+--------+


    1.内连接:在每个表中找出符合条件的共有记录。[x inner join y on...]
    第一种写法:(相当于多表查询,用的是where!)
    select t.*,s.* from teacher t,student s where t.id=s.tea_id;
    第二种写法:(inner省略了)
    select t.*,s.* from teacher t join student s on t.id=s.tea_id;
    第三种写法:
    select t.*,s.* from teacher t inner join student s on t.id=s.tea_id;


    +----+--------+----+------+--------+
    | id | name   | id | name | tea_id |
    +----+--------+----+------+--------+
    |  1 | 刘德华 |  1 | 张三 |      1 |
    |  1 | 刘德华 |  2 | 李四 |      1 |
    |  1 | 刘德华 |  3 | 王五 |      1 |
    |  2 | 张学友 |  4 | 赵六 |      2 |
    |  2 | 张学友 |  5 | 孙七 |      2 |
    +----+--------+----+------+--------+


    2.外连接有三种方式:左连接,右连接和全连接。
    2.1 左连接:根据左表的记录,在被连接的右表中找出符合条件的记录与之匹配
    找不到与左表匹配的,用null表示。[x left [outer] join y on...]
    第一种写法:
    select t.*,s.* from teacher t left join student s on t.id=s.tea_id;
    第二种写法:
    select t.*,s.* from teacher t left outer join student s on t.id=s.tea_id;


    +----+--------+------+------+--------+
    | id | name   | id   | name | tea_id |
    +----+--------+------+------+--------+
    |  1 | 刘德华 |    1 | 张三 |      1 |
    |  1 | 刘德华 |    2 | 李四 |      1 |
    |  1 | 刘德华 |    3 | 王五 |      1 |
    |  2 | 张学友 |    4 | 赵六 |      2 |
    |  2 | 张学友 |    5 | 孙七 |      2 |
    |  4 | 黎明   | NULL | NULL |   NULL |
    +----+--------+------+------+--------+


    2.2 右连接:根据右表的记录,在被连接的左表中找出符合条件的记录与之匹配,
    找不到匹配的,用null填充。[x right [outer] join y on...]
    第一种写法:
    select t.*,s.* from teacher t right join student s on t.id=s.tea_id;
    第二种写法:
    select t.*,s.* from teacher t right outer join student s on t.id=s.tea_id;


    +------+--------+----+------+--------+
    | id   | name   | id | name | tea_id |
    +------+--------+----+------+--------+
    |    1 | 刘德华 |  1 | 张三 |      1 |
    |    1 | 刘德华 |  2 | 李四 |      1 |
    |    1 | 刘德华 |  3 | 王五 |      1 |
    |    2 | 张学友 |  4 | 赵六 |      2 |
    |    2 | 张学友 |  5 | 孙七 |      2 |
    +------+--------+----+------+--------+


    2.3 全连接:返回符合条件的所有表的记录,没有与之匹配的,用null表示(结果是左连接和右连接的并集)
    第一种写法:
    select t.*,s.* from teacher t full join student s on t.id=s.tea_id;
    第二种写法:
    select t.*,s.* from teacher t full outer join student s on t.id=s.tea_id;


    3 交叉连接(结果是笛卡尔积)
    select t.*,s.* from teacher t cross join student s;
    等效于:
    select t.*,s.* from teacher t,student s;
    +----+--------+----+------+--------+
    | id | name   | id | name | tea_id |
    +----+--------+----+------+--------+
    |  1 | 刘德华 |  1 | 张三 |      1 |
    |  2 | 张学友 |  1 | 张三 |      1 |
    |  4 | 黎明   |  1 | 张三 |      1 |
    |  1 | 刘德华 |  2 | 李四 |      1 |
    |  2 | 张学友 |  2 | 李四 |      1 |
    |  4 | 黎明   |  2 | 李四 |      1 |
    |  1 | 刘德华 |  3 | 王五 |      1 |
    |  2 | 张学友 |  3 | 王五 |      1 |
    |  4 | 黎明   |  3 | 王五 |      1 |
    |  1 | 刘德华 |  4 | 赵六 |      2 |
    |  2 | 张学友 |  4 | 赵六 |      2 |
    |  4 | 黎明   |  4 | 赵六 |      2 |
    |  1 | 刘德华 |  5 | 孙七 |      2 |
    |  2 | 张学友 |  5 | 孙七 |      2 |
    |  4 | 黎明   |  5 | 孙七 |      2 |
    +----+--------+----+------+--------+


    5自连接:连接的表都是同一个表,同样可以由内连接,外连接各种组合
    方式,按实际应用去组合。
    SELECT a.*,b.* FROM table_1 a,table_1 b WHERE a.[name]=b.[name] --连接的两表是同一个表,别称不一样




    SELECT a.*,b.* FROM table_1 a LEFT JOIN table_1 b ON a.[name]=b.[name] --左连接写法

    展开全文
  • 自连接查询

    千次阅读 2018-03-24 14:43:13
    自连接查询假想以下场景:某一电商网站想要对站内产品做层级分类,一个类别下面有若干子类,子类下面也会有别的子类。例如数码产品这个类别下面有笔记本,台式机,智能手机等;笔记本,台式机,智能手机又可以按照...

    自连接查询

    假想以下场景:某一电商网站想要对站内产品做层级分类,一个类别下面有若干子类,子类下面也会有别的子类。例如数码产品这个类别下面有笔记本,台式机,智能手机等;笔记本,台式机,智能手机又可以按照品牌分类;品牌又可以按照价格分类,等等。也许这些分类会达到一个很深的层次,呈现一种树状的结构。那么这些数据要怎么在数据库中表示呢?我们可以在数据库中创建两个字段来存储id和类别名称,使用第三个字段存储类别的子类或者父类的id,最后通过自连接去查询想要的结果。
    自连接查询其实等同于连接查询,需要两张表,只不过它的左表(父表)和右表(子表)都是自己。做自连接查询的时候,是自己和自己连接,分别给父表和子表取两个不同的别名,然后附上连接条件。看下面的例子:

    1. 创建数据表:
    [java] view plain copy
    1. create table tdb_cates(  
    2.     id smallint primary key auto_increment,  
    3.     cate_name varchar(20) not null,  
    4.     parent_id smallint not null  
    5. );  
    注:cate_name表示分类的名称,parent_id表示父类的id。

    2. 插入数据:
    [java] view plain copy
    1. insert into tdb_cates(cate_name, parent_id) values('数码产品'0);  
    2. insert into tdb_cates(cate_name, parent_id) values('家用产品'0);  
    3. insert into tdb_cates(cate_name, parent_id) values('笔记本'1);  
    4. insert into tdb_cates(cate_name, parent_id) values('智能手机'1);  
    5. insert into tdb_cates(cate_name, parent_id) values('电器'2);  
    6. insert into tdb_cates(cate_name, parent_id) values('家具'2);  
    7. insert into tdb_cates(cate_name, parent_id) values('冰箱'5);  
    8. insert into tdb_cates(cate_name, parent_id) values('洗衣机'5);  
    9. insert into tdb_cates(cate_name, parent_id) values('汽车品牌'0);  
    10. insert into tdb_cates(cate_name, parent_id) values('别克'9);  
    11. insert into tdb_cates(cate_name, parent_id) values('宝马'9);  
    12. insert into tdb_cates(cate_name, parent_id) values('雪佛兰'9);  
    13. insert into tdb_cates(cate_name, parent_id) values('家纺'0);  
    查询结果:


    3. 查询所有分类以及分类的父类:假想有左右两张表(都是tdb_cates),左表是子表,右表是父表;查询子表的id,子表的cate_name,父表的cate_name;连接条件是子表的parent_id等于父表的id。
    [java] view plain copy
    1. select s.id, s.cate_name, p.cate_name from tdb_cates s left join tdb_cates p on s.parent_id=p.id;  
    查询结果:


    4.  查询所有分类以及分类的子类:还是假想有左右两张表(都是tdb_cates),左表是子表,右表是父表;查询子表的id,子表的cate_name,父表的cate_name;连接条件是子表的id等于父表的parent_id。
    [java] view plain copy
    1. select s.id, s.cate_name, p.cate_name from tdb_cates s left join tdb_cates p on p.parent_id=s.id;  
    查询结果:

    展开全文
  • sql内连接、外连接和自连接查询

    万次阅读 多人点赞 2015-01-07 21:54:33
    通常在项目中对表的查询都是关联多张表,多表查询就涉及到sql的内连接、外连接和自连接查询。本篇文章将简单的介绍这些sql连接的使用,希望对大家有所帮助。 二. 数据准备: 先准备两张表: 1. 学生表:student ...
  • 问题:我们在Oracle数据库中,如果需求要查询出 EMP 表中的所有员工及员工对应的领导时,就需要用到自连接查询:查询语句如下:select e.empno,e.ename,e.mgr from emp e,emp b where e.empno = b.mgr; 但是,我们...
  • sql 自连接查询结果

    千次阅读 2018-06-29 19:21:19
    drop table guojia; create table guojia(name varchar2(20)); insert into guojia(name)values('中国'); insert into guojia(name)values('美国'); insert into guojia(name)values('巴西'); insert into guojia...
  • 最近无事,闲暇之余琢磨了一下RBAC权限管理,...就是查询权限的时候,将该权限的子权限集合一次性全查出来。废话不多说,直接见代码(后台是ssm,下面给出mybatis的代码)。。 SELECT p1.
  • sql 自连接的理解和使用

    千次阅读 2019-05-14 11:02:21
    =数学成绩”的学生姓名,这时就可以使用自连接查询: select 【学生姓名】 from 【成绩表】AS a,【成绩表】 AS b where a.【主键ID】=b.【主键ID】 and a.【成绩】>=b.【成绩】 and a.【课程名称】='语文' and...
  • sql中多表连接查询——连接

    千次阅读 2019-04-25 14:11:42
    多表连接的方法主要有左连接(left join)、右连接(left join)、内连接(inner join)和完全连接(full join),除此之外还有一种在同一个表中连接的方式,自连接自连接主要用于表中其他数据和某一数据进行...
  • 1.掌握涉及一个以上数据表的查询方法。 2.掌握等值连接 3.掌握自然连接 4.掌握非等值连接 5.掌握自身连接、外连接和复合条件连接 本次实验sql脚本: INSERT [dbo].[T] ([TNO], [TN], [SEX], [AGE], [PROF...
  • oracle连接查询详解

    万次阅读 2013-06-10 17:19:07
    连接查询是数据库查询语句中使用频率很高的查询方式,下面根据Oracle提供的官方文档学习一下连接查询: 一 Equijoins 等值连接:  等值连接是条件连接在连接运算符为“=”号时的特例。(相对于非等值连接,如:...
  • Mysql中的关联查询(内连接,外连接自连接)

    万次阅读 多人点赞 2017-12-26 19:14:25
    在使用数据库查询语句时,单表的查询有时候不能满足项目的业务需求,在项目开发过程中,有很多需求都是要涉及到多表的连接查询,总结一下mysql中的多表关联查询 一,内连接查询 是指所有查询出的结果都是能够在连接...
  • SQL SELECT(复杂查询)之 连接 & 子查询 解析 一、连接概念:把一张表 当做多个表使用...自己与一张与自己完全一样的从表建立关系 进行连接查询 以下举例所用表 employees表:字段如下employee_id, first_name, las
  • MySql自身连接查询

    千次阅读 2019-04-13 09:28:44
    一直没用到自身连接查询,今天做习题,遇到了,不多说,上代码: *题目: 查询和李军同性别并同班的同学SNAME 这是用到的表 22 土办法: Select sname from student where ssex=(select ssex fromstudent where ...
  • SQL语句自连接

    千次阅读 2019-01-03 16:31:55
    之前一直不太懂自连接里面的逻辑,不太会应用,遇到也就得过且过了,之后在一场很重要的面试中遇到了,很尴尬。所以遇到什么问题真的要弄懂弄透不断扫盲~ 通过栗子来说明吧。 栗子1: 题目要求是在要求返回员工中,...
  • SQL中的连接查询与嵌套查询

    万次阅读 多人点赞 2017-04-13 23:12:46
    连接查询 若一个查询同时涉及两个或两个以上的表,则称之为连接查询连接查询是数据库中最最要的查询, 包括: 1、等值连接查询 2、自然连接查询 3、非等值连接查询 4、自身连接查询 5、外连接查询 6、复合条件查询...
  • MySQL 联结 自连接

    千次阅读 2020-01-05 20:06:48
    联结顾名思义就是把一张表假设为两张一样的表,然后在做“多表查询” 例如想于下方表中找出与在“爱艺奇”公司的客户同名的顾客。 第一步:找出在“爱艺奇”的客户的姓名,第二步:从全表中去查询姓名与第一步查询...
  • 1.左连接(left join) 例如:select * from a left join b on (a.id= b.id and a.level = '1' ) =========>a 表数据全部显示2.右连接(right join) 例如:select * from a right join b on (a.id= b....
  • 先来看代码: SELECT cust_id,cust_name,cust_contact FROM Customers WHERE cust_name=(SELECT cust_name  FROM Customers  WHERE cust_contact="...自连接是很让人困惑不解的! 因为: 结构及其简单,但是逻辑...
1 2 3 4 5 ... 20
收藏数 1,220,350
精华内容 488,140
关键字:

自连接查询