相关资讯

Relevant information
CS编程中常犯的6个SQL错误
时间:2018-08-20 文章来源:洋蜜蜂

CS专业编程中总会出现点错误(BUG),无论是熟练的程序员还是新手,都会出现犯错误的时候,这些都是正常的。那么有哪些错误是程序员经常出现的错误呢,下面洋蜜蜂CS辅导教育跟大家来了解一下在java编程中,有哪些错误是经常出现的。

 

你可能看到java程序员每周的工作是编码开发一个可伸缩的web应用程序,或创建一个动态的网站,或者开发高效的电子商务产品页面,也可能是开发一个Android应用程序等等。但是,即使他们致力于不同的项目,却往往都有一个共同点,那就是编程!

 

你可能看到java程序员每周的工作是编码开发一个可伸缩的web应用程序,

 

Java程序员编程时需要混合面向对象思维和一般命令式编程的方法,能否完美的将两者结合起来完全得依靠编程人员的水准:

 

1.技能(任何人都能容易学会命令式编程)

 

2.模式(有些人用“模式-模式”,举个例子,模式可以应用到任何地方,而且都可以归为某一类模式)

 

3.心境(首先,要写个好的面向对象程序是比命令式程序难的多,你得花费一些功夫)

 

他们的职业要求长时间的工作来积累更多的编程知识。Java程序员还需要了解项目的需求、设计和开发一个属于自己的原型项目。为了使自己始终跟随行业变换的脚步,他们还必须具备其他语言的基础知识,比如HTML、SQL等等。

 

Java程序员的职业生涯并不是一帆风顺的,他们必须尝试每一次的挑战,即使是最好的程序员,有时在编程的过程中也难免会犯一些不可避免的错误。举个例子,在编写SQL语句时,有些错误却是绝对可以避免的。在这里,小编就为各位程序员列举一些常见的SQL错误。

 t1.png

上述查询的结果如下:

1.不使用批量更新

在编写SQL语句时,Java程序员最常见和最大的一个错误就是忘记批处理。在表中编写成千上万的INSERT语句这确实不是一个好主意,程序员应该使用单个的SQL语言来创建一个绑定不同的参数的批处理INSERT语句。执行批处理的速度将比单个执行快得多。

 

我们来看看以下一个例子:

 T2.png

这是一个糟糕的代码,在数据库中每一行INSERT语句都需要单独来执行。发送一批INSERT语句到数据库中一气呵成:

 t3.png

插入大型数据集时,批处理是非常重要的。为了显著提升性能,程序员应该尽量在批处理模式下运行一条语句。执行批量插入的另外一种方法是使用PreparedStatement对象。然而批处理不仅仅只是局限于INSERT语句,你还可以利用它来执行更新、删除和声明等操作。

 

2.DBMS引擎未优化查询

并不是所有的Java程序员都了解SQL。在SQL查询中可以用很多种方式来得到相同的结果,但是程序员应该始终遵循最快的响应最佳的方式。

 

例如一个Java程序员被要求从Employee表中检索所有名字以'A'打头的员工,通常他们喜欢使用LEFT函数返回雇员名字的第一个字符:

 t4.png

但是这是不正确的。在上面的查询中,数据库系统将扫描整个表来找到所需的信息。不使用索引,因此会花费大量的时间在执行查询上。相反,程序员应该使用查询检索结果:

 t5.png

上述查询将利用指数快速有效地检索数据。所以在一般情况下,如果该DBMS引擎可以采取一个索引,程序员应尽可能使用可优化搜索的词来加快查询的执行。

 

3.不正确的谓词运算顺序 

很多Java程序员认为查询通常的处理顺序是如下:FROM,WHERE,GROUPBY,HAVING,SELECT。上述顺序列除了用于执行查询的逻辑顺序。从逻辑上讲,FROM子句首先处理,定义了源数据表中的检索数据;接下来就是WHERE,随后就是GROUPBY等等。然在在物理上来说,查询处理是不同的。谓词的评估顺序通常是由各种规则和数据库版本来改变的。    

 

