注:该MySql系列博客仅为个人学习笔记。

本篇博客主要涉及MySql 函数(数学函数、字符串函数、日期时间函数、流程控制函数等),视图。

一、函数

1. 数学函数

对于数学函数,若发生错误,所有数学函数会返回 NULL

1.1  abs(x)   返回x的绝对值

1.2  bin(x)    返回x的二进制数

1.3  oct(x)    返回x的八进制数

1.4  hex(x)   返回x的十六进制数

1.5  ceiling(x)  返回大于x的最小整数值

1.6  floor(x)  返回小于x的最大整数值

1.7  exp(x)   返回e的x次方(e是自然数的底)

1.8  greatest(x1,x2,x3,...,xn)   返回集合中最大的值

1.9  least(x1,x2,x3,...,xn)        返回集合中最小的值

1.10  ln(x)       返回x的自然对数

1.11  log(x, y)  返回x的以y为底的对数

1.12  mod(x, y)  返回x/y的模(余数)

1.13  pi()      返回PI的值(圆周率)

1.14  rand()    返回一个随机浮点值 v ,范围在 0 到1 之间 (即, 其范围为 0 ≤ v ≤ 1.0)。若已指定一个整数参数 N ,则它被用作种子值,用来产生重复序列。

rand(N),随机数的产生取决于种子,种子不同,产生不同的随机数,种子相同,不管运行多少次都产生相同的随机数。所以,除非必要,否则不要设置随机种子。

若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1))。

例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机整数, 可使用以下语句:SELECT FLOOR(7 + (RAND() * 6));

ORDER BY RAND()同 LIMIT 的结合从一组列中选择随机样本很有用;

在WHERE语句中,WHERE每执行一次, RAND()就会被再计算一次;

1.15  round(x), round(x, y)  返回x的四舍五入的有y位小数的值。若要接保留x值小数点左边的y 位,可将 y 设为负值。

1.16  sign(x)  返回x作为-1、 0或1的符号,该符号取决于x的值为负、零或正。

1.17  sqrt(x)  返回非负数X 的二次方根

1.18  pow(x, y)    返回x 的y乘方的结果值

1.19  truncate(x, y)  返回被舍去至小数点后y位的数字x。若y 的值为 0, 则结果不带有小数点或不带有小数部分。可以将y设为负数,若要截去(归零) x小数点左起第y位开始后面所有低位的值。所有数字的舍入方向都接近于零。

2. 聚合函数(常用于group by从句的select查询中)

2.1  avg(expr)  返回expr 的平均值。若找不到匹配的行,则avg()返回 NULL

2.2  count(expr)  返回SELECT语句检索到的行中非NULL值的数目

2.3  min(expr)  返回表达式的最小值

2.4  max(expr) 返回表达式的最大值

2.5  sum(expr)  返回表达式的和

2.6  group_concat()  返回带有来自一个组的连接的非NULL值的字符串结果

3. 字符串函数

3.1  ascii(str)  返回值为字符串str 的最左字符的数值。假如str为空字符串,则返回值为 0 。假如str 为NULL,则返回值为 NULL。 ASCII()用于带有从 0到255的数值的字符。

3.2  length(str)  返回字符串字节长度

3.3  char_length(str)  返回字符串长度

3.2  bit_length(str)  返回值为二进制的字符串str长度。

3.3  concat(s1,s2,s3,..,sn)  返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。

3.4  concat_ws(sep, s1, s2,..,sn)  代表Concat With Separator ,是concat()的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。

3.5  insert(str, x, y, instr)  将字符串str从x位置开始,y个字符长度的子串替换为instr,返回结果。

3.6  find_in_set(str, strList)  strList是由一些被‘,’符号分开的自链组成的字符串,返回str在strList中的位置。

3.7  lcase(str) 或 lower(str)   返回小写字符串

3.8  ucase(str) 或 upper(str)  返回大写字符串

3.9  left(str, x)  返回str左边x个字符

3.10  right(str, x)  返回str右边x个字符

3.11  ltrim(str)  去掉str左边的空格

3.12  trim(str)   去掉str两边的空格

3.13  rtrim(str)  去掉str右边的空格

3.14  position(subStr in str)  返回子串subStr第一次在str中出现的位置

3.15  repeat(str, x)  返回str重复x的结果

3.16  reverse(str)  反转str

3.17  strcmp(s1, s2)  比较s1和s2

4. 日期时间函数

4.1  curdate() 或 current_date()  返回当前的日期

4.2  curtime() 或 current_time()   返回当前的时间

4.3  now() 或 current_timestamp()  返回当前日期和时间值,其格式为 'YYYY-MM-DD HH:MM:SS' 或YYYYMMDDHHMMSS , 具体格式取决于该函数是否用在字符串中或数字语境中。

4.4  year(date)  返回日期date的年份

4.5  month(date)  返回日期date的月份

4.6  monthname(date)  返回日期date的月份名

4.7  week(date)  返回date一年中的第几周

4.8  day(date) 或 dayofmonth(date)  返回date 对应的该月日期,范围是从 1到31

4.9  dayname(date)  返回date对应的工作日名称

4.10  dayofweek(date)  返回date (1 = 周日, 2 = 周一, ..., 7 = 周六)对应的工作日索引。

4.11  dayofyear(date)  返回date 对应的一年中的天数,范围是从 1到366。

4.12  date(date|datetime)  提取日期部分

4.13  datediff(expr1, expr2)  返回起始时间 expr和结束时间expr2之间的天数。

4.14  date_add(date|datetime, interval expr type)  执行日期运算。 date 用来指定起始时间。 expr 是一个表达式,用来指定从起始日期添加或减去的时间间隔值。 如果想要执行减运算,在expr前加个‘-’即可。 type 为关键词,它指示时间间隔的类型。

4.15  date_sub(date|datetime, interval expr type)   date_add()执行加运算,date_sub()执行减运算

date_sub() 是date_add的逆过程

4.16  date_format(date, format)  根据format 字符串安排date 值的格式。

5. 加密函数

5.1  md5(str)  MD5加密,碰撞性低,不可逆的;若参数为 NULL 则会返回 NULL。例如,返回值可被用作散列关键字。

5.2  password(str)  从原文密码str 计算并返回密码字符串,当参数为 NULL 时返回 NULL。PASSWORD()函数在MySQL服务器中的鉴定系统使用;你不应将它用在你个人的应用程序中。

5.3  sha(str) 或 sha1(str)  SHA1()可以被视为一个密码更加安全的函数,相当于  MD5()。

6. 流程控制函数

6.1  case [value] when [compare-value] then result [when [compare-value] then result]...[else result] end

6.2  if(expr1,expr2,expr3)  如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3。IF() 的返回值为数字值或字符串值。

6.3  IFNULL(expr1, expr2)  假如expr1 不为 NULL,则 IFNULL() 的返回值为 expr1; 否则其返回值为 expr2。IFNULL()的返回值是数字或是字符串

6.4  NULLIF(expr1, expr2)  如果expr1 = expr2  成立,那么返回值为NULL,否则返回值为 expr1。

7 系统信息函数

7.1  user()  或  current_user()  返回当前话路被验证的用户名和主机名组合。

7.2  charset(str)  返回字符串自变量的字符集。

7.3  database()  返回使用 utf8 字符集的默认(当前)数据库名。

7.4  row_count()  ROW_COUNT()返回被前面语句升级的、插入的或删除的行数。

7.5  version()  数据库版本

MySql函数总结:

1.mysql的函数肯定会影响查询速度,应该在建表的时候,通过合理的表结构减少函数的使用;例如添加冗余字段等。

2.如果确实要使用函数,比如时间的格式化,优先放在业务逻辑层处理,而不是sql查询语句中。

3.在查询时使用了函数,最大的一个坏处是,如果你针对某列查询,该列用上了函数,此列将不再使用索引。

二、视图(view)

在查询中,我们经常把查询结果当成临时表来看,视图可以看做一张虚拟表,是表通过某种运算得到的一个投影。临时表的数据不会变,而投影的数据会根据原表的数据变化而变化。

计算机数据库中的视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。

1.创建视图的语法

create [algorithm = merge|temptable|undefined] view as ;

视图一旦创建完毕,就可以将其当成一张表来看待。

2.视图在某些情况下,也是可以修改的,要求是视图的数据和表的数据一一对应;一一对应 是指:根据select关系,从表中取出的行,只能计算出视图中确定的一行;反之,视图中任意抽一行,能够根据select关系,反推出表中的确定的一行。

