MySQL学习进阶:SQL语句、存储过程和函数丨【绽放吧!数据库】
数据库知识学习过程中,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
权限系统围绕两个概念:
- 认证->确定用户是否允许连接数据库服务器;
- 授权->确定用户是否拥有足够的权限执行查询请求等。
如果认证不成功的话,那么授权肯定是无法进行的。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
- 点赞
- 收藏
- 关注作者
评论(0)