目录

1.用户与权限管理

MySQL 账户管理概述

创建用户并分配权限

查看、回收权限

修改密码

2.事务

事务概述

事务的特性(ACID)

3.视图和索引

视图

索引

索引概述

创建索引

查看、删除索引

4.存储过程

5.函数

6.Python DB-API

7.查询实战

学习目标:

1.通过创建用户并赋予权限,来满足后续开发的需要。

2.通过事务处理,来保证数据的一致性。(重点、难点)

3.使用视图简化SQL语句的频繁编写,并提高效率。

4.合理增加索引,优化查询速度。(重点)

5.使用函数、存储过程完成更加复杂的功能需求。(重点、难点)

6.使用Python的pymysql模块完成数据库的连接、数据的操作。(重点、难点)

1.用户与权限管理

MySQL 账户管理概述

MySQL的账户管理包括登录和退出MySQL服务器、创建用户、删除用户、密码管理和权限管理等内容。通过账户管理,可以保证MySQL数据库的安全性。

MySQL中root账号拥有最高权限,包括删库,删表。所以在生产环境下一般不会使用root账号登录数据库的。MySQL中的用户信息保存在mysql库下的user表中。

进入到msyql库查看msyql中所有用户信息

mysql> use mysql;
Database changed
mysql> select host,user from user;
+-----------+------+
| host      | user |
+-----------+------+
| %         | root |
| localhost | root |
+-----------+------+
2 rows in set

创建用户并分配权限

语法:

grant 权限列表 on 数据库 to ‘用户名’@‘访问主机’ identified by ‘密码’;

        提示:以上老版本的用法

        新版本的创建用户和授权分开写了,如下:

创建用户:create user ‘用户名’@’ip地址’

授权操作:grant 权限 on 数据库 to  ‘用户名’@’ip地址’

MySQL中权限有create、alter、drop、insert、update、delete、select等,如果要分配所有权限,直接使用:all privileges

下面给数据库创建一个python用户分配select权限,允许所有主机登录,密码为msyql

mysql> grant select on *.* to 'python'@'%' identified by 'mysql' with grant option;
Query OK, 0 rows affectedmysql> flush privileges;
Query OK, 0 rows affected

说明:

  • *.* :表示所有数据库的所有表
  • with grant option:表示它具有grant权限, 可以创建用户。
  • flush privileges:表示让赋予的权限立即生效。

查看、回收权限

查看用户的权限

show grants for 用户名;

show grants for python;

mysql> show grants for python;
+--------------------------------------------------------------------------------------------------------------------------+
| Grants for python@%                                                                                                      |
+--------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT ON *.* TO 'python'@'%' IDENTIFIED BY PASSWORD '*E74858DB86EBA20BC33D0AECAE8A8108C56B17FA' WITH GRANT OPTION |
+--------------------------------------------------------------------------------------------------------------------------+
1 row in set

增加权限

语法:grant update,delete,drop,insert on mysql.* to 'python'@'%';

mysql> grant update,delete,drop,insert on mysql.* to 'python'@'%';
Query OK, 0 rows affectedmysql> show grants for python;
+--------------------------------------------------------------------------------------------------------------------------+
| Grants for python@%                                                                                                      |
+--------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT ON *.* TO 'python'@'%' IDENTIFIED BY PASSWORD '*E74858DB86EBA20BC33D0AECAE8A8108C56B17FA' WITH GRANT OPTION |
| GRANT INSERT, UPDATE, DELETE, DROP ON `mysql`.* TO 'python'@'%'                                                          |
+--------------------------------------------------------------------------------------------------------------------------+
2 rows in set

回收权限

revoke select on *.*  from 'python'@'%';

mysql> revoke update,drop on mysql.* from 'python'@'%';
Query OK, 0 rows affectedmysql> show grants for python;
+--------------------------------------------------------------------------------------------------------------------------+
| Grants for python@%                                                                                                      |
+--------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT ON *.* TO 'python'@'%' IDENTIFIED BY PASSWORD '*E74858DB86EBA20BC33D0AECAE8A8108C56B17FA' WITH GRANT OPTION |
| GRANT INSERT, DELETE ON `mysql`.* TO 'python'@'%'                                                                        |
+--------------------------------------------------------------------------------------------------------------------------+
2 rows in set

修改密码

普通用户修改自己的密码

在终端上修改不需要进到数据库

MySQLadmin -upython -p password 新密码

root账号修改普通用户的密码:

1.修改MySQL.user表,修改test的密码

update user set password=password(123) where user='test';

2.刷新权限   flush privileges;

mysql> update user set password=password(123) where user='test';
Query OK, 1 row affected
Rows matched: 1  Changed: 1  Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected

删除用户

方法1:drop user '用户名'@'主机’;

