一、数据库
在开发中,为了保存大量的数据,我们经常会使用到数据库,那么数据库是什么呢?简而言之,数据库就是一种特殊的文件,其中存储着需要的数据。
它具有如下特点:
- 持久化存储
- 读写速度极高
- 保证数据的有效性
- 对程序支持性非常好,容易扩展
当前主要使用两种类型的数据库:关系型数据库、非关系型数据库,所谓的关系型数据库RDBMS(Relational Database Management System),是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
关系型数据库的主要产品有:
- oracle:在以前的大型项目中使用,银行,电信等项目
- mysql:web时代使用最广泛的关系型数据库
- ms sql server:在微软的项目中使用
- sqlite:轻量级数据库,主要应用在移动平台
关系型数据库核心元素有:
- 数据行(记录)
- 数据列(字段)
- 数据表(数据行的集合)
- 数据库(数据表的集合)
那么RDBMS和数据库的关系是什么呢?
- 其实RDBMS分为客户端和服务端,我们通过编写SQL语句,把SQL语句交给服务端去执行,然后服务端会到它管理的数据库、数据表里面进行相应的操作。
那么什么是SQL语句呢?
- SQL(Structured Query Language)是结构化查询语言,是一种用来操作RDBMS的数据库语言,当前关系型数据库都支持使用SQL语言进行操作,也就是说可以通过 SQL 操作 oracle,sql server,mysql,sqlite 等等所有的关系型的数据库。
- SQL语句主要分为:
DQL:数据查询语言,用于对数据进行查询,如select
DML:数据操作语言,对数据进行增加、修改、删除,如insert、udpate、delete
TPL:事务处理语言,对事务进行处理,包括begin transaction、commit、rollback
DCL:数据控制语言,进行授权与权限回收,如grant、revoke
DDL:数据定义语言,进行数据库、表的管理等,如create、drop
CCL:指针控制语言,通过控制指针完成表的操作,如declare cursor
SQL 是一门特殊的语言,专门用来操作关系数据库,并且它是不区分大小写的。
那么MySQL又是什么呢?
- MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,后来被Sun公司收购,Sun公司后来又被Oracle公司收购,目前属于Oracle旗下产品。
它具有如下特点:
- 使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性
- 支持多种操作系统,如Linux、Windows、AIX、FreeBSD、HP-UX、MacOS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris等
- 为多种编程语言提供了API,如C、C++、Python、Java、Perl、PHP、Eiffel、Ruby等
- 优化的SQL查询算法,有效地提高查询速度
- 大型的数据库。可以处理拥有上千万条记录的大型数据库
- 支持多种存储引擎
- MySQL 软件采用了双授权政策,它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库
- MySQL使用标准的SQL数据语言形式
- Mysql是可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系统
当然最主要的还是因为它是开源、免费的,使用范围广,跨平台支持性好,提供了多种语言调用的 API,是学习互联网公司数据库的首选。
二、mysql安装
2.1 服务器端
- 安装服务器端:在终端中输入如下命令,回车后,然后按照提示输入
sudo apt-get install mysql-server - 启动服务
sudo service mysql start - 查看进程中是否存在mysql服务
ps ajx|grep mysql - 停止服务
sudo service mysql stop - 重启服务
sudo service mysql restart - 配置文件目录
/etc/mysql/mysql.conf.d/mysqld.cnf,可以通过vi命令进入此文件查看mysql配置的选项。
2.2 客户端
客户端为开发人员与dba(数据库管理员)使用,通过socket方式与服务端通信,常用的有navicat、命令行mysql。
1. 图形化界面客户端navicat可以到navicat官网下载安装:navicat官网
2. 命令行方式
安装:
sudo apt-get install mysql-client
查看帮助文档:
mysql –help
连接命令:
mysql -u root -p,回车后输入密码。
退出命令:
ctrl+d、quit 、exit。
三、数据类型
- 数据完整性
一个数据库就是一个完整的业务单元,可以包含多张表,数据被存储在表中,在表中为了更加准确的存储数据,保证数据的正确有效,可以在创建表的时候,为表添加一些强制性的验证,包括数据字段的类型、约束。 数据类型
- 可以通过查看帮助文档查阅所有支持的数据类型。
- 使用数据类型的原则是:够用就行,尽量使用取值范围小的,而不用大的,这样可以更多的节省存储空间。
- 常用数据类型如下:
– 整数: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时推荐使用;
– 对于图片、音频、视频等文件,不存储在数据库中,而是上传到某个服务器上,然后在表中存储这个文件的保存路径。
约束
– 主键primary key:物理上存储的顺序
– 非空not null:此字段不允许填写空值
– 惟一unique:此字段的值不允许重复
– 默认default:当不填写此值时会使用默认值,如果填写时以填写为准
– 外键foreign key:对关系字段进行约束,当为关系字段填写值时,会到关联的表中查询此值是否存在,如果存在则填写成功,如果不存在则填写失败并抛出异常
说明:虽然外键约束可以保证数据的有效性,但是在进行数据的crud(增加、修改、删除、查询)时,都会降低数据库的性能,所以不推荐使用,那么数据的有效性怎么保证呢?答:可以在逻辑层进行控制。
四、数据库、数据表操作
- 数据库操作
打开终端
-- 进入mysql:
mysql -uroot -p 回车后输入密码,进入mysql
-- 查看版本:
select version();
-- 显示当前时间:
select now();
-- 修改输入提示符:
prompt python>
-- 查看所有数据库:
show databases;
-- 使用数据库:
use 数据库名;
-- 查看当前使用的数据库:
select database();
-- 创建数据库:
create database 数据库名 charset=utf8;
-- 删除数据库:
drop database 数据库名;
- 数据表操作
-- 查看当前数据库中所有表:
show tables;
-- 查看表结构:
desc 表名;
-- 创建表:
auto_increment表示自动增长
CREATE TABLE table_name(
column1 datatype contrai,
column2 datatype,
column3 datatype,
.....
columnN datatype,
PRIMARY KEY(one or more columns)
);
-- 修改表-添加字段
alter table 表名 add 列名 类型;
例:
alter table students add birthday datetime;
-- 修改表-修改字段:重命名版
alter table 表名 change 原名 新名 类型及约束;
例:
alter table students change birthday birth datetime not null;
-- 修改表-修改字段:不重命名版
alter table 表名 modify 列名 类型及约束;
例:
alter table students modify birth date not null;
-- 修改表-删除字段
alter table 表名 drop 列名;
例:
alter table students drop birthday;
-- 删除表
drop table 表名;
例:
drop table students;
-- 查看表的创建语句
show create table 表名;
例:
show create table classes;
- 数据的增删改查(curd)
– curd的解释: 代表创建(Create)、更新(Update)、读取(Retrieve)和删除(Delete)
1. 查询:
查询所有列:
select * from 表名;
例:
select * from classes;
查询指定列
可以使用as为列或表指定别名
select 列1,列2,... from 表名;
例:
select id,name from classes;
2. 增加:
格式:INSERT [INTO] tb_name [(col_name,...)] {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
说明:主键列是自动增长,但是在全列插入时需要占位,通常使用0或者 default 或者 null 来占位,插入成功后以实际数据为准
全列插入:值的顺序与表中字段的顺序对应
insert into 表名 values(...)
例:
insert into students values(0,’郭靖‘,1,'蒙古','2016-1-2');
部分列插入:值的顺序与给出的列顺序对应
insert into 表名(列1,...) values(值1,...)
例:
insert into students(name,hometown,birthday) values('黄蓉','桃花岛','2016-3-2');
全列多行插入:值的顺序与给出的列顺序对应
insert into 表名 values(...),(...)...;
例:
insert into classes values(0,'python1'),(0,'python2');
insert into 表名(列1,...) values(值1,...),(值1,...)...;
例:
insert into students(name) values('杨康'),('杨过'),('小龙女');
3. 修改:
格式: UPDATE tbname SET col1={expr1|DEFAULT} [,col2={expr2|default}]...[where 条件判断]
update 表名 set 列1=值1,列2=值2... where 条件
例:
update students set gender=0,hometown='北京' where id=5;
4. 删除:
DELETE FROM tbname [where 条件判断]
delete from 表名 where 条件
例:
delete from students where id=5;
逻辑删除,本质就是修改操作
update students set isdelete=1 where id=1;
- 数据备份和恢复
1. 备份:
运行mysqldump命令
mysqldump –uroot –p 数据库名 > python.sql;
按提示输入mysql的密码
2. 恢复:
连接mysql,创建新的数据库
退出连接,执行如下命令
mysql -uroot –p 新数据库名 < python.sql
根据提示输入mysql密码
- 逻辑删除
– 对于重要数据,并不希望物理删除,一旦删除,数据无法找回
– 删除方案:设置is_delete的列,类型为bit,表示逻辑删除,默认值为0
– 对于非重要数据,可以进行物理删除
– 数据的重要性,要根据实际开发决定