例如下面的Employee表:

 t6.png

在给定的上表中,要检索所有销售部门员工的雇员代码大于100的。通常在这种情况下程序员将以下面的方式查询表:

 t7.png

然而,上面的查询结果错误:

 “Conversionfailedwhenconvertingthevarcharvalue‘abc’todatatypeint”

 查询失败的原因正是前面所指出的,没有规定执行谓词的顺序。在这种情况下,第二谓词求值首先导致转换错误。相反使用CASE表达式,这里将保证只有合法的数值将被转换为int类型:

 t8.png

4.忘掉NULL

Java程序员写SQL时对NULL的误解可能是最大的错误。也许是因为(并非唯一理由)NULL也称作UNKNOWN。如果被称作UNKNOWN,这还好理解些。另一个原因是,当你从数据库拿东西或是绑定变量时,JDBC将SQLNULL和Java中的null对应了起来。这样导致了NULL=NULL(SQL)和null=null(Java)的误解。

 

对于NULL最大的误解是当NULL被用作行值表达式完整性约束条件时。

 

另一个误解出现在对于NULL在NOTINanti-joins的应用中。

 

解决方法:

 

好好的训练你自己。当你写SQL时要不停得想到NULL的用法:

 

①这个NULL完整性约束条件是正确的?

 

②NULL是否影响到结果?

 

5.在Java内存中处理数据

 

很少有Java开发者能将SQL理解的很好.偶尔使用的JOIN,还有古怪的UNION,好吧.但是对于窗口函数呢?还有对集合进行分组呢?许多的Java开发者将SQL数据加载到内存中,将这些数据转换成某些相近的集合类型,然后再那些集合上面使用边界循环控制结构(至少在Java8的集合升级以前)执行令人生厌的数学运算.

 

但是一些SQL数据库支持先进的(而且是SQL标准支持的!)OLAP特性,这一特性表现更好而且写起来也更加方便.一个(并不怎么标准的)例子就是Oracle超棒的MODEL分句.只让数据库来做处理然后只把结果带到Java内存中吧.因为毕竟所有非常聪明的家伙已经对这些昂贵的产品进行了优化.因此实际上,通过将OLAP移到数据库,你将获得一下两项好处:

 

①便利性.这比在Java中编写正确的SQL可能更加的容易.

 

②性能表现.数据库应该比你的算法处理起来更加快.而且更加重要的是,你不必再去传递数百万条记录了.

 

完善的方法:

 

每次你使用Java实现一个以数据为中心的算法时,问问自己:有没有一种方法可以让数据库代替为我做这种麻烦事.

 

6.使用聚合函数代替窗口函数(windowfunctions)

在介绍窗口函数之前,在SQL中聚合数据意味着使用GROUPBY语句与聚合函数相映射。在很多情形下都工作得很好,如聚合数据需要浓缩常规数据,那么就在join子查询中使用group查询。

 

但是在SQL:2003中定义了窗口函数,这个在很多主流数据库都实现了它。窗口函数能够在结果集上聚合数据,但是却没有分组。事实上,每个窗口函数都有自己的、独立的PARTITIONBY语句,这个工具对于显示报告太TM好了。

 

使用窗口函数:

 

①使SQL更易读(但在子查询中没有GROUPBY语句专业)

 

②提升性能,像关系数据库管理系统能够更容易优化窗口函数

 

解决方法:

 

当你在子查询中使用GROUPBY语句时,请再三考虑是否可以使用窗口函数完成。

 

以上就是洋蜜蜂CS辅导给大家带来的java编程常见错误,看过的同学们以后就多注意下,避免常犯。Java编程是一种简单的,面向对象的,分布式的,解释型的,健壮安全的,结构中立的,可移植的,性能优异、多线程的动态语言。如果CS编程上遇到不懂的问题也可以找我们帮忙辅导。

上一篇:CS专业C语言关于时间计算的函数 返回列表 下一篇:如何成功申请到美国金融研究生