python全栈第二十五天 mysql

目录

 

mysql高级查询

排序

分页查询

聚合函数

分组查询

连接查询

左连接

右连接

自连接

子查询

数据库设计之三范式

E-R模型

PyMySQL

事务的介绍

事务的使用

索引

索引的使用

查看耗时

联合索引

闭包

装饰器

装饰器的语法糖写法

通用装饰器的使用

装饰器带参

类装饰器


mysql高级查询

 

排序

语法

select * from 表名 order by 列名 desc|asc;

eg:

 select * from sanguo order by height desc,age asc;

 

分页查询

语法

select * from 表名 limit start,count;

eg:

select * from sanguo where gender = "男" limit 0, 3;

 

聚合函数

一般结合分组使用,用于统计分组数据。聚合函数不对空值进行统计

select avg(height) from sanguo;

 

分组查询

语法

group by 列名 [HAVING 条件表达式] [WHIT ROLLUP];

 

select gender from sanguo group by gender;
select gender,group_concat(name) from sanguo group by gender;
select gender,avg(height) from sanguo group by gender;
select gender,count(*) from sanguo group by gender;
select gender,count(*) from sanguo group by gender with rollup;
select gender,count(*) from sanguo group by gender having count(*) > 1;

 

 

连接查询

内连接

语法:

select 字段 from 表1 inner join 表2 on 表1.字段1 = 表2.字段2

内连接查询关键字 inner join,on是连接查询条件

内连接,两个表的公共数据

select * from class inner join sanguo on class.id = sanguo.c_id;
select class.name, sanguo.name from class inner join sanguo on class.id = sanguo.c_id;

 

左连接

以左表为主根据条件查询右表数据,如果根据条件查询右表数据不存在使用null值填充

语法:

select 字段 from 表1 left join 表2 on 表1.字段1 = 表2.字段2

select * from class left join sanguo on class.id = sanguo.c_id;
select * from sanguo left join class on class.id = sanguo.c_id;

右连接

select * from class right join sanguo on class.id = sanguo.c_id;

 

自连接

左表和右表是同一个表,根据连接查询条件查询两个表中的数据

 

子查询

在一个select 语句中,嵌入了另外一个select语句,那么被嵌入的select语句称之为子查询语句,外select语句称之为主查询;

select * from students where age > (select avg(age) from students);

select * from sanguo where (age, height) = (select max(age), max(height) from sanguo);

 

数据库设计之三范式

第一范式(1NF):强调列的原子性,即列不能够再分成其他几列。

第二范式(2NF):满足1NF,1表必须又一个主键;2是主键字段必须完全依赖于主键,而不能只依赖于主键的一部分。

第三范式(3NF):满足2NF,另外非主键必须直接依赖于主键,不能存在间接或传递依赖。

 

E-R模型

设计数据库,先画出实体-关系模型。

 

添加外键约束:alter table 从表名 add foreign key(外键字段) references 主表(主键字段);

删除外键约束:alter table 表名 drop foreign key 外键名;

 

PyMySQL

安装pymysql第三方包

sudo pip3 install pymysql;

查看信息

pip3 show pymysql

pip3 list

 

导入

import pymysql

创建连接对象

conn = connect(参数列表)

参数host:连接的mysql主机,如果本机是'localhost'

参数port:连接的mysql主机的端口,默认是3306

参数user:连接的用户名

参数password:连接的密码

参数database:数据库的名称

参数charset:通信采用的编码方式,推荐使用utf8

 

连接对象操作说明:

关闭连接 conn.close()

提交数据 conn.commit()

撤销数据 conn.rollback()

 

获取游标对象

获取游标对象的目标就是要执行sql语句,完成对数据库的增,删,改,查操作。

cur = conn.cursor()

游标操作说明:

使用游标执行SQL语句:execute(operation [parameters]) 执行SQL语句,返回受影响的行数,主要用于执行insert,update ,delete,select等语句

获取查询结果集中的一条数据:cur.fetchone()返回一个元组,如(1,‘张三’)

获取查询结果集中的所有数据:cur.fetchall()返回一个元组,如(1,‘张三’),(2,‘李四’))

关闭游标:cur.close(),表示和数据库操作完成

 

pymysql 完成数据的查询操作

import pymysql

创建连接对象

#1.导入第三方包
import pymysql



if __name__ == '__main__':

#2.创建连接对象
    conn = pymysql.connect(host='localhost',
                           port=3306,
                           user='root',
                           password='123456',
                           database='testdb',
                           charset='utf8')
#3.获取游标对象
    cur = conn.cursor()
#4.操作游标,执行sql语句
    sql = 'select * from sanguo;'
    cur.execute(sql)
    row = cur.fetchall()
    for item in row:
        print(item)
#5.关闭游标
    cur.close()
#6.关闭连接对象
    conn.close()

事务的介绍

事务就是用户定义的一系列执行SQL语句的操作,这些操作要么完全地执行,要么完全地都不执行,它是一个不可分割的工作执行单元。

