07丨什么是SQL函数?为什么使用SQL函数可能会带来问题?

1.学习简记

1,函数在计算机语言的使用中贯穿始终,在 SQL 中我们也可以使用函数对检索出来的数据进行函数操作,比如求某列数据的平均值,或者求字符串的长度等。

 

2.从函数定义的角度出发,我们可以将函数分成内置函数和自定义函数。

在 SQL 语言中,同样也包括了内置函数和自定义函数。内置函数是系统内置的通用函数,而自定义函数是我们根据自己的需要编写的,下面讲解的是 SQL 的内置函数。

 

3.你需要从以下几个方面掌握 SQL 函数:

什么是 SQL 函数?
内置的 SQL 函数都包括哪些?
如何使用 SQL 函数对一个数据表进行操作,比如针对一个王者荣耀的英雄数据库,我们可以使用这些函数完成哪些操作?
什么情况下使用 SQL 函数?为什么使用 SQL 函数有时候会带来问题?
什么是 SQL 函数

 

当我们学习编程语言的时候,也会遇到函数。函数的作用是什么呢?它可以把我们经常使用的代码封装起来,需要的时候直接调用即可。这样既提高了代码效率,又提高了可维护性。

SQL 中的函数一般是在数据上执行的,可以很方便地转换和处理数据。

一般来说,当我们从数据表中检索出数据之后 //建议再次温习执行一条sql的过程,就可以进一步对这些数据进行操作,得到更有意义的结果,比如返回指定条件的函数,或者求某个字段的平均值等。

 

4.常用的 SQL 函数有哪些

SQL 提供了一些常用的内置函数,当然你也可以自己定义 SQL 函数。SQL 的内置函数对于不同的数据库软件来说具有一定的通用性,//但是其实很少,   如果你说都基本分为这四类.是的

我们可以把内置函数分成四类:

算术函数
字符串函数
日期函数
转换函数
这 4 类函数分别代表了算术处理、字符串处理、日期处理、数据类型转换,它们是 SQL 函数常用的划分形式,你可以思考下,为什么是这 4 个维度?

答案: 函数是对提取出来的数据进行操作,数据表中字段类型刚好是这四种/,详细见下面解释

 

[具体解释:

我们经常会保存一些数值,不论是整数类型,还是浮点类型,实际上对应的就是数值类型。同样我们也会保存一些文本内容,可能是人名,也可能是某个说明,对应的就是字符串类型。此外我们还需要保存时间,也就是日期类型。那么针对数值、字符串和日期类型的数据,我们可以对它们分别进行算术函数、字符串函数以及日期函数的操作。如果想要完成不同类型数据之间的转换,就可以使用转换函数]

 

5.算术函数

算术函数,顾名思义就是对数值类型的字段进行算术运算。

 

字符串函数

常用的字符串函数操作包括了字符串拼接,大小写转换,求长度以及字符串替换和截取等.

 

日期函数

日期函数是对数据表中的日期进行处理

 

转换函数

转换函数可以转换数据之间的类型,常用的函数如下表所示:

[转换函数个人用的很少,所以这里特别记下]

 

这两个函数不像其他函数,看一眼函数名就知道代表什么、如何使用。下面举了这两个函数的例子,你需要自己运行下:

SELECT CAST(123.123 AS INT),运行结果会报错。

SELECT CAST(123.123 AS DECIMAL(8,2)),运行结果为 123.12。

SELECT COALESCE(null,1,2),运行结果为 1。//这个会用到

CAST 函数在转换数据类型的时候,不会四舍五入,如果原数值有小数,那么转换为整数类型的时候就会报错。不过你可以指定转化的小数类型,在 MySQL 和 SQL Server 中,你可以用DECIMAL(a,b)来指定,其中 a 代表整数部分和小数部分加起来最大的位数,b 代表小数位数,比如DECIMAL(8,2)代表的是精度为 8 位(整数加小数位数最多为 8 位),小数位数为 2 位的数据类型。所以SELECT CAST(123.123 AS DECIMAL(8,2))的转换结果为 123.12。

 

 

6.SQL

6.1 假如我们想要知道最大生命值最大的是哪个英雄,以及对应的数值

