精华内容
下载资源
问答
  • MySQL多表连接查询

    千次阅读 2016-05-13 20:02:53
    多表连接查询是在日常开发中经常需要用到的一个操作。在此对多表连接查询做一个总结,为了便于理解本文以一个实际开发中的案例作为例子来讲解。 表结构首先我们创建三张表:用户表(t_user)、账户表(t_account)...

    连接查询是数据库查询中很重要的一个组成部分。而多表连接查询是在日常开发中经常需要用到的一个操作。在此对多表连接查询做一个总结,为了便于理解本文以一个实际开发中的案例作为例子来讲解。

    表结构

    首先我们创建三张表:用户表(t_user)、账户表(t_account)和账户流水表(t_account_info),表中的字段非常的简单,分别如下:

    t_user

    user_iduser_name
    1ricky
    2jack
    3lily
    4mike
    5kobe
    6candy

    t_account

    user_idbalance
    15000
    218000
    32000
    425000
    5150000

    t_account_info

    user_idtypeamountcreate_time
    1网购消费80001463132262
    1餐饮消费25001462132262
    1交通消费5001461532262
    2网购消费50001463132262
    2餐饮消费25001462132262
    2交通消费15001462232262
    2旅游消费250001463132262
    3网购消费20001463232262

    连接查询

    内连接

    需求:
    现在需要分别检索用户表的user_id、user_name和账户表中的balance。 显然,两个表的连接条件是:用户表的user_id=账户表的user_id。

    我们可以有两种方式,这两种是等效的

    
    SELECT u.user_id,u.user_name, a.balance FROM t_user AS u, t_account AS a WHERE u.user_id=a.user_id;
    

    另外一个是:

    
    SELECT u.user_id,u.user_name, a.balance FROM t_user AS u INNER JOIN t_account AS a WHERE u.user_id=a.user_id;
    


    外连接

    在通常的连接操作中,只有满足连接条件的元组才能作为结果输出。例如上例中t_user和t_account做连接查询的结果表中没有id为6的用户信息,原因在于他没有账户信息,在t_account中没有元组,造成t_user中这些元组在连接时被舍弃了。

    有时想以t_user为主体列出每个每个用户的基本信息及账户信息,如果某个用户没有账户,仍把舍弃的t_user元组保存到结果表中,而在t_account表的属性上填空值(NULL),这时候就需要外连接。

    1、左外联结
    左外连接列出所有左边关系(t_user)中的所有元组。

    SELECT u.user_id,u.user_name, a.balance FROM t_user AS u LEFT OUT JOIN t_account AS a WHERE u.user_id=a.user_id;

    2、右外连接
    左外连接列出所有右边关系(t_account)中的所有元组。

    SELECT u.user_id,u.user_name, a.balance FROM t_user AS u RIGHT OUT JOIN t_account AS a WHERE u.user_id=a.user_id;


    最后,为了方便测试,附上完整的表结构SQL:

    
    //建库
    CREATE DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 
    
    use test;
    
    /**建表*/
    CREATE TABLE `t_user` (
      `user_id` int(11) NOT NULL AUTO_INCREMENT,
      `user_name` varchar(20) NOT NULL,
      PRIMARY KEY (`user_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    CREATE TABLE `t_account` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `user_id` int(11) NOT NULL,
      `balance` double(9,2) NOT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY (`user_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    CREATE TABLE `t_account_info` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `user_id` int(11) NOT NULL,
      `type` varchar(20) NOT NULL,
      `amount` double(8,2) NOT NULL,
      `create_time` bigint(10) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    
    /**初始化数据*/
    INSERT INTO t_user(user_name) VALUES('ricky');
    INSERT INTO t_user(user_name) VALUES('jack');
    INSERT INTO t_user(user_name) VALUES('lily');
    INSERT INTO t_user(user_name) VALUES('mike');
    INSERT INTO t_user(user_name) VALUES('kobe');
    INSERT INTO t_user(user_name) VALUES('candy');
    
    INSERT INTO t_account(user_id,balance) VALUES(1,5000);
    INSERT INTO t_account(user_id,balance) VALUES(2,18000);
    INSERT INTO t_account(user_id,balance) VALUES(3,2000);
    INSERT INTO t_account(user_id,balance) VALUES(4,25000);
    INSERT INTO t_account(user_id,balance) VALUES(5,150000);
    
    INSERT INTO t_account_info(user_id,`type`,amount,create_time) VALUES(1,'网购消费',8000,1463132262);
    INSERT INTO t_account_info(user_id,`type`,amount,create_time) VALUES(1,'餐饮消费',2500,1462132262);
    INSERT INTO t_account_info(user_id,`type`,amount,create_time) VALUES(1,'交通消费',500,1461132262);
    INSERT INTO t_account_info(user_id,`type`,amount,create_time) VALUES(2,'网购消费',5000,1463132262);
    INSERT INTO t_account_info(user_id,`type`,amount,create_time) VALUES(2,'餐饮消费',2500,1462132262);
    INSERT INTO t_account_info(user_id,`type`,amount,create_time) VALUES(2,'交通消费',1500,1461132262);
    INSERT INTO t_account_info(user_id,`type`,amount,create_time) VALUES(2,'旅游消费',25000,1461132262);
    INSERT INTO t_account_info(user_id,`type`,amount,create_time) VALUES(3,'网购消费',2000,1463232262);
    
    
    展开全文
  • SQL语句多表连接查询语法

    万次阅读 多人点赞 2019-07-28 09:32:13
    总结:内连接就是两个的交集 ,左外连接就是左边加两交集 ,右外连接就是右边加两交集 一、外连接 1.左连接 left join 或 left outer join SQL语句:select * from student left join score on ...

     

     

    总结:内连接就是两个表的交集 ,左外连接就是左边表加两表交集 ,右外连接就是右边表加两表交集

     

     

    一、外连接

    1.左连接  left join 或 left outer join

    SQL语句:select * from student left join score on student.Num=score.Stu_id;

    2.右连接  right join 或 right outer join

    SQL语句:select * from student right join score on student.Num=score.Stu_id;

    3.完全外连接  full join 或 full outer join

    SQL语句:select * from student full join score on student.Num=score.Stu_id;

    通过上面这三种方法就可以把不同的表连接到一起,变成一张大表,之后的查询操作就简单一些了。

    交叉连接查询,这种查询方式基本不会使用,原因就是这种查询方式得到的是两个表的乘积(笛卡儿集)

    语法就是select * from a,b;则尽量不使用此语句,产生的结果过于繁琐。

     

    内连接查询,可以有效的去除笛卡尔集现象

    内连接查询分为两类:

     

    二、内连接 

    join 或 inner join

    SQL语句:select * from student inner join score on student.Num=score.Stu_id;

    此时的语句就相当于:select * from student,score where student.ID=course.ID;

     

    内连接查询分为两类:

    隐式内连接

    select * from A,B where 条件                                          隐式连接使用别名:

    select * from A 别名1,B 别名2 where 别名1.xx=别名2.xx;

    显示内连接

    select * from A inner join B on 条件 (inner可以省略)  显示连接使用别名:

    select * from A 别名1 inner join B 别名2 on 别名1.xx=别名2.xx

    举例:

    三、交叉连接

    cross join,没有where指定查询条件的子句的交叉联接将产生两表的笛卡尔积。

    SQL语句:select * from student cross join score;

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • ABP-多表连接查询

    千次阅读 2019-02-18 10:46:23
    前言:什么是多表连接查询   一:编写表查询语句--内连接 对应SQL语句: select * from Person join Telephone on Person.Id = Telephone.PersonId   第一种方式:LINQ语法 public List<Two...

    前言:什么是多表连接查询

     

    一:编写多表查询语句--内连接

    对应SQL语句:

    select * from Person  join Telephone on Person.Id = Telephone.PersonId

     

    第一种方式:LINQ语法

     public List<Twotable> GetTwo()
            {
                var query = from a in   _entityRepository.GetAll()
                            join b in _TelRepository.GetAll()
                            on a.Id equals b.PersonId
                            select new Twotable{
                                Name=a.Name,
                                Telephone=b.PhoneNumber
                            };
                return query.ToList();
            }

    第二种方式:Lambda语法

     public List<Twotable> GetTwo()
            {
                var query = _entityRepository.GetAll()
            .Join(
                    _TelRepository.GetAll(),
            top => top.Id,
            art => art.PersonId,
            (top, art) => new Twotable
            {
                Name = top.Name,
                Telephone = art.PhoneNumber
            });
                return query.ToList();
            }

    二:编写多表连接查询--左右连接

    左连接的概念:

    对应SQL语句:

    select * from Person  left join Telephone on Person.Id = Telephone.PersonId

     

    右连接的概念:

    对应SQL语句:

    select * from Person  right join Telephone on Person.Id = Telephone.PersonId

    多表查询

    左右连接,取决于 a b2个的位置 

    方法1:LINQ语法

    var leftOuterJoin = from a in _entityRepository.GetAll()
                           join b in _TelRepository.GetAll()
                            on a.Id equals b.PersonId
                            into cls from c in cls.DefaultIfEmpty()
                            select new Twotable
                            {
                                Name = a.Name,
                                Telephone = c.PhoneNumber
                            };

    方法2:Lambda语法

           var leftOuterJoin = _entityRepository.GetAll()
          .GroupJoin(
                  _TelRepository.GetAll(),
          top => top.Id,
          art => art.PersonId,
          (top, art) => new Twotable
          {
              Id = top.Id,
              Name = top.Name,
              Telephone =  art.FirstOrDefault(x => x.PersonId == top.Id).PhoneNumber
    
          }).Select(o => o);

    三:编写多表连接查询---全连接

    全连接的概念

    对应SQL语句

    select * from Person full outer join Telephone on Person.Id = Telephone.PersonId

    使用全连接:(合并左右连接就可以了)

          //右连接
                var rightOuterJoin = from b in _TelRepository.GetAll()
                            join a in _entityRepository.GetAll()
    
                              on b.PersonId equals a.Id
                              into cls
                            from c in cls.DefaultIfEmpty()
                            select new Twotable
                            {
                                Id = c.Id,
                                Name = c.Name,
                                Telephone = b.PhoneNumber
                            };
         //左连接
    
               var leftOuterJoin = from a in _entityRepository.GetAll()
                            join b in _TelRepository.GetAll()
                            on a.Id equals b.PersonId
                            into cls from c in cls.DefaultIfEmpty()
                            select new Twotable
                            {
                                Name = a.Name,
                                Telephone = c.PhoneNumber
                            };

     

    var fullOuterJoin = leftOuterJoin.Union(rightOuterJoin);

    或者

    var fullOuterJoin = leftOuterJoin.Concat(rightOuterJoin);

    番外: 

    如果想 3表 或 4表 连接,那就和SQL语句一样在下面加 join就好了

         var query = from b in _TelRepository.GetAll()
                            join a in _entityRepository.GetAll()
                              on b.PersonId equals a.Id
                              into cls
                            from c in cls.DefaultIfEmpty()
    
                              join d in _userRepository.GetAll()
                               on c.Id equals  d.Id
                                from e in cls.DefaultIfEmpty()
    
                            select new Twotable
                            {
                                Id = c.Id,
                                //Name = c.Name,
                                Name =e.Name,
                                Telephone = b.PhoneNumber
                            };

     

    展开全文
  • hibernate 实现多表连接查询

    千次阅读 2019-01-10 11:34:22
    现在有一个问题,就是实现多表连接查询,且查询结果集不与任何一个实体类对应,怎么解决呢? 举个例子: 现在有两个表,一个users用户表, 一个goods商品表,每个用户可以有个商品,而一个商品只能对应一个用户。 ...

    Hibernate主要支持两种查询方式:HQL查询和Criteria查询。前者应用较为广发,后者也只是调用封装好的接口。

    现在有一个问题,就是实现多表连接查询,且查询结果集不与任何一个实体类对应,怎么解决呢?

    举个例子:

    现在有两个表,一个users用户表, 一个goods商品表,每个用户可以有多个商品,而一个商品只能对应一个用户。

    users表中的字段:userId,userName,telephone,address
    
    goods表中的字段:goodsId,goodsName,userId
    

    现在要实现两表连接查询,查出每个用户所拥有的商品,并把该用户的信息和其商品信息显示出来。

    使用Hibernate反向生成的实体类分别是Users和Goods。

    有两种方式:
    (1)使用传统方式:
    String hql="select u.userName, u.telephone, u.address, g.goodsName from Users u, Goods g where u.userId=g.userId";
    

    根据这个查询语句,调用query.list()方法得到一个List值,这个List中的每一个值都是Object[]类型的,里面包含了查询出来的所有值,剩下的自个儿去处理就行了

    (2)增加一个映射类

    增加一个映射类UsersVoGoods.java,添加需要查询的信息相关的所有属性,本例中添加userName,telephone, address,goodsName。并为这几个属性添加setter和getter方法,增加构造函数,参数与这四个属性对应,那么可以用hql查询方式:

    String hql = "select new com.test.UsersVoGoods(u.userName, u.teltphone, u.address, g.goodsName) from Users u, Goods g where u.userId=g.userId";
    

    query.list()的返回值List中的值都是UsersVoGoods型的,直接使用get()就能获取。

    其实不增加映射类也是可以的,只需要在Users.java实体类里增加一个构造函数,函数参数还是需要的所有字段,并为这些参数中Users实体原来没有的字段添加属性和getter() setter()即可。

    展开全文
  • Mysql 多表连接查询

    万次阅读 多人点赞 2018-05-08 19:27:21
    本文部分内容转载至:Mysql 多表查询详解,同时感谢原作者的整理与创作;
  • SQL多表连接查询(详细实例)

    千次阅读 2017-08-07 11:00:05
    本文主要列举两张和三张表来讲述多表连接查询。 新建两张表: 表1:student 截图如下:   表2:course 截图如下:   (此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两...
  • Access数据库多表连接查询

    千次阅读 2017-11-25 23:02:00
    第一次在Access中写表查询,就按照MS数据库中的写法,结果报语法错,原来Access的多表连接查询是不一样的 表A、B、C,A关联B,B关联C,均用ID键关联 一般写法:select * from A inner join B on A.ID=B.ID inner ...
  • 多表连接查询与子查询

    万次阅读 2013-10-02 14:32:41
    多表连接查询和子查询 一、连接查询 1.1使用无连接规则连接两表 所谓无连接规则连接,就是指两个表的SELECT语句中不设置任何连接条件,这样的到的链接结果是第一个表的每一行都会和第二个表的所有行进行连接,即...
  • (四)sql多表连接查询join on的用法

    万次阅读 2019-08-04 18:45:53
    (四)sql多表连接查询join on的用法
  • SQL语句基础-多表连接查询

    千次阅读 2019-06-26 14:23:00
    连接查询介绍 连接查询包括内连接,左外连接,右外连接,全外连接和交叉连接,后面连个很少使用,在此只介绍内连接和左右外连接。 以下作为示例进行单查询: Stduent Sno Sname Ssex Sbirthday Sdept Memo ...
  • 最近记忆力越来越差了,昨天脑袋一抽,居然忘记了怎么用Mybatis进行多表连接查询并在界面取值,好不容易才想起来,写篇博客,以作记录 需求分析 Mybatis多表连接查询 并在界面取值,放在同一表格下 ...
  • SQL多表连接查询

    千次阅读 2012-09-18 15:40:12
    本文主要列举两张和三张表来讲述多表连接查询。 新建两张表: 表1:student 截图如下: 表2:course 截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两...
  • mysql多表连接查询(去掉重复列)

    千次阅读 2019-10-16 01:25:37
    多表连接查询,且去掉重复列,使用 USING() select * from (select * from school left join course USING (courseid)) e left join student USING (studentid); select * from school left join cou...
  • 本篇介绍SQL 标准中定义的多表连接查询语句(JOIN),以及六种主流数据库中的实现及差异:Oracle、MySQL、Microsoft SQL Server、PostgreSQL、Db2、SQLite。
  • 数据库sql语句多表连接查询+group by分组的使用

    万次阅读 多人点赞 2018-08-01 10:47:02
    其实,在学校的一次课设中就发现了不会多表连接查询+group by分组,这次实在实习中遇到这种问题,不可能混过去了,便解决一下它吧. 问题背景: 今天写sql语句的时候,需要从两个表中查出关联的数据,并且需要分组 第...
  • sql多表连接查询

    千次阅读 多人点赞 2018-05-19 17:22:11
    初始环境如下:1:...外链接: 又分为:左连接、右连接、完全外连接 左连接:select * from student left join course on student.ID=course.ID 查询结果为: 右连接:select * from student right join c...
  • sqlserver 多表连接查询

    千次阅读 2019-04-28 14:37:04
    查询每个学生的学号、姓名、课程代号及选课成绩,不允许有重复列2. 查询每个学生的学号、姓名、课程名及选课成绩3. 查询哪些课程没人选4. 查询男生中没选课的学号、姓名、性别5.查询每个男生的选课门数,包括没有...
  • sql中多表连接查询——自连接

    千次阅读 2019-04-25 14:11:42
    多表连接的方法主要有左连接(left join)、右连接(left join)、内连接(inner join)和完全连接(full join),除此之外还有一种在同一个表中连接的方式,自连接。 自连接主要用于表中其他数据和某一数据进行...
  • Mysql多表连接查询的执行细节(一)

    万次阅读 多人点赞 2019-02-26 20:54:39
    本篇博客会说明一下问题: 1. 驱动表如何选择; 2. 两表关联查询的内在逻辑是怎样的 3. *多表连接如何执行?是先两表连接的结果集然后关联第三张表,还是一条记录贯穿全局
  • 数据库多表连接查询

    千次阅读 2014-03-06 11:19:57
     如果一个查询需要对进行操作就称为连接查询连接查询的结果集或结果称为之间的连接。  连接查询实际上是通过 各个 之间共同列 的关联性 来查询数据的,它是关系数据库查询最主要的特征。  select...
  • ORACLE中的多表连接查询

    万次阅读 2018-06-07 19:43:35
    SQL中操作,以便可以查询到所需数据,其中包括内连接、外链接、等值连接、非等值连接、左连接、右连接。 两种写法: 1. 使用逗号隔开两再用where判断。 2. 使用join语法,注意条件之间不加逗号。 ...
  • MyBatis 多表连接查询

    万次阅读 2018-06-03 16:56:23
    多表连接的两种方式(数据库逻辑模型): 1.一对一关系 2.一对关系 一、通过 resultMap 和 association 实现一对一关系 在 mapper.xml 文件里面的代码: &lt;resultMap type="...
  • Django多表连接查询

    千次阅读 2019-02-17 15:12:46
    Django连接查询 1、一对一查询 models.OneToOneField(Entry) 两个实体类:Author , Wife 1、通过 Author 找 Wife author = Author.objects.get(id=1) wife = author.wife 2、通过 Wife 找 Author ...
  • 使用Queryable.Join实现多表连接查询

    千次阅读 2016-01-08 19:11:31
    今天处理一个问题时,遇到EF Model中多表连接查询的情况,于是学习了一下Queryable.Join()的用法。由于本人是Linq新手,很地方都看不懂,只能依葫芦画瓢。 业务说明 1) 一个EF Model名为Daks,对应的DbContext名...
  • 现在有一个问题,就是实现多表连接查询,且查询结果集不与任何一个实体类对应,怎么解决呢? 举个例子: 现在有两个表,一个users用户表, 一个goods商品表,每个用户可以有个商品,而一个商品只能对应一个用户。...
  • PHP完成MySQL多表连接查询-- JOIN

    千次阅读 2019-06-08 10:09:42
    可以在 SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来联合多表查询。 JOIN 按照功能大致分为如下三类: 1、INNER JOIN(内连接,或等值连接):获取两个中字段匹配关系的记录。 2、LEFT JOIN(左连接):...
  • SSM 各种配置信息 就 不再赘述,之前一篇写过。...是2 查询返回来的结果集2 对应的 pojo ---- 2 字段 id、name、pid List&lt;Three&gt; 是3查询返回来的结果集3 对应的 pojo ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 864,818
精华内容 345,927
关键字:

多表连接查询