一个group里查找topN行的sql

flink sql的分组聚合 TUMBLE(TABLE 表名, DESCRIPTOR(时间字段), INTERVAL ‘10’ MINUTES))将需要分组的字段放在group by子句即可,把时间字段放在group by下可实现开窗的功能。滚动:SELECT window_start, window_end, SUM(price)滑动:SELECT window_start, window_end, SUM(price)滑动窗口:HOP(time_attr, interval, interval)第四种,GROUP BY CUBE。 阅读详情
问题

     在很多统计需求里,我们会有这样的问题:把一些记录某个字段分组,然后找到每个分组最小的某个列,并且返回包含这个最小列的这一行。

     一个示例表test(select * from test):

gid    age    username
1      11     zhangsan
1      13     zhangsan
1      15     lisi
1      10     wangwu
2      20     liusanjie
2      23     wumingshi
1      10     hh

  比如一个机构的人员,每个人有年龄(age),名字(username)还有一个所在group(gid)

 我们经常有这样的问题:找到每个group年龄最小的成员。

直观的想法

   对于这样的问题,最先想到的当然是聚集函数(aggregate function),你可能这样:

select gid,min(age) from test;

  但是怎么得到年龄最小的员工的名字呢?你或许想这样写:

select gid,min(age),username from test;

 可惜这样会得到一个语法错误,比如postgresql的提示:column "test.gid" must appear in the GROUP BY clause or be used in an aggregate function

为什么会这样呢?我们是根据gid来分组的,一个gid当然只有一个最小的age,但是可能会有多个不同的name,它当然没法返回给你,因为它不知道是哪个。

也许你会说,我要的就是age最小的那行对应的name,可惜min函数不提供此功能*。*

那你也许想这样:

select gid,min(age),min(username) from test;

非常遗憾,你会发现返回的名字和年龄会对不上,返回的年龄是最小的,名字也是最小的!名字还有大小?嗯,当你跟人合作写了一本书,然后被告知:排名不分先后,按姓氏笔划排列,你可能抱怨自己的姓氏了。

问题的推广

    推广一些,我们可能想知道某个部门年龄最小的3个员工。

我们来回忆或者猜测一下sql是怎么实现聚集函数,或者这么说:如果让你来实现聚集函数,你会怎么实现?

聚集函数的可能实现方法(欢迎补充)

1. 排序

    一种思路是根据group by的字段排序,然后对同一个group的记录根据min函数的字段排序:

select * from test order by gid,age ;
gid    age    username
1    10    "wangwu"
1    10    "hh"
1    11    "zhangsan"
1    13    "zhangsan"
1    15    "lisi"
2    20    "liusanjie"
2    23    "wumingshi"

   然后遍历每个分组,找第一行就可以了,时间复杂度O(nlogn),主要就是排序的复杂度,空间复杂度是O(n),也就是WHERE命中的记录数。

2. Hash分组

  代码如下:

     Map<GroupKey,Object> map=new HashMap<GroupKey,Object>();
     for each row which matches where condition
        GroupKey key=row.getGroupKey();
        Object val=row.getValue();
        Object old=map.get(key);
        if(old==null) map.put(key,val);
        else map.put(key,min(old,val);

时间复杂度O(n),空间复杂度O(groupCount),可能更多,参考下面的PG自定义聚集函数部分。

根据上面的分析,数据库实现应该是第二种方式(我的猜测)。

对于找topN而不是top one:第一种方法没有任何变化,而第二种方案可能需要一个堆(Heap)这样的数据结构来高效的保存top N

解决方法

参考内容:

http://archives.postgresql.org/pgsql-performance/2003-11/msg00135.php

http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

http://stackoverflow.com/questions/723054/extra-fields-with-sql-min-group-by

http://sql-ex.ru/help/select16.php

标准SQL的解决方法

Top one

      思路一: 使用子查询

--SELECT * FROM test AS v
--WHERE v.age = (
--	SELECT  min(age) FROM test
--	WHERE gid = v.gid
--	)

      可以这样来阅读这个sql:对于test里的每一行,首先用一个子查询找到这个组最小的年龄,如果这行的年龄等于这个最小年龄,那么就是满足条件的记录。

      有一点绕口?仔细想想为什么这样是正确的!

      时间复杂度:如果没有索引,那么是O(n*n),如果gid有索引,那么会好一点,好的程度取决于group count,如果只有一个gid,那么就退化到O(n*n),如果每个人都在不同的group,那么会是最好的O(n)。

      问题:如果一个组的最小年龄不止一行,那么所有的都会返回

      思路二: 我们可以使用group by和min函数找到每个分组的最小的年龄值,然后使用自连接的技巧来找到对应的其它字段。

--select f.*
--from (
--   select gid, min(age) as minage
--   from test group by gid
--) as x inner join test as f on f.gid = x.gid and f.age = x.minage;

      这样来阅读这个sql:找到每个组的最小年龄,把它放到一个临时表 x 里,然后使用内连接找到每一行其它的字段,连接的条件是gid相同而且age是最小的age

      这个SQL返回和前面完全相同的结果,也会有多个最小值的问题。

      时间复杂度同上,但是可能比前一个会快一些(我的猜测,具体还要看优化器),因为一次找到所以的最小值然后放到内存(临时表),但是空间要比上面多用一些。

Top N

    首先解决Top2

--select *
--from test
--where age = (select min(age) from test as f where f.gid = test.gid)
--   or age = (select min(age) from test as f where f.gid = test.gid
--      and age > (select min(age) from test as f2 where f2.gid = test.gid))

        我们这样阅读它:首先找到每个组年龄最小的成员,然后找到年龄第二小的。什么是年龄第二小呢?也就是除了年龄最小    where age > (select min(age) from test as f2 where f2.gid = test.gid))
    外,年龄最小的
    用这样的思路解决Top 3就很费劲了:首先用前面的方法找到第二小的年龄,然后在所有大于第二小的年龄里寻找最小的。
    问题,如果有重复的年龄,那么可能不止Top 2或者Top 3
  Top N的解决办法 
    什么叫最小的年龄?也就是没有其它的年龄比这个年龄小

    什么叫第二小的年龄?就是比这个年龄小的只有1个   

    什么叫Top2的年龄?就是年龄比它们小的小于等于2个(如果多于2个,它怎么能排第二呢?)
   

    什么叫第三小的年龄?就是比这个年龄小的只有2个

    什么叫Top3的年龄?就是年龄比它们小的小于3个

--select *
--from test
--where (
--   select count(*) from test as f
--   where f.gid = test.gid and f.age < test.age
--) <= 2;

     我们这样来阅读它:请找出这样的记录------和此记录同一个group的记录里年龄比我小的小于等于2个

非标准SQL的解决方法

     思路一: 使用排序的方法

          按照前面的解决聚集函数的方法,我们可以先排序,然后从每个组里挑选第一个。怎么从一个group里选择第一个呢?很多数据库(比如Oracle和SQL Server等)提供了First和Last这样的聚集函数。

--select t.gid,first(t.age),first(t.username)
--from (
--        select gid,age,username from test order by gid,age
--     ) as t
--group by t.gid

           首先按gid和age排序,然后从每个group里选择第一行

           Postgresql的实现 pg默认没有,但是它提供了create aggregate来让用户创建自定义的聚集函数,这里暂不细讲,可以参考

            http://wiki.postgresql.org/wiki/First_(aggregate)

            时间复杂度O(nlogn),空间复杂度O(n)

      思路二:还是排序

              mysql既没有提供first,也没有提供接口让用户创建聚集函数,那怎么办呢?还好mysql可以在sql里使用变量。

set @num := 0, @type := '';

select type, variety, price
from (
   select type, variety, price,
      @num := if(@type = type, @num + 1, 1) as row_number,
      @type := type as dummy
  from fruits
  order by type, price
) as x where x.row_number <= 2;

            没看明白?我们用Java来实现一下:

      sort rows by gid,age
      int lastGid=-1;
      int lasAge=-1;
      int rowInGroup=-1;
      for(row:rows){
          int gid=row.getGid();
          int age=row.getAge();
          if(gid!=lastGid){ //第一次出现这个gid
             rowInGroup=1;
          }else{
             rowInGroup++;
          }
          if(rowInGroup<=2){ //这是我想要的!!
          }
          lastGid=gid;
          lastAge=age;
      }

        对照起来应该很容易明白了。

       另外出来First和Last,也可以使用其它一些数据库相关的函数,比如RANK,ROW_NUMBER等实现类似的思路。

       当然First只能找到Top 1,所以要找Top N,可能需要实现First_N 这样的聚集函数,实现起来和First没有什么本质区别

思路三:还是排序(使用PG的特殊语法)

--SELECT DISTINCT ON (gid) gid, age,username
--	FROM test
--	ORDER BY gid, age;

       Distinct on的细节参考文档

思路四:Hash的方法

       这就只能自己实现聚集函数了。

       下面讲讲在PG里的实现方法(我的PG也很弱,所以写出来的可能很丑陋,欢迎帮助改进)

    Postgresql的聚集函数框架

        不过在讲它的Create Aggregate之前,我们想想如果我们来设计这个框架,我们怎么做?

        聚集函数可以分为两类:函数的解依赖于局部解和当前值;另一类解依赖于所有的值。

        这样说起来很抽象,我们具体举两个例子。

        1. 求最小值的min函数

           min(3,4,5,6)=min(3,min(4,min(5,6)))。我们遍历所有的记录,然后记下当前的最小值就可以了。

           max,sum与之类似,avg呢?这个得稍微思考一下: 我们需要记下前面的平均值和个数 avg(3,4,5,6)= (avg(3,4,5)*3 + 6)/4,当然这样做比先sum然后除以个数慢,但是它需要更少的临时空间。有些场合可能需要权衡时间和空间。

        2. 求中位数

           这个没有所有的数据是没办法求到的

        因此我们的框架可能是这样(这就是PG的框架):对于满足Where条件的每一条记录,调用一个用户定义的状态转移函数,最后在group遍历完成后调用一个终态函数。

        比如求min,状态转移函数可能是:

       sfunc(oldMin,curr)
            if(curr < oldMin) return curr;
            else return oldMin;

         当然可以不使用状态转移函数而先保留所以的值,然后一次扫描找出最小的,不过这样的缺点是需要空间保留所有的值(当然对于求中位数这样的问题必须这样做)

        明白了这点我们来看PG的Create Aggregate命令:http://www.postgresql.org/docs/9.0/static/sql-createaggregate.html

CREATE AGGREGATE name ( input_data_type [ , ... ] ) (
    SFUNC = sfunc,
    STYPE = state_data_type
    [ , FINALFUNC = ffunc ]
    [ , INITCOND = initial_condition ]
    [ , SORTOP = sort_operator ]
)

or the old syntax

CREATE AGGREGATE name (
    BASETYPE = base_type,
    SFUNC = sfunc,
    STYPE = state_data_type
    [ , FINALFUNC = ffunc ]
    [ , INITCOND = initial_condition ]
    [ , SORTOP = sort_operator ]
)

         最重要的就是SFUNC,STYPE和FINALFUNC,STYPE就是中间状态的类型。我们来看First的实现:

-- Create a function that always returns the first non-NULL item
CREATE OR REPLACE FUNCTION public.first_agg ( anyelement, anyelement )
RETURNS anyelement AS $$
        SELECT $1;
$$ LANGUAGE SQL IMMUTABLE STRICT;

-- And then wrap an aggreagate around it
CREATE AGGREGATE public.first (
        sfunc    = public.first_agg,
        basetype = anyelement,
        stype    = anyelement
);

      非常简单。首先是定义状态转移函数first_agg,它有两个参数,第一个参数是之前的最小值,每次pg都会传过来,第二个就是当前行的值。这个函数只是简单的返回第一个参数,这样最终得到的就是每个group的第一行。然后创建一个聚集函数first,指定它的状态转移函数。first没有终态函数,因为第一个值已经求出来了。

然后我们来看怎么创建聚集函数不用排序来解决top one的问题。

首先创建一个自定义类型:(pg里定义的sql函数或者pl/pgsql函数没办法接受record类型的参数,所以我使用了比较土的方法)

--CREATE TYPE grouptype AS (
--    age            integer,
--    username       text
--);

定义了一个自定义类型,然后是定义状态转移函数和聚集函数,非常简单

--CREATE OR REPLACE FUNCTION public.minrow_agg ( grouptype, grouptype )
--RETURNS grouptype AS '
--    BEGIN
--	IF $2.age < $1.age THEN
--             RETURN $2;
--        END IF;
--       RETURN $1;
--    END;
--' LANGUAGE 'plpgsql' IMMUTABLE STRICT;
--CREATE AGGREGATE public.minrow (
--        sfunc    = public.minrow_agg,
--        basetype = grouptype,
--        stype    = grouptype
--);

