MySQL数据库
数据库简介
- 数据库说到底就是一个文件,就像一个Excel文件
- 列 =====> 字段,能够 唯一 标记某个字段:这就是 主键
- 行 =====> 记录
RDBMS
-
相当于一个程序,用来管理数据库的
-
当前主要使用的两种类型的数据库:关系型数据库、非关系型数据库
-
关系型数据库:
mysql:一般用作于网站
redis:一般用作与缓存
-
非关系型数据库:
mongodb:一般用作于爬虫
-
-
RDBMS和数据库的关系
-
SQL 为一种用来操作RDBMS的数据库语言,也是要重点理解!
SQL
- SQL是结构化查询语言,是一种用来操作RDBMS的数据库语言,可以用 SQL语句 完成对数据库的 增删查改
- SQL 是一门特殊的语言,专门用来操作关系数据库
- 不区分大小写
MySQL
- MySQL是一个关系型数据库管理系统
- 开源 免费 不要钱 使用范围广,跨平台支持性好,提供了多种语言调用的 API
MySQL 安装
-
服务端
sudo apt-get install mysql-server # 安装 sudo service mysql start # 启动 ps ajx|grep mysql # 查看是否存在mysql服务 sudo service mysql stop # 停止 sudo service mysql restart # 重启
-
客户端
-
图形化界面的客户端 : Navicat (可去官网下载对应版本)
-
命令行客户端(最主要)
sudo apt-get install mysql-client # 安装 sudo mysql -uroot -pmysql # 链接数据库 quit/exit/ctrl+d # 退出
-
数据
-
数据类型
-
使用数据类型的原则是:够用就行,尽量使用取值范围小的,而不用大的,这样可以更多的节省存储空间
-
常用数据类型如下:
- 整数: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:物理上存储的顺序
- 非空not null:此字段不允许填写空值
- 惟一unique:此字段的值不允许重复
- 默认default:当不填写此值时会使用默认值,如果填写时以填写为准
- 外键foreign key:对关系字段进行约束,当为关系字段填写值时,会到关联的表中查询此值是否存在,如果存在则填写成功,如果不存在则填写失败并抛出异常
- 说明:虽然外键约束可以保证数据的有效性,但是在进行数据的crud(增加、修改、删除、查询)时,都会降低数据库的性能,所以不推荐使用,那么数据的有效性怎么保证呢?答:可以在逻辑层进行控制
数据库的基本使用
-- 数据库操作
-- 链接数据库
mysql -uroot -p -- 需密码
mysql -uroot -pmysql -- 不需密码
-- 退出数据库
exit/quit/ctrl+d
-- sql语句最后需要有分号;结尾
-- 显示数据库版本
select version();
-- 显示时间
select now();
-- 查看所有数据库
show database;
-- 创建数据库
--create database 数据库名 charset=utf8;
create database python04 charset=utf8;
-- 查看创建数据库的语句
show carte database ....
-- 查看当前使用的数据库
-- 使用数据库
use 数据库的名字
-- 删除数据库
-- drop database 数据库名;
drop database python04;
-- 数据表的操作
-- 查看当前数据库中所有表
show tables;
-- 创建表
-- auto_increment表示自动增长
-- not null 表示不能为空
-- primary key 表示主键
-- default 默认值
-- create table 数据表名字(字段 类型 约束[, 字段 类型 约束]);
-- 创建classes表(id, name)
create table xxxx(id int, name varchar(30));
create table yyyy(
id int primary key not null auto_increment,
name varchar(30)
);
--查看表结构
-- desc 数据表结构名字;
desc xxxx;
-- 创建students表(id, name, age, hight, gender, cls_id)
create table students(
id int unsigned not null auto_increment primary key,
name varchar(30),
age tinyint unsigned default 0,
hight decimal(5,2),
gender enum("男", "女", "保密") default "保密",
cls_id int unsigned);
-- 查看表创建的语句
show create table 表名字;
-- 修改表-添加字段
alter table 表名 add 列名 类型;
-- 修改表-修改字段:不重命名版
alter table 表名 modify 列名 类型及约束;
-- 修改表-修改字段:重命名
alter table 表名 change 原名 新名 类型及约束;
-- 修改表-删除字段
alter table 表名 drop 列明;
-- 删除表
drop table 表名;
drop database 数据库名;
-- 增删改查
-- 增加
--全列插入
--insert [into] 表名 value(...);
-- 主键字段 可以用 0 null default 来占位
-- 例:向students 表中插入 一个学生信息
insert into students values(0, "小明", 20, "男", "1997-09-01");
-- 部分插入
--insert into 表名(列1,...) values(值1,....);
insert into students(name, gender) values("小明", 1);
-- 枚举中的下表值从1开始,即此处的 1 为 男
-- 多行插入
insert into students(name, gender) values("小明", 1),("小红", 2);
insert into students values(0, "小明", 20, 1, "1997-09-01"),(0.....);
-- 删除
-- 物理删除
delete from students; -- 整个数据表中的所有数据全部删除(慎用!!!)
delete from students where name="xxx"
-- 逻辑删除
-- 用一个字段来表示,这条信息表中的所有数据全部删除
-- 给students表添加一个 is_delete字段 bit类型
alter table students add is_delete bit default 0;
update students set is_delete=1 where id=0;
-- 修改
--update 表名 set 列1=值1,列2=值2,... where 条件;
update students set gender=1; -- 全改
update students set gender=1 where id=3; --只改id=3的
-- 查询
-- 查询所有列
--select * from 表名;
select * from students;
select * from students where name = "xx"; --条件查询
-- 查询指定列
-- select 列1,列2,... from 表名;
select name, gender from students;
-- 可以使用as为列或表指定别名
-- select 字段[as 别名], 字段[as 别名] from 数据表 where ...;
select name as 姓名,gender as 性别 from students; -- 哪个在前面就先显示谁
备份
mysqldump –uroot –p 数据库名 > python.sql;
# 按提示输入mysql的密码
恢复
- 链接 mysql,创建新的数据库
- 退出连接,执行如下命令
mysql -uroot –p 新数据库名 < python.sql
# 根据提示输入mysql密码
END…