一、认识数据库
1、什么是数据库?
简述;数据库就是存放数据的仓库,数据就是具有描述性的记录符号。
2、文件存储 文件处理就可以将数据永久存储
问题: 1,管理不方便 2、文件操作效率问题 3、一个程序不太可能仅运行在同一台电脑上
提高计算机的性能的方式:
1、垂直扩展 指的是更换更好的硬件提升性能 2、水平扩展 指的是就是添加更多的计算机 把任务分配给每一台电脑
分布式计算的好处 : 1、其中某一台挂掉了不会导致整个系统瘫痪 稳定性高 2、理论上性能可以无限扩展
分布式计算其实也是整体
数据共享需要用到socket技术
共享就存在竞争问题
加锁处理
文件存取效率问题
3、数据库类型 数据库 本质上就是一套软件由服务器端和客户端组成 C?S B/S
目前常见的数据库: 关系型数据库 数据与数据之间可以建立关联关系
SQLserver : 仅支持Windows MySQL 数据库学习免费 开源 性能也不差 MySQL先后被sun和Oracle收购 MariaDB MySQL创始人
Oracle
DB2
非关系型数据库:
mogodb
Redis
memcached
4、安装数据库的步骤:
1、添加环境变量
2、注册系统服务
3、修改默认密码 MySQL设置密码:MySQLadmin MySQLadmin-uroot -p 修改的新密码admin 查看密码:
破解密码:
1、删除存储密码的文件
2、可以在启动服务器时告诉她让他不要读取密码文件
1、mysqld-skip-grant-tables
2、无密码登录
3、使用update 来更新你的密码 在mysq.user表中 update mysql.user set password=password("新密码")where user="root"and host="localroot"
4、启动服务器,注册系统服务
5、数据库中(库,表,给表记录)增删改查的命令: 数据库服务器中存放的是 库(文件加) 表(文件) 表里面是记录(一行数据)
库相关 :
创建 create database 数据库名 charset 编码名称
修改 alter database 数据库名 charset gbk
查 show databases; 查看所有数据 show create database 数据库名 查看建库语句
删除 drop database 数据库名
表相关 :
创建 create table t1(id int,name char);
修改 改结构:
alter table 表名 add | drop | modify | change :
add 后面跟 字段名 数据类型
drop 后面跟 字段名
modify 后面跟 字段名 新类型
change 后面跟 旧字段名 新的字段名 新类型
修改编码:alter table t1 charset gbk;
修改表名: rename table 旧表名 to 新表名
查 show tables; show create table 表名 查看建表语句 desc 表名 查看表结构(字段)
删除 drop table 表名 truncate table 表名,重建表(清空数据)
记录相关 :
添加 insert into 表名 values(值1...),(值1....)....
插入时注意 值得顺序 和 类型必须与表结构一致
修改 update 表名 set 字段名=新的值 where 条件
可以同时修改多行 用逗号来隔开字段 没有条件就全改
查 select *|字段名 from 表名 *表示所有字段
删除 delete from 表名 where条件 没有条件就全删
一、数据存储引擎
查看引擎指令:show engines;
什么是引擎 ?
一个功能的核心部分引擎可以被分类
为什么要分类?
自然 增压的 汽油 柴油 电动 混合动力 天然气 核动力 烧水
汽油 动力弱一点 噪音小 震动小
柴油 动力强 污染大 噪音大 振动大
需求场景的不同催生了不同的引擎类别
回到mysql 核心功能是存储数据 涉及到存储数据的代码 就称之为存储引擎 根据不同的需求 也有着不同的引擎分类
不同的引擎测试 创建表时在最后指定引擎名称 engine = xxx
create table t1(id int)engine=innodb
create table t1(id int not null)engine=csv
create table t1(id int)engine=memory
create table t1(id int)engine=blackhole
insert into t1 value(1);
insert into t2 value(1);
insert into t3 value(1);
insert into t4 value(1);
总结: innodb是默认的引擎 因为 它是永久存储 并且 支持事务,行锁,外键
二、创建表的完整语句 create table 表名( 字段名称 数据类型[(长度) 约束条件], 字段名称 数据类型[(长度) 约束条件] ) *****
必须的:字段名 数据类型 表名 ***** 可选的:长度 约束条件 *****
长度用于设置数据的长度
数据类型也是一种约束 约束指的是除了数据类型外的额外的规范
如果添加的数据超过了指定的长度范围,超出范围的就丢弃;
注意: 字段名 和 表名 库名 都不能是mysql的关键字 比如select from not..... *****
三、数据类型
为什么需要将数据分类?
1.为了描述事物 更加准确
2.描述起来更方便
3.节省内存空间
1 a 你 utf8 下 5个字节
1 a b c unicode 6个字节
mysql支持的数据类型:
整型 *** *** *** ***** ***
tinyint smallint mediumint int bigint
字节数:1 2 3 4 8
默认情况下整型是有符号的 需要用一个二进制位存储符号
给整型加上 约束 unsigned来表示无符号
不管有没有符号输入的只要不超过整型的最大范围查看的值还是其原值;
有符号时:
tinyint 包含数的范围在(-128~127)
smallint包含数的范围在(-2**15~(2**15-1))
mediumint 包含数的范围在(-2**23~(2**23-1))
int 包含数的范围在(-2**31~(2**31-1))
bigint 包含数的范围在(-2**63~(2**63-1))
无符号时:
tinyint 包含数的范围在(0~(2**8-1))
smallint包含数的范围在(0~(2**16-1))
mediumint 包含数的范围在(0~(2**24-1))
int 包含数的范围在(0~(2**32-1))
bigint 包含数的范围在(0~(2**64-1))
修改严格模式:以上特性的出现是因为 mysql处于非严格模式, 查看当前模式 show variables like "sql_mode";
修改为严格模式 set global sql_mode = "STRICT_TRANS_TABLES";
严格模式下 如果值超出范围就直接报错,在一些版本中默认就是严格模式!
在我们的正常开发中,我们应该先判断数据的正确性,没有问题在发给数据库
怎么选择: 得根据实际情况来判断,能够保存你的数据的最小类型
长度限制对于整型的意义:
create table t10(id int(1));
insert into t10 value(454555);
select *from t10;
发现这个数也存储成功
说明 这里长度指的不是存储容量限制,而是显示的宽度且如果你的数据超过了显示宽度 有几个显示几个;如果不足 则补全到指定长度 得告诉它用什么来补全 。
create table t13(id int(10) zerofill);
总结 不是容量限制 而是 显示宽度 且要限制显示宽度
1.创建表时 给整型加上宽度
2.加上zerofill约束
浮点型: 小数型
分类: float ***** double **** decimal *****
字节数: 4 8 不确定(手动指定)
给浮点设置宽度限制 float(m,d) double(m,d) decimal(m,d)
长度说明 ***** m表示 这个浮点数整体的长度 d表示 小数部分的长度 例如: float(5,3) 最大值: 99.999
区别 ***** :
相同点: 小数部分最大长度都是30
float和double的最大长度为255
不同点: decimal的整体最大长度65
精度不同 double 比 float 精度高
decimal 是准确的 不会丢失精度
如何选择:你对精确度要求高你就使用 decimal
字符型
分类:char 定长字符 varchar 变长字符
char类型的长度是固定 无论你存储的数据有多长 占用的容量都一样 char(3) 存储的数据为 "a" 在硬盘保存的数据还是占3字符长度 实际保存的是"a "
varchar 长度是可变的 存储的数据有多长就占用多长 varchar(3) 存储的数据为 "a" 在硬盘保存的数据还是占1字符长度 实际保存的是"a"
例如:
yxx exx lxx zxx cx wxx char(3) (1bytes+yx)(1bytes+exx)(1bytes+lx)(1bytes+zxx) varchar(3)
如果是可变长度 则有问题 不知道数据从哪里开始到哪里结束 所以需要有一个位置保存数据的长度
vharchar 能支持的最大长度是65535 用于保存数据长度的数据最长两个bytes
如果是char类型 如果你的数据不足指定长度 就在后面用空格补全
验证:
使用一个 char_length的函数 可以查看字符的长度 create table t18(a char(4),b varchar(4)); insert into t18 value("x","x");
select char_length(a),char_length(b) from t18; 两个字段的长度都为1
结论: 这是因为 mysql在存储时 自动加上的空格 对使用者而言是没有意义的 所以mysql自动帮你处理掉空格了,我们可以设置sql模式 来让它现出原形如:set global sql_mode = "PAD_CHAR_TO_FULL_LENGTH,STRICT_TRANS_TABLES" 设置完成后重启 msyql 再次使用select char_length(a),char_length(b) from t18;查询长度
注意:当你在执行这样的查询语句时 mysql会自动将参数末尾的空格去除
例如:select *from t19 where name = "yh"
当你在使用模糊搜索时 要注意 定长字符 后面可能会有空格 所以最好在后面加上百分号 % select *from t19 where name like "yh";
% 任意个数的任意字符
_ 1个任意字符
如何选择 char和varchar
char:存取效率高但浪费存储空间
varchar:存取效率低于char但节省存储空间
char和varchar 长度都比较小 最大就是65535
char和varchar使用起来感受不到区别 通常用的是char
大文本类型:
TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXT 文本是带有编码
BLOB 系列 TINYBLOB BLOB MEDIUMBLOB LONGBLOB 也是字符数据 但是不带编码
二进制类型: 用于存储多媒体数据 比如视频 但是我们一般不会将多媒体数据存到数据 而是存储文件路径地址
BINARY系列 BINARY VARBINARY 存储二进制数据
日期时间类型:
分类: time 时分秒 HH:MM:SS ***
year 年份 ***
date 日期 年月日 ***
datetime 日期加时间 年月日 时分秒 年份最大是9999 *****
timestamp 时间戳 从1970-1-1开始算 年份最大是2037 *****
共同点: 时间的存取通过字符串类型且都可以使用now()函数来插入当前时间
datetime 和 时间戳都能够表示日期和时间
不同之处是: 年份最大范围不同
时间戳可以为空 代表当前时间
时间戳在你更新记录时 会自动更新为当前时间
布尔 可以用别的类型;来代替
枚举 ** 用于描述 一个已知范围的数据 例如性别: 只有男 女 或其他 enum("man","woman","other")
总结: 枚举中只能是字符串类型且添加的数据只能是已经出现在枚举中的值并且插入的值只能是其中的一个而且可以使用枚举值的序号来插入值 从1开始。
集合 ** 用于描述一堆数据 比如你的兴趣爱好 set("watch movie","listen music","play game")
总结:集合中的数据 只能是字符串且添加的数据只能是已经出现在集合中的值并且插入的值可以是其中的任意几个而且可以使用枚举值的序号来插入值 从1开始但是只能给一个序号。