方法2:进入到MySQL这个库 delete from user where user='用户名';

2.事务

事务概述

事务:也称工作单元,是由一个或多个SQL语句所组成的操作序列,这些SQL语句作为一个完整的工作单元,要么全部执行成功,要么全部执行失败。在数据库中,通过事务来保证数据的一致性。

事务处理语言:Transaction Process Language ,简称TPL,主要用来对组成事务的DML语句的操作结果进行确认或取消。确认也就是使DML操作生效,使用提交(COMMIT)命令实现;取消也就是使DML操作失效,使用回滚(ROLLBACK)命令实现。

通过事务的使用,能防止数据库中出现数据不一致现象。如两个银行账户进行转账,涉及到两条更新操作,这两条更新操作只允许全部成功或失败,否则数据会出现不一致的现象。

MySQL是支持事务的,跟使用的引擎相关。MySQL中支持多种引擎,默认使用Innodb引擎支持事务。

MyISAM:不支持事务,用于只读程序提高性能

InnoDB:支持ACID事务、支持行级锁

Berkeley DB:支持事务

事务的特性(ACID)

原子性(Atomicity):事务就像“原子”一样,不可被分割,组成事务的DML操作语句要么全成功,要么全失败,不可能出现部分成功部分失败的情况。

一致性(Consistency):一旦事务完成,不管是成功的,还是失败的,整个系统处于数据一致的状态。

隔离性(Isolation):一个事务的执行不会被另一个事务所干扰。比如两个人同时从一个账户从取钱,通过事务的隔离性确保账户余额的正确性。

持久性(Durability):也称为永久性,指事务一旦提交,对数据的改变就是永久的,不可以再被回滚。

事务处理-手动提交事务

用begin,rollback,commit来实现,用begin开启事务后在没有commit提交之前执行修改命令,变更会维护到本地缓存中,而不维护到务理表中,只有在commit提交后才会更新到务理表中。如果中间执行错误,那么用rollback回滚事务,恢复到执行事务前的状态。

begin 开启事务

调出终端  还是能查到数据

mysql> use test;
Database changed
mysql> select * from students;
+----+----------+--------+------+----------+----------+
| ID | name     | gender | age  | hometown | class_id |
+----+----------+--------+------+----------+----------+
|  3 | 诸葛亮   |       |   15 | 广州     |        1 |
|  4 | 安其拉   |        |   12 | 香港     |        1 |
|  5 | 白起     |       |   14 | 香港     |        1 |
|  6 | 不知火舞 |        |   16 | 香港     |        1 |
|  7 | 妲己     |        |   13 | 香港     |        1 |
|  8 | 狄仁杰   |       |   14 | 香港     |        1 |
|  9 | 小乔     |        |   15 | 香港     |        1 |
| 10 | 闵月     |        |   16 | 广州     |        1 |
| 16 | 李白     |       |   18 | 广州     |        2 |
| 17 | 吕布     |       |   14 | 广州     |        2 |
| 18 | 嬴政     |       |   20 | 广州     |        2 |
| 19 | 王昭君   |        |   15 | 广州     |        2 |
| 20 | 张飞     |        |   15 | NULL     |        2 |
| 21 | 貂蝉     |       |   13 | NULL     |        2 |
| 22 | 刘备     |        |   14 | 0        |        2 |
| 23 | 李昭     |       |   16 | 0        |        2 |
| 24 | 赵信     | NULL   | NULL | 广州     |     NULL |
+----+----------+--------+------+----------+----------+
17 rows in set (0.24 sec)

commit 提交事务 

mysql> commit;
Query OK, 0 rows affected

 rollback事务回滚

