--EmpAndDept5
--主要关于更新表格、数据库备份、日志的开启、删除和通过python来调用mysql
--将select的数据返回创建一个新表
create table emp2 as
select empno,sal from emp where 1=0;
--这种方式可以创建一个包含列字段但是没有数据的方法,因为后面的where始终为false
--将depno为20的部门的每个员工的薪水更新为现在的110%,要求永久保存,使用update
update emp set sal=sal*1.1 where deptno=10;
--仅更新在emp_bonus中有奖金的人的薪水(1.1倍)
update emp set sal=sal*1.1 where empno in (select empno from emp_bonus);
--使用exists实现跟in一样的功能
update emp e set sal=sal*1.1 where exists(select null from emp_bonus eb where e.empno=eb.empno);
--记住任何时候都要记得where,除非你想全部的数据都更新
--删除重复数据,先insert一个,因为主键的原因,empno不一样,但是我们知道这两就是一个人,是重复的
insert into emp(ename,job,mgr,hiredate,sal,comm,deptno) values('smith','clerk',7902,1980-12-27,1064.80,null,10);
delete from emp where empno not in (select max(empno) from emp group by ename);
--这时会发现delete报错了,原因是因为修改一个表和子查询不能是同一个表(不知道为啥书上的就可以通过。。。)
--有一个办法是将他变成孙子查询!
delete from emp where empno not in (select * from (select max(empno) from emp group by ename) a );
--删除表格
--delete和drop的区别,delete删除的是数据,表列元素还在,drop删除的是整个表
delete from pet;
drop table pet;
--删除单个记录
delete from emp where empno=1000;
--数据库备份和恢复
--有几种方法:
--No.1 土方法:找到电脑上存放mysql数据库的文件夹(一般默认是在mysql文件夹的data里),直接复制文件夹中数据库内的内容....
-- 需要恢复的时候就创建一个新数据库将内容复制进去覆盖就行了
-- 缺点:依赖于windows的文件存储系统,不能移植到其他类型机器上
--No.2 mysqldump法
--cmd模式下进到bin目录下输入:mysqldump -u root -p basename > backup.sql
--basename为你要备份的数据库名字,backup为导出的文件名,会在bin下生成back.sql文件,或者你在backup.sql前加上路径如:C:\安装文件备份\backup.sql
--提示locktable错误则在basename后面加上--skip-lock-tables
--恢复数据库
--从cmd进入数据库界面,执行以下命令,即可
create database restoretest;
use RestoreTest;
source C:/User/backup.sql; --注:路径最好不要包含中文,我用了中文结果source不到了
-- 路径最好用/而不是\,source下容易因为转义字符的存在而出错,否则这里要用\\
-- 优点:生成的文件可移植到其他机器上
-- 缺点:速度较慢
--No.3 采用第三方软件备份(这里就不介绍了)
--日志
--其中的二进制日志记载了你的一系列sql操作,如当系统崩溃,数据库资料丢失,我们通过数据库备份文件恢复之后,
--可以让服务器执行二进日志,将数据库恢复到崩溃之前的状态
--可以通过以下命令查看是否开启了相关的日志:
show global variables like '%log%';
show global variables like 'log_bin';
show binary logs; --查看二进制日志
show master status; --查看当前使用的日志(主要查看现在是用的哪个二进制日志)
--要永久开启二进制日志和其他日志,可以配置my.ini文件,配置方法可以查看我的另一篇博文:http://blog.csdn.net/databatman/article/details/49951853
--注:网上大部分的配置都是针对mysql5.6版本以前的,基本已经过时了,此配置方法是针对mysql5.6.x以后版本的
--关于使用日志恢复数据库的博文 http://blog.csdn.net/alvine008/article/details/9097105
--本来想自己写一个,后来发现这个已经写得很nice了,毕竟现在的我还没在企业实践过,写出来也是半吊子,就不写啦
--综上,时间轴一般是:
-- 1.备份数据库,同时启动了二进制日志
-- 2.一段时间后,数据库意外崩溃
-- 3.使用以前的数据库备份来恢复数据库
-- 4.同时调用从备份到崩溃前的日志恢复数据库到崩溃前状态
--删除数据库
drop database if exists Heros; --如果存在,就删除
--用python来调用mysql数据库
--参见本篇博文:
--或者见另一个代码文件:python-mysql.py
先安装python与mysql的关联库:在python的script文件夹中,cmd模式下输入:
pip install mysql-connector-python --allow-external mysql-connector-python
#!usr/bin/env python
#-*- coding:utf-8 -*-
import mysql.connector #mysql-connector-python包
#connect用于连接数据库
#cursor.execute用于执行create、insert、update、select等等一系列语句
#创建一个连接数据库的对象con、cursor
con=mysql.connector.connect(host='localhost',user='root',password='1991423',database='cookbook',use_unicode=True)
cursor=con.cursor()
#创建表格
sql1=u"create table pytest (id int primary key,name varchar(20),sex nchar(1) default '男' check(sex in ('男','女')))"
cursor.execute(sql1)
#插入数据的两种写法
#1、小心这种写法,回想一下mysql的插入语句,因为mysql本身在插入数据时字符串就要加'',
# 所以你写的让execute传人数据库的语句也要包含'',包含的方法有:
# ①外面用双引号"",内部就可以用单引号而不冲突了
# ②用转义字符\'即可
cursor.execute(u"insert into pytest values(1,'bob','男')")
#2、推荐!
#考虑到数据库是开放用来给用户查询的,所以时常需要修改输入的值,因此这种方法用的较多
sql2=u'insert into pytest values(%s,%s,%s)'
parameter=[2,'Kate','女']
cursor.execute(sql2,parameter)
#将insert的数据更新储存到数据库
con.commit()
#在数据库的操作界面用selcet * from pytest会发现id=2女生那栏显示的是乱码(可能你的不会遇到)
#原因是上面的代码在传入中文的时候两者的编码可能不一样导致,可以如下用unicode格式更新一下
#顺便复习下update语句
sql3=u'update pytest set sex=%s where id=%s'
parameter=[u'女',2]
cursor.execute(sql3,parameter)
con.commit()
#查询select
cursor.execute('select * from pytest')
#使用fetchall获得所有的返回值
#还有fetchone返回一个,fetchmany返回多个,scroll函数等
#返回的是list,内部每个实例都是tuple
values=cursor.fetchall()
n=cursor.rowcount #统计execute影响到的行数,像select选出了2行,所以这里n=2
print values
print n
#注:每次调用完select都必须fetchall,才能进行下一次的查询,否则会报错
#记得关闭cursor和conn,避免数据库泄露
cursor.close()
con.close()
#为了避免在执行出错的时候仍然能关闭数据库,多要跟try except finally结合
http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014320107391860b39da6901ed41a296e574ed37104752000
mysql代码github地址:
https://github.com/databatman/SQLCookBook-MysqlVersion
PS:所有的mysql的EmpAnd1-n代码都会上传到这个文件夹,顺便求关注啊,虽然还是菜鸟一个,啊哈