MySQL
数据库理论
概念
概念:特殊格式的数据文件集合
特点
持久化存储
读写速度极高
保证数据的有效性
对程序支持性非常好,容易扩展
数据设计
E-R模型
作用:提供实体、属性和联系的方法,用来描述现实世界的概念模型
实体型用矩形表示,属性用椭圆形表示,联系
三范式
1NF:强调是列的原子性,列的数据不能够再拆掉成几列
2NF:一个表中必须有一个主键,非主键字段必须完全依赖于主键,不能依赖于主键的一部分(注:主键可以设置成多字段,当一个字段无法唯一标示数据时)
3NF:非主键必须直接依赖于主键,不能够间接依赖
即一个字段一个数据,每个表必须有主键,一个对象一个表
口诀
1.一个字段一个数据
2.表必须有主键
3.一张表一个对象
配置
服务端配置
安装
安装:sudo apt-get install mysql-server
配置项
bind-address表示服务器绑定的ip,默认为127.0.0.1
port表示端口,默认为3306
datadir表示数据库目录,默认为/var/lib/mysql
general_log_file表示普通日志,默认为/var/log/mysql/mysql.log
log_error表示错误日志,默认为/var/log/mysql/error.log
查看配置
配置文件目录为/etc/mysql/mysql.cnf
cd进入conf.d目录,打开mysql.cnf,发现并没有配置
cd进入mysql.conf.d目录,vi打开mysql.cnf,可以看到配置项
客户端配置
安装
下载
可以到Navicat官网下载
将压缩文件拷贝到ubuntu虚拟机中,放到桌面上,解压
安装
解压:tar zxvf navicat112_mysql_cs_x64.tar.gz
进入解压目录运行:./start_navicat
未找到.NET应用组件-----点击两次取消
评估试用版-----试用
故障解决
中文乱码
打开start_navicat文件
将export LANG="en_US.UTF-8"改为export LANG="zh_CN.UTF-8"
试用期
解决:删除用户目录下的.navicat64目录
cd ~
rm -r .navicat64
关系型数据库MySQL
核心元素
数据行(记录)
数据列(字段)
数据表(数据行的集合)
数据库(数据表的集合)
语句分类
DQL:数据查询语言,用于对数据进行查询,如select
DML:数据操作语言,对数据进行增加、修改、删除,如insert、update、delete
TPL:事务处理语言,对事务进行处理,包括begin transaction、commit、rollback
DDL:数据定义语言,进行数据库、表的管理等,如create、drop
DCL:数据控制语言,进行授权与权限回收,如grant、revok
不区分大小写
Navicat图形化操作
创建数据表
点击工具栏“表”,在第二行显示关于表的命令,点击“创建表”
弹出新窗口,按照上节的设计,创建班级表,填写各字段,选择相应的类型
对于id字段,需要设置为int类型,无符号,自动增长,主键,非空
对于字符串类型,必须指定包含字符个数,还需要指定字符集、排序规则,默认与数据库的一致
datetime的默认值可以设置成now(),也可以是一个具体值,如'2000-1-1'
编辑数据表
选择一张表后,工具栏的第二行“打开表”、“设计表”、“删除表”都变的可用
打开表会查看表的当前数据,可以在这个窗口中增加、修改、删除数据
设计表和创建表的窗口一样,可以增加、修改、删除字段,或编辑字段的类型、约束
删除表会将表物理删除
增
默认没有数据,可以在对应的列中填写数据,点击底部的对勾完成添加
注意:自动增长的主键列不需要填写值
如果需要继续添加数据,点击询问的加号,会出现一个新的空白行,填写数据即可
删
点击某个单元格,再点击询问的减号,可以删除
说明:对于重要数据,推荐将isdelete属性改为1,而不是进行物理删除.
查
双击表,或者选择表后,点击工具栏第二行的“打开表”,可以查看表的数据
改
点击某个单元格,即可编辑值,修改完后,点击底部的勾生效.
数据的CURD
curd的解释: 代表创建(Create)、更新(Update)、读取(Retrieve/Read)和删除(Delete)
事务四大特性ACID
原子性(Atomicity) 一致性(Consistency) 隔离性(Isolation) 持久性(Durability)
数据类型与约束
数据类型
整数:int,bit
小数:decimal
字符串:varchar,char
日期时间: date, time, datetime
枚举类型(enum)
特殊类型说明
decimal表示浮点数,如 decimal(5, 2) 表示共存5位数,小数占 2 位.
char表示固定长度的字符串,如char(3),如果填充'ab'时会补一个空格为'ab '.
varchar表示可变长度的字符串,如varchar(3),填充'ab'时就会存储'ab'
字符串 text 表示存储大文本,当字符大于 4000 时推荐使用, 比如技术博客.
对于图片、音频、视频等文件,不存储在数据库中,而是上传到某个服务器上,然后在表中存储这个文件的保存路径.
数据类型附录表
整数
类型 字节大小 有符号范围(Signed) 无符号范围(Unsigned)
TINYINT 1 -128 ~ 127 0 ~ 255
SMALLINT 2 -32768 ~ 32767 0 ~ 65535
MEDIUMINT 3 -8388608 ~ 8388607 0 ~ 16777215
INT/INTEGER 4 -2147483648 ~2147483647 0 ~ 4294967295
BIGINT 8 -9223372036854775808 ~ 9223372036854775807 0 ~ 18446744073709551615
字符串
类型 字节大小 示例
CHAR 0-255 类型:char(3) 输入 'ab', 实际存储为'ab ', 输入'abcd' 实际存储为 'abc'
VARCHAR 0-255 类型:varchar(3) 输 'ab',实际存储为'ab', 输入'abcd',实际存储为'abc'
TEXT 0-65535 大文本
日期
类型 字节大小 示例
DATE 4 '2020-01-01'
TIME 3 '12:29:59'
DATETIME 8 '2020-01-01 12:29:59'
YEAR 1 '2017'
TIMESTAMP 4 '1970-01-01 00:00:01' UTC ~ '2038-01-01 00:00:01' UTC
数据约束
主键 primary key: 物理上存储的顺序.
外键 foreign key: 对关系字段进行约束,
惟一 unique: 此字段的值不允许重复.
默认 default: 当不填写字段对应的值会使用默认值,如果填写时以填写为准.
非空 not null: 此字段不允许填写空值.
数据库命令行基本操作
sql服务
启动sql服务器 sudo service mysql start
关闭sql服务 sudo service mysql stop
重启服务 sudo service mysql restart
检查是否启动 ps ajx|grep mysql
登录服务器 mysql -u用户名 -p密码 密码可以先不明文输入
查看版本 select version();
查看当前时间 select new();
数据库
查看所有数据库 show databases;
使用数据库 use 数据库名;
查看当前使用的数据库 select database();
查看当前数据库下所有表 show tables;
创建数据库 create database 数据库名 charset=utf8;
删除数据库 drop database 数据库名;
查看创建数据库的语句 show create database 数据库名;
数据库备份 mysqldump –uroot –p 数据库名 > 备份名称.sql;
数据库恢复 mysql -uroot -p 新数据库名 < 备份数据库.sql; 需要先创建一个新数据库
数据库克隆:导入数据库:第一步:创建空数据库,第二步:use 新数据库 第三步:source 导入的数据库路径
数据表
查看当前数据库中所有的表 show tables;
查看表结构 desc 表名;
创建表 create table 表名(字段1 类型 约束,字段2 类型 约束,)
删除表 drop table 表名;
查看表的创建语句:show create table 表名;
字段
添加字段 alter table 表名 add 字段 类型 约束;
修改字段类型及约束 alter table 表名 modify 字段 新的类型 约束;
修改字段名 类型 约束 alter table 表名 字段 新字段名 新的类型 约束
删除字段 alter 表名 drop 字段;
记录
查看字段的数据 select 字段 from 表名;
插入记录 insert into 表名(字段)values(字段对应的值);
插入多条记录 insert into 表名(字段) values(字段对应的值) (字段对应的值)
auto_increment表示自动增长,0可以进行占位
修改 update 表名 set 字段1=值1,字段2=值2 where 条件; !!!条件不加,全列(字段)将都会被更改
物理删除记录 delete from 表名 where 条件;
逻辑删除记录 update 表名 set is_delete=1 where 条件 !!!条件不要忘 ,需要存在一个is_delete字段
数据库命令行拓展
常见数据操作命令
原名 as 别名 as可省略
消除重复行 distinct 列名
where 条件
比较运算符
等于: =
大于: >
大于等于: >=
小于: <
小于等于: <=
不等于: != 或 <>
逻辑运算符
and
or
not
模糊查询
like
%表示任意多个任意字符
_表示一个任意字符
范围查询
in (值1,值2,...)表示在一个非连续的范围内
between 初始值 and 结束值 表示在一个连续的范围内
空判断
is null
is not null
排序
select * from 表名 order by 列1 asc|desc [,列2 asc|desc,...]
将行数据按照列1进行排序,如果某些行 列1 的值相同时,则按照 列2 排序,以此类推
asc从小到大排列,即升序 ase可省略,默认升序
desc从大到小排序,即降序
默认按照列值从小到大排列(即asc 关键字)
limit 分页
select * from 表名 [ where 条件] limit start=0,count
从start开始,获取count条数据
start默认值为0
也就是当用户需要获取数据的前n条的时候可以直接写上 xxx limit n;
聚合函数
概念
组函数,默认情况下 聚合函数会对当前所在表当做一个组进行统计
特点
每个组函数接收一个参数(字段名或者表达式)
* 统计结果中默认忽略字段为NULL的记录 要想列值为NULL的行也参与组函数的计算,必须使用IFNULL函数对NULL值做转换。
* 不允许出现嵌套 比如sum(max(xx))
max(列名) 求出集合中数据的最大值
min(列名) 求出集合中数据的最小值
count(列名或*) 求出集合中数据的数量
sum(列名) 求出集合中数据的和
avg(列名) 求出集合中数据的平均值
group by 分组 + with rollup
group_concat + having
注意
select 后的字段只能出现在以下两种情况:
在group by后出现过
在聚合函数中出现
select 字段(列名) from 表名 group by 分组依据(列名);
select 字段,group_concat(字段名) from 表名 group by 分组依据;
select 字段 ,avg(字段) from 表名 group by 字段;
select 字段,count(*) from students group by gender having count(*)>2(过滤条件);
select 字段,count(*) from 表名 group by 字段 with rollup;
连接
内连接 inner join
内连接查询:查询的结果为两个表匹配到的数据
右(外)连接 right join
左(外)连接 left join
对于外连接 outer关键字可以省略
select * from 表1 inner或left或right join 表2 on 表1.列 运算符 表2.列
自连接
当需要将多张"表"的相关数据汇总一个结果集中, 并且多张"表"的数据来自于同一张表
自连接就是一种特殊的连接方式
需要对表起多个不同的别名才能进行自连接查询
子查询
概念
理解
子查询是嵌入到主查询中
子查询是辅助主查询的,要么充当条件,要么充当数据源
子查询是可以独立存在的语句,是一条完整的 select 语句
标量子查询: 子查询返回的结果是一个数据(一行一列)
查询班级学生平均年龄
查询大于平均年龄的学生
select * from students where age > (select avg(age) from students);
列子查询: 返回的结果是一列(一列多行)
查询还有学生在班的所有班级名字
找出学生表中所有的班级 id
找出班级表中对应的名字
select name from classes where id in (select cls_id from students);
行子查询: 返回的结果是一行(一行多列)
需求: 查找班级年龄最大,身高最高的学生
行元素: 将多个字段合成一个行元素,在行级子查询中会使用到行元素
select * from students where (height,age) = (select max(height),max(age) from students);
总结
SELECT select_expr [,select_expr,...] [
FROM tb_name
[JOIN 表名]
[ON 连接条件]
[WHERE 条件判断]
[GROUP BY {col_name | postion} [ASC | DESC], ...]
[HAVING WHERE 条件判断]
[ORDER BY {col_name|expr|postion} [ASC | DESC], ...]
[ LIMIT {[offset,]rowcount | row_count OFFSET offset}]
]
关联查询
能用子查询就不要用连接
大量的数据进行连接查询,会导致内存暴增
除了左右连接,其他情况下都可以用子查询代替
批量处理数据
批量插入数据
(将查询的数据直接插入表中)
将select语句的结果集插入到一个表中,select查询到的字段名要与插入的字段名依次对应
insert into 表名(字段名) select 语句
步骤
查询出自己想要的数据
insert into表名(字段名) (select查询语句)
批量修改数据
(连续更新)
update 表1 join 表2 on 连接条件 set 某表.字段=值
步骤
外键的使用
外键作用
约束子表插入或更新数据,必须满足主表对该数据的要求
外键的数据必须属于在外键表中
使用到外键约束会极大的降低表更新的效率, 所以在追求读写效率优先的场景下一般很少使用外键
添加外键
创建表时字段名 类型 约束,foreign key(字段名) references 主表名(字段名)
alter table 表名 add foreign key(字段名) references 主表名(字段名)
删除外键
删除约束 alter table 表名 drop foreign key 外键名; 外键名可以通过查看表创建语句获取
删除记录 alter table 表名 drop key 外键绑定的字段名;
案例:根据商品表中的分类信息创建分类表
创建 "商品分类"表
将分类信息导入到分类中
将商品表中的分类名称更改为分类名称对应的分类id
根据商品表中的品牌信息创建品牌表
创建 "商品品牌表" 表并导入品牌名称
使用商品品牌表中的信息更新商品表信息
修改商品表表结构
添加外键
数据库编程
事务
概念
事务Transaction,是指作为一个基本工作单元执行的一系列SQL语句的操作,要么完全地执行,要么完全地都不执行。
特性ACID
原子性(Atomicity):整个事务被视为一个整体最小单位,要么整体都执行,要么没有执行,不可能只执行其中一部分操作
一致性(Consistency):事务的状态与数据库状态保证一致
隔离性(Isolation):事务与事务之间完全隔离,互不影响
持久性(Durability:一旦事务提交,其修改会永久保存到数据库中,不可撤销
使用方法
数据库引擎必须是innodb类型支持事务
开启事务 begin;或者start transaction;
提交事务 commit;
回滚事务 rollback;
回滚只支持对于数据记录,对于删除表删库不可回滚(撤销)
使用注意
修改数据会自动触发事务:insert、update、delete
mysql命令行中会自动提交事务
键入 set autocommit=0 不进行自动提交
需要进行多次数据修改是,手动开启提交,成功一起成功,失败回滚到之前
不可撤销
索引
一种特殊的文件,包含数据表里所有记录的位置信息,类似于目录,加快数据库的查询速度
索引的使用
查看表中的索引:show index from 表名;
创建索引 create index 索引名称 on 表名(字段名称(长度))
如果指定字段是字符串,需要指定长度,建议长度与定义字段时的长度一致
字段类型如果不是字符串,可以不填写长度部分
使用 使用索引名称直接代替原表名即可
创建 create index xxx on 表名(字段名[(索引长度 字符串类型才需要指定)])
查看 show index for xxx
使用时 使用索引代替原表名
删除索引 drop index 索引名称 on 表名;
总结
索引可以明显提供某些字段的查询效率
建立索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件,对于需要常更新和插入的表格以及较小的表没有必要建立
建立索引将会增加占用磁盘空间
Python操作mysql
步骤
初始化步骤
1.导入 from pymysql import connect
2.连接数据库 连接对象 = connect(host='Ip地址', port=数据库端口, user='用户名', password='密码', database='数据库名', charset='utf8') IP地址填写localhost 代表本机
3.创建游标 游标对象 = conn.cursor()
装载sql执行语句
4.执行sql语句 cs.execute("mysql语句%s",(参数1,...)) 安全传参,避免sql注入
装载后处理处理
查询语句,获取查询结果
获取一条数据 游标对象.fetchone()
获取所有查询到的数据 游标对象.fetchall()
增删改语句,提交数据
提交数据 连接对象.commit() 查询可以省略这条语句
撤销数据 连接对象.rollback()
关闭游标和连接
关闭游标 游标对象.close()
关闭连接 连接对象.close()
总结
字符串替换
sql语句使用字符串拼接时,'数据',两边的引号不能省略
安全传参时,使用%s占位时引号必须省略
数据库维护管理
视图
简介
替换(封装)复杂的sql语句功能,简化操作,增强可读性
定义视图
creat view 视图名称 as select复杂语句;
查看视图
show tables;
使用视图
select * from 视图名称;
删除视图
drop view 视图名称;
总结
视图封装了对多张基本表的复杂操作,简化用户操作
视图只是一个虚表,并不存储任何基本表的表数据,当用户使用视图的时候 视图会从基本表中取出
通过视图可以对用户展示指定字段从而屏蔽其他字段数据,更加安全
用户管理
权限分类-用户
服务实例级账号,启动一个mysql即为一个实例,此为管理员
数据库级账号,对特定的数据库执行增删改查的所有操作
数据表级账号,对特定表执行增删改查等所有操作
字段级的权限,对某些表的特定字段进行操作
存储程序级的账号,对存储程序进行增删改查的操作
用户管理
查看用户表 desc user
Host表示允许访问的主机
User表示用户名
authentication_string表示密码,为加密后的值
查看所有用户 select host,user,authentication_string from user
创建用户 grant 权限列表 on 数据库 to '用户名'@'访问主机' identified by '密码'
权限列表 select读...all 所有
访问主机 %代表任意ip都可以访问 localhost或具体ip代表本机或特定主机
删除用户 drop user '用户名'@'主机'
delete from user where user = '用户名';
学习网址 http://blog.csdn.net/lxpbs8851/article/details/10895085
权限管理
grant 权限名称 on 数据库 to 账户@主机 with grant option;
修改密码 usdate user set authentication_string=password('新密码') where user='用户名';
password( )函数加密
修改后需要刷新权限 flush privileges
远程登录(危险-慎用)
修改vim /etc/mysql/mysql.conf.d/mysqld.cnf
在bind-addr = 127.0.0.1 前用#注释,不注释只能本地登录
重启mysql service mysql restart
主从配置
作用
从机数据库同步主机数据库,提高数据安全以及服务的稳定性
可以通过增加从服务器提高数据库性能
主机用于增删改,从机用于查询
备份
mysqldump –uroot –p 数据库名 > python.sql;
恢复
mysql -uroot –p 新数据库名 < python.sql
导入数据库:第一步:创建空数据库,第二步:use 新数据库 第三步:source 导入的数据库路径
步骤
数据库备份与恢复
查看所有数据库 show databases;
使用数据库 use 数据库名;
查看当前使用的数据库 select database();
查看当前数据库下所有表 show tables;
创建数据库 create database 数据库名 charset=utf8;
删除数据库 drop database 数据库名;
查看创建数据库的语句 show create database 数据库名;
数据库备份 mysqldump –uroot –p 数据库名 > 备份名称.sql;
数据库恢复 mysql -uroot -p 新数据库名 < 备份数据库.sql; 需要先创建一个新数据库
数据库克隆:导入数据库:第一步:创建空数据库,第二步:use 新数据库 第三步:source 导入的数据库路径
查询美化l分类展示内容: 查询语句最后面 \G