1.账户管理
在生产环境下操作数据库时,绝对不可以使用root账户连接,而是创建特定的账户,授予这个账户特定的操作权限,然后连接进行操作,主要的操作就是数据的crud
MySQL账户体系:根据账户所具有的权限的不同,MySQL的账户可以分为以下几种
服务实例级账号:,启动了一个mysqld,即为一个数据库实例;如果某用户如root,拥有服务实例级分配的权限,那么该账号就可以删除所有的数据库、连同这些库中的表
数据库级别账号:对特定数据库执行增删改查的所有操作
数据表级别账号:对特定表执行增删改查等所有操作
字段级别的权限:对某些表的特定字段进行操作
存储程序级别的账号:对存储程序进行增删改查的操作
账户的操作主要包括创建账户、删除账户、修改密码、授权权限等
注意:进行账户操作时,需要使用root账户登录,这个账户拥有最高的实例级权限
查看所有用户
查看user表的结构desc user\G;
主要字段说明:
host表示允许访问的主机
user表示用户名
authentication_string表示密码,为加密后的值
查看所有用户
selecthost,user,authentication_string from user;
创建账户并授予权限
需要使用实例级账户登录后操作,以root为例
常用权限主要包括:create、alter、drop、insert、update、delete、select
如果分配所有权限,可以使用all privileges
创建账户并授权
语法如下:grant 权限列表 on 数据库 to '用户名'@'访问主机' identified by '密码';
授权
语法如下:grant 权限名称 on 数据库 to 账户1,账户2,... with grant option;
示例
step1:使用root登录
mysql -uroot-p
回车后写密码,然后回车
step2:创建账户并授予所有权限,说明如下用户名为py,密码为123
操作python数据库的所有对象python.*
访问主机通常使用百分号%表示此账户可以使用任何ip的主机登录访问此数据库
访问主机可以设置成localhost或具体的ip,表示只允许本机或特定主机访问
grant all privileges onpython.* to 'py'@'%' identified by '123';
查看用户有哪些权限
show grants for py;
step3:退出root的登录
quit
step4:使用py账户登录
mysql -upy -p
回车后写密码,然后回车
回收权限
需要使用实例级账户登录后操作,以root为例
如果不希望某用户拥有此权限,可以将此权限从用户上撤销
语法如下:revoke 权限列表 on 数据库名.* from '用户名'@'主机';
修改密码
语法1:不需登录mysqladmin-u py -p password '新密码'
例:mysqladmin -u py -p password '123456'
回车后写密码,然后回车
语法2:使用root登录,修改mysql数据库的user表
使用password()函数进行密码加密
注意修改完成后需要刷新权限
update userset authentication_string=password('新密码') where user='用户名';
例:update user set authentication_string=password('123') where user='py';
刷新权限:flushprivileges
语法1用于账户自己修改密码
语法2用于修改自己或其它账户的密码,一般是dba或经理修改员工的密码
删除账户
语法1:使用root登录dropuser '用户名'@'主机';
例:drop user 'py'@'%';
语法2:使用root登录,删除mysql数据库的user表中数据
deletefrom user where user='用户名';
例:delete from user where user='py';
--操作结束之后需要刷新权限flushprivileges
推荐使用语法1删除用户
如果主机的字母大写时,使用语法1删除失败,采用语法2方式
2.函数创建
语法如下
delimiter$$
create function 函数名称(参数列表) returns返回类型
begin
sql语句
end
$$
delimiter ;
- 说明:delimiter用于设置分割符,默认为分号
- 在“sql语句”部分编写的语句需要以分号结尾,此时回车会直接执行,所以要创建存储过程前需要指定其它符号作为分割符,此处使用//,也可以使用其它字符
查看python数据库中的函数
select name,type from mysql.procwhere db='python';
调用语法如下:select 函数名称(参数列表);
删除函数语法如下:dropfunction 函数名称;
临时变量声明临时变量,只能在 begin ... end 体重语法如下
declare变量名 类型 default 默认值;
例:declare x varchar(100);
设置变量值,语法如下
set 变量名=值;
例:set x='abc';
用户变量/会话变量
只有在当前连接用户有效,其他连接用户无法访问
使用@标识声明用户变量
使用 select 来查看用户变量
系统变量
任何一个用户都可以访问
使用 @@来标识系统变量
使用 select 来查看系统变量
函数判断
语法如下
if 条件1 then
语句1;
elseif 条件2 then
语句2;
else
语句
end if;
循环
语法如下
while 条件do
语句;
end while;
退出循环:leave,相当于break
退出本次循环:iterate,相当于continue
3.存储过程创建
语法如下
delimiter//
create procedure存储过程名称(参数列表)
begin
sql语句
end
//
delimiter ;
说明:delimiter用于设置分割符,默认为分号
在“sql语句”部分编写的语句需要以分号结尾,此时回车会直接执行,所以要创建存储过程前需要指定其它符号作为分割符,此处使用//,也可以使用其它字符
查看表结构descmysql.proc\G;
查看python数据库的所有存储过程
select name,type,body from mysql.procwhere db='python';
调用语法如下:call 存储过程(参数列表);
删除语法如下:drop procedure 存储过程名称;
存储过程和函数的区别
相同点
1.存储过程和函数都是为了可重复的执行操作数据库的 sql 语句的集合.
2.存储过程和函数都是一次编译,就会被缓存起来,下次使用就直接命中缓存中已经编译好的sql, 不需要重复编译
3.减少网络交互,减少网络访问流量
不同点
1.标识符不同,函数的标识符是 function, 过程:procedure
2.函数中有返回值,且必须有返回值,而过程没有返回值,但是可以通过设置参数类型(in,out)来实现多个参数或者返回值
3.函数使用 select 调用,存储过程需要使用 call 调用
4.select 语句可以在存储过中调用,但是除了 select ... into 之外的 select 语句都不能再函数中调用
5.通过 in out 参数,过程相关函数更加灵活,可以返回多个结果
6.在实际开发中根据个人喜好选择使用函数或者存储过程