1.什么是数据库存储数据用文件就可以了,为什么要数据库呢?
首先,文件保存数据有以下几个缺点:
文件的安全性问题文件不利于数据查询和管理文件不利于存储海量数据文件才程序中控制不方便数据库存储的介质:
磁盘内存为解决上述问题,专家们设计出更加利于管理数据的东西-数据库,能更加有效的管理数据,数据库的水平是衡量一个程序员水平的重要指标
2.主流数据库SQL Sever: 微软的产品,.Net程序员的最爱,中大型项目Oracle: 甲骨文产品,适合大型项目,复杂的业务逻辑,并发一般来说不如MySQLMySQL:世界上最受欢迎的数据库,属于甲骨文,并发性好,不适合做复杂的业务。主要用在电商,SNS,论坛。对简单的SQL处理效果好PostgreSQL :加州大学伯克利分校计算机系开发的关系型数据库,不管是私用,商用,还是学术研究使用,可以免费使用,修改和分发SQLite: 是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了H2: 是一个用Java开发的嵌入式数据库,它本身只是一个类库,可以直接嵌入到应用项目中3.基本使用3.1 MySQL安装CentOS 6.5下编译安装MySQL 5.6.14_野马红尘的技术博客_51CTO博客
https://zhuanlan.zhihu.com/p/49046496
Windows下通过MySQL Installer安装MySQL服务_野马红尘的技术博客_51CTO博客
ubuntu 安装 MySql_ubuntu安装mysql-CSDN博客
3.2 连接服务器代码语言:javascript复制mysql -h 127.0.0.1 -P 3306 -u root -p注意:
如果没有写 -h 127.0.0.1 默认是连接本地 如果没有写 -P 3306 默认是连接3306端口号3.3 服务器管理执行 win+r 输入 services.msc 打开服务管理器 通过下图左侧停止,暂停,重启动按钮进行服务管理3.4 服务器、数据库、表关系所谓安装数据库服务器,只是在机器上安装了一个数据库管理系统程序,这个管理程序可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。
为保存应用中实体的数据,一般会在数据库中创建多个表,以保存程序中实体的数据。数据库服务器、数据库和表的关系如下:
3.5 使用案例创建数据库
代码语言:javascript复制create database helloworld;使用数据库
代码语言:javascript复制use helloworld;创建表
代码语言:javascript复制create table student(
id int,
name varchar(32),
gender varchar(2)
);表中插入数据
代码语言:javascript复制insert into student (id, name, gender) values (1, '张三', '男');
insert into student (id, name, gender) values (2, '李四', '女');
insert into student (id, name, gender) values (3, '王五', '男');查询表中的数据
代码语言:javascript复制select * from student;3.6 数据逻辑存储3.7 MySQL架构MySQL 是一个可移植的数据库,几乎能在当前所有的操作系统上运行,如 Unix/Linux、Windows、Mac 和 Solaris。各种系统在底层实现方面各有不同,但是 MySQL 基本上能保证在各个平台上的物理体系结构的一致性
4.SQL分类DDL【data definition language】 数据定义语言,用来维护存储数据的结构
代表指令: create, drop, alter DML【data manipulation language】 数据操纵语言,用来对数据进行操作
代表指令: insert,delete,update DML中又单独分了一个DQL,数据查询语言
代表指令: select DCL【Data Control Language】 数据控制语言,主要负责权限管理和事务
代表指令: grant,revoke,commit5.存储引擎存储引擎是数据库管理系统如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法
MySQL的核心就是插件式存储引擎,支持多种存储引擎
5.1 查看存储引擎代码语言:javascript复制show engines;5.2 存储引擎对比6.库的操作6.1 创建数据库语法:
代码语言:javascript复制CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [,create_specification] ...]
create_specification:
[DEFAULT] CHARACTER SET charset_name
[DEFAULT] COLLATE collation_name 说明:
大写的表示关键字 [] 是可选项 CHARACTER SET: 指定数据库采用的字符集 COLLATE: 指定数据库字符集的校验规则 6.2 创建数据库案例创建名为db1的数据库
在mysql8之前当我们创建数据库没有指定字符集和校验规则时,系统使用默认字符集:utf8,校验规则是:utf8_ general_ ci在mysql8之后默认字符集为utf8mb4,校验规则是uft8mb4_0900_ai_ci6.3 字符集和校验规则6.3.1 查看系统默认字符集以及校验规则代码语言:javascript复制show variables like 'character_set_database';
show variables like 'collation_database';6.3.2 查看数据库支持的字符集代码语言:javascript复制show charset;字符集主要是控制用什么语言。比如utf8就可以使用中文
6.3.3 查看数据库支持的字符集校验规则代码语言:javascript复制show collation;6.3.4 校验规则对数据库的影响6.3.4.1 不区分大小写创建一个数据库,校验规则使用utf8_ general_ ci/utf8mb4_0900_ai_ci[不区分大小写]
代码语言:javascript复制create database test1 collate utf8_general_ci;
use test1;
create table person(name varchar(20));
insert into person values('a');
insert into person values('A');
insert into person values('b');
insert into person values('B');6.3.4.2 区分大小写创建一个数据库,校验规则使用utf8_ bin[区分大小写]
代码语言:javascript复制create database test2 collate utf8_bin;
use test2;
create table person(name varchar(20));
insert into person values('a');
insert into person values('A');
insert into person values('b');
insert into person values('B');6.4 操纵数据库6.4.1 查看数据库代码语言:javascript复制show databases;6.4.2 显示创建语句代码语言:javascript复制show create database 数据库名; 说明:
MySQL 建议我们关键字使用大写,但是不是必须的。 数据库名字的反引号``,是为了防止使用的数据库名刚好是关键字 /*!40100 default.... */ 这个不是注释,表示当前mysql版本大于4.01版本,就执行这句话6.4.3 修改数据库语法:
代码语言:javascript复制ALTER DATABASE db_name
[alter_spacification [,alter_spacification]...]
alter_spacification:
[DEFAULT] CHARACTER SET charset_name
[DEFAULT] COLLATE collation_name说明:
对数据库的修改主要指的是修改数据库的字符集,校验规则6.4.4 数据库删除代码语言:javascript复制DROP DATABASE [IF EXISTS] db_ name;执行删除之后的结果:
数据库内部看不到对应的数据库 对应的数据库文件夹被删除,级联删除,里面的数据表全部被删注意:不要随意删除数据库
6.4.5 备份和恢复6.5.4.1 备份代码语言:javascript复制mysqldump -P3306 -u root -p 密码 -B 数据库名 > 数据库备份存储的文件路径 可以打开看看 .sql 文件里的内容,其实把我们整个创建数据库,建表,导入数据的语句
都装载这个文件中
6.5.4.2 还原代码语言:javascript复制mysql> source /home/dc/mysql_test1/test1.sql;6.4.5.3 注意事项如果备份的不是整个数据库,而是其中的一张表,怎么做?
代码语言:javascript复制mysqldump -u root -p 数据库名 表名1 表名2 > D:/mytest.sql同时备份多个数据库
代码语言:javascript复制mysqldump -u root -p -B 数据库名1 数据库名2 ... > 数据库存放路径 如果备份一个数据库时,没有带上 -B 参数, 在恢复数据库时,需要先创建空数据库,然后使用数据库,再使用source 来还原
6.4.6 查看连接情况语法:
代码语言:javascript复制show processlist;可以告诉我们当前有哪些用户连接到我们的MySQL,如果查出某个用户不是你正常登陆的,很有可能你的数据库被人入侵了。发现自己数据库比较慢时,可以用这个指令来查看数据库连接情况
7.表的操作7.1 创建表语法:
代码语言:javascript复制CREATE TABLE table_name (
field1 datatype,
field2 datatype,
field3 datatype
) character set 字符集 collate 校验规则 engine 存储引擎说明:
field 表示列名 datatype 表示列的类型 character set 字符集,如果没有指定字符集,则以所在数据库的字符集为准 collate 校验规则,如果没有指定校验规则,则以所在数据库的校验规则为准7.2 创建表案例代码语言:javascript复制create table users (
id int,
name varchar(20) comment '用户名',
password char(32) comment '密码是32位的md5值',
birthday date comment '生日'
) character set utf8 engine MyISAM;说明:
不同的存储引擎,创建表的文件不一样。 users 表存储引擎是 MyISAM ,在数据目中有三个不同的文件,分别是: users.frm :表结构
users.MYD :表数据
users.MYI :表索引
7.3 查看表结构代码语言:javascript复制desc 表名;7.4 修改表在项目实际开发中,经常修改某个表的结构,比如字段名字,字段大小,字段类型,表的字符集类型,表的存储引擎等等。我们还有需求,添加字段,删除字段等等。这时我们就需要修改表
代码语言:javascript复制ALTER TABLE tablename ADD (column datatype [DEFAULT expr][,columndatatype]...);
ALTER TABLE tablename MODIfy (column datatype [DEFAULT expr][,columndatatype]...);
ALTER TABLE tablename DROP (column);案例:
在users表中添加两条记录代码语言:javascript复制mysql> insert into users values(1,'a','b','1982-01-04'),(2,'b','c','1984-01-04');在users表添加一个字段,用于保存图片路径代码语言:javascript复制mysql> alter table users add assets varchar(100) comment '图片路径' after birthday;修改name,将其长度改成60代码语言:javascript复制mysql> alter table users modify name varchar(60);删除password列 注意:删除字段一定要小心,删除字段及其对应的列数据都没了
代码语言:javascript复制mysql> alter table users drop password;修改表名为employee代码语言:javascript复制mysql> alter table users rename to employee;to:可以省掉
将name列修改为xingming代码语言:javascript复制mysql> alter table employee change name xingming varchar(60);
--新字段需要完整定义7.5 删除表语法格式:
代码语言:javascript复制DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ...示例:
代码语言:javascript复制drop table t1;8.数据类型8.1 数据类型分类8.2 数值类型8.2.1 tinyint类型数值越界测试:
说明:
在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。 可以通过UNSIGNED来说明某个字段是无符号的注意:尽量不使用unsigned,对于int类型可能存放不下的数据,int unsigned同样可能存放不下,与其如此,还不如设计时,将int类型提升为bigint类型
8.2.2 bit类型基本语法:
代码语言:javascript复制bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。举例:
bit字段在显示时,是按照ASCII码对应的值显示 如果我们有这样的值,只存放 0 或 1 ,这时可以定义 bit(1) 。这样可以节省空间
8.2.3 小数类型8.2.3.1 float语法:
代码语言:javascript复制float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节案例:
小数:float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入
如果定义的是float(4,2) unsigned 这时,因为把它指定为无符号的数,范围是 0 ~ 99.99
8.2.3.2 decimal语法:
代码语言:javascript复制decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数decimal(5,2) 表示的范围是 -999.99 ~ 999.99 decimal(5,2) unsigned 表示的范围 0 ~ 999.99 decimal和float很像,但是有区别: float和decimal表示的精度不一样说明:float表示的精度大约是7位。
decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略, 默认是10建议:如果希望小数的精度高,推荐使用decimal
8.3 字符串类型8.3.1 char语法:
代码语言:javascript复制char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255案例(char):
说明:
char(2) 表示可以存放两个字符,可以是字母或汉字,但是不能超过2个, 最多只能是2558.3.2 varchar语法:
代码语言:javascript复制varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节案例:
关于varchar(len),len到底是多大,这个len值,和表的编码密切相关:
varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是65532当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)8.3.3 char和varchar比较 如何选择定长或变长字符串?
如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5 如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是要保证最长的能存进去定长的磁盘空间比较浪费,但是效率高变长的磁盘空间比较节省,但是效率低定长的意义是,直接开辟好对应的空变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少8.4 日期和时间类型常用的日期有如下三个:
date :日期 'yyyy-mm-dd' ,占用三字节 datetime 时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从 1000 到 9999 ,占用八字节 timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节案例:
更新数据
8.5 enum和set语法:
enum:枚举,“单选”类型; enum('选项1','选项2','选项3',...); 该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,....最多65535个;当我们添加枚举值时,也可以添加对应的数字编号
set:集合,“多选”类型; set('选项值1','选项值2','选项值3', ...); 该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,.... 最多64个
案例:
有一个调查表votes,需要调查人的喜好, 比如(登山,游泳,篮球,武术)中去选择(可以多选),(男,女)[单选]
集合查询使用find_ in_ set函数: