当根据条件查询数据库中记录没有,但是又想返回0怎么办?

我们平时在操作数据库的时候,对于null的记录或者字段相信大家都可以用ifnull()来判断为null的时候需求返回什么数据,但是如果根据条件查询的时候,数据库根本没有这条记录但是又想返回数据不存在时候的结果该怎么办,比如你统计一个时间区间的某条记录中的一个字段,如果记录不存在就是0,ifnull()这个函数是在字段为null的情况才可以判断,那么这个时候改怎么判断呢?

示例:

SELECT check_date,sum(cnt) cnt FROM db58_baicai_bcbi.v_check_count_day WHERE sync_is_valid = 0 AND check_date BETWEEN '2022-02-01' and '2022-02-08' GROUP BY check_date

这是原来的sql,查询条件为时间,并且按照时间分组统计cnt的字段之和.

结果

这里可以看到由于其他区间没有记录所以统计不出来条数,那如果我们场景是作为一个折线图的数据,那么其他日期区间没有记录的应该用0表示,这时候该怎么做呢?

我们这时候可以新建一张只存时间的表,然后将结果leftjon,这样如果cnt数据没有就会为null,这个时候就可以用ifnull()来判断了,当日这种方式比较暴力而且时间可能会不够,所以一次生成了50年的,之前也试过用存储方式来写,但是我觉得这种比较简单,sql也不会复杂,不知道有没有大佬有更好意见

SELECT
    daylist.DAY,
    IFNULL( sum( cnt ), 0 ) AS cnt 
FROM
    db58_baicai_bcbi.v_day_list daylist
    LEFT JOIN ( SELECT check_date, sum( cnt ) cnt FROM db58_baicai_bcbi.v_check_count_day WHERE sync_is_valid = 0 AND check_date BETWEEN '2022-02-01' AND '2022-02-08' GROUP BY check_date ) countday ON daylist.DAY = countday.check_date 
WHERE
    daylist.DAY BETWEEN '2022-02-01' AND '2022-02-08'
GROUP BY
    daylist.DAY

日期表:

结果

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目 录   数据库通用查询系统 23 题目简介: 23 2.1 设计的内容、要求和目标 23 2.2 总体设计 23 3.1 操作界面设计 25 3.2 类成员变量及方法设计 26 3.3 数据库设计 28 3.4 源代码分析 29 3.4.1 DatabaseServer类 29 3.4.2 ServerThread 类 30 3.4.3 DatabaseClient类 32 4 系统运行及使用说明 36 总 结 36 数据库通用查询系统 题目简介: JAVA Applet(or JFrame)通过套接字连接和服务器端的JAVA应用程序实现通信。程序将表的名字、表字 段的个数及查询条件提交给服务器,服务器端的JAVA程序进行查询操作,并将查询结果 返回给JAVA Applet(or JFrame)程序。当仅查询数据表记录时,我们可以不必知道表字段的属性,因为无 论字段是何种属性,总可以使用getString(int coiumnIndex)或getString(String columnName)方法返回字段值的字符表示。另外,无论字段是何种属性,SQL语句的LIKE 子语句允许字段值以字符串形式与其他字符串比较。 主要内容: 设计要求 总体设计 详细设计 代码调试 软件开发 课程设计题目 2.1 设计的内容、要求和目标 当仅仅查询数据库记录时,我们可以不必知道表字段的属性,因为无论字段还 是何种属性,总可以使用getString(int columnIndex)或getString(String columnName)方法返回字段值的字符串表示。另外,无论字段是何种属性,SQL语句的L IKE子语句允许字段值以字符串形式与其他字符串进行匹配比较。 基于以上所述,要求设计一个B/S模式的数据库通用查询系统,具体要求如下: (1)客户端Java Applet程序从加载该Java Applet程序的html文件获取数据库的表的名字、表的字段名字以及表字段的个数 。这样一来,当需要修改html文件,而不必修改Java Applet程序,使得Java Applet在查询数据库时具有了通用性。 (2)Java Applet通过套接字连接和服务器端的Java应用程序实现通信。Java Applet程序将表的名字、表字段的个数以及查询条件提交给服务器,服务器端的Java 应用程序进行查询操作,并将查询结果返回Java Applet程序。 2.2 总体设计 在设计数据库通用查询系统时,需要编写3个Java源文件:DatabaseServer.java、Serv erThread.java和DatabaseClient.java。其DatabaseServer.java和ServerThread.ja va为服务器端Java程序编译产生所需要的类;DatabaseClient.java为客户端Java Applet程序编译产生所需要的类。数据库通用查询系统除了需要编写3个Java源文件所编 译产生的类外,还需要Java系统提供的一些重要的类。数据库通用查询系统所用到的一 些重要的类以及它们之间的组合关系如图12.1和图12.2所示。 图12.1 客户端类之间的组合关系 图12.2 服务器端类之间关系 2.1 数据库(服务器端) 设计的数据库的名字是book.mdb,在该库所创建的表是bookform。 2.2 DatabaseServer.java(服务器端主类) DatabaseServer类创建的对象负责响应客户请求,该类含有main方法,服务器端从该类 开始执行。DatabaseServer类的成员变量有3种重要类型的对象:ServerSoket、Soke t和ServerThread对象。运行效果如下图所示 DatabaseServer类运行效果 2.3 ServerThread.java(服务器端) ServerThread类是Thread类的子类,在Server类负责为请求连接的用户启动一个线程 对象。 2.4 DatabaseClient.java(客户端主类) DatabaseClient是Applet类的子类,尽管DatabaseClient类需要驻留在服务器端,但它 需要下载到客户端的浏览器来运行,因此Java Applet是客户端程序。DatabaseClient类的成员变量有四种重要类型的对象:Choice 、Checkbox、TextArea和Socket对象。运行效果如下图所示: 图2.4 DatabaseClient创建的JFrame及主要的成员对象3 详细设计及实现 3.1 操作界面设计 a) 客户端运行效果 (b)服务器端运行效果 3.2 类成员变量及方法设计 图12.1 N
数据库系统之查询处理与优化 查询处理的过程 第⼀步 就是语法分析器与翻译器处理,对SQL查询语句进⾏语法验证,保证查询语句的正确性,然后将SQL查询语句翻译为可使⽤的形式 第⼆步 是将SQL查询语句翻译为系统对应的内部表⽰形式,即关系代数表达式 第三步 就是对关系代数表达式进⾏优化,找出最优的效率最⾼的关系代数表达式 第四步 根据这个关系代数表达式制定好执⾏计划(执⾏计划是指执⾏⼀个查询的计算机原语,也就是说它是标注了如何执⾏⼀个或多个关系代数操 作的操作序列) 第五步 执⾏引擎按照执⾏计划进⾏执⾏,对数据库的表,函数进⾏操作,最终得到查询结果响应给⽤户。 优化器(就是对关系代数的优化,是通过等价变换得到优化执⾏⽅案,也就是操作执⾏的顺序,包含了注释是否需要采⽤索引,具体采⽤的 操作执⾏算法等) 查询代价的度量 1.查询处理的代价可通过该查询对各种资源的使⽤情况进⾏度量 2.然⽽在⼤型数据库系统,在磁盘存取数据的代价通常是最主要的代价 3.我们可以使⽤传送磁盘块数以及搜索磁盘次数来度量查询计划代价。假设磁盘⼦系统传送⼀个块的数据平均消耗tr秒,磁盘块平均访问时 间(磁盘搜索时间加上旋转延迟)为ts秒,那么依次传送b个块以及执⾏S次磁盘搜索的操作消耗btr+Sts秒 SQL常见的查询 1.整个表数据全部读取,也就是没有任何条件的查询 2.有⼀个单⼀条件准确定位某⼀个数据记录 3.有⼀个范围条件要定位多个数据记录 4.单个条件和范围条件的结合 选择操作典型实现⽅法 1.简单的全表扫描⽅法 顺序扫描,输出满⾜条件的元组,适合⼩表,不适合⼤表 2.索引(或散列)扫描⽅法 通过索引先找到满⾜条件的元组主码或元组指针,再通过元组指针直接在查询的基本表找到元组。适合选择条件的属性上有索引(例如 B+树索引或Hash索引) 选择操作的实现 例:select * from Student,SC where Student.sno=SC.sno 1.嵌套循环⽅法 对外层循环(Student)的每⼀个元组(s),检索内层循环(SC)的每⼀个元组(sc),检查这两个元组在连接属性(sno)上是否相等,如果满⾜连接 条件,则串接后作为结果输出,知道外层循环表的元组处理完为⽌。 2.排序-合并⽅法(适合连接的诸表已经排好序的情况) 如果连接的表没有排好序,先对Student表和SC表按连接属性sno排序,取Student表第⼀个sno,依次扫描SC表具有相同sno的元 组,当扫描到sno不相同的第⼀个SC元组时,返回Student表扫描它的下⼀个元组,再扫描SC表具有相同sno的元组,把它们连接起来 重复上述步骤直到Student表扫描完。 3.索引连接⽅法 在SC表上建⽴属性sno的索引,(如果原来没有索引),对Student表每⼀个元组,由sno值通过SC的索引查找相应的SC元组,把这些SC 元组和Student表的元组处理完为⽌。 4.Hash Join⽅法 把连接属性作为hash码,⽤同⼀个hash函数把R和S的元组散列到同⼀个hash⽂件。 查询的代价主要考虑的内容 在分布式数据库系统,查询代价除了考虑CPU代价和I/O代价外,由于数据分布在不同的场地上,使得查询处理还要考虑站点间传输数 据的代价;分布透明性是指⽤户不需要了解数据分⽚的位置,分⽚的分配位置以及数据复制的过程;分布式查询优化⼀般需要考虑操作的执 ⾏顺序和数据在不同场地间的传输顺序;执⾏分布式数据库查询时,导致数据传输量⼤的主要原因时数据间的连接操作和并操作。 查询优化 同⼀个SQL查询语句的不同关系代数表达式,它查询代价时不同的,可以根据关系代数表达式的等价转换,将关系代数表达式变成代价较低 的关系代价表达式,来实现查询优化。 查询树和查询执⾏计划之间的区别 查询树不是最优的,不包含实际执⾏时选择的算法,执⾏计划=优化后的查询树+选择的实际执⾏的算法(连接运算是⽤块连接还是散列连 接,是否⽤流⽔线等); 查询执⾏的时候是⽤的执⾏计划,即优化后的查询树加上相应操作的具体算法; 查询树的基本优化策略 选择下移优化策略(优先做选择,后做关系连接,将选择移到靠近关系) 投影下移优化策略(通过等价规则先进⾏投影,去除对查询⽆意义的属性,再做连接) 选择连接顺序优化策略(⼩关系的连接优先,这样做间结果元组会很少,这个代价也会很低)
DataBaseTool: 简单的数据库查询、修改工具。 最新版本: 1.0.0.7 20190616 如不能正常执行,请运行 Regist.bat 注册必要的组件。 (在win7下可能由于权限的问题无法复制和注册文件到系统目录,解决方法是: 打开‘开始’菜单->‘所有程序’->‘附件’,右键点击‘命令提示符’,选择‘以管理员身份运行’, 启动命令行程序后,转到本程序目录,然后执行Regist.bat) 本程序可用的数据库可以是Access的.mdb文件,.xls文件,.csv文件,.txt文件等 也可用于打开SQL Server数据库和已建立ODBC数据源的其他数据库 若要打开mdb文件、xls文件、csv文件、txt文件,可以点“Browse”按钮定位文件,也可以直接把文件拖到MdbFile列表框。 若要打开SQLServer数据库,则需要在MdbFile输入框输入“sql:ServerName,DataBaseName,UserName,Password”, 其 ServerName 是数据库服务器的名称或IP地址 DataBaseName 是数据库名称 UserName 是用户名称 Password 是用户密码 若要连接其他数据库,可以直接输入数据源的名称(DSN),格式为:“dsn:数据源的名称;uid=用户名;pwd=密码” Field1 和 Field2 是查询条件,所选表格的字段已列出,点选字段名、比较运算符,然后在后面输入条件 支持最多两个查询条件,如果需要更多查询条件或者构造更复杂的条件,请点击 “ExeSQL” 按钮,在那里可以自己输入任何合法的 SQL 命令,程序将帮您执行它! FieldToReplace 及下面两个输入框是用来把数据表某一个字段的特定字符串替换为其他字符串: StrTobeReplace 是需要被替换掉的字符串,StrToReplace 是用来替换的字符串! (不要奇怪为什么会提供如此奇怪的功能!是因为工作需要替换某个表所有记录的某个字段的指定字符串,才写了这个程序,就是说这个功能是写这个程序的初衷!) 如果点选 Order 复选框,则会按照 Field1, Field2, FieldToReplace 的顺序排序,如果 Field1 或者 Field2 已经是 查询条件的一部分,则不参与排序。 如果点选 AutoUpdate 复选框,则在下面表格修改的数据会自动更新到数据库,如果仅修改一个单元格的数据,则修改完后需要按回车键确定才会存入数据库! 如果没有点选 AutoUpdate 复选框,并在表格修改了数据,按“UpDate”按钮也可以把修改的数据更新到数据库(这个不太常用!) 右侧的字段列表是查询时需要显示的列,如果一个也不选或者全选,则都将查询所有字段(即select *) 【常用的】 EXESQL 按钮: 可以直接输入一个简单的SQL命令并执行。 ‘Show queried data’ 选项: 指示所输入的 sql 命令是否会返回数据集,如果勾选,程序会尝试读取返回的数据集,如果不勾选,程序就只是执行命令并尝试返回受影响的行数。 程序会自动判断这个命令是否会返回数据集,如果判断为会返回数据集,比如输入的是一个 类似 select * from 的命令,则自动勾选‘Show queried data’。如果您确定命令会返回数据集但这个选项没有自动勾选,您可以手动勾选, 这样程序就会尝试读取并显示得到的结果。 ‘LongSQL’按钮: 如果您要输入一个很长很复杂的命令,可以再按‘LongSQL’按钮,会弹出一个可以输入多行文字的新输入窗口,然后就可以在其输入多行命令。 换行: 在这个输入控件,直接按回车就是换行,如果按 Ctrl+回车 则相当于按‘OK’按钮,会立即执行输入的命令。 多个命令: 如果要一次执行多个命令,比如几百几千行的 insert 命令,可以一次把所有这些命令都复制到 LongSQL 的输入框, 每一命令之间用英文分号';'分隔,然后按 Ctrl+回车 或点击‘OK’按钮执行。 ‘Ignore errors’选项: 如果输入的多行命令可能有些会出错,比如 insert 了重复的数据,并且希望除出错的命令外其他的命令可以正常执行,可以选这个选项, 这样的话,程序会跳过出错的命令并继续执行后面的命令。 数据导出: ‘Export’按钮: 如果要导出查询或命令的结果,可以在结果显示出来后,按‘Export’按钮,程序会自动启动Excel并把数据导出到Excel;如果电脑上没有 安装Excel,则这个按钮不起作用。 复制数据: 用户可以选择把数据复制到剪贴板上,复制有2种方式: 1) 复制所选行 按住 Ctrl 键并用鼠标点击每行的行首,可以选择多行(所选择的行并不要求相邻),选择完毕后,在所选行上点击鼠标右键选择 ‘Copy’菜单进行复制。 2) 复制所选列 点击需要复制的第一列的列标题,然后按住‘Shift’键再点击需要复制的最后一列的列标题(按列复制时要求这些列必须相邻), 选择完毕后,在所选行上点击鼠标右键选择‘Copy’菜单进行复制。 ‘Copy’菜单有2个,一个是 ‘Copy(Using Tab)’,另一个是‘Copy(Using ',')’, 如果选择‘Copy(Using Tab)’则复制的数据,各字段值之间会用 Tab 分隔, 如果选择‘Copy(Using ',')’则复制的数据,各字段值之间会用英文的逗号分隔。 ================================================================================== 特别的命令: 如果查看每个表格各有多少数据,可以执行: SELECT $TABLEINFO$ 如果查看某个表格的字段定义,可以执行: SELECT $FIELDINFO$ where table=TableName,其‘TableName’是您查看的表格的名称 ================================================================================== 这个程序可以作为临时或不打开庞大的数据库软件时查看或修改数据的小工具,也可以作为验证sql是否正确的工具! 或者通过在界面上点选查询条件,按 “Find” 按钮,然后再按 “ExeSQL” 按钮,然后把自动生成的sql命令复制出来用到其他地方,即把这个程序作为简便的生成sql命令的工具. win7 或 win10系统下,需要以管理员身份运行 Regist.bat 以注册所需的组件。
当使用Jeecg-boot进行数据库查询时,出现数据库记录返回对象为空的情况,可能有以下几个原因: 1. 数据库记录确实不存在:首先,需要确定数据库是否真的存在与查询条件匹配的记录。可以通过直接在数据库执行相同的查询语句,来确认是否能够获取到记录。如果查询结果为空,那么数据库可能确实没有记录。 2. 查询条件不准确:检查查询语句条件是否正确。可能是因为查询条件设置错误,导致未能正确匹配到数据库记录。可以逐一检查查询条件的正确性,尤其是使用了多个条件组合查询时,可能需要重新检查条件间的逻辑关系。 3. 数据库连接异常:确认数据库连接是否正常。如果数据库连接异常,可能导致查询无法正常执行,从而返回对象为空。可以检查数据库连接配置是否正确,并且通过其他方式验证数据库连接是否正常。 4. ORM框架配置问题:Jeecg-boot使用了ORM框架,如MyBatis进行数据库操作。确保相关的ORM框架配置正确,并且相关的实体类与数据库表进行了正确的映射。如果映射配置错误,可能导致查询结果无法正确返回。 5. 数据库字段值为空:确认数据库对应字段的值是否为空。如果数据库对应字段的值为空,查询结果返回对象的对应属性也会为空。 总之,通过仔细检查查询条件、确认数据库连接和映射配置是否正确,以及检查数据库的值,可以解决数据库查询返回对象为空的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值