下面是用法,主要ROW函数会把几个字段拼成我们定义类型

--select gid, minrow(ROW(age,username)) from test group by gid
PG里其它的解法

感谢小万 luoyi的提醒,pg的window function可以提供类似排序的解法,而且比全排序应该快一些。

SELECT gid, age, username, (rank() OVER (PARTITION BY gid ORDER BY age)) as r FROM test;
这是可以的。
但是不能把rank()当成where的条件:
SELECT gid, age, username, (rank() OVER (PARTITION BY gid ORDER BY age)) as r FROM test where r=1;

必须这么写:
SELECT gid, age,username
FROM
  (SELECT gid, age,username,
          rank() OVER (PARTITION BY gid ORDER BY age) AS pos
     FROM test
  ) AS ss
WHERE pos < 3;
其实这种方法和我前面说的排序,然后first的实现类似,不过会稍微好一些,不用对所有的排序,而是对每个group排序。
时间复杂度应该比排序好,但是应该不止O(n)


datax web升级springboot3 jdk17 datax web但GitHub上还是springboot2,没有升级过,最近扫漏洞发现spring-core漏洞必须升级到6.x才能解决,这时不得不将springboot升级到3.x,随之而来是jdk、mybatis-plus等等的升级,调整了几天才没问题,痛苦的开发人生~~以上,有疑问欢迎留言。 阅读详情

相关推荐

金融波动预测:GARCH模型实战解析与ARIMA对比

本文深入解析GARCH模型在金融波动预测中的实战应用,并与传统ARIMA模型进行对比。通过沪深300指数日收益率数据的案例分析,展示GARCH模型如何有效捕捉波动聚集效应,提升极端波动预测准确率。文章包含Python代码实现、参数解读及模型选择指南,为量化交易者提供实用的波动率建模解决方案。

weixin_29098367的博客 189

mongTemplate实现group分组查询aggregation

【代码】mongTemplate实现group分组查询aggregation。

伟大是熬出来的 2126

【AI赋能】Sora + CapCut 打造爆款短视频:从脚本到发布的自动化工作流

本文详细介绍了如何利用Sora、Grok和CapCut等AI工具构建自动化短视频生产工作流。通过结构化Prompt生成专业脚本,借助Sora将文字转化为高质量视频素材,并利用CapCut进行高效剪辑与合成,实现从创意到发布的十倍效率提升,助力个人及团队打造爆款内容。

g8f9d0s1a2的博客 494

GID GID全称:Group Identification 群体身份 (指共享资源系统使用者的身份)

<br />GID  GID全称:Group Identification 群体身份 (指共享资源系统使用者的身份)<br />  何谓GID?<br />  GID是一个通用的、适应性强和用户界面友好的图形用户界面,用于几何模拟、数据输入、模型转换、网格和可视化的结果,对所有类型的数值仿真包都适用。 <br />  一般多用于比如网游封测时期的账号,或者就是一些带有共享性质的资源使用者的帐号。<br />  GID的特点及运用:<br />  通用 <br />  GID对使用数值方法分析任何科学和工程的

Attitude decides everything, detail decides success or failure! 2671

手把手教你用GD32F407VET6的EXMC驱动外部SRAM,搞定大内存需求

本文详细介绍了如何使用GD32F407VET6的EXMC外设驱动外部SRAM,解决嵌入式开发中的大内存需求问题。通过硬件连接方案、EXMC时序配置与初始化步骤,以及软件集成与内存管理技巧,帮助开发者快速实现内存扩展。特别适合需要处理图形显示缓冲、音频处理等大内存场景的GD32F407开发者。

weixin_30752699的博客 346

车载以太网SOMEIP入门必看:从服务发现到事件订阅,一次搞懂三种核心通信模式(附报文实例)

本文深入解析车载以太网SOME/IP的三种核心通信模式:服务发现、方法调用和事件订阅,通过真实报文实例和仿真工具演示,帮助开发者快速掌握这一关键技术。文章特别强调服务发现机制的基础作用,并详细介绍了Request/Response与Fire&Forget两种方法调用模式的应用场景,为智能汽车网络通信开发提供实用指南。

