目录
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()