mysql> delete from students where id>22;
Query OK, 1 row affectedmysql> select * from students;
+----+----------+--------+-----+----------+----------+
| ID | name     | gender | age | hometown | class_id |
+----+----------+--------+-----+----------+----------+
|  3 | 诸葛亮   | 1      |  15 | 广州     |        1 |
|  4 | 安其拉   | 0      |  12 | 香港     |        1 |
|  5 | 白起     | 1      |  14 | 香港     |        1 |
|  6 | 不知火舞 | 0      |  16 | 香港     |        1 |
|  7 | 妲己     | 0      |  13 | 香港     |        1 |
|  8 | 狄仁杰   | 1      |  14 | 香港     |        1 |
|  9 | 小乔     | 0      |  15 | 香港     |        1 |
| 10 | 闵月     | 0      |  16 | 广州     |        1 |
| 16 | 李白     | 1      |  18 | 广州     |        2 |
| 17 | 吕布     | 1      |  14 | 广州     |        2 |
| 18 | 嬴政     | 1      |  20 | 广州     |        2 |
| 19 | 王昭君   | 0      |  15 | 广州     |        2 |
| 20 | 张飞     | 0      |  15 | NULL     |        2 |
| 21 | 貂蝉     | 1      |  13 | NULL     |        2 |
| 22 | 刘备     | 0      |  14 | 0        |        2 |
+----+----------+--------+-----+----------+----------+
15 rows in setmysql> rollback;
Query OK, 0 rows affectedmysql> select * from students;
+----+----------+--------+-----+----------+----------+
| ID | name     | gender | age | hometown | class_id |
+----+----------+--------+-----+----------+----------+
|  3 | 诸葛亮   | 1      |  15 | 广州     |        1 |
|  4 | 安其拉   | 0      |  12 | 香港     |        1 |
|  5 | 白起     | 1      |  14 | 香港     |        1 |
|  6 | 不知火舞 | 0      |  16 | 香港     |        1 |
|  7 | 妲己     | 0      |  13 | 香港     |        1 |
|  8 | 狄仁杰   | 1      |  14 | 香港     |        1 |
|  9 | 小乔     | 0      |  15 | 香港     |        1 |
| 10 | 闵月     | 0      |  16 | 广州     |        1 |
| 16 | 李白     | 1      |  18 | 广州     |        2 |
| 17 | 吕布     | 1      |  14 | 广州     |        2 |
| 18 | 嬴政     | 1      |  20 | 广州     |        2 |
| 19 | 王昭君   | 0      |  15 | 广州     |        2 |
| 20 | 张飞     | 0      |  15 | NULL     |        2 |
| 21 | 貂蝉     | 1      |  13 | NULL     |        2 |
| 22 | 刘备     | 0      |  14 | 0        |        2 |
| 23 | 李昭     | 1      |  16 | 0        |        2 |
+----+----------+--------+-----+----------+----------+
16 rows in set

事务处理-自动提交模式

MySQL默认是自动提交的,也就是你提交一个sql,就直接执行。可以通过 set autocommit = 0 禁止自动提交,set autocommit = 1 开启自动提交, 来实现事务的处理。

但要注意当用set autocommit = 0 的时候,以后所有的sql都将作为事务处理,直到用commit确认或 rollback结束,注意当结束这个事务的同时也开启了新的事务。按第一种方法只将当前的做为一个事务。

事务处理-隐式处理

隐式提交:当下列任意一种情况发生时,会发生隐式提交

执行一个DDL(CREATE、ALTER、DROP、TRUNCATE、RENAME)语句;

执行一个DCL(GRANT、REVOKE)语句;

隐式回滚:当下列任意一种情况发生时,会发生隐式回滚

客户端强行退出

客户端连接到服务器端异常中断

系统崩溃

3.视图和索引

视图

对于复杂的查询,在多个地方被使用,如果需求发生了改变,需要更改sql语句,则需要在多个地方进行修改,维护起来非常麻烦。这种情况下可以定义视图解决,视图本质上就是对查询语句的封装。视图实际上就是查询。

创建视图:

create view 视图名称 as select语句;

示例:创建视图,查询学生对应的成绩信息

mysql> select * from tb_student where gender=1;
+-----------+----------+--------+------------+------+--------+
| stuid     | sname    | gender | birth      | addr | collid |
+-----------+----------+--------+------------+------+--------+
| 103321001 | 杨文杰   | 1      | 1995-01-06 | 襄阳 |    102 |
| 103321003 | 何伟     | 1      | 1995-08-04 | 信阳 |    105 |
| 103321004 | 汪洋     | 1      | 1983-06-08 | 武汉 |    104 |
| 103321005 | 欧阳先锋 | 1      | 1986-09-08 | 鄂州 |    101 |
+-----------+----------+--------+------------+------+--------+
4 rows in setmysql> create view v_where_re as select * from tb_student where gender=1;
Query OK, 0 rows affected

刷新就可以看到新的视图

 查看视图:查看表会将所有的视图也列出来

show tables;

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| class          |
| students       |
| tb_coure       |
| tb_score       |
| tb_student     |
| v_where_re     |
+----------------+
6 rows in set

删除视图:

drop view 视图名称;

调用视图:

select * from v_stu_score;

mysql> select * from v_where_re;
+-----------+----------+--------+------------+------+--------+
| stuid     | sname    | gender | birth      | addr | collid |
+-----------+----------+--------+------------+------+--------+
| 103321001 | 杨文杰   | 1      | 1995-01-06 | 襄阳 |    102 |
| 103321003 | 何伟     | 1      | 1995-08-04 | 信阳 |    105 |
| 103321004 | 汪洋     | 1      | 1983-06-08 | 武汉 |    104 |
| 103321005 | 欧阳先锋 | 1      | 1986-09-08 | 鄂州 |    101 |
+-----------+----------+--------+------------+------+--------+
4 rows in set

