精华内容
下载资源
问答
  • SQL一对多,子表关联查询

    千次阅读 2018-12-03 13:08:10
    SQL一对多,子表关联查询 两张表:主表A(合作伙伴),从表B(维修方式) 表关系:A:B-----1:N 表A: 只有一条 partner_id为A20181203120246889b15e990d72464a的合作伙伴 表B: 主从表关联字段:partner_id 目前从...

    SQL一对多,子表关联查询


    两张表:主表A(合作伙伴),从表B(维修方式)
    表关系:A:B-----1:N
    表A:
    只有2条合作伙伴记录

    在这里插入图片描述
    表B:

    在这里插入图片描述
    主从表关联字段:partner_id

    目前从表B中有两条合作伙伴,共对应5条维修方式。
    检索要求:查出支持 【到店、邮寄、上门】的合作伙伴。

    SQL写法,可以是:

    SELECT * FROM A  
    where exists (select 1 from B where A.partner_id=B.partner_id and B.service_method='到店') 
     and  exists (select 1 from B where A.partner_id=B.partner_id and B.service_method='邮寄')
     and  exists (select 1 from B where A.partner_id=B.partner_id and B.service_method='上门')
    

    检索结果:仅出来一条 partner_id为A20181203120246889b15e990d72464a的合作伙伴。

    展开全文
  • 我现在有两张表 table1,table2,其中table1的字段(id,name),表table2的字段(id, ...需要查询出来 (name和status为0的总数)的集合该怎么写sql?status的值只有0或者1. table1的id和table2的table1_Id是主外键关联的。
  • sql 一对多查询分页

    千次阅读 2017-02-10 15:47:06
    sql 1对多查询(关联查询)时进行分页,以mysql举例

    原理:先对主表进行了分页查询,然后再进行关联查询(下面用mysql举例)


    重点部分是(select * from user limit 0,2) u ,其实这句就是对主表先进行了一次分页查询,并查出所有数据,那么接下来的关联查询,就会在这个主表查询出来的结果里进行了

    SELECT
    	u.id,
    	u.login_name,
    	u.remark,
    	r.id AS role_id,
    	r.role_name,
    	r.app_id,
    	r.web_page_ids,
    	r.remark AS roleRemark,
    	f.id AS function_id,
    	f.function_name,
    	f.function_icon,
    	f.url,
    	f.remark AS functionRemark
    FROM
    	(select * from user limit 0,2) u
    LEFT JOIN user_role ur ON u.id = ur.user_id
    LEFT JOIN role r ON ur.role_id = r.id
    LEFT JOIN user_function uf ON u.id = uf.user_id
    LEFT JOIN FUNCTION f ON uf.function_id = f.id

    下面这出一张效果图,只查询出了前面两个用户,而前面查出来的16条数据,都是属于用户1的。



    展开全文
  • MyBatis实现一对一,一对多关联查询

    万次阅读 多人点赞 2019-09-25 00:20:31
    关联查询是几个表联合查询,只查询一次,通过在resultMap里面的association,collection节点配置一对一,一对多的类就可以完成 具体实现如下 准备数据库表结构与数据 班级classes与老师teacher是一对一的关系 班级...

    MyBatis如何实现一对一,一对多查询的?

    可以通过关联查询实现。关联查询是几个表联合查询,只查询一次,通过在resultMap里面的association,collection节点配置一对一,一对多的类就可以完成

    具体实现如下

    准备数据库表结构与数据

    班级classes与老师teacher是一对一的关系

    班级classes与学生student是一对多的关系

    
    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for classes
    -- ----------------------------
    DROP TABLE IF EXISTS `classes`;
    CREATE TABLE `classes`  (
      `c_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '班级id',
      `c_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '班级名',
      `teacher_id` int(11) NULL DEFAULT NULL COMMENT '老师id',
      PRIMARY KEY (`c_id`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic COMMENT '班级表';
    
    -- ----------------------------
    -- Records of classes
    -- ----------------------------
    INSERT INTO `classes` VALUES (1, '高三2班', 1);
    INSERT INTO `classes` VALUES (2, '高一4班', 2);
    
    -- ----------------------------
    -- Table structure for teacher
    -- ----------------------------
    DROP TABLE IF EXISTS `teacher`;
    CREATE TABLE `teacher`  (
      `t_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '老师id',
      `t_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '老师姓名',
      PRIMARY KEY (`t_id`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic COMMENT '老师表';
    
    -- ----------------------------
    -- Records of teacher
    -- ----------------------------
    INSERT INTO `teacher` VALUES (1, '老师张三');
    INSERT INTO `teacher` VALUES (2, '老师李四');
    
    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for student
    -- ----------------------------
    DROP TABLE IF EXISTS `student`;
    CREATE TABLE `student`  (
      `s_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学生id',
      `s_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '学生姓名',
      `class_id` int(11) NULL DEFAULT NULL COMMENT '班级id',
      PRIMARY KEY (`s_id`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic COMMENT '学生表';
    
    -- ----------------------------
    -- Records of student
    -- ----------------------------
    INSERT INTO `student` VALUES (1, '学生小明', 1);
    INSERT INTO `student` VALUES (2, '学生小陈', 1);
    INSERT INTO `student` VALUES (3, '学生小张', 2);
    
    SET FOREIGN_KEY_CHECKS = 1;
    

    数据库准备工作完成后,使用IDEA新建一个Spring Boot项目,工程目录如下

    新建Spring Boot项目

    在这里插入图片描述

    在pom.xml文件中添加如下依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.1.0</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    

    在application.yml文件中进行数据库和mybatis配置

    # spring配置
    spring:
      # 数据库配置
      datasource:
        type: com.zaxxer.hikari.HikariDataSource
        url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&allowMultiQueries=true&useSSL=false&tinyInt1isBit=false&serverTimezone=GMT%2B8
        driverClassName: com.mysql.cj.jdbc.Driver
        username: root
        password: root
    
    # mybatis配置
    mybatis:
      # 给实体类配置别名
      type-aliases-package: com.jourwon.*.pojo
      # 加载mybatis的mapper配置文件
      mapper-locations: classpath:mybatis/mapper/**/*Mapper.xml
      configuration:
        # 开发环境控制台打印sql语句
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
        # 开启驼峰规则自动映射字段属性值;如字段为user_name的可以映射到userName属性中
        map-underscore-to-camel-case: true
        # 设置sql执行超时时间,以秒为单位的全局sql超时时间设置,当超出了设置的超时时间时,会抛出SQLTimeoutException
        default-statement-timeout: 30
        # 解决查询返回结果含null没有对应字段值问题
        call-setters-on-nulls: true
    

    新建老师类Teacher

    @Data
    public class Teacher {
    
        private int id;
    
        private String name;
    
    }
    

    新建班级类Classes

    @Data
    public class Classes {
    
        private int id;
    
        private String name;
    
        private Teacher teacher;
    
        private List<Student> studentList;
    
    
    }
    

    新建学生类Student

    @Data
    public class Student {
    
        private int id;
    
        private String name;
    
    }
    

    新建ClassesMapper.xml映射文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.jourwon.mybatis.mapper.ClassesMapper">
    
        <!-- 一对一关联查询 -->
        <select id="listClasses" parameterType="int" resultMap="ClassesResultMap">
    		select * from classes c,teacher t where c.teacher_id=t.t_id and c.c_id=#{id}
    	</select>
    
        <resultMap type="com.jourwon.mybatis.pojo.Classes" id="ClassesResultMap">
            <!-- 实体类的字段名和数据表的字段名映射 -->
            <id property="id" column="c_id"/>
            <result property="name" column="c_name"/>
            <association property="teacher" javaType="com.jourwon.mybatis.pojo.Teacher">
                <id property="id" column="t_id"/>
                <result property="name" column="t_name"/>
            </association>
        </resultMap>
    
        <!-- 一对多关联查询 -->
        <select id="listClasses2" parameterType="int" resultMap="ClassesResultMap2">
    		select * from classes c,teacher t,student s where c.teacher_id=t.t_id and c.c_id=s.class_id and c.c_id=#{id}
    	</select>
    
        <resultMap type="com.jourwon.mybatis.pojo.Classes" id="ClassesResultMap2">
            <id property="id" column="c_id"/>
            <result property="name" column="c_name"/>
            <association property="teacher" javaType="com.jourwon.mybatis.pojo.Teacher">
                <id property="id" column="t_id"/>
                <result property="name" column="t_name"/>
            </association>
            <collection property="studentList" ofType="com.jourwon.mybatis.pojo.Student">
                <id property="id" column="s_id"/>
                <result property="name" column="s_name"/>
            </collection>
        </resultMap>
    
    
    </mapper>
    

    Application类

    @MapperScan(basePackages = {"com.jourwon.mybatis.**.mapper"})
    @SpringBootApplication
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
    }
    

    测试类

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class ApplicationTests {
    
        @Autowired
        private ClassesMapper classesMapper;
    
        /**
         * Description: 测试班级与老师一对一关联关系
         *
         * @author JourWon
         * @date 2019/9/24 23:18
         * @param 
         * @return void
         */
        @Test
        public void test01() {
    
            List<Classes> classes = classesMapper.listClasses(1);
            for (Classes aClass : classes) {
                System.out.println(classes);
            }
    
        }
    
        /**
         * Description: 测试班级与学生一对多关联关系
         *
         * @author JourWon
         * @date 2019/9/24 23:19
         * @param 
         * @return void
         */
        @Test
        public void test02() {
    
            List<Classes> classes = classesMapper.listClasses2(1);
            for (Classes aClass : classes) {
                System.out.println(classes);
            }
    
        }
    
    }
    

    测试结果

    test01()测试结果输出

    ==>  Preparing: select * from classes c,teacher t where c.teacher_id=t.t_id and c.c_id=? 
    ==> Parameters: 1(Integer)
    <==    Columns: c_id, c_name, teacher_id, t_id, t_name
    <==        Row: 1, 高三2, 1, 1, 老师张三
    <==      Total: 1
    Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@140d1230]
    [Classes(id=1, name=高三2, teacher=Teacher(id=1, name=老师张三), studentList=null)]
    

    test02()测试结果输出

    ==>  Preparing: select * from classes c,teacher t,student s where c.teacher_id=t.t_id and c.c_id=s.class_id and c.c_id=? 
    ==> Parameters: 1(Integer)
    <==    Columns: c_id, c_name, teacher_id, t_id, t_name, s_id, s_name, class_id
    <==        Row: 1, 高三2, 1, 1, 老师张三, 1, 学生小明, 1
    <==        Row: 1, 高三2, 1, 1, 老师张三, 2, 学生小陈, 1
    <==      Total: 2
    Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@140d1230]
    [Classes(id=1, name=高三2, teacher=Teacher(id=1, name=老师张三), studentList=[Student(id=1, name=学生小明), Student(id=2, name=学生小陈)])]
    

    所以,一对一关联查询需要在resultMap里面配置association,一对多关联查询需要在resultMap里面配置collection节点

    展开全文
  • SQL语句关联查询语法

    千次阅读 2021-03-03 10:11:37
    **sql语句关联查询语法** 、外连接 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...
                           **sql语句多表关联查询语法**
    

    一、外连接

    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 student,score;则尽量不使用此语句,产生的结果过于繁琐。

    二、内连接

    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;

    三、交叉连接

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

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

    四、结构不同的表连接

    当两表为多对多关系的时候,我们需要建立一个中间表student_score,中间表至少要有两表的主键。

    SQL语句:select s.Name,C.Cname from student_score as sc left join student as s on s.Sno=sc.Sno left join score as c on c.Cno=sc.Cno

    select C_name,grade from student left join score on student.Num=score.Stu_id where name=‘李五一’;
    红色部分即中间表,是集合两表所有内容的一张总表。

    五、UNION操作符用于合并两个或多个select语句的结果集。

    UNION内部的SELECT语句必须拥有相同数量的列,每个列也必须拥有相似的数据类型,每条SELECT语句中的列的顺序必须相同。

    select Num from student union select Stu_id from score;
    union操作符是默认查重的,如果允许重复的值,就可以使用union all 。对于两张结构相同的表,union也可以把他们合并成一张表:

    select * from student1 union select *from student2;
    六、子查询

    有时候,查询时需要的条件是另外一个select语句的结果,就会使用到子查询。

    1.带IN关键字的子查询

    SQL语句:select * from student where Num IN(select Stu_id from score);

    2.带EXISTS关键字的子查询

    exists内查询返回一个真价值,若返回true时,外查询进行查询,否则外查询不进行查询。

    SQL语句:select * from student where exists(select * from score where C_name=‘计算机’);

    3.带ANY关键字的子查询

    使用ANY关键字只要有一个满足,就通过该条件来执行外查询。

    SQL语句:select sname,(date_format(from_days(now())-to_days(birthday)),’%Y’)+0) as ‘年龄’ from student where birthday>ANY(select birthday from student where bumen=‘计算机系’);

    4.带ALL关键字的子查询

    使用ALL关键字必须满足所有的内层查询语句返回的所有结果,才执行外查询

    SQL语句:select sname,(date_format(from_days(now())-to_days(birthday)),’%Y’)+0) as ‘年龄’ from student where birthday>ALL(select birthday from student where bumen=‘计算机系’);

    展开全文
  • 可以用sql直接实现下图的任意种形式吗![图片说明](https://img-ask.csdn.net/upload/201710/19/1508401941_485897.png)
  • SQL语言关联查询

    千次阅读 2020-05-25 22:59:45
    、外连接 外连接可分为:左连接、右连接、完全外连接。 1、左连接 left join 或 left outer join SQL语句:select * from student left join course on student.ID=course.ID 执行结果: 左...
  • mybatis用户角色权限一对多关联查询

    千次阅读 2017-08-24 11:06:00
    mybatis一对多关联查询案例 1.需求 2.数据库说明 3.实体说明 4.mybatis SQL语句编写 一.需求 在做角色权限管理时,需要根据用户名查询其对应的所有角色以及拥有的所有权限二.数据库说明 数据库有如下几个表 用户...
  • Mybatis 关联查询(一对一与一对多

    万次阅读 2019-08-18 19:55:11
    数据库表与表之间的关系: 1、一对一查询 ...如果从用户信息出发查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单。 sql语句: SELECT o.id, o.user_id userId, o.number, o.cre...
  • 一对多关联导致数据发散的SQL优化经验

    千次阅读 多人点赞 2020-07-27 10:25:15
    而我在工作中写SQL经常遇见的一个问题就是一对多关联导致数据发散。因此,这篇文章,主要记录一对多关联导致数据发散的应对方案。 多表关联优化的例子 我之前写了一个SQL,运行了一个多小时,也没有运行出来。下面我...
  • mybatis一对多关联查询两种方式

    万次阅读 2018-12-24 00:01:06
    mybatis一对多关联查询两种方式前提:方式一:方式二: 前提: 现在有两张表,学生表跟教师表,一个教师对应多个学生 教师表: CREATE TABLE `teacher` ( `id` int(11) PRIMARY KEY, `name` varchar(20) , `age` ...
  • Mybatis关联查询一对多和多对一XML配置详解

    万次阅读 多人点赞 2017-12-21 10:53:05
    平时在开发过程中dao、bean和XML文件都是自动生成的,很少写XML的配置关系,今天记录一下mybatis的关联查询中的多对一和一对多的情况。 首先是有两张表(学生表Student和老师Teacher表),为了更易懂,这里只设置了...
  • sql的三种关联查询

    千次阅读 2016-11-18 20:59:01
    sql表之间的关联查询分为两种:内联,和外联。
  • 注意:在mybatis的部分版本中发现当两个表的主键列名一致,比如都是id时,配置关联查询时子表只能返回1条数据,在这里提供种简单的方法,避免大量修改文件,由于我的源码不便公开,请大家看这里的源码:...
  • Java中一对多关联查询sql思想

    千次阅读 2017-04-30 20:41:18
    需要往外查询数据,一对多的思想其实就是在insert into 数据的时候 存入另一个表的一个主键或者一个能唯一识别这条数据的字段。当插入成功的时候,这个时候a 表数据库可能存的是 b 表里面的用户ID或者是C 表的主键亦...
  • SQL一对多查询

    万次阅读 2019-03-19 11:03:31
    常见的业务中我们都会发现到订单就是一个非常显眼的“一对多”典例。 结构:一个大的订单可以有多个“小订单”(订单详情),每个“小订单”都对应有多个商品。 首先看下表结构: 订单表:(SYS_Order) 订单ID ...
  • mybatis实现多表一对一,一对多,多对多关联查询

    万次阅读 多人点赞 2018-02-03 15:40:08
    1、一对一 关键字:association 作用:针对pojo对象属性的映射  property:pojo的属性名  javaType:pojo类名 (1) 嵌套结果: 使用嵌套结果映射来处理重复的联合结果的子集 <!-- 1、...
  • SQL实现一对多、多对多建表与查询

    千次阅读 2021-03-01 17:11:40
    之前在做网页开发的时候一直用Sqlalchemy来操作数据库,当我用到自关联多对多和自关联一对多的时候,sqlalchemy的配置会有一些辅助的参数,配置起来很麻烦,灵机一动我就想了一下,为什么不能直接写sql呢!...
  • 1.1 一对多查询 案例:查询所有订单信息及订单...1.1.1 Sql语句:三张表的关联查询 标红的分别为查询字段,查询的表,关联查询的条件 SELECT  orders.*,  user.username,  user.address,  orderdetail.idorderde
  • 动态sql if 标签 <!-- 演示动态sql-if标签的使用情景 --> <select id="getUserByWhere" parameterType="user" resultType="com.itheima.mybatis.pojo.User"> <!-- SELECT * FROM USER WHERE ...
  • sql关联查询,子查询的优化

    千次阅读 2018-04-03 17:03:31
    项目中接收离职同事的统计部分代码的优化,客户反映随着时间查询...,不说直接上sql代码SELECT ajjbxx.ssbm, pqNum , round(CASE WHEN ISNULL(pqNum, 2) - ISNULL(zfNum, 0) - ISNULL(jyNum, 0) = 0 THEN 1 EL...
  • 现有三张表如下(其中用户和角色之间是一对多关联关系): 用户表(user): id, username id username 1 user1 2 user2 角色表(role): id, role_name id role_name 1 role1 2 role2 ...
  • Mybatis关联查询一对一和一对多的实现

    万次阅读 多人点赞 2015-05-13 09:20:43
    本文主要讲了使用Mybatis实现关联查询,分为一对一和一对多两种情况,最后并对ResultMap进行一个简要说明。
  • 在使用PageHelper+mybatis作为数据分页查询的时候,如果使用了collection进行一对多关联的时候有可能出现分页不正确的问题
  • mybatis关联查询问题(一对多、多对一)

    万次阅读 多人点赞 2014-06-05 12:14:10
    mybatis 提供了高级的关联查询功能,一对多,多对多,多对一
  • 一对多,如果多个表字段名相同,要记住使用别名,否则多条数据只显示一条 &lt;resultMap type="com.example.demo.model.TuserModel" id="extendMapper"&gt; &lt;id column="...
  • resultMap元素(结果映射)【*****】级联关系【*****】4.1 一对一关联查询 (association) - 用javaType来指定对象类型4.2 一对多、多对多关联查询 (collection) - 用ofType来制定对象类型 映射器  
  • 最近项目里要返回一个下面这种json的数据...首先想到的是用一对多关联查询,一条sql搞定,然后用collection自己组装就可以 <resultMap id="CheckItemResponse" type="com.xxx.response.subject.CheckItemDtoRe...
  • 1.1 实现一对查询: resultType:使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。 如果没有查询结果的特殊要求建议使用resultType。 定义专门的po类...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 291,409
精华内容 116,563
关键字:

sql一对多关联查询