SQL必知必会
陈旸
清华大学计算机博士
立即订阅
10179 人已学习
课程目录
已完结 49 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词丨SQL可能是你掌握的最有用的技能
免费
第一章:SQL语法基础篇 (19讲)
01丨了解SQL:一门半衰期很长的语言
02丨DBMS的前世今生
03丨学会用数据库的方式思考SQL是如何执行的
04丨使用DDL创建数据库&数据表时需要注意什么?
05丨检索数据:你还在SELECT * 么?
06丨数据过滤:SQL数据过滤都有哪些方法?
07丨什么是SQL函数?为什么使用SQL函数可能会带来问题?
08丨什么是SQL的聚集函数,如何利用它们汇总表的数据?
09丨子查询:子查询的种类都有哪些,如何提高子查询的性能?
10丨常用的SQL标准有哪些,在SQL92中是如何使用连接的?
11丨SQL99是如何使用连接的,与SQL92的区别是什么?
12丨视图在SQL中的作用是什么,它是怎样工作的?
13丨什么是存储过程,在实际项目中用得多么?
14丨什么是事务处理,如何使用COMMIT和ROLLBACK进行操作?
15丨初识事务隔离:隔离的级别有哪些,它们都解决了哪些异常问题?
16丨游标:当我们需要逐条处理数据时,该怎么做?
17丨如何使用Python操作MySQL?
18丨SQLAlchemy:如何使用Python ORM框架来操作MySQL?
19丨基础篇总结:如何理解查询优化、通配符以及存储过程?
第二章:SQL性能优化篇 (18讲)
20丨当我们思考数据库调优的时候,都有哪些维度可以选择?
21丨范式设计:数据表的范式有哪些,3NF指的是什么?
22丨反范式设计:3NF有什么不足,为什么有时候需要反范式设计?
23丨索引的概览:用还是不用索引,这是一个问题
24丨索引的原理:我们为什么用B+树来做索引?
25丨Hash索引的底层原理是什么?
26丨索引的使用原则:如何通过索引让SQL查询效率最大化?
27丨从数据页的角度理解B+树查询
28丨从磁盘I/O的角度理解SQL查询的成本
29丨为什么没有理想的索引?
30丨锁:悲观锁和乐观锁是什么?
31丨为什么大部分RDBMS都会支持MVCC?
32丨查询优化器是如何工作的?
33丨如何使用性能分析工具定位SQL执行慢的原因?
34丨答疑篇:关于索引以及缓冲池的一些解惑
35丨数据库主从同步的作用是什么,如何解决数据不一致问题?
36丨数据库没有备份,没有使用Binlog的情况下,如何恢复数据?
37丨SQL注入:你的SQL是如何被注入的?
第三章:认识DBMS (7讲)
38丨如何在Excel中使用SQL语言?
39丨WebSQL:如何在H5中存储一个本地数据库?
40丨SQLite:为什么微信用SQLite存储聊天记录?
41丨初识Redis:Redis为什么会这么快?
42丨如何使用Redis来实现多用户抢票问题
43丨如何使用Redis搭建玩家排行榜?
44丨DBMS篇总结和答疑:用SQLite做词云
第四章:SQL项目实战 (3讲)
45丨数据清洗:如何使用SQL对数据进行清洗?
46丨数据集成:如何对各种数据库进行集成和转换?
47丨如何利用SQL对零售数据进行分析?
结束语 (1讲)
结束语 | 互联网的下半场是数据驱动的时代
SQL必知必会
登录|注册

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

陈旸 2019-06-26
函数在计算机语言的使用中贯穿始终,在 SQL 中我们也可以使用函数对检索出来的数据进行函数操作,比如求某列数据的平均值,或者求字符串的长度等。从函数定义的角度出发,我们可以将函数分成内置函数和自定义函数。在 SQL 语言中,同样也包括了内置函数和自定义函数。内置函数是系统内置的通用函数,而自定义函数是我们根据自己的需要编写的,下面讲解的是 SQL 的内置函数。
你需要从以下几个方面掌握 SQL 函数:
什么是 SQL 函数?
内置的 SQL 函数都包括哪些?
如何使用 SQL 函数对一个数据表进行操作,比如针对一个王者荣耀的英雄数据库,我们可以使用这些函数完成哪些操作?
什么情况下使用 SQL 函数?为什么使用 SQL 函数有时候会带来问题?

