精华内容
下载资源
问答
  • Mysql自连接查询

    2019-07-10 12:00:13
    Mysql自连接查询 ...

    Mysql自连接查询

                        版权声明:本文为博主原创文章,未经博主允许不得转载。                        https://blog.csdn.net/xiaoyaoyulinger/article/details/54175483                    </div>
                                                    <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-cd6c485e8b.css">
                                        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-cd6c485e8b.css">
                <div class="htmledit_views" id="content_views">
    

    自连接查询

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

    1. 创建数据表:
    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. 插入数据:
    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。
    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;
    查询结果:




    展开全文
  • mysql 自连接查询

    2019-01-27 19:51:00
    自连接查询自连接就是一个表和它自身进行连接,是多表连接的特殊情况。在自连接查询中,要先在FROM字句中为表分别定义两个不同的别名,然后使用这两个别名写出一个连接条件。 条件比较在同一个表中的情况*/ --任务...

    /*

    自连接查询
    自连接就是一个表和它自身进行连接,是多表连接的特殊情况。
    在自连接查询中,要先在FROM字句中为表分别定义两个不同的别名,
    然后使用这两个别名写出一个连接条件。

    条件比较在同一个表中的情况
    */

    --任务1:查询课程类别相同但是开课系部不同的课程信息
    --                 要求显示课程编号、课程名称、课程类别与系部
    --                 编号,并按照课程编号升序排列查询结果。

    SELECT DISTINCT c1.CouNo 课程编号, c1.CouName 课程名称, 
                                       c1.Kind 课程类别, c1.DepartNo 系部编号
    FROM Course c1 JOIN Course c2 ON c1.Kind=c2.Kind  AND c1.DepartNo!=c2.DepartNo
    ORDER BY c1.CouNo;

    转载于:https://www.cnblogs.com/draymond/p/10327751.html

    展开全文
  • mysql自连接查询

    2021-03-31 21:36:54
    问题:查询数学成绩最高的学生信息和该学生班长的姓名 想法:想要获取班长的学号必须将学生表和班级表做一次内连接,但这样只能拿到学号,拿不到班长的姓名,所以用班长的学号再和学生表做一次自连接即可 ...

    1、数据库表结构如下:

    create table student(
    id int(11) primary key not null auto_increment comment '学号',
    name varchar(100),
    gender varchar(100),
    class_id int(11) not null,
    birth_day date,
    literal_degree int(11),
    math_degree int(11),
    CONSTRAINT fk_student_class_id foreign key(class_id) REFERENCES class(id)
    );
    
    create table class(
    id int(11) primary key not null auto_increment,
    name varchar(100),
    supervisor_name varchar(100),
    leader_id int(11) comment '班长学号'
    );
    

    2、测试数据

    class表
    在这里插入图片描述
    student表
    在这里插入图片描述

    3、问题描述:

    问题:查询数学成绩最高的学生信息和该学生班长的姓名

    想法:想要获取班长的学号必须将学生表和班级表做一次内连接,但这样只能拿到学号,拿不到班长的姓名,所以用班长的学号再和学生表做一次自连接即可

    select s1.id,s1.name,s1.gender,s1.class_id,s1.birth_day,s1.literal_degree,
    s1.math_degree,c.leader_id,s2.name
    from student s1,student s2,class c
    where s1.class_id=c.id and s2.id=c.leader_id 
    and s1.math_degree=(select max(math_degree) from student)
    

    在这里插入图片描述

    今天群里看到的问题,我就帮别人解答了,对自己也是一种进步

    展开全文
  • 主要介绍了Mysql自连接查询,结合实例形式分析了MySQL自连接查询的应用场景、原理及相关操作技巧,需要的朋友可以参考下
  • MySQL自连接查询的深入分析 一般的连接查询使用两张不同的表,指定连接条件,然后进行查询。自连接查询格式和普通的连接查询书写格式完全相同,只不过我们需要把一张表想象成两张表使用。 自连接查询是自己和自己...

    MySQL自连接查询的深入分析

    一般的连接查询使用两张不同的表,指定连接条件,然后进行查询。自连接查询格式和普通的连接查询书写格式完全相同,只不过我们需要把一张表想象成两张表使用。
    自连接查询是自己和自己连接,分别给一张表取两个不同的别名,然后附上连接条件。格式如下:

    select 字段列表
    from table_name alias1 join table_name alias2 
    on alias1.fieldname1=alias2.fieldname2
    ......;
    

    一、根据emp(员工)表,查询每个员工的领导,员工表的结构如下:

    create table emp(
        e_id int primary key,
        e_name char(20) not null default '',
        phone char(20) not null default '',
        leader int default null
    );
    
    insert into emp values(1,'张鹏辉','13603735588',2),(2,'王大强','13603736666',2),
    (3,'刘莉莉','13603732222',2),(4,'王安全','13603733377',2),
    (5,'王江涛','13603733366',5),(6,'刘大江','13603736644',5),
    (7,'刘鹏','13603738866',8),(8,'王大鹏','13603732635',8),
    (9,'王俊红','13603734468',8),(10,'王海军','13603735525',8);
    

    因为员工的领导也是员工,因此我们可以将emp表想象成两张表,一张为employee,一张为leader。employee表和leader表通过别名来指定,然后利用employee表的字段leader和leader表的字段e_id建立连接即可查询到每个员工的领导。代码及查询结果如下:

    mysql> select employee.e_id as 员工编号,employee.e_name as 员工姓名,
        -> employee.phone,leader.e_name as 领导
        -> from emp employee inner join emp leader
        -> on employee.leader=leader.e_id;
    +--------------+--------------+-------------+-----------+
    | 员工编号     | 员工姓名     | phone       | 领导      |
    +--------------+--------------+-------------+-----------+
    |            1 | 张鹏辉       | 13603735588 | 王大强    |
    |            2 | 王大强       | 13603736666 | 王大强    |
    |            3 | 刘莉莉       | 13603732222 | 王大强    |
    |            4 | 王安全       | 13603733377 | 王大强    |
    |            5 | 王江涛       | 13603733366 | 王江涛    |
    |            6 | 刘大江       | 13603736644 | 王江涛    |
    |            7 | 刘鹏         | 13603738866 | 王大鹏    |
    |            8 | 王大鹏       | 13603732635 | 王大鹏    |
    |            9 | 王俊红       | 13603734468 | 王大鹏    |
    |           10 | 王海军       | 13603735525 | 王大鹏    |
    +--------------+--------------+-------------+-----------+
    10 rows in set (0.00 sec)
    

    二、area表的结构如下:

    create table area(
        area_id int primary key,
        area_name char(50) not null default '',
        parent_id int not null default 0
    );
    
    insert into area values(1,'河南省',0),(2,'湖北省',0),(3,'河北省',0),
    (101,'郑州市',1),(102,'新乡市',1),(10101,'金水区',101),
    (10102,'中牟县',101),(10103,'巩义市',101),(10104,'新郑市',101),
    (10201,'红旗区',102),(10202,'牧野区',102),(10203,'辉县市',102),
    (10204,'原阳县',102),(10205,'修武县',102),(10206,'获嘉县',102),
    (201,'武汉市',2),(202,'宜昌市',2),(20101,'汉阳区',201),(20102,'武昌区',201),
    (20103,'青山区',201),(20104,'洪山区',201),(20201,'当阳市',202),(20202,'枝江市',202);
    

    根据area表查询某个地区所属的地区,查询命令及查询结果如下:

    mysql> select area.*,superior_area.area_name as superior_area
        ->      from area left join area superior_area
        ->      on area.parent_id=superior_area.area_id;
    +---------+-----------+-----------+---------------+
    | area_id | area_name | parent_id | superior_area |
    +---------+-----------+-----------+---------------+
    |       1 | 河南省    |         0 | NULL          |
    |       2 | 湖北省    |         0 | NULL          |
    |       3 | 河北省    |         0 | NULL          |
    |     101 | 郑州市    |         1 | 河南省        |
    |     102 | 新乡市    |         1 | 河南省        |
    |     201 | 武汉市    |         2 | 湖北省        |
    |     202 | 宜昌市    |         2 | 湖北省        |
    |   10101 | 金水区    |       101 | 郑州市        |
    |   10102 | 中牟县    |       101 | 郑州市        |
    |   10103 | 巩义市    |       101 | 郑州市        |
    |   10104 | 新郑市    |       101 | 郑州市        |
    |   10201 | 红旗区    |       102 | 新乡市        |
    |   10202 | 牧野区    |       102 | 新乡市        |
    |   10203 | 辉县市    |       102 | 新乡市        |
    |   10204 | 原阳县    |       102 | 新乡市        |
    |   10205 | 修武县    |       102 | 新乡市        |
    |   10206 | 获嘉县    |       102 | 新乡市        |
    |   20101 | 汉阳区    |       201 | 武汉市        |
    |   20102 | 武昌区    |       201 | 武汉市        |
    |   20103 | 青山区    |       201 | 武汉市        |
    |   20104 | 洪山区    |       201 | 武汉市        |
    |   20201 | 当阳市    |       202 | 宜昌市        |
    |   20202 | 枝江市    |       202 | 宜昌市        |
    +---------+-----------+-----------+---------------+
    23 rows in set (0.00 sec)
    

    根据area表查询某个地区所包含的其他地区,查询命令如下:

    mysql> select area.area_id,area.area_name,
        -> subordinate_area.area_id as subordinate_area_id,
        -> subordinate_area.area_name as subordinate_area_name
        -> from area subordinate_area right join area
        -> on subordinate_area.parent_id=area.area_id;
    +---------+-----------+---------------------+-----------------------+
    | area_id | area_name | subordinate_area_id | subordinate_area_name |
    +---------+-----------+---------------------+-----------------------+
    |       1 | 河南省    |                 101 | 郑州市                |
    |       1 | 河南省    |                 102 | 新乡市                |
    |       2 | 湖北省    |                 201 | 武汉市                |
    |       2 | 湖北省    |                 202 | 宜昌市                |
    |     101 | 郑州市    |               10101 | 金水区                |
    |     101 | 郑州市    |               10102 | 中牟县                |
    |     101 | 郑州市    |               10103 | 巩义市                |
    |     101 | 郑州市    |               10104 | 新郑市                |
    |     102 | 新乡市    |               10201 | 红旗区                |
    |     102 | 新乡市    |               10202 | 牧野区                |
    |     102 | 新乡市    |               10203 | 辉县市                |
    |     102 | 新乡市    |               10204 | 原阳县                |
    |     102 | 新乡市    |               10205 | 修武县                |
    |     102 | 新乡市    |               10206 | 获嘉县                |
    |     201 | 武汉市    |               20101 | 汉阳区                |
    |     201 | 武汉市    |               20102 | 武昌区                |
    |     201 | 武汉市    |               20103 | 青山区                |
    |     201 | 武汉市    |               20104 | 洪山区                |
    |     202 | 宜昌市    |               20201 | 当阳市                |
    |     202 | 宜昌市    |               20202 | 枝江市                |
    |       3 | 河北省    |                NULL | NULL                  |
    |   10101 | 金水区    |                NULL | NULL                  |
    |   10102 | 中牟县    |                NULL | NULL                  |
    |   10103 | 巩义市    |                NULL | NULL                  |
    |   10104 | 新郑市    |                NULL | NULL                  |
    |   10201 | 红旗区    |                NULL | NULL                  |
    |   10202 | 牧野区    |                NULL | NULL                  |
    |   10203 | 辉县市    |                NULL | NULL                  |
    |   10204 | 原阳县    |                NULL | NULL                  |
    |   10205 | 修武县    |                NULL | NULL                  |
    |   10206 | 获嘉县    |                NULL | NULL                  |
    |   20101 | 汉阳区    |                NULL | NULL                  |
    |   20102 | 武昌区    |                NULL | NULL                  |
    |   20103 | 青山区    |                NULL | NULL                  |
    |   20104 | 洪山区    |                NULL | NULL                  |
    |   20201 | 当阳市    |                NULL | NULL                  |
    |   20202 | 枝江市    |                NULL | NULL                  |
    +---------+-----------+---------------------+-----------------------+
    37 rows in set (0.00 sec)
    

    还可以利用分组(Group by)改变显示方式,代码如下:

    mysql> select area.area_id,area.area_name,
        -> group_concat(subordinate_area.area_name) as subordinate_area_name
        -> from area subordinate_area right join area
        -> on subordinate_area.parent_id=area.area_id
        -> group by area.area_id;
    +---------+-----------+-------------------------------------------------------------+
    | area_id | area_name | subordinate_area_name                                       |
    +---------+-----------+-------------------------------------------------------------+
    |       1 | 河南省    | 郑州市,新乡市                                               |
    |       2 | 湖北省    | 宜昌市,武汉市                                               |
    |       3 | 河北省    | NULL                                                        |
    |     101 | 郑州市    | 新郑市,金水区,中牟县,巩义市                                 |
    |     102 | 新乡市    | 修武县,红旗区,获嘉县,牧野区,辉县市,原阳县                   |
    |     201 | 武汉市    | 青山区,洪山区,汉阳区,武昌区                                 |
    |     202 | 宜昌市    | 当阳市,枝江市                                               |
    |   10101 | 金水区    | NULL                                                        |
    |   10102 | 中牟县    | NULL                                                        |
    |   10103 | 巩义市    | NULL                                                        |
    |   10104 | 新郑市    | NULL                                                        |
    |   10201 | 红旗区    | NULL                                                        |
    |   10202 | 牧野区    | NULL                                                        |
    |   10203 | 辉县市    | NULL                                                        |
    |   10204 | 原阳县    | NULL                                                        |
    |   10205 | 修武县    | NULL                                                        |
    |   10206 | 获嘉县    | NULL                                                        |
    |   20101 | 汉阳区    | NULL                                                        |
    |   20102 | 武昌区    | NULL                                                        |
    |   20103 | 青山区    | NULL                                                        |
    |   20104 | 洪山区    | NULL                                                        |
    |   20201 | 当阳市    | NULL                                                        |
    |   20202 | 枝江市    | NULL                                                        |
    +---------+-----------+-------------------------------------------------------------+
    23 rows in set (0.00 sec)
    
    展开全文
  • mysql 自连接查询数据

    2019-10-05 08:55:23
    今天项目BOSS提了个sql语句需求,我听得稀里糊涂,没办法,一步步讨论、实践,最终搞定。... 2 Navicat MySQL Data Transfer 3 4 Source Server : localhost_3306 5 Source Server Version : 50623 6 Sou...
  • 本文实例讲述了Mysql自连接查询。分享给大家供大家参考,具体如下:自连接查询假想以下场景:某一电商网站想要对站内产品做层级分类,一个类别下面有若干子类,子类下面也会有别的子类。例如数码产品这个类别下面有...
  • 同一个表链接查询自连接的次数是否会显著影响查询性能 自己已经做了实验,在1000000数据量下,查询性能很好,并且查询的响应时间并不随自连接的次数增加而增加;但是自己还不是很放心这样的查询设计,希望大家...
  • 1. 自连接查询 左表和右表是同一个表,根据连接查询条件查询两个表中的数据。 区域表效果图 例1:查询省的名称为“山西省”的所有城市 创建areas表: create table areas( id varchar(30) not null ...
  • 自连接查询属于联表查询中特殊的一种 联表查询是两张表采用7中join方式 依据两张表不同字段相同数据进行数据查询 那么一张表如何进行联表查询呢? 就是采用自连接的查询方式 自连接说白了就是把一张表分成两张 然后...
  • Mysql——连接查询

    2020-12-02 19:22:10
    Mysql——连接查询连接查询分类笛卡尔乘积现象内连接之等值连接内连接之非等值连接自连接外连接 连接查询 连接查询,也可以叫跨表查询,需要关联多个表进行查询。 在实际开发中,大部分的情况下都不是从单表中查询...
  • MySQL自连接

    2019-10-09 20:52:05
    MySQL自连接就是在同一张表上自己连接自己,参与连接的表是同一张表,通过设置表别名虚拟出两张表。 当我们想将表中行与同一表中的其他行组合或运算时,可以使用自连接。要执行自连接操作必须使用表别名来帮助MySQL...
  • 自连接查询 内连接查询 查询两个表中符合条件的共有记录 内连接查询效果图: 内连接查询语法格式: select 字段 from 表1 inner join 表2 on 表1.字段1 = 表2.字段2 inner join 就是内连接查询关键字 on 就是...
  • 现在有个一次性需求需要将所有的分类查询出来保存到excel,格式如下: 一级分类id 一级分类名称 二级分类id 二级分类名称 三级分类id 三级分类名称 查询SQL 如下所示: select c1.id as 一级分类id,...
  • MySQL数据库连接查询

    2020-10-20 07:51:49
    5. 自连接查询 1. 连接查询的介绍 连接查询可以实现多个表的查询,当查询的字段数据来自不同的表就可以使用连接查询来完成。 连接查询可以分为: 内连接查询 左连接查询 右连接查询 自连接查询 2. 内连接查询 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,379
精华内容 1,351
关键字:

mysql自连接查询

mysql 订阅