事务的使用场景:

在日常生活中,有时我们需要进行银行转账,这个银行转账背后就是要执行多个SQL语句,假如这些SQL执行到一半突然停电,那么就会导致这个功能只完成了一半,这种情况是不允许出现,要想解决这个问题就需要通过事务来完成。

 

事务的四大特性:

原子性 Atomicity

一致性 Consistency

隔离性 Isolation

持久性 Durability

原子性:

一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性

一致性:

数据库总是从一个一致性的状态转换到另一个一致性的状态。

隔离性:

通场来说,一个事务所作的修改操作在提交事务之前,对于其他事务来说是不可见的。

持久性:

一旦事务提交,则其所做的修改会永久保存到数据库

说明:

事务能够保证数据的完整性和一致性,让用户的操作更加安全。

 

事务的使用

在使用事务之前,先要确保表的存储引擎是InnoDB类型,只有这个类型才可以使用事务,MYSQL数据库中表的存储引擎默认是InnoDB类型。

表的存储引擎说明:

表的存储引擎就是提供存储数据一种机制,不同表的存储引擎提供不同的存储机制。

查看MYSQL数据库支持的表的存储引擎:

show engines;

 

开启事务:

begin;

或者

start transaction;

说明:

开启事务执行修改命令,变更数据会保存到mysql服务端的缓存文件中,而不维护到物理表中

mysql数据库默认采用自动提交(autocommit)模式,如果没有显示的开启一个事务,那么每条sql语句都会被当做一个事务执行提交的操作

当设置autocommit=0就是取消了自动提交事务模式,直到显示的执行commit和rollback表示该事务结束。

set autocommit = 0;

insert into students(name) values('刘老爷');

commit

mysql -uroot -p

select * from students;

commit;

 

 

索引

索引介绍

索引在mysql中叫做‘健’,他是一个特殊的文件,它保存着数据表里所有记录的位置信息,更通俗的来说,数据库索引好比一本书前面的目录,能加快数据库的查询速度.但是会创建索引文件

应用场景

当数据库中数据量很大时,查找数据会变得很慢,我们就可以通过索引来提高数据库的查询效率

 

索引的使用

查看表中已有索引:

show index from 表名;

说明:

主键列会自动创建索引

索引的创建、

语法

alter table 表名 add index 索引名(字段名,...)

说明

索引名不指定,默认使用字段名

删除索引

alter table 表名 drop index 索引名

 

查看耗时

set profiling = 1;

show profiles;

 

联合索引

即一个索引覆盖表中两个或者多个字段

alter table 表名 add index(字段名,字段名)

联合索引最左原则

 

 

闭包

函数执行完,变量不释放

在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包

闭包的作用:可以保存外部函数的变量

普通闭包

1.函数嵌套

2.外部函数的变量

3。内部要使用外部函数的变量

4.返回内部函数

def sum():
    num1 = 10
    def sum1(num2):
        result = num1 + num2
        print(result)
    return sum1

a = sum()
a(1)

 

修改闭包内使用的外部变量

在闭包内修改外部变量需要用到gobal关键词

 

装饰器

给已有函数增加额外功能的函数,本质上就是一个闭包函数。

1.不修改已有函数的源代码

2.不修改已有函数的调用方式

3.给已有函数增加额外功能

如果闭包函数的参数有且只有一个并且时函数类型,那么这个闭包函数称为装饰器

def comment():
    print('发表评论')


def loginC(func):
    def inner():
        print('已登录')
        func()
    return inner


comment = loginC(comment)
comment()

 

装饰器的语法糖写法

如果有多个函数都需要添加登录验证的功能,每次都要编写func = check(func)这样代码对已有函数进行装饰,这种做法还是比较麻烦。

python给提供了一个装饰函数更加简单的写法,那就是语法糖,语法糖的书写格式:

@装饰器名字,通过语法糖的方式也可以完成对已有函数的装饰

def loginC(func):
    def inner():
        print('已登录')
        func()
    return inner


@loginC
def comment():
    print('发表评论')




# comment = loginC(comment)
comment()

说明:

装饰器的执行时间时加载模块时立即执行

 

通用装饰器的使用

1.装饰带有参数的函数

def decorator(func):
    def inner(*args, **kwargs):
        num = func(*args, **kwargs)
        return num
    return inner

装饰器带参

其实时在原有的装饰器上嵌套了一层函数

def return_decorator(flag):
    def decorator(func):
        def inner(*args, **kwargs):
            num = func(*args, **kwargs)
            return num
        return inner
    return decorator


@return_decorator('1')
def cinner():
    print('xx')

类装饰器

实现__call__方法,表示对象是一个可调用对象可以像函数一样调用

class MyDecorator(object):
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        self.func()


@MyDecorator
def show():
    print('杭州下雪了!')


show()

 

Guess you like

Origin blog.csdn.net/qq_41179365/article/details/111469029