精华内容
下载资源
问答
  • 复杂查询

    千次阅读 2015-12-04 23:09:55
    查询显示的时候需要统计信息,但是又不能直接使用统计函数查询的话,通过子查询在FROM子句之后进行统计。 第五题:列出部门名称和这些部门的员工信息(数量、平均工资),同时列出那些没有员工的...
    第一题:列出至少有一个员工的所有部门编号、名称,并统计出这些部门的平均工资、最低工资、最高工资。
    select * from dept;

    select d.deptno,d.dname,count(empno),avg(sal),min(sal),max(sal)
    from emp e,dept d
    where d.deptno=e.deptno
    group by d.deptno,d.dname

    having count(empno)>1;


    group by 子句:

    在前面的操作中,都是对表中的每一行数据进行单独的操作。

    在有些情况下,需要把一个表中的行分为多个组,然后将这个作为一个整体,获得改组的一些信息,

    例如获取部门编号为10的员工人数,

    where:

    select  deptno,count(empno)
    from emp
    where deptno=10
    group by deptno

    having:

    select  deptno,count(empno)
    from emp
    having deptno=10
    group by deptno

    注意:having 和group by的位置交换后也是能执行出来的。


    或者某个部门的员工的平均工资等,就需要使用group by子句对表中的数据进行分组。

    select  deptno,avg(sal)
    from emp
    group by deptno
    having deptno=10



    注意:

    使用group by子句,可以根据表中的某一列或某几列对表中的数据进行分组,多个列之间使用逗号隔开。如果根据多个列进行分组,oracle会首先根据第一列进行分组,然后在分出来的组中在按照第二列进行分组。


    SQL> select deptno as "部门编号",count(*) as "员工人数",job as "工作"
      2  from emp
      3  group by deptno,job
      4  order by deptno
      5  ;
        部门编号       员工人数 工作
    -------- ---------- ---------
          10          1 CLERK
          10          1 MANAGER
          10          1 PRESIDENT
          20          2 ANALYST
          20          2 CLERK
          20          1 MANAGER
          30          1 CLERK
          30          1 MANAGER
          30          4 SALESMAN
     
    9 rows selected



    having子句:

    1、having子句通常与group by 子句一起使用,在完成对分组结果的统计后,

    可以使用having子句对分组的结果进行一步筛选。

    2、如果在select语句中使用group by 子句,那么having子句将应用股group by子句创建的组;

         如果制定了where子句,而没有指定group by子句,那么having子句将应用于where子句的输出,并且这个输出被看做是一个组;

    3、如果在select语句中既没指定where子句,也没有制定group by子句,那么having子句将应用from子句的输出,并且将这个输出看做一个组。


    理解having子句的最好的方法就是记住select语句中的子句的处理次序:


    1、where子句只能接受from子句输出的数据;

    2、havi--例7.13在前面例7、11的语句中,添加having祖居,指定调教为员工人数大于3如下:
    select deptno as "部门编号",count(*) as "员工人数"
    from emp
    group by deptno
    having count(*)>3ng子句则可以接受来自group by,where,from子句输出的数据。


    提示:

    如果不使用group by子句,那么having子句的功能与where子句一样,都是定义搜索条件,但是having子句的搜索条件与组有关,而不是与单个的行有关。


    第二题: 列出薪金比“SMITH”或“ALLEN”多的所有员工的编号、姓名、部门名称、其领导姓名。


    --第一步:找出“SMITH”或“ALLEN”的工资
    select ename,sal
    from emp
    where ename in('SMITH','ALLEN');
    select ename,sal
    from emp
    where ename='SMITH' or ename='ALLEN';
    --第二步:以上的查询返回的多行单列的记录,按照子查询的要求在WHERE子句中写合适,
    --所以这个时候将上面的查询作为一个子查询出现,继续查询符合此要求的员工的编号、姓名。

    select e.empno,e.ename,sal
    from emp e
    where sal> any( select sal from emp where ename='SMITH' or ename='ALLEN' )
    --any:大于最小值
    --all大于最大值


    select * from emp where sal>1600
    --第三步:查询出部门的名称,引入部门表,同时增加消除笛卡尔积的条件
    select e.empno,e.ename,sal,d.dname
    from emp e,dept d
    where sal> any( select sal from emp where ename='SMITH' or ename='ALLEN' ) and e.deptno=e.deptno
    --第四步:领导的信息需要emp表自身关联
    select e.empno,e.ename,e.sal,d.dname,m.ename
    from emp e,dept d,emp m
    where e.sal>any(select sal from emp where ename='SMITH' or ename='ALLEN')  and e.deptno=e.deptno and
    e.mgr=m.empno




    any:处理select返回的多个值


    --例8.7对scott用户的emp表进行操作,获得工资大于任意一个部门的平均工资的员工信息,如下:

    --第一步:获取每一个部门的平均工资


    select deptno,avg(sal)
    from emp
    group by deptno

    --第二步:用any处理上个查询出来的多个平均值

    select * 
    from emp
    where sal>any(select avg(sal)
    from emp
    group by deptno) 



    --例8.8对scott用户的emp表进行操作,获得工资大于所用部门的平均工资的员工
    select * 
    from emp
    where sal>all(select avg(sal)
    from emp
    group by deptno)


    --获取员工和员工老板的名字
    select e.empno,e.ename||' 的老板是 '||m.ename
    from emp e,emp m
    where 
    e.mgr=m.empno


    select empno 
    from emp
    where ename='JONES'


    select empno 
    from emp
    where ename='KING'


    select * from emp;


    仔细观察这个表:


    第三题:列出所有员工的编号、姓名及其直接上级的编号、姓名,显示的结果按领导年工资的降序排列。
    select e.empno,e.ename,m.deptno,m.ename,12*(m.sal+nvl(m.comm,0))
    --员工,老板
    from emp e,emp m
    --员工的老板的编号=老板的编号
    where e.mgr=m.empno(+)
    --KING这个员工没老板
    order by 12*(m.sal) desc;


    SELECT e.empno,e.ename,m.empno,m.ename,(m.sal+NVL(m.comm,0))*12 income
    FROM emp e,emp m
    WHERE e.mgr=m.empno(+)
    ORDER BY income DESC;


    select * from emp;


    --左连接:是在检索结果中除了显示满足连接条件的行外,还显示JOIN关键字左侧表中所有满足检索条件的行。
    --例8.26使用做外链接,检索emp表和salgrade表,获取员工的工资等级。
    --为了观察做外链接的执行效果,首先使用insert语句向emp 表中添加一些记录,其中sal列的值需要小于700或者
    --大于9999,也就是不在工资的等级范围内。
    insert into emp values(7937,'Candy',null,null,null,500,null,null);
    select * from emp;
    --下面使用左连接
    select e.empno,e.ename,e.sal,d.grade
    from emp e,salgrade d
    where e.sal between d.losal and d.hisal(+)


    select empno,sal from emp;


    --使用右外连接,检索emp表和dept表中所包含的部门编号
    select distinct e.deptno as "emp表",d.deptno  as "deptno表"
    from emp e,dept d
    where e.deptno(+)=d.deptno


    dept表:


    emp表:


    注意:dept表中定义全部的部门号,当一个部门有人了才记录到emp表中。

    想显示全部的dept,就在缺失的表上加上+号。


    --3、 列出所有员工的编号、姓名及其直接上级的编号、姓名,显示的结果按领导年工资的降序排列。
    select e.empno,e.ename,m.deptno,m.ename,12*(m.sal+nvl(m.comm,0))
    --员工,老板
    from emp e,emp m
    --员工的老板的编号=老板的编号
    where e.mgr=m.empno(+)--老板
    --KING这个员工没老板
    order by 12*(m.sal) desc;
    --想显示所有的员工,必须在缺失的一个表上加+号
    --KING 的e.mgr为空  where e.mgr=m.empno(+)--老板


    第四题:列出受雇日期早于其直接上级的所有员工的编号、姓名、部门名称、部门位置、部门人数。


    --第一步:列出受雇日期早于其直接上级的所有员工的编号、姓名 —— 自身关联emp表。
    select e.empno,e.ename,m.ename
    from emp e,emp m
    where e.mgr=m.empno(+) and e.hiredate<m.hiredate


    SELECT e.empno,e.ename
    FROM emp e,emp m
    WHERE e.mgr=m.empno(+) AND e.hiredate<m.hiredate;


    --第二步:加入部门信息,继续引入部门表
    SELECT e.empno,e.ename,d.dname,d.loc
    FROM emp e,emp m,dept d
    WHERE e.mgr=m.empno(+) AND e.hiredate<m.hiredate and d.deptno=e.deptno;
    --第三步:统计部门人数,此时由于要使用统计函数,而且以上的查询也无法再直接出现统计函数,所以使用子查询完成
    SELECT e.empno,e.ename,d.dname,d.loc,temp.count
    FROM emp e,emp m,dept d,(select deptno dno,count(empno) count from emp group by deptno) temp
    WHERE e.mgr=m.empno(+) AND e.hiredate<m.hiredate and d.deptno=e.deptno
    and e.deptno=temp.dno


    select distinct deptno,temp.count
    from dept,(select deptno dno,count(empno) count from emp group by deptno) temp
    where dept.deptno=temp.dno


    注意:

    当查询显示的时候需要统计信息,但是又不能直接使用统计函数查询的话,通过子查询在FROM子句之后进行统计。



    第五题:列出部门名称和这些部门的员工信息(数量、平均工资),同时列出那些没有员工的部门。



    select  d.deptno,count(e.empno),avg(e.sal)
    from emp e,dept d
    where e.deptno(+)=d.deptno
    group by d.deptno

    外连接:

    e.deptno是缺失的,加+号

    SELECT d.deptno,d.dname,d.loc,COUNT(e.empno),AVG(e.sal)
    FROM emp e,dept d
    WHERE e.deptno(+)=d.deptno
    GROUP BY d.deptno,d.dname,d.loc;



    第六题:列出所有“CLERK”(办事员)的姓名及其部门名称,部门的人数,工资等级。


    select e.ename,d.dname,temp.count,s.grade
    from dept d,emp e,salgrade s,(select deptno dno,count(empno) count from emp group by deptno) temp
    where d.deptno=e.deptno and e.sal between s.losal and s.hisal and e.job='CLERK' and temp.dno=d.deptno


    select * from salgrade;




    select *
    from emp
    where job='CLERK'

    第七题:列出最低薪金大于1500的各种工作及从事此工作的全部雇员人数及所在部门名称、位置、平均工资。

    SELECT temp.job,temp.count,d.dname,e.ename
    FROM dept d,(
        SELECT e.job job,COUNT(e.empno) count
        FROM emp e
        GROUP BY e.job
        HAVING MIN(e.sal)>1500) temp,
        emp e
    WHERE e.deptno=d.deptno AND e.job=temp.job;
    --第一步:使用emp表按照job分组,统计最低工资(HAVING)和人数
    select e.job,count(e.empno),min(e.sal)
    from emp e
    group by e.job--统计函数是不参与分组的
    having min(e.sal)>1500
    --第二步:要查询出雇员所在的部门信息,但是以上的查询能跟dept表有关联吗?
    --以上的查询和dept表之间并没有关联字段,那么如果没有关联字段,一定会有笛卡尔积产生,
    --但是多表查询必须要消除笛卡尔积,所以必须联系;
    --以上的查询可以和emp表的job字段关联;
    --要引入的dept表也可以和emp表的deptno字段关联;
    select e.job job ,count(e.empno) count
    from emp e
    group by e.job
    having min(e.sal)>1500


    select temp.job,temp.count,d.dname,e.ename
    from dept d,(select e.job job ,count(e.empno) count
    from emp e
    group by e.job
    having min(e.sal)>1500) temp,emp e
    where e.deptno=d.deptno and temp.job=e.job
    --第三步:求出一个部门的平均工资,使用emp表在子查询中统计
    select temp.job,temp.count,d.dname,e.ename,res.avg
    from dept d,(select e.job job ,count(e.empno) count
    from emp e
    group by e.job
    having min(e.sal)>1500) temp,emp e,(select deptno dno,avg(sal) avg
    from emp
    group by deptno) res
    where e.deptno=d.deptno and temp.job=e.job and res.dno=d.deptno

    --8、列出在部门“SALES”(销售部)工作的员工姓名、基本工资、雇佣日期、部门名称、假定不知道销售部的部门编号。


    select e.ename,e.sal,e.hiredate,d.dname
    from emp e,dept d
    where e.deptno=d.deptno and d.dname='SALES'


    select * from emp;



    第九题:列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,公司的工资等级。



    select e.ename,d.deptno,d.dname,m.ename,s.grade
    from dept d,emp e,emp m,salgrade s
    where e.mgr=m.empno(+) and e.deptno=d.deptno and e.sal between s.losal and s.hisal and e.sal>(select avg(sal)
    from emp)

    第十题:列出与“SCOTT”从事相同工作的所有员工及部门名称,部门人数。

    --列出与“SCOTT”从事相同工作的所有员工及部门名称,部门人数。
    SELECT e.empno,e.ename,e.job,d.dname,temp.count
    from emp e,dept d,(select deptno dno,count(empno) count from emp e group by deptno) temp
    where e.deptno=d.deptno and temp.dno=d.deptno and e.job=(select job from emp where ename='SCOTT')AND e.ename<>'SCOTT'

    注意:e.ename<>'SCOTT'把本身除去

    11、列出公司各个工资等级雇员的数量、平均工资。


    --列出公司各个工资等级雇员的数量、平均工资。
    select s.grade,count(e.empno),avg(e.sal)
    from salgrade s,emp e
    where e.sal between s.losal and s.hisal
    group by s.grade


    12、列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金、部门名称。
    select e.ename,e.empno,e.sal,d.deptno
    from emp e,dept d
    where e.sal>all(select sal from emp where deptno=30) and e.deptno=d.deptno

    13、列出在每个部门工作的员工数量、平均工资和平均服务期限。


    select d.deptno,d.dname,d.loc,count(e.empno),avg(e.sal),AVG(MONTHS_BWTWEEN(SYSDATE,e.hiredate)/12) year

    from emp e,dept d

    --d.deptno是完整的,e.deptno 部门有人的时候,才被写在emp

    where e.deptno(+)=d.deptno

    group by d.deptno,d.dname,d.loc


    注意:平均服务期限AVG(MONTHS_BWTWEEN(SYSDATE,e.hiredate)/12) year

    14、列出所有员工的姓名、部门名称和工资。

    select e.ename,d.dname,e.sal

    from dept d,emp e

    where d.deptno=e.deptno

    15、列出所有部门的详细信息和部门人数。

    select d.deptno,d.dname,d.loc,count(e.empno)

    from dept d,emp e

    where d.deptno=e.deptno(+)

    group by d.deptno,d.dname,d.loc

    16、列出各种工作的最低工资及从事此工作的雇员姓名。

    select e.ename,e.job,e.sal

    from emp e,(select job,min(e.sal) min

    from emp e

    group by job) temp

    where temp.job=e.job and e.sal=temp.min


    17、列出各个部门的MANAGER(经理)的最低薪金、姓名、部门名称、部门人数。

    第一步:找到所有部门的经理

    select deptno,min(sal)

    from emp

    where job='MANAGER'

    group by deptno

    第二步:找到姓名,但是以上的子查询,不能再出现其他的字段

    select e.ename,e.sal

    from emp e,(

    select deptno dno,min(sal) sal

    from emp

    where job='MANAGER'

    group by deptno

    ) temp

    WHERE e.deptno=temp.dno AND e.sal=temp.sal AND e.job='MANAGER';
    第三步:加入部门的名称信息
    

    select e.ename,e.sal,e.ename

    from emp e,(

    select deptno dno,min(sal) sal

    from emp

    where job='MANAGER'

    group by deptno

    ) temp,dept d

    WHERE e.deptno=temp.dno AND e.sal=temp.sal AND e.job='MANAGER' and d.deptno=e.deptno
    第四步:统计部门人数
    

    select e.ename,e.sal,e.ename,res.count

    from emp e,(

    select deptno dno,min(sal) sal

    from emp

    where job='MANAGER'

    group by deptno

    ) temp,dept d,(SELECT deptno dno,COUNT(empno) countFROM emp GROUP BY deptno) res

    WHERE e.deptno=temp.dno AND e.sal=temp.sal AND e.job='MANAGER' and d.deptno=e.deptno and res.deptno=d.deptno
    
    
    18、列出所有员工的年工资,所在部门名称,按年薪从低到高排序。

    select d.dname,(e.sal+nvl(e.comm,0))*12 yearsal

    from dept d,emp e

    where d.deptno=e.deptno

    order by yearsal desc

    19、查出某个员工的上级主管及所在部门名称,并要求出这些主管中的薪水超过3000。

    自己写的:

    select e.empno,e.eame,d.dname,m.empno,m.ename

    from emp e,dept d

    where e.mgr=d.empno(+) and e.deptno and d.deptno and m.sal>3000

    答案:

    SELECT DISTINCT m.ename,d.dname,m.sal
    FROM emp e,emp m,dept d
    WHERE e.mgr=m.empno AND m.deptno=d.deptno AND m.sal>3000;
    20、求出部门名称中,带‘S’字符的部门员工的工资合计、部门人数。

    SELECT d.dname,SUM(e.sal),COUNT(e.empno)
    FROM emp e,dept d
    WHERE e.deptno(+)=d.deptno AND d.dname LIKE%S%’
    GROUP BY d.dname;

    21、给任职日期超过30年或者在87年雇佣的雇员加薪,加薪原则:10部门增长10%,20部门增长20%,30部门增长30%,依次类推。

    UPDATE emp SET
        sal=(1 + deptno/100)*sal
    WHERE MONTHS_BETWEEN(SYSDATE,hiredate)/12>30
        OR TO_CHAR(hiredate,’yyyy’)=1987;

    以上的所有题目作为DML操作的总结,这些题目结果都不重要,关键是解决问题的思路,这些只能通过代码的不断练习。

    二、总结

    1、 多表查询:在进行查询语句编写的时候,一定要确定所需要关联的数据表,而且只要是表的关联查询,就一定会存在笛卡尔积的问题,使用关联字段消除此问题。

    在使用多表查询的时候要考虑到左右连接的问题,Oracle之外的数据库可以使用SQL:1999语法控制左右连接;

    2、 所有的统计函数是用于进行数据统计操作的,而统计要在分组中进行(或者是单独使用),分组使用GROUP BY子句,是在某一列上存在重复数据的时候才会使用分组操作,而分组后的过滤使用HAVING子句完成,所有的分组函数可以嵌套,但是嵌套之后的分组函数之中不能再有其他的查询字段,包括分组字段;

    3、 子查询:结合限定查询、多表查询、分组统计查询完成各个复杂查询的操作,子查询一般在WHERE和FROM之后出现较多;

    4、 数据库的更新操作一定要受到事务的控制(事务的锁机制),事务的两个命令:COMMIT、ROLLBACK(解锁),每一个连接到数据库上的用户都使用一个SESSION表示;

    5、 数据表的分页查询显示依靠ROWNUM伪列,以后在开发之中必定100%要使用。

    展开全文
  • Spring boot集成mongodb-使用MongoRepository完成CURD和复杂查询

    Spring Data简介

    Spring Data 是spring的组件之一,主要目的是为了让开发者再工作中能更加轻松的完成CURD,简化代码应该是所有框架的目的吧。今天介绍的Spring-data-mongodb只是其中的一个模块而已,Spring团队的强大不言而喻,有兴趣的请移步官网查看更多模块。
    Spring-Data

    Spring Data Jpa 方法定义规范

    网上的博文关于这部分大同小异,这里只贴部分内容,详细规则可以参考官方文档。这些方法只是在特定情况下才用的到,比如MongoRepository不能完成的工作,但是在本人实际工作中MongoRepository已经覆盖了9成以上的需求,如果你感觉有什么需求它完成不了,很有可能是没有找对方法。
    Spring-Data-Jpa

    在这里插入图片描述在这里插入图片描述

    MongoRepository实战操作

    1. 新建测试项目,spring boot新建项目可以选择访问官网,并添加Web和Mongodb依赖即可。如下图所示
      在这里插入图片描述
    2. 打开项目,并修改application.properties文件添加数据源,如下所示:
    spring.data.mongodb.host=localhost
    spring.data.mongodb.port=27017
    spring.data.mongodb.database=testmongodb
    
    1. 分别新建实体类User/Repository接口UserRespository/控制器UserController
    public class User {
       private String id;
       private String userName;
       private String password;
       private int age;
       private long createTime;
       public String getId() {
          return id;
       }
       public void setId(String id) {
          this.id = id;
       }
       public String getUserName() {
          return userName;
       }
       public void setUserName(String userName) {
          this.userName = userName;
       }
       public String getPassword() {
          return password;
       }
       public void setPassword(String password) {
          this.password = password;
       }
       public int getAge() {
          return age;
       }
       public void setAge(int age) {
          this.age = age;
       }
       public long getCreateTime() {
          return createTime;
       }
       public void setCreateTime(long createTime) {
          this.createTime = createTime;
       }  
    }
    
    package com.ppw.mongoexample.repository;
    
    import org.springframework.data.mongodb.repository.MongoRepository;
    
    import com.ppw.mongoexample.model.User;
    
    public interface UserRepository extends MongoRepository<User, String>{
    	public Page<User> findByUserNameLike(String userName, Pageable pageable);
    }
    
    package com.ppw.mongoexample.controller;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.domain.Example;
    import org.springframework.data.domain.ExampleMatcher;
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.PageRequest;
    import org.springframework.data.domain.Sort;
    import org.springframework.data.domain.Sort.Order;
    import org.springframework.data.domain.Sort.Direction;
    import org.springframework.http.MediaType;
    import org.springframework.web.bind.annotation.DeleteMapping;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseStatus;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.http.HttpStatus;
    import com.ppw.mongoexample.model.User;
    import com.ppw.mongoexample.repository.UserRepository;
    
    @RestController
    @RequestMapping("/v1/user")
    public class UserController {
    
       @Autowired
       private UserRepository userRepository;
       
       @ResponseStatus(HttpStatus.CREATED)
       @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
       public User createUser(@RequestBody User user) {
          return userRepository.save(user);
       }
       
       /**
        * 根据id查询
        * @param id
        * @return
        */
       @GetMapping(value="/{id}")
       public User readUserById(@PathVariable("id") String id){
          return userRepository.findOne(id);
       }
       
       /**
        * 根据一个或者多个属性查询单个结果
        * @param name
        * @return
        */
       @GetMapping(value="/name/{name}")
       public User readUserByName(@PathVariable("name") String name){
          User user = new User();
          user.setUserName(name);
          ExampleMatcher matcher = ExampleMatcher.matching().withIgnorePaths("age","createTime");
          Example<User> example = Example.of(user, matcher);
          return userRepository.findOne(example);
       }
       
       /**
        * 根据一个或者多个属性分页查询 
        * @param pageNumber
        * @param pageSize
        * @return
        */
       @GetMapping(value = "/page/{pageNumber}/pagesize/{pageSize}/name/{name}")
       public Page<User> readUsersByPage(@PathVariable("pageNumber") int pageNumber,
             @PathVariable("pageSize") int pageSize,@PathVariable("name") String name) {
          User user = new User();
          user.setUserName(name);
          ExampleMatcher matcher = ExampleMatcher.matching().withIgnorePaths("age","createTime");
          Example<User> example = Example.of(user, matcher);
          if (pageNumber < 1) {
             pageNumber = 1;
          } else if (pageSize == 0) {
             pageSize = 20;
          }
          
          PageRequest pageable = new PageRequest(pageNumber - 1, pageSize);
          return userRepository.findAll(example, pageable);
       }
       
       /**
        * 根据用户年龄升序排序
        * @return
        */
       @GetMapping
       public List<User> readUsers(){
          
          Order order = new Order(Direction.ASC,"age");
          Sort sort = new Sort(order);
          return userRepository.findAll(sort);
       }
       
       /**
        * 模糊查询带分页
        * @param pageNumber
        * @param pageSize
        * @param keyWords
        * @return
        */
       @GetMapping(value = "/page/{pageNumber}/pagesize/{pageSize}/keyword/{keyWords}")
       public Page<User> readUsersByKeywords(@PathVariable("pageNumber") int pageNumber,
             @PathVariable("pageSize") int pageSize,@PathVariable("keyWords") String keyWords) {
          if (keyWords == null) {
             keyWords = "";
          }
          if (pageNumber < 1) {
             pageNumber = 1;
          } else if (pageSize == 0) {
             pageSize = 20;
          }
          PageRequest pageable = new PageRequest(pageNumber - 1, pageSize);
          return userRepository.findByUserNameLike(keyWords, pageable);
       }
       
       @ResponseStatus(HttpStatus.OK)
       @DeleteMapping(value="/{id}")
       public void removeUser(@PathVariable("id") String id) {
          userRepository.delete(id);
       }
    }
    

    Postman测试部分接口结果如下图所示

    1.新建用户
    在这里插入图片描述2.根据用户名模糊查询并分页
    在这里插入图片描述3.根据年龄升序排序
    在这里插入图片描述

    Mongodb截图如下

    在这里插入图片描述

    注意事项

    在使用MongoRepository的过程中,非模糊查询多配合使用Example/ExampleMatcher来完成工作,MongoRepository已经非常强大,常用功能如排序,分页都已实现,当然还有很多方法文中没有提到感兴趣的可以深入了解一下。如果MongoRepository能实现,尽量不要做冗余的工作,如果非要自定义方法才能实现,一定要符合Spring-Data的规则来定义方法名。这里有一个小坑需要注意一下,如果实体类中包含有基本数据类型的属性,那么在使用repository.find(Example)时,需要把这些属性忽略掉,因为基本数据类型在新建对象时会有默认值,这时如果你按照别的属性查找数据时,这些属性也会附带到条件里。比如上文代码中有一个根据用户名查找用户的方法,此时你期望的是在查询过程中只有用户名起作用,那么这时候就要加上下面的代码。如果不加,则条件中会多出age=0&createTime=0,查出的结果有误。

    ExampleMatcher matcher = ExampleMatcher.matching().withIgnorePaths("age","createTime");
          Example<User> example = Example.of(user, matcher);
          
    

    github地址如下

    https://github.com/wppcoder/mongo-example.git

    欢迎讨论交流,如有错误欢迎指正。

    展开全文
  • Jpa 复杂查询

    2020-01-07 15:39:18
    有时候需要通过Jpa进行复杂的查询,做个记录汇总...这样就可以使用该接口提供的这些方法,进行复杂查询;相比JPQL,其优势是类型安全,更加的面向对象 可以看到这个接口基本是围绕着Specification接口来的; 2.Sp...

    有时候需要通过Jpa进行复杂的查询,做个记录汇总,后面以便于可以进行查阅;

    1.首先Repository需要继承接口JpaSpecificationExecutor<T>,这里的T是具体的entity实例;这样就可以使用该接口提供的这些方法,进行复杂查询;相比JPQL,其优势是类型安全,更加的面向对象

    可以看到这个接口基本是围绕着Specification接口来的;

    2.Specification

    Specification中有一些默认的实现,接口只有一个就是toPredicate方法;在默认的实现中,我们可以针对查询条件进行与或非多个条件的联合查询;

    3.最佳实践

    我们可以定义一个类(最好以specs结尾),里面实现各种查询的静态方法,返回一个Specification的实现就可以了,比如

    然后查询的时候直接使用这样就可以了;

     resourcesRepository.findAll(ResourcesSpecs.test(),pagable);

    如果是多个条件查询,比如再增加一个查询条件;

     

    上面的test方法再java8可以进行简化,替换成lamb表达式

    这里的CriteriaBuilder提供了多种方法,如下所示,这里只是演示了Resource的name字段等于aaa的查询条件;

    4.针对关联的查询,可以join之后再进行判断,例如,这里的root是代表跟对象Resource,得到的join对象包含了子对象的属性

     

    展开全文
  • mysql子查询复杂查询

    千次阅读 2018-04-22 07:54:32
    课程名称MySQL数据库技术实验成绩 实验名称实验五:复杂查询学号 姓名 班级 日期 实验目的:1.掌握select语句的基本语法;2.掌握连接查询和子查询的使用方法;实验平台:MySQL+SQLyog;实验内容与步骤:以下...

    课程名称

    MySQL数据库技术

    实验

    成绩

     

    实验名称

    实验五:复杂查询

    学号

     辅导老师;陶荣

    姓名

     

    班级

     

    日期

     

    实验目的:

    1.掌握select语句的基本语法;

    2.掌握连接查询和子查询的使用方法;

    实验平台:

    MySQL+SQLyog;

    实验内容与步骤:

    以下操作均在YGGL数据库中进行。

    一、子查询练习:

    1. 查找在财务部工作的员工的情况。

     

    2. 使用子查询的方法查找所有收入在2500元以下的员工的情况。

     

    3. 查找研发部年龄不低于市场部所有员工年龄的雇员姓名。

     

    4. 用子查询的方法查找研发部比市场部所有雇员收入都高的雇员的姓名。

     

    5. 查找比广告部所有员工收入都高的员工的姓名。

     

    6. 在order by中使用子查询,查询员工姓名、性别和工龄信息,要求按

    实际收入从大到小排列。

     

    二、连接查询练习:

    1. 查询每个员工的情况及其薪水的情况。

     

    2. 使用内连接的方法查询名字为“王林”的员工所在的部门。

     

    3. 使用内连接方法查找不在广告部工作的所有员工信息。

     

    4. 使用外连接方法查找所有员工的月收入。

     

    5. 查找广告部收入在2000元以上的雇员姓名及其薪水详情。

     

    6. 查询研发部在1966年以前出生的员工姓名及其薪水情况。

     

     

    实验总结(结论或问题分析):

          select * from `employees`  where 部门号 IN(select 部门号 FROM departments where 部门号=1);

     

    select * from employees e,`salary`s

    where e.编号=s.编号 and 收入<2500

     

    select 姓名  from employees e,departments d

    where 出生日期>=all(SELECT 出生日期 from employees e, departments d

    where e.部门号=d.部门号 and d.部门名称='财务部')

    and e.部门号=d.部门号 AND d.部门名称='研发部';

     

    select 姓名  from employees e,departments d,salary s

    where 收入>all(select 收入 FROM employees e,departments d, salary s

    where e.部门号=d.部门号 and s.编号=e.编号 and d.部门名称='市场部')

     and e.部门号=d.部门号 and s.编号=e.编号 and d.部门名称='研发部';

     

     

    SELECT 姓名 from `employees` e where 部门号 in(

    SELECT 部门号 FROM salary s where 

     收入>=all (select 收入 from salary where 编号 

     IN(select 编号 from employees e where  部门号=(select 

     部门号 from departments where 部门名称='研发部'))));

     

     SELECT 姓名,性别 from employees e,`salary`s

     where s.编号=e.编号 ORDER BY 收入 desc;

     

    select * from employees e,salary s 

    where s.编号=e.编号;

     

    select 部门名称 from employees e 

    inner join departments d  on e.部门号=d.部门号

    where e.姓名='王加';

     

    select* from employees e 

    inner join departments d  on e.部门号=d.部门号

    where d.部门号!='广告部';

     

    select * from employees e left outer join salary s 

    on s.编号=e.编号;

     

     

    select * from employees e inner join salary s 

    on s.编号=e.编号 inner join departments d on  

    e.部门号=d.部门号 where s.收入>2000;

     

     

    select * from employees e inner join salary s 

    on s.编号=e.编号 inner join departments d on  

    e.部门号=d.部门号 where e.出生日期>'1966' and d.部门名称='研发部';

     

     

     

     

     

     

            

     

     

     

         

     

     

     

                

     

     

     

     

     

     

     

     

     

     

     

     

                

                

    展开全文
  • sql复杂查询

    2017-04-13 11:13:37
    前言 前面的一篇文章写了下数据库设计和SQL语句基础,里面都是简单的增删改查,而且对最重要的查询也没有深入研究,实在是罪过,那么本文就sql复杂的查询语句进行探讨,也是当作一个记录好了复杂查询No.1假设我们...
  • 1.QueryDsl的复杂查询方法 queryDSL复杂查询的分页和自定义排序实现
  • 实验四 复杂查询

    千次阅读 2020-11-01 21:34:23
    实验四 复杂查询 教材使用的是雷景生版本的《数据库原理及应用(第2版)》 一、 实验目的: 掌握两个表以上的连接查询的应用,包括嵌套查询。 二、 实验内容: 初始表格三张: Student表、Course表和SC表 1、 ...
  • 数据库的复杂查询

    2019-10-31 17:31:49
    实验三 数据库的复杂查询 一、实验学时 2学时 二、实验目的 (1)熟练掌握复杂查询的select语句。 (2)熟练掌握连接查询方法。 (3)熟练掌握嵌套查询方法。 三、实验要求 (1)硬件设备:奔腾II或奔腾II...
  • SQL server 复杂查询

    千次阅读 2018-11-05 21:31:28
    通过本次实验使学生掌握数据库中表数据的各种复杂查询操作。 2.实验内容 连接查询 嵌套查询 谓词查询 3.实验环境 Windows SQL Server 实验步骤及结果 创建一个数据库,文件名为“教学” 打开“教学”数据库 ...
  • 1.非聚合复杂查询(展示了非聚合复杂查询的常用流程) public List<EsBlog> elasticSerchTest() { //1.创建QueryBuilder(即设置查询条件)这儿创建的是组合查询(也叫多条件查询),后面会介绍更多的查询方法 /...
  • 或是多个范围查询等更复杂的查询, 往往需要设计复杂的接口入参, 为了简化开发, 本文通过设计一个基于MyBatis-Plus的Wrapper类条件构造器()的公共方法类, 以一种规范化的FROM接收入参, 实现复杂查询 同时, 此方法...
  • mongoTemplate复杂查询之排除条件查询

    千次阅读 2018-12-18 18:35:27
    因为任务需要,刚接触MongoDB,需要实现复杂查询,却苦于网上找不到涉及排除某些条件的复杂条件查询,一番苦心自己终于琢磨出符合需求的结果,特此展示给大家 LocalDate finish = LocalDate.parse("2018-12-...
  • Mysql进行复杂查询

    千次阅读 2017-10-19 17:05:31
    Mysql进行复杂查询   1.查询“生物”课程比“物理”课程成绩高的所有学生的学号;  思路: (1)获取所有选了 生物 课程的学生的成绩(学号,成绩) --临时表  (2)获取所有选了 物理 课程的学生的成绩(学号...
  • 复杂查询,我们说复杂查询就是简单查询,限定查询,排序,分组,多表,子查询合计起来的查询 对于复杂查询,我们一点要先分析,按照思路来一步一步解决 以下是我总结的分析思路: 首先,确定两个表 dept emp 问题1...
  • MySQL查询语句之复杂查询_day04

    万次阅读 2017-06-29 21:57:56
    MySQL复杂查询 今天写的内容是在昨天的基础上,先要掌握好昨天的内容,今天进行一些复杂查询介绍。 一、分组查询: 1、关键字: GROUP BY   2、用法:GROUP BY 语句用于结合合计函数 (比如 SUM) ,根据一个或多...
  • Database之SQLSever:SQL命令实现查询之多表查询、嵌套查询、分页复杂查询,删除表内重复记录数据、外连接等案例之详细攻略 目录 SQL命令实现查询之多表查询、嵌套查询、分页复杂查询 1、多表查询 2、嵌套...
  • 实验五 数据查询——复杂查询

    千次阅读 2015-04-02 20:05:18
    实验五 数据查询——复杂查询一、实验目的 1.掌握SQLServer查询语句的基本语法 2.熟练使用SQL的Select语句对多表进行查询 3.熟练掌握并运用SQLServer所提供的函数 4.熟练使用SQL语句进行复杂的连接操作 二、...
  • SolrJ 复杂查询 高亮显示

    千次阅读 2017-12-08 21:09:28
    SolrJ 复杂查询 高亮显示上一章搭建了Solr服务器和导入了商品数据,本章通过SolrJ去学习Solr在企业中的运用。笔者最先是通过公司的云客服系统接触的Solr,几百万的留言秒秒钟就查询并高亮显示,不同的广告员还可以只...
  • 使用JdbcTemplate完成复杂查询 一.Repository package com.cy.repository; import com.cy.entity.Homework; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype....
  • oralce之复杂查询举例

    2015-07-25 19:50:34
    oralce之复杂查询举例
  • 使用PostgreSQL进行复杂查询

    千次阅读 2018-10-19 09:07:59
    SQL复杂查询与视图。 数据说明 现在有一个spj数据库,其中有四个表,分别为: S P J SPJ 供应商代码表 零件表 工程项目表 供应情况表 SQL查询 创建视图 将零件表P表与供应情况SPJ表、供应商S表结合,...
  • MySQL 复杂查询语句2

    2018-05-23 08:50:58
    MySQL复杂查询一、分组查询:1、关键字:GROUP BY 2、用法:GROUP BY 语句用于结合合计函数 (比如 SUM) ,根据一个或多个列对结果集进行分组,合计函数常常需要添加 GROUP BY 语句。 下面的给了两张表 一张是emp,...
  • sql server 复杂查询语句

    千次阅读 2018-09-12 22:12:39
    --复杂查询 --聚合函数,例如min,max --1,最低工资 select min(sal) from emp select * from emp select ename,sal from emp where sal=(select min(sal) from emp) --sql语句执行顺序从右向左, --2,...
  • 文章目录MyBatisPlus实现复杂查询1. wapper介绍2. AbstractWrapper2.1 ge、gt、le、lt、isNull、isNotNull2.2 eq、ne2.3 between、notBetween2.4 allEq2.5 like、notLike、likeLeft、likeRight2.6 in、notIn、inSql...
  • 1.Maven包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa<...import org.springframework.data.jpa.domain.Spec
  • 主要记录使用repository的分页查询,session执行cql,apoc执行cql的复杂查询
  • //mp实现复杂查询操作 @Test public void testSelectQuery() { //创建QueryWrapper对象 QueryWrapper<User> wrapper = new QueryWrapper<>(); //通过QueryWrapper设置条件 //ge、gt、le、lt //...
  • Mongo的$where复杂查询

    2019-04-02 18:27:10
    $where复杂查询,查询实例: mongo中存在文档:woker { "id":1001, "age":20, "workInfo":{ "salary":6000.00, "ability":"compute It work" }, "brotherAge":21 "degree": 3 //0初中,1高中,2专...
  • solr复杂查询条件查询(排序、过滤、高亮) package cn.kingdee; import java.util.List; import java.util.Map; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj....
  • SQL复杂查询

    千次阅读 2020-04-01 11:30:48
    对各表中的数据进行不同条件的连接查询和嵌套查询; 1) 查询每个学生及其选课情况 2) 查询每门课的间接先修课 3) 将STUDENT,SC进行右连接 4) 查询有不及格的学生姓名和所在系 5) 查询所有成绩为优秀...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,569
精华内容 14,227
关键字:

复杂查询