1. 什么是数据库
数据库就是存储数据的仓库
2. 哪些公司在使用数据库
金融机构,游戏网站,购物网站,论坛.........
3. 提供数据库服务的软件
MySQL、SQL_Server、Oracle、DB2、MongoDB、Mariadb
4. 在生产环境中,如何选择使用哪个数据库软件
1、是否开源
2、是否跨平台
不跨平台的:SQL_Server
3、公司类型
商业软件:政府部门、金融机构...(不差钱,数据安全性要求较高)
开源软件:游戏网站、购物网站、论坛 .......
1. 关系型数据库
特点:
1、数据是以行和列形式存储
2、表中每一行叫一条记录
3、每一列叫一个字段
4、表和表之间的逻辑关联叫关系
2. 示例
关系型数据库存储(性能低)
表1、学生信息
姓名 年龄 班级
星矢 25 三班
水冰月 26 六班
表2、班级信息表
班级 班主任
三班 大空翼
六班 松人
非关系型数据库存储(性能高,数据冗余)
{"姓名":"星矢","年龄":25,"班级":"三班"}
{"姓名":"水冰月","年龄":26,"班级":"六班","班主任":"松人"}
3. 跨平台
可以在Unix、Linux、Windows上运行数据库服务
4. 支持多种编程语言
Python、java、php .......
1. 数据库软件
提供数据库服务的软件,看得见,可操作,用来实现数据库逻辑功能
2. 数据库
数据库是一种逻辑概念,用来存储数据的仓库,侧重于存储
3. 数据仓库
从数据量上来说,数据仓库要比数据库庞大的多,主要用于数据挖掘和数据分析
Ubuntu安装MySQL
安装服务端
sudo apt -get install mysql-server
安装客户端
sudo apt -get install mysql-client
Ubuntu安装软件
1、sudo apt -get update (更新/etc/apt sourse.list源)
2、sudo apt -get -f install (修复依赖关系)
服务端启动
sudo /etc/init.d/mysql start
sudo /etc/init.d/mysql status | stop | restart
客户端连接
mysql -h主机地址 -u用户名 -p密码
mysql -hlocalhost -uroot -p123456
# 本地登录可省略-h选项
mysql -uroot -p123456
SQL命令使用规则
1、每条命令必须以;结尾
2、SQL命令不区分字母大小写
3、使用\c终止当前命令的执行
库的管理
库的基本操作
1.1、查看已有的库
show databases;
1.2、创建库(指定字符集)
create database 库名 character set utf8;
1.3、查看创建库的语句
show create database 库名;
1.4、查看当前所在库
select database();
1.5、切换库
ues 库名;
1.6、查看库中已有表
show tables;
1.7、删除库
drop database 库名;
库名的命名规则
1、可以使用数字、字母、下划线,但不能为纯数字
2、库名区分大小写字母
3、库名具有唯一性
4、不能使用特殊字符和mysql关键字
创建支持中文字符集的数据库
create database 数据库名称 default charset utf8 collate utf8_general_ci;
表的管理
表的基本操作
1、创建表
create table 表名(
字段名1 数据类型,
字段名2 数据类型,
字段名3 数据类型
) character set utf8;
2、查看创建表的语句(字符集,存储引擎)
show create table 表名;
3、查看表结构
desc 表名;
4、删除表
drop table 表名;
5、修改表名
alter table 旧表名 rename 新表名;
练习:
1、创建库Python1
create database python1 character set utf8;
2、在Python1库中创建表pymysql1并指定字符集为utf8,字段有三个,id name ag 数据类型自己定义
create table pymysql1(
id int,
name varchar(10),
age int(3)
) character set utf8;
3、查看pymysql1的默认字符集和存储引擎
show create table pymysql1;
4、查看表pymysql1表的结构
desc pymysql1;
5、删除表pymysql1
drop table pymysql1;
6、删除库Python1
drop database python1;
提示:
/var/lib/mysql
表记录的管理(插入)
在表中插入记录
插入单条记录
1、insert into 表名 values(字段1值,字段2值......)
插入多条记录---------->values一个括号代表一条记录所有值
2、insert into 表名(字段名1,字段名2,......) values(字段1值,字段2值......),(字段1值,字段2值......)
指定字段插入时------------>没有插入记录的字段必须可以为空值
3、insert into 表名(字段名1,字段名2....) values(值1,值2)
查询表记录
1、select * from 表名[where 条件];
2、select 字段名1,字段名2,... from 表名[where 条件];
表记录的管理(删除、修改)
1、删除表记录
delete from 表名 where 条件(id=1);
#delete语句后如果不加条件,会将所有记录删除
2、修改表记录---------->每次只能修改一条记录
update 表名 set 字段1=值1(新),字段2=值2 where 条件(字段1=值1(旧))
update t1 set salary=1234567 where id=1;
# update语句后如果不加条件,会将所有记录更新
3、mysql-批量修改表字段中的某一部分内容
update 表名 SET 字段名 = replac(字段名, '字段值', '要修改成的值') wher ID < 200;
表字段的操作
1、语法
alter table 表名 执行动作;
2、添加字段(add)
alter table 表名 add 字段名 数据类型; (加在最后)
alter table 表名 add 字段名 数据类型 first; (加在第一列)
alter table 表名 add 字段名 数据类型 after 字段名; (加在指定字段后)
3、删除字段名(drop)
alter table 表名 drop 字段名;
4、修改字段数据类型(modify)
alter table 表名 modify 字段名 新数据类型;
# 修改数据类型会受到表中原有数据的限制
5、修改字段名称
alter table 表名 change 旧字段名 新字段名 新字段数据类型
1、创建库 studb2
2、在库中创建表stuinfo,字段如下:
姓名、年龄、手机号
3、查看表结构
4、在表中第一列添加一个字段:学号
5、把手机号的数据类型改为bigint
6、在表中最后一列添加一个字段:注册时间register,数据类型为:timestamp
7、在表中学号、姓名、年龄、手机号四个字段插入2条记录
8、查询5分钟内的记录明细
select * from studb2 where register > (now() - interval 5 minute);
如何更改库的默认字符集
通过更改MySql的配置文件实现
1、获取root权限(sudo -i)
2、备份mysql的配置文件
cd /etc/mysql/mysql.conf.d/
cp -p mysqld.cnf mysqld.cnf.bak(备份文件)
3、修改配置文件
vi mysqld.cnf
在[mysqld]下面添加:
character_set_server=utf8
4、重启MySql服务/重新加载配置文件(reload)
/etc/init.d/mysql restart | force-reload
1、数值类型
1、int 大整形(4字节)
不给参数时默认为11
取值范围:0~2**32-1(42亿多)
2、tinyint微小整形(1字节)----------->1字节8位 2**8-1=255
不给参数时默认为3
2.1、有符号(signed默认)
取值范围:-128~127
2.2、无符号(unsigned):
取值范围:0~255
3、smallint小整形(2字节)
不给参数时默认为6
4、bigint极大整形(8字节)
不给参数时默认为20
1、float(4个字节,最多显示7个有效位)
1.1、用法
字段名 float(m,n) m:总数位 n:小数位位数
float(5,2) 取值范围:-999.99~999.99
1.2、注意
浮点型插入整数时会自动补全小数位
小数位如果多于指定位,会对下一位四舍五入
2、double(8字节,最多显示15个有效位)
3、decimal(最多显示28个有效位)
3.1、字段名 decimal(m,n)
3.2、存储空间(将整数部分和小数部分分开存储)
规则:将9位数字的倍数包装成4个字节
即:对于每个部分,需要4个字节来存储9位的每个倍数,剩余数字所需的存储空间如下表:
剩余数字 字节
0 0
1-2 1
3-4 2
5-6 3
7-9 4
示例:decimal(19,9)
整数部分:10/9=商1余1 4字节+1字节
小数部分:9/9=商1余0 4字节+0字节
2、字符类型
1、char(定长)
1.1、宽度取值范围:1~255
1.2、默认宽度位1个字节
2、varchar(变长)--------------->必须给定参数
取值范围:1~65535
3、char和varchar的特点
3.1、char:浪费存储空间,但是性能高
3.2、varchar:节省存储空间,但是性能低
4、text / longtext(4G) / blob / longblob
5、字符类型和数值类型的宽度区别
5.1、数值类型的宽度位显示宽度,仅仅用于select查询时显示,和占用的存储空间大小无关,可用zerofill查看效果
5.2、字符类型的宽度超过则无法存储
3、枚举类型(字段值只能在列举的范围内选择)
1、单选(最多65535个不同值)
字段名enum(值1,值2,...,值n)
2、多选
字段名set(值1,值2,...,值n)
3、创建表时
插入字段值时该字段值应用双引号或单引号引起来,多个值用逗号分隔开
字段名 values "basketball,football,sing......"
4、日期时间类型
1、year:年 YYYY
2、date:日期 YYYYMMDD
3、time:时间 HHMMSS
4、datetime
timestamp:日期时间 YYYYMMDDHHMMSS
##插入记录时datetime不给值默认返回NULL
##插入记录时timestamp不给值默认返回系统当前时间
5、示例:
-> create table tab2(
-> id int,
-> name char(15),
-> birth_year year,
-> birthday date,
-> classes time,
-> meeting datetime
-> );
创建一个学校的库 school
在库中创建一个表students存储学生信息,字段如下
学号(显示宽度为3,不够用0填充)
id int(3) zerofill,
姓名
name char(20),
年龄(不能位负数)
age tinyint(3) unsigned,
手机号
Tel varchar(11),
成绩(浮点型)
score decimal,
性别(单选)
sex enum('man','woman','secret'),
爱好(多选)
hobby set('basketball','tabletinies','reading','swiming','running'),
入学时间(年月日)
enter_school_time date
查看students的表结构
在表中随意插入一条记录
在表中的姓名、手机号、成绩三个字段插入3条记录
查看所有学生的姓名、手机号和成绩
日期时间函数
1、now()返回服务器当前时间 YYYY-MM-DD HH:MM:SS
2、curdate()返回当前日期 YYYY-MM-DD
3、curtime()返回当前时间 HH:MM:SS
4、year(时间) 返回指定时间的年份
5、date(时间)返回指定时间的日期
6、time(时间)返回指定时间的时间
日期时间的运算
1、语法格式
select ... from 表名 where 字段名 运算符 (时间-interval 时间间隔单位)
interval:间隔类型关键字
时间间隔单位:
1 day
1 hour | minute | year | month
2、示例:
1、查询一天以内的记录
select * from t11 where meeting > (now() - interval 1 day);
2、查询1天以前3天以内的记录
select * from t11 where meeting < (now() - interval 1 day) and meeting > (now() - interval 3 day);
运算符的操作(where 条件中的)
1、数值比较&字符比较
1、数值比较运算符:=、!=、>、>=、<、<=
2、字符比较运算符:=、!=
2、示例
1、查找sanguo表中攻击力大于200的英雄
select name,gongji from sanguo where gongji>200;
3、逻辑比较
1、and(两个或多个条件同时满足)
2、or(两个或多个条件有一个条件满足就可以)
4、范围内比较
1、运算符
where 字段名 between 值1 and 值2 #值为int型
where 字段名 in(值1,值2,...)
where 字段名 not in(值1,值2,...)
5、匹配空、非空
1、空:is null
2、非空:is not null
6、模糊比较
1、语法格式
where 字段名 like 表达式
2、表达式
1、_:匹配单个字符
2、%:匹配0到多个字符
1、null:空值,必须用is或者is not去匹配
2、" ":空字符串,只能用=或者!=去匹配
1、查找攻击值在100~200之间的蜀国英雄信息
select * from sanguo where gongji between 100 and 200 and country="蜀国";
2、查找编号为1,3,5的蜀国英雄和貂蝉的编号,姓名和国家
select id,name,country from sanguo where id in(1,3,5) and country="蜀国" or name="貂蝉";
3、查找蜀国和吴国以外的国家的女英雄信息
select * from sanguo where country not in('蜀国','吴国') and sex="女";
4、查找姓名为null的蜀国女英雄
select * from sanguo where name is null and country="蜀国" and sex="女";
5、查找姓名为" "的英雄的 id 姓名和 国家
select id,name,country from sanguo where name="";
6、名字里面至少有两个字符的记录
select name from sanguo where name like "_%_";
7、匹配名字里除null外的所有记录
select name from sanguo where name like "%";
8、名字里面有三个字符的记录
select name from sanguo where name like "___";
9、匹配赵姓的所有记录
select name from sanguo where name like "赵%";
10、通过字符串搜索库中的表:
show tables like "%er";
1、总结(执行顺序)
- select ...聚合函数 from 表名
- where ...
- group by ...
- having ...
- order by ...
- limit ...
2、order by(给查询结果排序)
1、order by 字段名 排序方式
2、排序方式
1、ASC(默认):升序
2、DESC:降序
3、示例
1、将英雄按防御值从低到高排序
select * from sanguo order by fangyu ;
2、将蜀国英雄按攻击值高到低排序
select * from sanguo where country="蜀国" order by gongji DESC;
3、将魏蜀两国男英雄中名字为三个字的英雄按防御值升序排列
select * from sanguo where country in("蜀国","魏国") and sex="男" and name like "___" order by fangyu asc;
3、limit(放在sql语句最后面)
1、作用:限制显示查询记录的个数
2、用法
1、limit n ——>显示n条记录
2、limit m,n ——>从m+1条记录开始,显示n条记录
limit 2,3 ——>显示3,4,5三条记录
3、示例
1、在蜀国英雄中查找防御值倒数第二名到第四名的记录
select * from sanguo where country="蜀国" order by fangyu limit 1,3;
2、在蜀国且名字不为空值的英雄中,查找攻击值前三名的英雄的姓名、攻击值和国家
select name,gongji,country from sanguo where country="蜀国" and name is not null order by gongji desc limit 3;
4、聚合函数
4.1、分类
1、avg(字段名):求该字段的平均值
2、sum(字段名):
3、max(字段名):
4、min(字段名):
5、count(字段名):统计该字段记录的个数
4.2、示例
1、攻击力最强值
select max(gongji) from sanguo;
2、统计表中id 和 name两个字段分别有多少条记录
select count(id),count(name) from sanguo;
3、统计蜀国英雄中攻击值>200的英雄个数
select count(*) from sanguo where country="蜀国" and gongji>200;
5、group by(分组)
5.1、作用:给查询结果进行分组
5.2、group by 字段名
1、示例:计算每个国家的平均攻击力
select country,avg(gongji) from sanguo group by country;
2、查找所有国家中英雄数量最多的前两名的国家名称和英雄数量
select country,count(*) from sanguo group by country order by count(*) desc limit 2;
3、注意:group by后的字段名必须为select之后的字段名,如果查询字段和group by之后的字段不一致,则必须要对该字段进行聚合处理(聚合函数)
6、having语句
6.1、作用:对查询结果进行进一步筛选
6.2、示例
1、找出平均攻击力>105的国家的前两名,显示国家名和平均攻击力
select country,avg(gongji) from sanguo group by country having avg(gongji)>105 order by avg(gongji) desc limit 2;
6.3、having语句通常和group by语句联合使用,用来过滤由group by语句返回的结果集
6.4、where只能操作表中实际存在的字段(desc 表名;),having操作的是由聚合函数生成的显示列
7、distinct(不显示字段的重复值)
7.1、用法
select distinct 字段名1,字段名2,... from 表名;
7.2、示例
1、统计三国列表中一共有多少个国家
select distinct country from sanguo;
2、计算蜀国一共有多少个英雄
select count(distinct name) from sanguo where country="蜀国";
3、注意
distinct处理的是distinct和from之间的所有字段,所有字段值必须全部相投才能去重
8、查询表记录时做数学运算
8.1、运算符
+、-、*、/、%
8.2、示例:让所有英雄攻击力翻倍
select id,name,gongji*2 as new_gj,country from sanguo;
9、约束
9.1、作用
为了限制无效的数据插入到数据表中
9.2、约束分类
1、默认约束(default)
作用:插入字段时,不给该字段赋值,使用默认值
格式:字段名 数据类型 default 值
2、非空约束(not null)
作用:不允许该字段的值有null记录
格式:字段名 数据类型 not null
3、default和not null可连用
字段名 数据类型 not null default 值
定义
对数据库中表的一列或者多列的值进行排序的一种结构 (mysql中索引用BTREE方式)
优点
可以加快数据的检索速度
缺点
1、当你对表中的数据进行增加,删除,修改的时候,索引需要动态维护,降低了数据维护速度
2、索引需要占用物理空间
索引示例
1、开启运行时间检测
Show variables like "%pro%";
Set profiling=1;
2、执行查询语句
Select name from t1 where name="lucy1009999";
3、查看执行时间
Show profiles;
4、在name字段创建索引
Create index index_name on t1(name);
5、执行查询语句
Select name from t1 where name="lucy1009999";
6、查看执行时间
Show profiles;
索引类型
1.1、使用规则
1、一张表中可以有多个index字段
2、字段值可以重复,且可以为NULL
3、经常把做查询条件的字段设置为index字段
I 4、index字段的key标志位MUL
1.2、创建index索引
1、创建表: ... index(字段名),index(字段名));
mysql> create table t1(
-> id int,
-> name varchar(20),
-> age tinyint,
-> index(id),
-> index(name)
-> );
2、已有表:dreate index 索引名 on 表名(字段名)
create index index_age on t1(age);
1.3、查看索引
1、desc 表名;
2、show index from 表名;
1.4、删除index
语法:drop index 索引名 on 表名
drop index index_age on t1;
#:删除普通索引只能一次一个删除
2.1、使用规则
1、一个表中可以有多个unique字段
2、对应字段的值不允许重复,但可以为NULL
3、key标志:UNI
2.2、创建
1、创建表:
... unique(字段名),unique(字段名));
Eg:... unique(tel),unique(cardnumber));
mysql> create table t2(
-> tel bigint,
-> cardnumber bigint,
-> name char(20),
-> unique(tel),
-> unique(cardnumber));
2、已有表:
create unique index 索引名 on 表名(字段名)
3、查看、删除(同index)
drop index 索引名 on 表名
&&
自增长属性(auto_increment)配合主键一起使用
1、使用规则:
(1)一个表中只能有一个主键字段
(2)对应字段值不允许重复,且不能为NULL
(3)Key标志:PRI
(4)把表中能够唯一标识一条记录的字段设置为主键,通常把记录编号的字段设置为主键
2、创建
(1)创建表
1、... id int primary key auto_increment , ... ...)[起始自增值];
2、... id int auto_increment, ... primary key(id,name)); [复合主键]
Eg:mysql> create table t3(
-> id int primary key auto_increment,
-> name varchar(20),
-> age tinyint
-> )auto_increment=100;
(2)已有表中创建
Alter table 表名 add primary key(字段名);
(3)删除主键
1、删除自增长(auto_increment)属性
Alter table 表名 modify id int;
2、删除主键
Alter table 表名 drop primary key;
(4)在已有表中加入自增长属性并指定起始值
1、添加自增长属性
Alter table 表名 modify id int auto_increment;
2、指定起始值
Alter table 表名 auto_increment=值;
1、定义
让当前表的字段值在另一个表的范围内选择
2、语法格式
foreign key (参考字段名)
references 被参考表名(被参考字段名)
on delete 级联动作
on update 级联动作
3、示例
表一:缴费信息表(财务)
学号 姓名 班级 金额
1 唐伯虎 二班 200
2 点秋香 二班 300
3 祝枝山 二班 500
表二:班级信息表(班主任)
学号 姓名 金额
1 唐伯虎 200
2 点秋香 300
3 祝枝山 500
缴费信息表(财务)
mysql> create table jftab(
-> id int primary key,
-> name varchar(20),
-> class varchar(7),
-> money int);
班级信息表(班主任)
mysql> create table bjtab(
-> stu_id int,
-> name varchar(20),
-> money int,
-> foreign key(stu_id) references jftab(id) on
-> delete cascade on update cascade
-> );
4、级联动作
1、cascade:数据级联更新
当主表删除记录或更改被参考字段值时,从表级联更新
2、restrict(默认)
当主表删除记录,或更改被参考字段值时,从表中有相关联记录则不允许主表操作
3、set null
当主表删除记录或更改被参考字段值时,从表中相关联记录的字段值设置为null
4、no action,同restrict,都是立即检查外键限制
5、删除外键限制
alter table 表名 drop foreign key 外键名;
6、在已有表中添加外键限制
alter table 表名 add
foreign key(...) references 表名(字段名)
on delete 级联动作
on update 级联动作
7、使用规则
1、两张表参考字段和被参考字段数据类型要一致
2、被参考字段必须为key的一种,通常primary key
1、作用:
把文件系统的内容导入到数据库中
2、语法格式:
load data infile "文件名"
into table表名
fileds terminated by "分隔符"
lines terminated by "\n"
3、示例
1、把 /etc/passwd 文件中的内容导入到db3下的userinfo表
Tarena : x : 1000 : 1000 :
用户名 密码 uid gid
tarena,,, : /home/tarena : /bin/bash
用户描述 主目录 登录权限
4、操作步骤
1、在数据库中创建对应的表
2、把要导入的文件拷贝到数据库搜索路径中
1、查看数据库搜索路径
show variables like “secure_file_priv”;
2、拷贝
sudo cp /etc/passwd /var/lib/mysql-files/
3、执行数据导入语句
load data infile '/var/lib/mysql-files/passwd'
into table userinfo
fields terminated by ":"
lines terminated by "\n";
5、练习
1、将class.csv文件导入到register表中
1、作用
将数据库中表记录保存到系统文件里
2、语法格式
select ... from 表名
into outfile "绝对路径文件名"
fields terminated by "分隔符"
lines terminated by "\n";
3、示例
1、把userinfo表中的用户名、密码、和uid号三个字段的值给 导出来
mysql> select username,password,uid from userinfo
-> into outfile "/var/lib/mysql-files/u.csv"
-> fields terminated by ","
-> lines terminated by "\n";
2、把mysql库下的user表中user、host的值导出来,user.csv
4、注意
1、导出的内容由sql查询语句决定
2、执行导出命令时路径必须指定对应的数据库目录下
5、表的复制
1、表的重命名:alter table 表名 rename 新表名
mysql> alter table class2 rename class3;
2、表的复制语法格式
create table 新表名 select ... from 表名 ...;
3、示例
(1) 复制class1表的全部记录的字段,class2
mysql> create table class1 select * from class2;
4、只复制表结构
create table 新表名 select ... from 表名 where false;
mysql> create table class1 select * from class2 where false;
6、嵌套查询(子查询)
1、定义:把内层查询结果当做外层查询的条件
2、语法格式:
sql查询语句 where 条件(sql查询语句)
3、示例
1、把uid的值小于这个平均值得用户和uid号显示出来
先求出uid的平均值
select avg(uid) from userinfo;
select username,uid from userinfo where uid<avg(uid);
嵌套方法:
select username,uid from userinfo where uid<(select avg(uid) from userinfo);
2、找出每个国家攻击力最高的英雄的名字和攻击值
select country,name,gongji from sanguo where gongji in ( select max(gongji) from sanguo group by country);
语法格式
mysql> select 字段名列表 from 表名列表 where 条件;
1、显示(省 市)详细信息
河北省 石家庄市
河北省 廊坊市
mysql> select sheng.s_name,city.c_name from sheng,city where sheng.s_id=city.cfather_id;
2、显示 (省 市 县) 详细信息
select sheng.s_name,city.c_name,xian.x_name from sheng,city,xian where sheng.s_id=city.cfather_id and city.c_id=xian.xfather_id;
或
mysql> select S_name,c_name,x_name from sheng,city,xian where s_id=cfather_id and c_id=xfather_id;
1、内连接
1、语法格式
select 字段名 from 表1
inner join 表2 on 条件
[inner join 表3 on 条件]
[inner join 表4 on 条件];
2、示例
1、内连接显示省和市的详细信息
mysql> select s_name,c_name from sheng inner join city on sheng.s_id=city.cfather_id;
2、内连接显示省市县详细信息
mysql> select s_name,c_name,x_name from sheng inner join city on sheng.s_id=city.cfather_id inner join xian on c_id=xian.xfather_id;
2、外连接
1、定义:以左表为主显示查询结果
2、语法格式
select 字段名列表 from 表1
left jion 表2 on 条件
left jion 表3 on 条件
......;
3、示例
1、显示省和市的详细信息
select s_name,c_name from sheng left join city on s_id=cfather_id;
2、显示省、市、县详细信息要求所有的市全部显示
mysql> select s_name,c_name,x_name from sheng right join city on s_id=cfather_id left join xian on c_id=xfather_id;
1、定义:以右表为主显示查询结果
2、语法格式
select 字段名列表 from 表1
right jion 表2 on 条件
right jion 表3 on 条件
......;
完全备份
1、命令格式
mysqldump -u用户名 -p 原库名 > 路径/***.sql
2、示例
1、备份china库
mysqldump -uroot -p china > ~/mydata/china.sql
3、原库名的表示方式
--all-databases 备份所有库
库名 备份单个库
-B 库1 库2 ... 备份多个库
库名 表1 表2 ... 备份指定库的指定表
4、练习
1、备份所有库all.sql,放到mydata目录中
tarena@tedu:~/mydata$ mysqldump -uroot -p --all-databases > all.sql
2、备份china库中的sheng、city、xian三张表为chinascx.sql
tarena@tedu:~/mydata$ mysqldump -uroot -p china sheng city xian > chinascx.sql
1、命令格式
mysql -u用户名 -p 目标库名 < 路径/**.sql
2、恢复china库
1、创建空库
create database china character set utf8;
2、恢复
mysql -uroot -p china < china.sql
3、从所有库的备份中恢复china一个库(–one-database)
mysql -uroot -p --one-database china < all.sql
4、注意:
1、恢复库时如果恢复到原库会将表中数据覆盖,新增的表不会删除
2、数据恢复时如果要恢复的库不存在,则先要创建空库
1、定义:一件事从开始发生到结束的整个过程
2、属性(ACID)
1、原子性:一个事务被视为一个不可分割的单元
(不可分割,要不全做,要不一步都不做)
2、一致性:数据库总是从一个已知状态转为另一个一致性状态(完整做完这一流程,转为另一状态)
3、隔离性:一个事务所做的修改在最终提交前,对其他事务是不可见的(每一个事物发生不能被其他并发事务干扰)
4、持久性:(数据一旦提交,将不能恢复到原状)
3、事务和事务回滚的应用
1、查看事务自动提交状态
show variables like “autocommit”;
2、开启事务
Begin;
一条或多条sql命令
##此时autocommit被禁用
3、终止事务
commit;(所有语句执行成功时执行)
rollback;(其中某一句语句执行失败则执行此语句)
事务回滚只针对表记录的操作:增、删、改有效,对创建 库、表的操作无效
4、案例
1、背景
你:建行卡
你朋友:工商卡
你在建行自动取款机上给你朋友工商卡转5000
2、过程
表1:CCB
create table CCB(
name char(15),
money int);
insert into CCB values(“zhuanqian”,10000);
表2:ICBC
create table ICBC(
name char(15),
money int);
insert into ICBC values(“shouqian”,4000);
3、mysql > begin;
mysql >update CCB set money=5000 where name=”zhuanqian”;
mysql >updata ICBC set money=9000 where name=”shouqian”;
mysql >commit; 转账成功
mysql >rollback; 转账失败
基本操作
1、查看所有的存储引擎
show engines;
2、查看已有表的存储引擎
show create table 表名;
##engines=innodb
3、创建表时指定存储引擎
create table 表名(...)engine=myisam;
4、工作中常用存储引擎
InnoDB myisam
[mysqld]
Default-storage-engine=myisam
5、常用存储引擎的特点
1、innodb特点
1、共享表空间
表名.frm 表结构
表名.ibd 表记录&索引信息
2、支持行级锁
2、myisam特点
1、独享表空间
表名.frm 表结构
表名.myd 表记录
表名.myi 索引文件
2、支持表级锁
3、锁
1、加锁的目的
解决客户端并发访问的冲突问题
2、锁的分类
1、锁类型
读锁(select):加读锁后不能更改表中内容,但可 以进行查询
写锁(互斥锁、排他锁)
2、锁粒度
表级锁 (myisam存储引擎支持)
行级锁 (innodb存储引擎支持)
4、如何决定表使用哪种存储引擎
1、执行查询操作多的表使用myisam(使用innodb浪费资源)
2、执行写操作多的表使用innodb存储引擎
1、选择合适的存储引擎
查询操作多————>myisam
写操作多——————>innodb
2、sql语句的调优(尽量避免全表扫描)
1、在select、where、order by常涉及到的字段上建立索引
2、where子句中尽量少使用 != ,否则导致全局扫描
3、尽量避免空(null)值判断,否则导致全局扫描
示例:
优化前:
select id from t1 where number is null;
优化后:
可以在number设置默认值0,确保number无null值,查询如下
select id from ti where number=0;
4、尽量避免用or来连接条件,否则进行全表扫描
优化前:
select id from t1 where id=10 or id=20;
优化后:
select id from t1 where id=10
union all
select id from t1 where id=20;
5、用模糊查询尽量避免前置%,否则全表扫描
6、尽量避免in和not in的使用,否则全表扫描
对于连续的值尽量用between和and
7、尽量避免使用select * from t1;
要用具体字段名代替*,不要用到任何字段
1、交互类型
Python3:
Pymysql(安装模块) : sudo pip3 install pymysql
Python2
MySQLdb(安装模块):sudo pip install mysql-python
2、connection对象
创建与数据库连接对象(调用connect()方法)
conn=pymysql.conect(参数列表)
参数列表:
1、host:主机地址,本机:"localhost"
2、user:用户
3、port:mysql端口,默认3306
4、db :数据库名
5、passwd:连接密码
6、charset:编码方式,推荐使用utf8
示例:
conn=pymysql.connect(host="localhost", user="root", port=3306, passwd="123456", db="china", charset="utf8")
3、游标对象(cursor对象)
1、作用:执行sql语句
2、创建游标对象:调用连接对象的cursor()方法
示例:cursor1=conn.cursor()
3、游标对象的方法
1、.execute(operation[,参数]) 执行sql语句
2、.close() 关闭游标对象
3、.fetchone() 获取结果集的第一条记录,返回一个元组失败返回None
4、.fetchmany(n) 获取结果集的n条记录,返回一个大元组
5、.fetchall() 获取结果集的所有记录,返回一个大元组
4、连接对象(如:conn)的方法
1、conn.close() 关闭连接
2、conn.commit() 提交到数据库执行
3、conn.rollback() 事务回滚操作
4、conn.cursor() 创建游标对象,用于执行sql语句获得结果
1、建立数据库连接
conn=pymysql.connect(host="localhost", user="root", port=3306, passwd="123456", db="china", charset="utf8")
2、创建游标对象
cursor1=conn.cursor()
3、利用游标对象的方法操作数据库
cursor1.execute(“sql语句”)
4、提交
conn.commit()
5、关闭游标
cursor1.close()
6、关闭数据库连接
conn.close()
Entry - Relation(实体关系模型)
1、关系
分类
一对一关系(1 :1): 班长和班级
一对多关系(1 :n): 公司和职工
多对多关系(m :n): 学生和课程
2、ER图的绘制
1、矩形框代表实体,菱形框代表关系,椭圆形代表属性