weixin_30955617的博客 111

在group by中添加Count(A)大于1

select count(A),A from table_Agroup by Ahaving count(A)>1 转载于:https://www.cnblogs.com/bluezhao/archive/2013/04/18/3028882.html

weixin_30532973的博客 6859

国产大模型 coding plan 实战决策指南:GLM、Kimi、豆包、abab 四大模型分层选型与工程落地

大模型辅助编程(coding assistant)正从概念验证走向规模化工程落地,其核心已不再是‘能否生成代码’,而是‘如何在真实开发流程中精准赋能’。理解模型能力边界、匹配技术栈特征、构建分层工作流(L1行级补全/L2函数生成/L3模块重构),是实现稳定提效的关键。GLM系列以工程稳定性见长,适合代码审计与测试生成;Kimi-Max凭借200K超长上下文胜任深度重构与合规审查;豆包响应快、框架适配深,是IDE高频补全的理想选择;abab系列则在IoT固件等跨模态场景中展现独特价值。本文聚焦国产模型在金融、

weixin_32238157的博客 427

Flink SQL TOPN 优化

大数据技术AI Flink/Spark/Hadoop/数仓,数据分析、面试,源码解读等干货学习资料 94篇原创内容 ...

全网同名,欢迎关注。 1460

告别手动复制粘贴:3种高效合并Excel表格的方法对比(含代码)

本文对比了VBA、Power Query和Python三种高效合并Excel表格的方法,并提供了可直接运行的代码。针对不同数据量、更新频率和技术背景,详细分析了各方案的优缺点与适用场景,帮助读者告别低效的手动操作,实现自动化数据整合。

weixin_29057237的博客 441

告别米级误差:手把手教你用Nordic nRF52840实现厘米级蓝牙测距(Channel Sounding实战)

本文详细介绍了如何利用Nordic nRF52840开发板和蓝牙信道探测(Channel Sounding)技术实现厘米级高精度测距。通过硬件配置、软件优化和实战案例,帮助开发者快速掌握低功耗蓝牙测距技术,适用于工业自动化、智能仓储等场景。

weixin_42741930的博客 476

sql group by 取每组第一条_sql面试题:topN问题

工作中会经常遇到这样的业务问题:如何找到每个类别下用户最喜欢的产品是哪个?如果找到每个类别下用户点击最多的5个商品是什么?这类问题其实就是常见的:分组取每组最大值、最小值,每组最大的N条(top N)记录。面对该类问题,如何解决呢?下面我们通过成绩表的例子来给出答案。成绩表是学生的成绩,里面有学号(学生的学号),课程号(学生选修课程的课程号),成绩(学生选修该课程取得的成绩)分组取每组最...

weixin_39759881的博客 7494

【系统架构设计师-2025上半年真题】综合知识-参考答案及详解(75题完全回忆版)

【系统架构设计师-2025上半年真题】案例分析-参考答案及部分详解

数据知道的博客 1万+

Flink Table & SQL 实时TopN

TopN语句用于获取流表中的前N条记录。 本文总结Flink Table & SQL 中实时TopN的用法。 语法 SELECT [column_list] FROM ( SELECT [column_list], ROW_NUMBER() OVER ([PARTITION BY col1[, col2...]] ORDER BY col1 [asc|desc...

王佩的优快云博客 2869

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【Flink SQL】Flink SQL 语法篇(九):Window TopN、Deduplication

小伙伴萌会问了,我有了 TopN 为啥还需要 Window TopN 呢?还记得上一篇博客介绍 TopN 说道的 TopN 时会出现中间结果,从而出现回撤数据的嘛?Window TopN 不会出现回撤数据,因为 Window TopN 实现是在窗口结束时输出最终结果,不会产生中间结果。而且注意,因为是窗口上面的操作,Window TopN 在窗口结束时,会自动把 State 给清除。

Data · Model · Agent · Repeat 2131

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Blink SQL TopN语句

Blink SQL TopN用法。

胜利的曙光的博客 418

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java实现GroupBy/分组TopN功能

介绍在Java 8 的Lambda(stream)之前,要在Java代码中实现类似SQL中的group by分组聚合功能,还是比较困难的。这之前Java对函数式编程支持不是很好,Scala则把函数式编程发挥到了机制,实现一个group by聚合对Scala来说就是几行代码的事情:val birds = List("Golden Eagle","Gyrfalcon", "American Robin"

Spring , Hadoop, Spark , BI , ML 1万+

Flink SQL 窗口函数从 OVER 到 TopN 的完整套路

Flink SQL 窗口函数(OVER)的5种典型应用模式:1)按时间范围滑动累计(RANGE+时间),用于统计最近时段指标;2)按行数滑动窗口(ROWS),计算最近N条数据均值;3)从头到当前的累积值(UNBOUNDED PRECEDING),如用户生命周期消费;4)排名函数(ROW_NUMBER/RANK/DENSE_RANK),用于TopN和去重;5)基于窗口函数的TopN场景,包括全局和分组TopN。与GROUP BY不同,OVER保持原行数同时添加统计字段,适合明细+统计场景。