什么是 SQL 函数

当我们学习编程语言的时候,也会遇到函数。函数的作用是什么呢?它可以把我们经常使用的代码封装起来,需要的时候直接调用即可。这样既提高了代码效率,又提高了可维护性。
SQL 中的函数一般是在数据上执行的,可以很方便地转换和处理数据。一般来说,当我们从数据表中检索出数据之后,就可以进一步对这些数据进行操作,得到更有意义的结果,比如返回指定条件的函数,或者求某个字段的平均值等。

常用的 SQL 函数有哪些

取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《SQL必知必会》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(75)

  • 时间是最真的答案
    基础篇可以快点更新,很多同学都有一些基础,看懂不难;进阶篇和高级篇可以正常更新,大家可以花多点时间在难点上,可能会更大提高大家的学习效率
    2019-06-26
    1
    87
  • leslie
    关于SQL函数问题:老师应当漏了一个关键点吧;它会导致查询不走索引,直接全表遍历,导致慢查询-这才是最重要的问题。现实工作中一般是禁止where条件出现函数:看到了就让开发代码重写。
    2019-06-26
    3
    21
  • flow
    由于sql中存在数据类型隐式转换的问题,我查了些资料,有一些不明白的地方。
    首先,对于 select * from heros where date(birthdate) > '2016-10-01',老师你说不使用date函数不安全,但是创建表的时候,birthday声明的就是date类型,那它就不可能是其他类型了啊;其次,我给 birthday 加上索引以后,使用explain查看执行计划,不使用 date 函数直接比较的效果要优于使用 date 函数 (参考的是 explain 结果的 type 属性,使用函数为ALL,不使用函数为range); 还有就是既然birthday 是 date 类型,那 被比较对象 ‘2017-01-01’ 是字符串,这就不同同一种数据类型了,我把它转换成 date 类型后进行比较,explain的结果却是一样的,那这里是否存在隐式的类型转换?

    隐式类型转换的资料主要参考这篇文章:https://blog.csdn.net/u010695794/article/details/78509191
    2019-06-26
    4
    15
  • supermouse
    计算英雄的最大生命平均值:
    SELECT AVG(hp_max) FROM heros;

    显示所有在2017年之前上线的英雄:
    SELECT name FROM heros WHERE birthdate IS NOT NULL AND YEAR(birthdate) < 2017;

    作者回复: 正确

    2019-06-27
    8
  • 菜菜
    学得我想打王者荣耀了

    作者回复: 很好 我已经很久没打了,昨天整理稿子的时候也有冲突想开一局,不过还是忍住了,一方面手机存储空间满了,另一方面还是多学习和工作,会让状态更好

    2019-06-28
    7
  • Andre
    答案:SELECT avg(hp_max) as avg_hp
    FROM heros;

    SELECT `name`
    FROM heros
    WHERE birthdate is NOT NULL AND DATE(birthdate)<'2017-01-01';
    另外赞同时间是最真的答案的说法,应该来讲基础篇大家都还是学起来不费力的,希望基础篇能够快点更新,然后尽快的进入进阶篇

    作者回复: 谢谢 基础篇让大家都有个共识的基础,掌握的人也可以快速复习一遍,进阶篇会有更多关于性能调优,高可用架构等

    2019-06-27
    2
  • Fred
    SELECT AVG(mp_max) as avg_max FROM hero;
    SELECT name WHERE YEAR(birthdate)<2017 AND birthdate IS NOT NULL
    2019-06-26
    2
  • mickey
    #计算英雄的最大生命平均值;
    #MySQL实现:
    SELECT avg(hp_max) as '英雄的最大生命平均值' FROM heros;

    #查询结果:
    英雄的最大生命平均值
    ----------------------
    6580.478260869565



    #显示出所有在 2017 年之前上线的英雄,如果英雄没有统计上线日期则不显示。
    #MySQL实现:
    SELECT * FROM heros WHERE birthdate is NOT NULL AND EXTRACT(YEAR FROM birthdate) < '2017';

    #查询结果:
    id name hp_max ... birthdate
    --------------------------------------------
    10000 夏侯惇 7350 ... 2016-07-19
    10003 牛魔 8476 ... 2015-11-24
    10004 吕布 7344 ... 2015-12-22
    10006 芈月 6164 ... 2015-12-08
    ......
    2019-06-26
    2
  • flow
    select avg(hp_max) as avg_hp
    from heros;

    select name, birthdate
    from heros
    where birthdate < date('2017-01-01');
    2019-06-26
    1
    2
  • 海洋
    作业:
    SELECT AVG(hp_max) FROM heros;
    +-------------------+
    | AVG(hp_max) |
    +-------------------+
    | 6580.478260869565 |
    +-------------------+
    1 row in set (0.07 sec)

    -------------------------------------------
     SELECT name FROM heros WHERE Year(birthdate) < 2017 AND birthdate is NOT NULL;
    +----------+
    | name |
    +----------+
    | 夏侯惇 |
    | 牛魔 |
    | 吕布 |
    | 芈月 |
    | 太乙真人 |
    | 刘邦 |
    | 关羽 |
    | 马可波罗 |
    | 李元芳 |
    | 虞姬 |
    | 成吉思汗 |
    | 不知火舞 |
    | 貂蝉 |
    | 周瑜 |
    | 张良 |
    | 钟馗 |
    | 蔡文姬 |
    | 花木兰 |
    | 李白 |
    | 杨戬 |
    | 刘备 |
    | 宫本武藏 |
    | 娜可露露 |
    +----------+
    或者
    SELECT name FROM heros WHERE DATE(birthdate) <'2017-01-01' AND birthdate is NOT NULL;
    2019-08-12
    1
  • Elliot
    DBMS 之间的差异性很大,远大于同一个语言不同版本之间的差...

    说明学数据库也难免会遇到各种看似毫无技术含量的坑喽。。。

    作者回复: DBMS一般都有自己的方言,不过这些方言都很好理解。比如MySQL可以用LIMIT截取所需的数据行,而Oracle需要使用ROWNUM关键字通过子查询来完成。

    2019-07-07
    1
  • 大隐-于市
    切换数据库的概率很低吧,工作了十年一直被教育不是使用内部函数,因为增加更换数据库的成本,不过一直没见过哪个公司更换数据库。即使是阿里的去ioe那本身也会增加很多开发成本,所有的sql都检查。
    2019-07-04
    1
  • Amanda
    > SELECT ROUND(AVG(hp_max), 2) FROM heros;
    +-----------------------+
    | ROUND(AVG(hp_max), 2) |
    +-----------------------+
    | 6580.48 |
    +-----------------------+
    > SELECT name FROM heros WHERE birthdate IS NOT NULL AND DATE(birthdate)<'2017-01-01';

    作者回复: 正确,你也可以使用YEAR(birthdate)<2017

    2019-06-27
    1
  • 圆子蛋
    1. SELECT AVG(max_hp) FROM heros;
    2. SELECT name,YEAR(birthdate) AS birthdate FROM heros WHERE birthdate is NOT NULL AND YEAR(birthdate)<2017
    2019-06-26
    1
  • 啦啦啦
    看了今天的课知道了日期比较不用DATE函数不安全,以前都没用过
    2019-06-26
    1
  • 怀朔
    select avg(ph)from hero
    2019-06-26
    1
  • Geek_d3a509
    SELECT AVG(hp_max) FROM heros;
    SELECT name FROM heros WHERE birthdate IS NOT NULL AND DATE(birthdate)<'2017-01-01';
    2019-12-10
  • 王加武
    第一题:计算最大生命值的平均值
    mysql> SELECT AVG(hp_max)
        -> FROM heros;
    第二题:计算在2017年之前上线的英雄,如果不存在,那么就不显示
    mysql> SELECT *
        -> FROM heros
        -> WHERE YEAR(birthdate) < '2017' AND birthdate IS NOT NULL;
    根据老师所讲的,所有的关键字和函数都尽量大写,其他的都小写,这是规范。
    今天学习了几种比较常用的函数的类型:
    日期函数
    算数函数
    字符串函数

    在写查询语句的时候应该注意安全性的问题,有的语句虽然能执行出来,但是存在一些不安全的因素
    在写SQL函数的时候,应该注意版本问题
    最后就是大小写的规范!
    2019-11-12
  • 丁丁历险记
    坚决不用sql 日期函数的路过。
    2019-11-07
  • 丁丁历险记
    偶尔用一下,group_concat
    其它基本没用过。
    日期转为时间戳,避开无聊的sql 函数。
    2019-11-07
收起评论
75
返回
顶部