索引

索引概述

一般的应用对数据库大部分操作都是查询,所以查询速度显得尤为重要。当数据库中数据量很大时,查找数据会变得很慢,这个时候就需要做相应的优化处理。

建立索引是一个有效的优化方案,索引就好比一本书的目录,它会让你更快的找到内容,显然目录(索引)并不是越多越好,假如这本书1000页,有500也是目录,它当然效率低,目录是要占纸张的,而索引是要占磁盘空间的。

选择索引的数据类型,越小的数据类型越好,越小的数据类型通常在磁盘、内存和CPU缓存中都需要更少的空间,处理起来更快。简单的数据类型更好,整型数据比起字符串,处理开销更小,因为字符串的比较更复杂。

MySQL常见索引有:主键索引、唯一索引、普通索引、全文索引、组合索引

创建索引

PRIMARY KEY(主键索引):

alter table 表名 add primary key (列名);

UNIQUE(唯一索引):

alter table 表名 add unique (列名);

INDEX(普通索引):

alter table 表名 add index 索引名称 (列名);

FULLTEXT(全文索引):

alter table add fulltext (列名);

组合索引:

alter table 表名 add index 索引名 (列1,列2,列2);

mysql索引的区别

主键索引:他是一种特殊的唯一索引,不允许有空值

普通索引:最基本的索引没有什么限制

唯一索引:唯一的约束,跟我们的普通索引类似,索引列的值必须唯一,允许有空值

全文索引:仅可用于myisam,针对的是较大的数据,varchar,text生成全文索引很耗时间和空间

组合索引:为了更好的提高mysql效率,允许建立组合索引,遵循 左前缀原则

查看、删除索引

查看索引

show index from 表名;

删除索引

drop index 索引名 on 表名;

查询速度测试-数据准备

创建一个表myindex表,写一段python脚本插入将50万条数据插入

show index from myindex;-- alter table myindex add index index_my_test(test);-- drop INDEX index_my_test on myindex;

4.存储过程

存储过程概述

存储过程,也翻译为存储程序,是一条或者多条SQL语句的集合,可以视为批处理,但是其作用不仅仅局限于批处理。

本节主要介绍如何创建存储过程,以及如何调用、查看、修改、删除存储过程。存储过程也可以调用其他存储过程。

创建储存过程

语法

delimiter //
create procedure 存储过程名称(参数列表)
begin
sql语句
end
//
delimiter ;

delimiter用于设置sql语句分割符,默认为分号

在“sql语句”部分编写的语句需要以分号结尾,此时回车会直接执行,所以要创建存储过程前需要指定其它符号作为分割符,此处使用//,也可以使用其它字符

示例:

delimiter //
create PROCEDURE qiuz_test_pro()
BEGIN
select * from students WHERE gender='1';
END
//
delimiter
-- 查询创建的存储过程
show PROCEDURE STATUS;
-- 调用存储过程
call qiuz_test_pro()
-- 删除存储过程
drop PROCEDURE qiuzhi_test_pro;

存储过程中的变量

要在存储过程中声明一个变量,可以使用DECLARE语句

语法:

DECLARE variable_name datatype DEFAULT default_value;

说明

在DECLARE关键字后面要指定变量名。变量名必须遵循MySQL表列名称的命名规则。

指定变量的数据类型及其大小。变量可以有任何MySQL数据类型,如INT,VARCHAR,DATETIME等。

当声明一个变量时,它的初始值为NULL。但是可以使用DEFAULT关键字为变量分配默认值。

示例:

可以声明一个名为total_sale的变量,数据类型为INT,默认值为0

DECLARE total_sale INT DEFAULT 0;

设置变量值

DECLARE total_count INT DEFAULT 0;

SET total_count = 10;

除了SET语句之外,还可以使用SELECT INTO语句将查询的结果分配给一个变量。

DECLARE total_count INT DEFAULT 0;

SELECT COUNT(*) INTO total_count FROM students;

示例

delimiter //create procedure proc_stu_2()beginDECLARE total_count INT DEFAULT 0;SELECT COUNT(*) INTO total_count FROM students;end//delimiter ;

条件语句

IF语句

语法

IF expression THEN
statements;
END IF;

如果表达式(expression)计算结果为TRUE,那么将执行statements语句,否则控制流将传递到END IF之后的下一个语句

IF...ELSE语句

如果表达式计算结果为FALSE时执行语句,请使用IF ELSE语句,如下所示:

IF expression THEN
statements;
ELSE
else-statements;
END IF;

IF...ELSEIF...ELSE语句

如果要基于多个表达式有条件地执行语句,则使用IF ELSEIF ELSE语句如下:

IF expression THEN
statements;
ELSEIF elseif-expression THEN
elseif-statements;
...
ELSE
else-statements;
END IF;