3. show create view  该语句给出了1个创建给定视图的CREATE VIEW语句

4. drop view [, ]  能够删除1个或多个视图

5. 使用create创建表的时候,生成三个文件,frm(表结构,自动定义等),MYD(数据),MYI(索引),可以看到视图只有一个表结构定义。

6. algorithm algorithm可取三个值:merge、temptable或undefined。如果没有algorithm子句,默认算法是undefined(未定义的)。算法会影响MySQL处理视图的方式。

对于一些简单的视图,它在发挥作用的过程中,并没有建立临时表,而只是把条件存起来,下次来查询,把条件合并,直接去查基表,建临时表相比之下开销较大。

如果不指定algorithm,则更倾向于使用merge。

algorithm=temptable 适合于较复杂的视图,比如有聚合函数的视图等,这种是无法合并条件去基表查询的,需要生成一张临时表。

视图总结:

1.视图一旦创建完毕,就可以将其当成一张表来看待。

2.视图可以简化查询,对于一些复杂的统计,可以先用视图生成一个中间结果,再查询视图。

3.更加精细的权限控制,例如可以用视图隐藏掉用户表的密码字段,而将其开放给别人。

4.数据量大,分表时可以用视图将所有表的查询结果保存到一个视图中。

5.表的数据变化,会影响到视图的变化;

6.视图在某些情况下,也是可以修改的,要求是视图的数据和表的数据一一对应。所谓的一一对应,必须是通过select关系,视图能在基表中查出对应的数据,基表也可以在视图中查询对应的数据;例如select句中有order by limit 等都是无法一一对应的。

7.视图定义服从下述限制:

SELECT语句不能包含FROM子句中的子查询。

SELECT语句不能引用系统或用户变量。

SELECT语句不能引用预处理语句参数。

8.某些视图是可更新的。也就是说,可以在诸如UPDATE、DELETE或INSERT等语句中使用它们,以更新基表的内容。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。还有一些特定的其他结构,这类结构会使得视图不可更新。

9. ALGORITHM(算法)

可选的ALGORITHM子句是对标准SQL的MySQL扩展。ALGORITHM可取三个值:MERGE、TEMPTABLE或UNDEFINED。如果没有ALGORITHM子句,默认算法是UNDEFINED(未定义的)。算法会影响MySQL处理视图的方式。

对于MERGE,会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。

对于TEMPTABLE,视图的结果将被置于临时表中,然后使用它执行语句;建临时表的开销有点大。

对于UNDEFINED,MySQL将选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE,这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。

明确选择TEMPTABLE的1个原因在于,创建临时表之后、并在完成语句处理之前,能够释放基表上的锁定。与MERGE算法相比,锁定释放的速度更快,这样,使用视图的其他客户端不会被屏蔽过长时间。