SQL:SELECT name, hp_max FROM heros WHERE hp_max = (SELECT MAX(hp_max) FROM heros); -- 这里使用子查询,外查询的条件字段的字段值不需要指定内查询中年字段的字段名,应该是mysql做了这方面的处理

6.2 假设我们需要知道在 2016 年 10 月 1 日之后上线英雄的平均最大生命值、平均最大法力和最高物攻最大值。

SQL: SELECT AVG(hp_max), AVG(mp_max), MAX(attack_max) FROM heros WHERE DATE(birthdate)>'2016-10-01'; -- 这三个聚合函数的结果是没有什么关系的

 

7.为什么使用 SQL 函数会带来问题

尽管 SQL 函数使用起来会很方便,但我们使用的时候还是要谨慎,因为你使用的函数很可能在运行环境中无法工作,这是为什么呢?

 

如果你学习过编程语言,就会知道语言是有不同版本的,比如 Python 会有 2.7 版本和 3.x 版本,不过它们之间的函数差异不大,也就在 10% 左右。但我们在使用 SQL 语言的时候,不是直接和这门语言打交道,而是通过它使用不同的数据库软件,即 DBMS。DBMS 之间的差异性很大,远大于同一个语言不同版本之间的差异。实际上,只有很少的函数是被 DBMS 同时支持的。比如,大多数 DBMS 使用(||)或者(+)来做拼接符,而在 MySQL 中的字符串拼接函数为Concat()。大部分 DBMS 会有自己特定的函数,这就意味着采用 SQL 函数的代码可移植性是很差的,因此在使用函数的时候需要特别注意。

 

8.关于大小写的规范 //因为在 Linux 和 Windows 环境下,你可能会遇到不同的大小写问题

比如 MySQL 在 Linux 的环境下,数据库名、表名、变量名是严格区分大小写的,而字段名是忽略大小写的  //这个真不知道

而 MySQL 在 Windows 的环境下全部不区分大小写

 

命名规范的建议:

关键字和函数名称全部大写;
数据库名、表名、字段名称全部小写;
//而且建议使用反引号[``]继进行标识
SQL 语句必须以分号结尾。

 

9.总结

函数对于一门语言的重要性毋庸置疑,我们在写 Python 代码的时候,会自己编写函数,也会使用 Python 内置的函数。在 SQL 中,使用函数的时候需要格外留意。不过如果工程量不大,使用的是同一个 DBMS 的话,还是可以使用函数简化操作的,这样也能提高代码效率。只是在系统集成,或者在多个 DBMS 同时存在的情况下,使用函数的时候就需要慎重一些。

2.网友评论

[leslie]

关于SQL函数问题:老师应当漏了一个关键点吧;它会导致查询不走索引,直接全表遍历,导致慢查询-这才是最重要的问题。现实工作中一般是禁止where条件出现函数:看到了就让开发代码重写。

Ryoma
不是函数会导致不走索引,要看函数的位置。一般来说,出现在比较运算符右边的依然可以运用索引.

 

验证:

 

索引列与非索引列使用SQL内置函数的结果:

综上可知:

同时将将 > 换成 =, 执行计划也是相同的结果.

1.当函数的位置在比较运算符左侧,索引失效. 这里走的是全表扫描.

当出现在比较运算符右边的依然可以走索引.

 

2.也可以知道,SELECT * FROM test WHERE learn_index > 0 AND DATE(learn_date) < DATE(NOW()); 

查询效率是最好的,filtered为100.

 

 

[大隐-于市]
2019-07-04
切换数据库的概率很低吧,工作了十年一直被教育不是使用内部函数,因为增加更换数据库的成本,不过一直没见过哪个公司更换数据库。

即使是阿里的去ioe那本身也会增加很多开发成本,所有的sql都检查。

 

 

后续补充...

3.应用场景

TBD

4.问题

1.性能上,使用SQL内置函数与在逻辑代码中处理,哪个更好? 

TBD 

 

2.使用内置函数,导致索引不生效的情况是哪些?

TBD

5.推荐书籍/文档

TBD

6.学习体会

TBD

7.参考

https://time.geekbang.org/column/article/103349 //极客时间-SQL必知必会-第07讲

https://blog.csdn.net/william_n/article/details/100175645  //SQL必知必会

后续补充...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值