MySQL学习进阶:SQL语句、存储过程和函数丨【绽放吧!数据库】

举报
SHQ5785 发表于 2021/08/08 17:52:56 2021/08/08
【摘要】 数据库知识学习过程中,SQL语句是基础,函数和存储过程是进阶学习内容。此篇博文主要讲解下SQL语句、存储过程和函数。常用SQL语句SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块;数据操纵语言DML主要有三种形式:INSERT、UPDATE、DELE...

数据库知识学习过程中,SQL语句是基础,函数和存储过程是进阶学习内容。此篇博文主要讲解下SQL语句、存储过程和函数。

常用SQL语句

SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL

数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块;

数据操纵语言DML主要有三种形式:INSERT、UPDATE、DELETE。

Mysql语法顺序

即当sql中存在下面的关键字时,它们要保持这样的顺序:

select[distinct]、from、join(如left join)、on、where、group by、having、union、order by、limit;

Mysql执行顺序

即在执行时sql按照下面的顺序进行执行:

from、on、join、where、group by、having、select、distinct、union、order by、group by

例如:

select a.Customer,sum(a.OrderPrice) from orders a where a.Customer=’Bush’ or a.Customer = ‘Adams’ group by a.Customer;

实现多表查询(内连接)

select u.uname,a.addr from lm_user u inner join lm_addr a on u.uid = a.uid;

使用select from where同样可以实现

select u.uname,a.addr from lm_user u, lm_addr a where u.uid = a.uid;

权限控制方面,MySQL权限系统围绕两个概念:

  1. 认证->确定用户是否允许连接数据库服务器;
  2. 授权->确定用户是否拥有足够的权限执行查询请求等。

如果认证不成功的话,那么授权肯定是无法进行的。
revoke  grant 的语法差不多,只需要把关键字 “to” 换成 “from”。

grant all on *.* to dba@localhost;

revoke all on *.* from dba@localhost;

如果你想允许用户myuser从ip为192.168.1.6的主机连接到mysql服务器,并使用mypassword作为密码:

GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'192.168.1.3' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;

FLUSH PRIVILEGES;


注意:授权后必须FLUSH PRIVILEGES;否则无法立即生效。

存储过程

常用的数据库操作语言SQL语句在执行的时候需要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。

一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。
存储过程通常有以下优点:

1. 存储过程增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
存储过程允许标准组件式编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。
2. 存储过程能实现较快的执行速度。如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。
3. 存储过程能够减少网络流量。针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织成存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大降低了网络流量并降低了网络负载。
4. 存储过程可被作为一种安全机制来充分利用。系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据安全。

存储过程常用操作如下:

创建存储过程

delimiter $$
create procedure procedure_bill()
comment '查询所有销售情况'
begin
select billid, tx_time, amt from lm_bill;
end $$
delimiter;

显示存储过程状态

show procedure status like 'procedure_bill';
show procedure status;

执行存储过程

call procedure_bill;

函数

MySQL涉及的常用函数主要包括:数学函数、聚合函数、字符串函数日期和时间函数加密函数格式化函数、控制流函数类型转化函数和系统信息函数

数学函数

ABS(x) 返回x的绝对值;
BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制);
CEILING(x) 返回大于x的最小整数值;
EXP(x) 返回值e(自然对数的底)的x次方;
FLOOR(x) 返回小于x的最大整数值;
GREATEST(x1,x2,...,xn)返回集合中最大的值;
LEAST(x1,x2,...,xn) 返回集合中最小的值;
LN(x) 返回x的自然对数;
...

聚合函数:

  • AVG(col)返回指定列的平均值;
  • COUNT(col)返回指定列中非NULL值的个数;
  • MIN(col)返回指定列的最小值;
  • MAX(col)返回指定列的最大值;
  • SUM(col)返回指定列的所有值之和;
  • GROUP_CONCAT(col) 返回由属于一组的列值连接组合而成的结果;

字符串函数:

ASCII(char)返回字符的ASCII码值;
BIT_LENGTH(str)返回字符串的比特长度;
CONCAT(s1,s2...,sn)将s1,s2…,sn连接成字符串;
CONCAT_WS(sep,s1,s2...,sn)将s1,s2…,sn连接成字符串,并用sep字符间隔;
INSERT(str,x,y,instr) 将字符串str从第x位置开始,y个字符长的子串替换为字符串instr,返回结果;
...

日期和时间函数:

CURDATE()或CURRENT_DATE() 返回当前日期;
CURTIME()或CURRENT_TIME() 返回当前时间;
DATE_ADD(date,INTERVAL int keyword)返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化),如:SELECTDATE_ADD(CURRENT_DATE,INTERVAL 6 MONTH);
DATE_FORMAT(date,fmt) 依照指定的fmt格式格式化日期date值;
DATE_SUB(date,INTERVAL int keyword)返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化),如:SELECTDATE_SUB(CURRENT_DATE,INTERVAL 6 MONTH);
...

加密函数:

AES_ENCRYPT(str,key)
返回用密钥key对字符串str利用高级加密标准算法加密后的结果,调用AES_ENCRYPT的结果是一个二进制字符串,以BLOB类型存储;
AES_DECRYPT(str,key) 返回用密钥key对字符串str利用高级加密标准算法解密后的结果
DECODE(str,key) 使用key作为密钥解密加密字符串str;
ENCRYPT(str,salt)
使用UNIX crypt()函数,用关键词salt(一个可以唯一确定口令的字符串,就像钥匙一样)加密字符串str;
...

控制流函数:

CASE WHEN[test1] THEN [result1]...ELSE [default] END如果testN是真,则返回resultN,否则返回default;
CASE [test] WHEN[val1] THEN [result]...ELSE [default]END 如果test和valN相等,则返回resultN,否则返回default;
IF(test,t,f) 如果test是真,返回t;否则返回f;
IFNULL(arg1,arg2) 如果arg1不是空,返回arg1,否则返回arg2;
NULLIF(arg1,arg2) 如果arg1=arg2返回NULL;否则返回arg1;
...

格式化函数

DATE_FORMAT(date,fmt) 依照字符串fmt格式化日期date值;
FORMAT(x,y) 把x格式化为以逗号隔开的数字序列,y是结果的小数位数;
INET_ATON(ip) 返回IP地址的数字表示;
INET_NTOA(num) 返回数字所代表的IP地址;
TIME_FORMAT(time,fmt) 依照字符串fmt格式化时间time值;
...

类型转化函数:

SELECT CAST(NOW() AS SIGNED INTEGER),CURDATE()+0; SELECT 'f'=BINARY 'F','f'=CAST('F' AS BINARY);

系统信息函数:

DATABASE() 返回当前数据库名;
BENCHMARK(count,expr) 将表达式expr重复运行count次;
CONNECTION_ID() 返回当前客户的连接ID;
FOUND_ROWS() 返回最后一个SELECT查询进行检索的总行数;
USER()或SYSTEM_USER() 返回当前登陆用户名;
VERSION() 返回MySQL服务器的版本;
...

【绽放吧!数据库】有奖征文火热进行中:https://bbs.huaweicloud.com/blogs/285617

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。