WHILE循环语句

WHILE语句的语法如下:

WHILE expression DO
statements
END WHILE

WHILE循环在每次迭代开始时检查表达式。 如果 expression 为TRUE,MySQL将执行WHILE和END WHILE之间的语句,直到expression为FALSE。 WHILE循环称为预先测试条件循环,因为它总是在执行前检查语句的表达式。

DELIMITER $$
DROP PROCEDURE IF EXISTS test_mysql_while_loop$$
CREATE PROCEDURE test_mysql_while_loop()
BEGIN
DECLARE x INT;
DECLARE str VARCHAR(255);
SET x = 1;
SET str = ‘’; WHILE x <= 5 DO
SET str = CONCAT(str,x,',’);
SET x = x + 1;
END WHILE;
SELECT str;
END
$$
DELIMITER ;

5.函数

内置函数-字符串函数

查看字符的ascii码值ascii(str),str是空串时返回0

select ascii('a');

查看ascii码值对应的字符char(数字)

select char(97);

拼接字符串concat(str1,str2...)

select concat(12,34,'ab');

包含字符个数length(str)

select length('abc');

截取字符串

left(str,len)返回字符串str的左端len个字符

right(str,len)返回字符串str的右端len个字符

substring(str,pos,len)返回字符串str的位置pos起len个字符

mysql> select left('abcefg123',6);
+---------------------+
| left('abcefg123',6) |
+---------------------+
| abcefg              |
+---------------------+
1 row in setmysql> select right('abcefg123',6);
+----------------------+
| right('abcefg123',6) |
+----------------------+
| efg123               |
+----------------------+
1 row in setmysql> select substring('abcefg123',2,3);
+----------------------------+
| substring('abcefg123',2,3) |
+----------------------------+
| bce                        |
+----------------------------+
1 row in set

去除空格

ltrim(str)返回删除了左空格的字符串str

rtrim(str)返回删除了右空格的字符串str

trim([方向 remstr from str)返回从某侧删除remstr后的字符串str

方向词包括both、leading、trailing,表示两侧、左、右)

mysql> select trim(' bar  ');
+----------------+
| trim(' bar  ') |
+----------------+
| bar            |
+----------------+
1 row in setmysql> select trim(leading 'x' FROM 'xxxbarxxx');+------------------------------------+
| trim(leading 'x' FROM 'xxxbarxxx') |
+------------------------------------+
| barxxx                             |
+------------------------------------+
1 row in setmysql> select trim(both 'x' FROM 'xxxbarxxx');+---------------------------------+
| trim(both 'x' FROM 'xxxbarxxx') |
+---------------------------------+
| bar                             |
+---------------------------------+
1 row in setmysql> select trim(trailing 'x' FROM 'xxxbarxxx');+-------------------------------------+
| trim(trailing 'x' FROM 'xxxbarxxx') |
+-------------------------------------+
| xxxbar                              |
+-------------------------------------+
1 row in set

返回由n个空格字符组成的一个字符串space(n)

mysql> select concat('x',space(10),'x');
+---------------------------+
| concat('x',space(10),'x') |
+---------------------------+
| x          x              |
+---------------------------+
1 row in set

替换字符串replace(str,fromstr,tostr)

mysql> select replace('abc123','123','efg');
+-------------------------------+
| replace('abc123','123','efg') |
+-------------------------------+
| abcefg                        |
+-------------------------------+
1 row in set

大小写转换,函数如下

lower(str)

upper(str)

mysql> select lower('ABC');
+--------------+
| lower('ABC') |
+--------------+
| abc          |
+--------------+
1 row in setmysql> select upper('gfh');
+--------------+
| upper('gfh') |
+--------------+
| GFH          |
+--------------+
1 row in set

日期时间函数

获取子值,值为整数类型,函数如下

year(date)返回date的年份(范围在1000到9999)

month(date)返回date中的月份数值

day(date)返回date中的日期数值

hour(time)返回time的小时数(范围是0到23)

minute(time)返回time的分钟数(范围是0到59)

second(time)返回time的秒数(范围是0到59)

mysql> select year('2021-11-15') as 年,month('2021-11-15') as 月,day('2021-11-15') as 日;
+------+----+----+
| 年   | 月 | 日 |
+------+----+----+
| 2021 | 11 | 15 |
+------+----+----+
1 row in set
mysql> select hour('16:43:59') as 小时,minute('16:43:59') as 分钟,second('16:43:59') as 秒;
+------+------+----+
| 小时 | 分钟 | 秒 |
+------+------+----+
|   16 |   43 | 59 |
+------+------+----+
1 row in set

日期计算,使用+-运算符,数字后面的关键字为year、month、day、hour、minute、second

mysql> select '2021-11-15'+interval 1 day;
+-----------------------------+
| '2021-11-15'+interval 1 day |
+-----------------------------+
| 2021-11-16                  |
+-----------------------------+
1 row in set

日期时间函数

日期格式化date_format(date,format)

参数format可选值如下

%Y 获取年,返回完整年份
%y 获取年,返回简写年份
%m 获取月,返回月份
%d 获取日,返回天值
%H 获取时,返回24进制的小时数
%h 获取时,返回12进制的小时数
%i 获取分,返回分钟数
%s 获取秒,返回秒数

示例:将使用-拼接的日期转换为使用空格拼接

mysql> select date_format('2021-11-15','%Y %m %d');
+--------------------------------------+
| date_format('2021-11-15','%Y %m %d') |
+--------------------------------------+
| 2021 11 15                           |
+--------------------------------------+
1 row in set

当前日期current_date()、当前时间current_time() 、当前日期时间now()

mysql> select current_date() as 当前日期,current_time() as 当前时间,now() as 当前日期时间;
+------------+----------+---------------------+
| 当前日期   | 当前时间 | 当前日期时间        |
+------------+----------+---------------------+
| 2021-11-15 | 16:52:44 | 2021-11-15 16:52:44 |
+------------+----------+---------------------+
1 row in set

自定义函数

创建自定义函数

语法:

delimiter $$
create function 函数名称(参数列表) returns 返回类型
begin
sql语句
end
$$
delimiter ; 

示例:

mysql> delimiter $$
CREATE FUNCTION py_trim(str VARCHAR(100)) returns varchar(100)
BEGIN
DECLARE x VARCHAR(100);
set x=LTRIM(RTRIM(str));
return x;
END
$$
delimiter;
1304 - FUNCTION py_trim already exists

查看创建的自定义函数

所有函数存储在mysql数据库下的proc表中,存储过程与函数都存储在proc表中,区别在type字段,函数的type字段为 FUNCTION

查看python数据库中的函数

select name,type from mysql.proc where db='python’;

调用自定义函数

select 函数名称(参数列表);

mysql> select py_trim(' ss');
+----------------+
| py_trim(' ss') |
+----------------+
| ss             |
+----------------+
1 row in set

6.Python DB-API

概述

Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口。

PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个实现库,Python2中则使用mysqldb。

PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库。

安装PyMySQL

在使用 PyMySQL 之前,我们需要确保 PyMySQL 已安装。

PyMySQL 下载地址:https://github.com/PyMySQL/PyMySQL

如果还未安装,我们可以使用以下命令安装最新版的 PyMySQL:

pip install PyMySQL

连接数据库

数据库准备,连接数据库之前,请确保已经创建了python数据库,以及students表

创建Connection 对象:用于建立与数据库的连接

#创建数据库的链接
from pymysql import *
conn=connect(host='localhost',user='root',password='123',database='test',port=3306,charset='utf8')
#创建一个游标对象 可以利用这个对象进行数据库的操作
try:cur=conn.cursor()print('success')
except Exception as ex:print(ex)

Connection 连接对象拥有的方法

close 关闭连接,连接数据库跟打开文件一样,操作完成之后需要关闭,否则会占用连接。

commit()提交,pymysql 默认开启事物,所以每次更新数据库都要提交

rollback()回滚,事物回滚

cursor()返回Cursor对象,用于执行sql语句并获得结果

获取cursor对象

cur = conn.cursor() # cursor对象用于执行sql语句

cursor对象拥有的方法

close()关闭cursor对象

execute(operation [, parameters ]) 执行语句,返回受影响的行数,可以执行所有语句

fetchone()获取查询结果集的第一个行数据,返回一个元组

fetchall()执行查询时,获取结果集的所有行,一行构成一个元组,再将这些元组装入一个元组返回

#创建数据库的链接
from pymysql import *
conn=connect(host='localhost',user='root',password='123',database='test',port=3306,charset='utf8')
#创建一个游标对象 可以利用这个对象进行数据库的操作
try:cur=conn.cursor()cur.execute('select * from tb_student')result=cur.fetchall()for item in result:print('姓名:{} 地址:{}'.format(item[1],item[4]))
except Exception as ex:print(ex)finally:cur.close()conn.close()

运行结果

姓名:杨文杰 地址:襄阳
姓名:何玲峰 地址:新洲
姓名:何伟 地址:信阳
姓名:汪洋 地址:武汉
姓名:欧阳先锋 地址:鄂州

插入数据

res = cur.execute('insert into students VALUES (0,"白里守约",0,"广州",2,18);’)

print(res) # 查看受影响的行数

conn.commit() # 提交事物

#创建数据库的链接
from pymysql import *
conn=connect(host='localhost',user='root',password='123',database='test',port=3306,charset='utf8')
#创建一个游标对象 可以利用这个对象进行数据库的操作
try:cur=conn.cursor()insersql='''insert into tb_student(stuid,sname,addr) values(100,'吴老师','广东')'''cur.execute(insersql)conn.commit()

查询数据:

#创建数据库的链接
from pymysql import *
conn=connect(host='localhost',user='root',password='123',database='test',port=3306,charset='utf8')
#创建一个游标对象 可以利用这个对象进行数据库的操作
try:cur=conn.cursor()insersql='''insert into tb_student(stuid,sname,addr) values(101,'张老师','广东')'''cur.execute('select * from tb_student')result=cur.fetchall()for item in result:print('姓名:{} 地址:{}'.format(item[1],item[4]))
except Exception as ex:print(ex)finally:cur.close()conn.close()

输出结果

姓名:吴老师 地址:广东
姓名:杨文杰 地址:襄阳
姓名:何玲峰 地址:新洲
姓名:何伟 地址:信阳
姓名:汪洋 地址:武汉
姓名:欧阳先锋 地址:鄂州

执行sql语句参数化,参数化sql语句中使用%s占位。

execute(operation [parameters]) 执行语句,返回受影响的行数,可以执行所有语句

[parameters] 参数列表

cur.execute('select * from tb_student where stuid=%s',[100])

7.查询实战

准备数据

mysql> create table goods(-> id int unsigned primary key auto_increment not null,-> name varchar(150) not null,-> cate varchar(40) not null,-> brand_name varchar(40) not null,-> price decimal(10,3) not null default 0-> );
Query OK, 0 rows affected

使用insert语句,插入多条数据

insert into goods values(0,'Apple MacBook Air 13.3英寸笔记本电脑','笔记本','苹果','6588');
insert into goods values(0,'联想(Lenovo)拯救者R720 15.6英寸大屏','笔记本','联想','6099');
insert into goods values(0,'法国酒庄直采原瓶原装进口AOC级艾落干红葡萄酒','红酒','法国','499');
insert into goods values(0,'x550cc 15.6英寸笔记本','笔记本','华硕','2799');
insert into goods values(0,'清扬(CLEAR)洗发水','洗发水','清扬','35'); 

查询

查询goods表中所有的商品

select * from goods;

查询所有产品的平均价格,并且保留两位小数

select round(avg(price),2) as 平均价格 from goods

通过子查询来实现,查询所有价格大于平均价格的商品,并且按价格降序排序

SELECT id,name,price from goods
where price>(select round(avg(price),2)from goods)
ORDER BY price DESC;

查询所有 "联想" 的产品

select * from goods where brand_name='联想';

查询价格大于或等于"联想"价格的商品,并且按价格降序排列

select id,name,price from goods
where price>=any(select price from goods where brand_name='联想')
order by price desc; 

查询每个产品类型的最低价格的,通过cate字段进行分组。

select cate,min(price) from goods group by cate;

运行结果

查询价格区间在4500-6500之间的笔记本

select * from goods where price BETWEEN 4500 and 6500 and cate='笔记本';

查询数据分表

mysql> create table if not exists goods_cates(-> cate_id int unsigned primary key auto_increment, -> cate_name varchar(40)-> );

1、查询goods表中所有的商品,并且按"类别"分组

select cate from goods group by cate;

2、将分组后的结果写入到刚才创建的表中

INSERT into goods_cates(cate_name) select cate from goods group by cate;

3、通过goodscates数据表来更新goods表,将goods表中的cate字段,修改成goodscates的id字段

update goods inner join goods_cates on goods.cate=goods_cates.cate_name set cate=cate_id;

4、字段 brand_name 进行分表

create table if not exists goods_brands(
brand_id int unsigned primary key auto_increment,
brand_name varchar(40)
);
insert into goods_brands(brand_name) select brand_name from goods group by brand_name;

5、通过goodsbrands数据表来更新goods表,将goods表中的barndname字段,修改成goods_brands的id字段

update goods as g inner join goods_brands as b on g.brand_name=b.brand_name
set g.brand_name=b.brand_id;

6、查看goods表结构,发现 cate, 、brand_name 两个字段都是varchar字段,需要修改成int类型字段。

alter table goods change cate cate_id int UNSIGNED not null,
change brand_name brand_id int UNSIGNED not null;
desc goods;

7、通过左连接查询所有商品的信息

 

select id,name,cate_name,brand_name,price from goods as g
left join goods_cates as c on g.cate_id = c.cate_id
left join goods_brands as b on g.brand_id = b.brand_id; 

8、通过右连接查询所有商品的信息

select id,name,cate_name,brand_name,price from goods as g
right join goods_cates as c on g.cate_id = c.cate_id
right join goods_brands as b on g.brand_id = b.brand_id; 

MySQL高级—MysqlDay3相关推荐

  1. Mysql高级调优篇——第五章:Sql调优在面试中深度剖析

    上节讲了Sql调优实战,本章聊聊面试中Sql调优深度的剖析场景! 在讲之前我们先做一些准备工作,建立一些需要用到的表: Mysql高级调优篇表补充--建表SQL_风清扬逍遥子的博客-CSDN博客⭐️t ...

  2. Mysql高级调优篇——第四章:Sql实战调优场景剖析(下)

    上一章我们讲述了索引调优实战在Join的过程,那么本章重点阐述索引失效的场景及原因剖析! 1.索引失效场景 老规矩先导入一些表作为数据使用,表的所有定义在这个链接中: Mysql高级调优篇表补充--建 ...

  3. Mysql高级调优篇——第三章:Sql实战调优场景剖析(上)

    上几个章节我们讲述了很多硬核的知识,那本章开始我们正式进入Sql实战过程!! 1.热身Case 回顾上节讲的Explain知识点,我们简单做个回顾,来个热身的Case: 看下面的Sql执行是如何的,请 ...

  4. Mysql高级调优篇——前言简介

    本篇开始就进入Mysql高级篇,当然我讲解的身份是Java开发工程师,并非专业的DBA,所以我们以写出高效,好用,Sql优化和开发相关的数据库方面的知识落地为目的,帮助开发解决一些sql上的问题,为迈 ...

  5. Mysql高级之触发器

    原文:Mysql高级之触发器 触发器是一类特殊的事务 ,可以监视某种数据操作(insert/update/delete),并触发相关操作(insert/update/delete). 看以下事件: 完 ...

  6. MySQL 高级 - 存储过程 - 语法 - case结构

    MySQL 高级 - 存储过程 - 语法 - case结构 -- 给定一个月份, 然后计算出所在的季度 create procedure pro_test7(mon int) begindeclare ...

  7. MySQL 高级 - 存储过程 - 语法 - if判断 || 传递参数 (IN - 输入 OUT-输出)

    MySQL 高级 - 存储过程 - 语法 - if判断 传递参数

  8. MySQL高级知识(十五)——主从复制

    前言:本章主要讲解MySQL主从复制的操作步骤.由于环境限制,主机使用Windows环境,从机使用用Linux环境.另外MySQL的版本最好一致,笔者采用的MySQL5.7.22版本,具体安装过程请查 ...

  9. mysql高级笔记_MySQL高级部分笔记

    有关于MySQL的高级部分笔记 这是一篇关于MySQL高级部分的笔记主要是,sql优化以及mysql锁的相关内容,以及主从配置等内容等比较基础的优化 一.逻辑架构部分 逻辑架构 逻辑架构介绍图如下 连 ...

  10. MySQL高级 - 锁 - MyISAM表锁 - 读锁

    如何加表锁 MyISAM 在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE.DELETE.INSERT 等)前,会自动给涉及的表加写锁,这个过程并不需要用户干 ...

最新文章

  1. setfacl设置特定目录的权限
  2. 131. 分割回文串(回溯算法)
  3. IOS 本地推送 IOS10.0以上 static的作用 const的作用
  4. 智能制作,是我们改变时代的机会——阿里云视频云的理想与未来
  5. c++返回指针时候注意提防_编写干净的测试–提防魔术
  6. 函数式编程在Redux/React中的应用
  7. 单链表的代码python_python版本单链表实现代码
  8. 我是这样理解HTTP和HTTPS区别的
  9. 关于QT中奇数个汉字出现newline in constant的错误
  10. Boost下载安装编译配置使用指南
  11. ios 添加block 类别_ios block是什么数据类型?
  12. Python网络编程之基于socket实现文件上传
  13. 分享几款PR常用插件
  14. 用matlab解线性规划题目,用MATLAB软件解线性规划范例
  15. 十大验证码解决方案服务比较
  16. 企业邮箱管理员如何管理邮箱
  17. 现在的学生能把老师活活气死
  18. office2010安装包下载,专业版完整版官方原版
  19. python 利用脚本命令压缩加密文件并删除源文件
  20. linux安装驱动报错权限没有,linux系统下安装显卡驱动程序.doc

热门文章

  1. 管式超滤系统:管式超滤膜的市场发展与应用领域
  2. 自己-社会-机器学习
  3. Win7资源管理器频繁自动重启的解决方法
  4. 【语法】如何翻译how从句和介词提前的定语从句
  5. Cadence Allegro 导出Properties on Nets Report报告详解
  6. Android开机全解析
  7. 手机安装cherles证书
  8. css 企业级,web前端开发企业级CSS常用命名,书写规范总结
  9. Nginx mirror指令详解
  10. Candence dsp算子