-- 数据库备份 在库外执行,将数据库备份,在当前目录生成一个xxx.sql文件
mysqldump -uroot -p 数据库名 > xxx.sql;
-- 数据库恢复 在库外执行,将数据库恢复到其余数据库中去
mysql -uroot -p 新数据库名 < xxx.sql; 复制代码
原子性:python
一个事务必须被视为一个不可分割的最小工做单元,整个事务中的全部操做要么所有提交成功,要么所有失败回滚,对于一个事务来讲,不可能只执行其中的一部分操做,这就是事务的原子性mysql
一致性:sql
数据库老是从一个一致性的状态转换到另外一个一致性的状态。(例如在转帐过程当中系统崩溃,支票帐户中也不会损失,由于事务最终没有提交,因此事务中所作的修改也不会保存到数据库中。)数据库
隔离性:缓存
一般来讲,一个事务所作的修改操做在提交事务以前,对于其余事务来讲是不可见的。函数
持久性:fetch
一旦事务提交,则其所作的修改会永久保存到数据库。ui
在使用事务以前,先要确保表的存储引擎是 InnoDB
类型, 只有这个类型才可使用事务,MySQL数据库(5.1以后)中表的存储引擎默认是 InnoDB
类型。编码
表的存储引擎说明:spa
表的存储引擎就是提供存储数据一种机制,不一样表的存储引擎提供不一样的存储机制。
查看MySQL数据库支持的表的存储引擎:
-- 查看MySQL数据库支持的表的存储引擎show engines;复制代码
说明:
经常使用的表的存储引擎是 InnoDB
和 MyISAM
InnoDB
是支持事务的
MyISAM
不支持事务,优点是访问速度快,对事务没有要求或者以select、insert为主的均可以使用该存储引擎来建立表
开启事务:
begin;--或者start transaction;复制代码
开启事务后执行修改命令,变动数据会保存到MySQL服务端的缓存文件中,而不维护到物理表中
MySQL数据库默认采用自动提交(autocommit
)模式,若是没有显示的开启一个事务,那么每条sql语句都会被看成一个事务执行提交的操做
set autocommit = 0;
--设置autocommit = 0 变为了手动提交事务,默认为1为自动提交
insert into 表名(name) values('张无忌');
-- 须要执行手动提交,数据才会真正添加到表中, 验证的话须要从新打开一个链接窗口查看表的数据信息,由于是临时关闭自动提交模式
commit --提交事务
-- 另外从新打开一个终端窗口,链接MySQL数据库服务端
mysql -uroot -p
-- 而后查询数据,若是上个窗口执行了commit,这个窗口才能看到数据select * from 表名;复制代码
回滚事务:
放弃本地缓存文件中的缓存数据, 表示回到开始事务前的状态
rollback; --回滚事务复制代码
索引在MySQL中也叫作“键”,它是一个特殊的文件,它保存着数据表里全部记录的位置信息,更通俗的来讲,数据库索引比如是一本书前面的目录,能加快数据库的查询速度。
应用场景:
当数据库中数据量很大时,查找数据会变得很慢,咱们就能够经过索引来提升数据库的查询效率。
查看表中已有索引:
show index from 表名;复制代码
说明:
主键列会自动建立索引
索引的建立:
-- 建立索引的语法格式
-- alter table 表名 add index 索引名[可选](列名, ..)
-- 给name字段添加索引
alter table 表名 add index my_name (name);复制代码
说明:
索引名不指定,默认使用字段名
索引的删除:
-- 删除索引的语法格式
-- alter table 表名 drop index 索引名
-- 若是不知道索引名,能够查看创表sql语句
show create table 表名;
alter table 表名 drop index my_name;复制代码
聚合函数的介绍
聚合函数又叫组函数,一般是对表中的数据进行统计和计算,通常结合分组(group by)来使用,用于统计和计算分组数据。下面是一些常见的聚合函数:
count(col): 表示求指定列的总行数
max(col): 表示求指定列的最大值
min(col): 表示求指定列的最小值
sum(col): 表示求指定列的和
avg(col): 表示求指定列的平均值
分组查询
分组查询就是将查询结果按照指定字段进行分组,字段中数据相等的分为一组。
语法格式:
GROUP BY 列名 [HAVING 条件表达式] [WITH ROLLUP]复制代码
HAVING对分组后的数据进行条件过滤,WITH ROLLUP在全部记录的最后加上一条记录,显示select查询时聚合函数的统计和计算结果。
-- 根据gender字段进行分组,汇总全部人的年龄
select gender,group_concat(age) from 表名 group by gender with rollup;复制代码
下面对数据库比较常见的SQL语句作一些简单总结:
insert into 表名(name) values ('黄蓉'),('郭靖'),('黄药师'); --一次插入多列;
select * from 表名 where not age between 10 and 25; --年龄不在10到25之间;
select * from 表名 where age in(20,23); --年龄是20,23的;
select * from 表名 where height is null; --身高不为空;
select * from 表名 order by age desc,height desc; --年龄按降序,年龄相同身高按降序排序;
--求平均价格,而且保留两位小数
select round(avg(price),2) from 表名;
--查询全部价格大于平均价格的商品,而且按价格降序排序
select id,name,price from 表名 where price > (select round(avg(price),2) from 表名) order by price desc;
--分页查询
select * from 表名 limit start,count
-- limit是分页查询关键字
-- start表示开始行索引,默认是0-
- count表示查询条数复制代码
查询两个表中符合条件的共有记录。
select 字段 from 表1 inner join 表2 on 表1.字段1 = 表2.字段2复制代码
inner join 就是内链接查询关键字
on 就是链接查询条件
以左表为主根据条件查询右表数据,若是根据条件查询右表数据不存在使用null值填充。
select 字段 from 左表 left join 右表 on 左表.字段1 = 右表.字段2复制代码
left join 就是左链接查询关键字
on 就是链接查询条件
以右表为主根据条件查询左表数据,若是根据条件查询左表数据不存在使用null值填充。
select 字段 from 左表 right join 右表 on 左表.字段1 = 右表.字段2复制代码
right join 就是右链接查询关键字
on 就是链接查询条件
外键约束:对外键字段的值进行更新和插入时会和引用表中字段的数据进行验证,数据若是不合法则更新和插入会失败,保证数据的有效性。
-- 为cls_id字段添加外键约束
alter table students add foreign key(cls_id) references classes(id);复制代码
-- 建立学校表
create table school( id int not null primary key auto_increment,
name varchar(10));
-- 建立老师表
create table teacher( id int not null primary key auto_increment,
name varchar(10),
s_id int not null,
foreign key(s_id) references school(id));复制代码
-- 须要先获取外键约束名称,该名称系统会自动生成,能够经过查看表建立语句来获取名称
show create table teacher;
-- 获取名称以后就能够根据名称来删除外键约束
alter table teacher drop foreign key 外键名;复制代码
pymysql
是python链接mysql
的一个比较经常使用的库。可经过pip
安装。
pip show pymysql
--查看是否装pymysql及查看装后的信息;
pip install pymysql --安装复制代码
import pymysql
''' host=None, # Mysql所在的主机IP地址,若是在本地使用localhost user=root, # 用户名 password="mysql",# 密码 database='py', # 使用哪一个数据库 port=3306, # mysql的端口,默认3306 charset='utf8' # 数据库编码格式 '''
conn = pymysql.connect(host = 'None',
user = 'root',
password='mysql',
database='py',
port = 3306,
charset = 'utf8')
sql = 'select * from students' #待执行的sql语句
cursor = conn.cursor() # 获取游标
raw_count = cursor.execute(sql) #cursor执行sql语句,返回影响的行数
print('raw_count:',raw_count)
# one = cursor.fetchone() # 返回一个数据,格式是元祖
# print('one:',one)
res = cursor.fetchall() # 返回全部查询数据,是一个复合元祖
for one in res:
print(one)
cursor.close() # 关游标
conn.close() # 关闭数据库链接复制代码
上面的代码演示了查询语句的基本使用。
try:
sql = "insert into students(name,age)values(%s,%s),(%s,%s)" # %s参数占位,插入两行
cursor = conn.cursor() # 获取游标
raw_count = cursor.execute(sql,['西门吹雪',25,'独孤求败',30]) #返回影响行数
print('raw_count:',raw_count)
conn.commit() #提交事务
except Exception as e:
print(e)
conn.rollback() # 出现错误,对数据进行回滚
finally:
cursor.close()
conn.close()复制代码
防止sql
注入,用%s
占位,可传入任意类型数据, %s
占位不须要带引号。上面的代码演示了执行sql
插入的操做。下面演示删除与更新sql
的代码。注意一下cursor
的execute()
方法,若是传入第二个参数,能够是列表或元祖。
conn = pymysql.connect(host = 'None',user = 'root',
password='mysql',database='py',
port = 3306,charset = 'utf8')
try:
# sql = "delete from students where id = %s" # 删除
sql = "update students set age = %s where id = %s" # 修改
cursor = conn.cursor() # 获取游标
# raw_count = cursor.execute(sql,(9,)) #删除id=9的数据
raw_count = cursor.execute(sql,(18,19)) # 修改
print('raw_count:',raw_count)
conn.commit() #提交事务
res = cursor.fetchall() #遍历全部记录
for one in res:
print(one)
except Exception as e:
print(e)
conn.rollback() # 出现错误,对数据进行回滚
finally:
cursor.close()
conn.close()复制代码