hello.reader 1170

MySQL分组TOPN终极详解

MySQL分组TOPN终极详细解释 终极终极详细解释…因为比较详细,适合小白看(大佬请绕道) 代码比较简单,但是我一开始纠结了好久,脑壳疼 首先gruop by+limit 肯定是不可以的,下面演示一下 1.建表 CREATE TABLE `score_info` ( `id` BIGINT(18) NOT NULL AUTO_INCREMENT, `name` VARCHAR(20) DEFAULT NULL, `class_no` VARCHAR(10) DEFAULT NULL, `s

yZzc_XQ的博客 2926

java group by_Java实现GroupBy/分组TopN功能

详情在Java 8 的Lambda(stream)之前,要在Java代码中实现相似SQL中的group by分组聚合功能,还是比较困难的。这之前Java对函数式编程支持不是很好,Scala则把函数式编程发挥到了机制,实现一个group by聚合对Scala来说就是几行代码的事情:val birds = List("Golden Eagle","Gyrfalcon", "American Robin...

weixin_42659194的博客 7620

做 SQL 性能优化真是让人干瞪眼

很多大数据计算都是用 SQL 实现的,跑得慢时就要去优化 SQL,但常常碰到让人干瞪眼的情况。 比如,存储过程中有三条大概形如这样的语句执行得很慢: select a,b,sum(x) from T group by a,b where …; select c,d,max(y) from T group by c,d where …; select a,c,avg(y),min(z) from T group by a,c where …; 这里的 T 是个有数亿行的巨大表,要分别按三种方式分组,分组的

石臻说AI(szzdzhp001) 【原名 石臻臻的杂货铺】 1万+

sql 分组统计topN

sql 分组统计topN

CJD的博客 926

Flink SQL Window TopN 详解

Flink SQL Window TopN 详解

猫猫爱吃小鱼粮 888

Flink 之 TopN 以及窗口TopN

在Flink中,TopN计算是指从数据流中选取前N个元素,通常根据某个指标进行排序。TopN计算可以在全局范围内进行,也可以在窗口内进行。窗口TopN计算是指在特定的时间窗口或计数窗口内进行TopN计算。这些操作在实时数据分析、监控和推荐系统中非常常见。

实践出真知 777

【Flink SQL】Flink SQL 语法篇(八):集合、Order By、Limit、TopN

上述 SQL 在流式任务中,如果一条左流数据先来了,没有从右流集合数据中找到对应的数据时会直接输出,当右流对应数据后续来了之后,会下发回撤流将之前的数据给撤回。这也是一个回撤流。

Data · Model · Agent · Repeat 2140

sql group by 取每组符合条件_SQL学习-6

第六关:求职面试题创建数据库表创建过程不作赘述,参见第一关,这里更多是对之前的一个复习和回顾,创建数据库表需注意字段类型,是否为null,以及是否为主键2. 查找学生灵活运用%查询含相关字符的内容,还是需要注意所有都需要用英文符号查询符合要求的学生查询符合条件的老师3. 汇总分析汇总分析这里需注意distinct的位置-列明前!!初次写的时候放在count的外面...分组分组结果条件这里需将需求转...

weixin_39617470的博客 791
上一篇: Java的Lock小结
下一篇: 在Linux下编译OpenJdk并调试Hotspot
fancyerII
博客等级 码龄23年 48粉丝 164原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值