mysql 查询条件左视图的参数_MySql学习(四) —— 函数、视图相关推荐

  1. mysql查询当前时间和用户_MySQL学习笔记(3) - 查询服务器版本,当前时间,当前用户...

    IIC驱动移植在linux3.14.78上的实现和在linux2.6.29上实现对比(deep dive) 首先说明下为什么写这篇文章,网上有许多博客也是介绍I2C驱动在linux上移植的实现,但是笔 ...

  2. mysql 查询条件之外的数据_mysql 查询符合条件的数据

    匿名用户 1级 2014-12-11 回答 SELECT * FROM test WHERE state IS NULL AND 1 > (SELECT COUNT(*) FROM test t ...

  3. mysql 查询条件不区分大小写

    MySql查询条件不区分大小写 在日常开发过程中,经常遇到某些条件查询功能,而某些字段例如姓名,往往是模糊查询,并且在含有英文或拼音的情况小,要求不区分大小写. 例如一个字段名称是username,字 ...

  4. mysql查询条件_mysql条件查询,最简单的一种,你知道吗?

    在上一篇文章中我们学习了在php中怎样查询数据库中的数据,哪些数据都是直接获取一个表中的所有数据,全部拿过来,没有经过过滤,很多数据对于我们来说暂时是用不上的,这就相当于浪费了带宽,不利于提高数据处理 ...

  5. mysql 查询条件优先级_mysql条件查询and or使用实例及优先级介绍

    mysql条件查询and or使用实例及优先级介绍 一.总结 一句话总结: 在where中可以包含任意数目的and和or操作符,在没有任何其他符号的时候,例如括号,SQL会首先执行and条件,然后才执 ...

  6. mysql事务变量_mysql学习四之事务、变量、触发器、函数、存储过程

    需求:有一张银行账户表,有A用户给B用户转账:A账户先减少,B账户增加,但是A操作完之后断电了. 解决方案:A减少钱,但是不要立即修改数据表:B收到钱之后,同时修改数据表 事务安全 事务:transa ...

  7. mysql function 表名作为参数_mysql 常用的分组聚合函数

    mysql 常用的分组聚合函数 1.聚合运算 一般情况下,需要的聚合数据(和,平均值,最大,最小等)并不总是存储在表中,但是可以执行存储数据的计算来获取它. 根据定义,聚合函数对一组值执行计算并返回单 ...

  8. mysql 触发器条件判断偶尔失效_mysql┃多个角度说明sql优化,让你吊打面试官!...

    ​正文约: 4744字 预计阅读时间: 12分钟 文章首发于我的微信公众号:moon聊技术,欢迎大家关注 mysql┃多个角度说明sql优化,让你吊打面试官! 目录 目录 前言 正文 1.表结构优化● ...

  9. Mysql查询条件为大于时,不走索引失效问题排查

    我们都知道在数据库查询时,索引可以极大的提高查询效率.通常在使用的时候,都会针对频繁查询的关键字段建立索引. 比如,当以交易日期(trans_date)来查询交易记录时,通常会对该字段添加索引,以便在 ...

  10. mysql 查询条件是中文时,无法查询的解决办法

    前言 最近在学习使用mysql数据库,遇到了查询条件是中文时,无法查询的问题,解决后,分享解决方法如下(本例使用navicat 对mysql数据库进行管理). 一.效果演示 导入表格数据 使用查询功能 ...

最新文章

  1. 北京赛区总结,以及。。。
  2. 2018-2019-1 20189218《Linux内核原理与分析》第五周作业
  3. java之hibernate之 cascade和inverse
  4. 简单DP (Preparing for Xtreme 12.0) | STL map使用
  5. 委内瑞拉通胀这么厉害,为什么有钱人不去圈地、买房?
  6. 用鼠标选择模型表面两点并连线
  7. treeset java_Java TreeSet add()方法与示例
  8. WebBrowser中显示乱码
  9. 01-windows下python爬取网页上的图片
  10. Lucene分词初探---LetterTokenizer
  11. PAT 乙级 1010. 一元多项式求导 (25) Java版
  12. 自学Java要不要背熟语法_JAVASE经典面试问题(必须熟背),你Get到了吗?
  13. poj 3630 简单Trie树的应用
  14. FastDFS单机搭建以及java客户端Demo
  15. cvMatchTemplate() 模板匹配
  16. optisystem中器件的学习(5-Receivers Library/Tools Library/Optiwave/ external Software Library/Free Space )
  17. 英特尔第十代处理器为什么不支持win7_为什么7代CPU不支持WIN7操作系统?
  18. 解决电脑系统重装后出现多引导项的问题
  19. Adobe Illustrator CS6 已停止工作 的问题
  20. python实现匿名发邮件_python 发送匿名邮件或无发件人

热门文章

  1. 目标识别笔记:鸢尾花数据集决策树/随机森林MATLAB仿真
  2. 完全的新手入门_使用Unity做个单机二人小麻将(二) 吃碰杠胡牌算法
  3. 【云和恩墨大讲堂】李真旭 - 数套 ASM RAC 的恢复案例
  4. 【论文筛选】ReID候选调研对象 2020-08-04 (ing)
  5. liunx 杀死指定端口 命令
  6. 鱼哥赠书活动第①期:《脑洞大开:透测试另类实战攻略》《Kali Linux高级渗透测试》《CTF实战:技术、解题与进阶》《构建新型网络形态下的网络空间安全体系》
  7. 不再被 node-sass 安装问题困扰
  8. 小红书“种草”潮玩生意
  9. 初中生的心理特征与管理对策
  10. proteus 8添加具有电气连接作用的网络标签