什么是数据库?存储数据的仓库
概念:按照数据结构来组织、存储和管理数据的简历在计算机存储设备上的仓库
分类:
网络数据库
把数据库技术引入到计算机网络系统中,借助网络技术将存储于数据库的信息及时发出去,用户与网络中的数据库进行实 时动态数据交互
层级数据库
层次结构模型实质上是一种友根节点的定向有序树(无回的连通图)
关系数据库
建立在关系模型基础上的数据库
借助于集合代数等数学概念和方法来处理数据库中的数据
数据库的另外一种分类方式:基于存储介质
存储介质分;两种:磁盘和内存
关系型数据库:存储在磁盘中
非关系型数据库:存储在内存中
关系型数据库
三大特点:
关系数据结构:指数据以什么方式存储,是一种二维表的形式存储。(行、列)
本质:二维表(体现数据放在对应的位置)
姓名 |
年龄 |
身高 |
体重 |
张三 |
30 |
187 |
70 |
李四 |
40 |
178 |
65 |
关系操作集合:指如何关联和管理对应的存储数据,SQL指令
获取张三的年龄:已知条件为姓名
Select 年龄 from 二维表 where 姓名=张三;
关系完整性约束:数据内部有对应的关联关系,以及数据与数据之间也有对应的关联关系
表内约束:对应的具体列,只能放对应的数据(不能乱放)
表间约束:自然界各实体都是有着对应的关联关系的(外键)
SQL
结构化查询语言简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计的语言
用于存储数据以及查新、更新和管理关系数据库系统
同时也是数据库脚本文件的拓展名
SQL就是专门为关系型数据库而设计出来的
SQL分类
1、数据查询语言:DQL
专门用于查询数据
代表指令: select/show
2、数据操作语言:DML
专门用于写数据
代表指令:insert.update、delete
3、事务处理语言:TPL
专门用于事务安全处理:(不是所有的关系型数据库都提供事务安全处理)
transaction
4、数据控制语言:DCL
专门用于权限管理
代表指令:grant 分配指令 revoke 回收权限
5、数据定义语言:DDL
专门用于结构管理
代表指令:create、drop、alter
MySQL
是一个关系型数据库管理系统、开源、免费
MySQL是一种C/S的结构:客户端和服务端
- 启动和停止服务
- /usr/local/MySQL/bin/mysql -u root -p
- 输入密码
- 退出:exit
完整语法:
mysql -hlocalhost -P3306 -u root -p
IP地址 指定端口号 用户名 密码
注意事项:
- 通常端口都可以默认
- 密码的输入可以先输入-p,再输入密码
MySQL服务端架构
由以下几层构成:
1、数据库管理系统(最外层):DBMS,专门管理服务器端的所有内容
2、数据库(第二层):DB,专门用于存储数据的仓库(可以有很多个)
3、二维数据表(第三层):Table,专门用于存储具体实体的数据
4、字段(第四层):Field,具体存储某种类型的数据(实际存储单元)
数据库中常用的几个关键字:
- row:行
- Column:列(field)
库操作
数据库是数据存储的最外层(最大单元)
创建数据库:
create database 数据库名[库选项];
库选项:数据库的相关属性
字符集:charset 字符集,代表着当前数据库下的所有表存储的数据默认指定的字符集(不指定会采用DBMS默认的)
校对集:collate 校对集
create database 数据库名 charset 字符集名;
显示数据库:
显示数据库:
查看全部: show databases;
查看部分: show databases like'匹配模式';
_:匹配当前位置单个字符
%:匹配指定位置多个字符
举例: 获取以my开头的全部数据库:
'my%'; 获取以m开头,后面一个字母不确定,最后为database的数据库:
'm_database';
获取以database结尾的数据库:
'%database';
显示数据库创建语句:
show create database 数据库名字;
选择数据库:
为什么要选择数据库呢?因为数据是存储到数据表,数据表是存在数据库下,如果要操作数据,那么必须要进入到对应的数据库才行
use 数据库名;
修改数据库:
修改数据库库选项:字符集和校对集
alter database 数据库名 charset = 字符集;
删除数据库:
drop database 数据库名;
数据表操作:
创建数据表:
普通创建表:
create table 表名(字段名 字段类型[字段属性],字段名 字段类型[字段属性],字段名 字段类型[字段属性],...) [表选项]
举例:
use datavase; create table class(name varchar(10));
将数据表挂到数据库中:
create table mydatabase.class(name varchar(10));
表选项:与数据库选项类似
Engine:存储引擎,mysql提供的集体存储数据的方式,默认有一个innodb(5.5之前默认是mysiam)
Charset:字符集:只对当前自己表有效(基表比数据库高)
Collate:校对集
复制已有表结构:
从已有的存在的表复制一分(只复制结构)
只要使用数据库.表名 就可以在任何数据库下访问其他数据库的表名
create table 表名 like 表名; create table 表名 like 数据库名.表名;
显示数据表:
每当一张表创建,数据库下会创建一些文件(与存储引擎有关)
(dp.opt这个结构文件来自于innodb存储引擎,innodb存储引擎所有的文件都存储在外部的ibdata文件中)
查看所有表
show tables;
匹配显示表
show tables like '匹配模式';
显示表结构:
显示表中所包含的字段信息(名字,类型,属性等)
Describe 表名;
Desc 表名;
show columns from 表名;
显示表创建语句:
show create table 表名;
MySQL中有多种语句结束符:
;与\g:字段在上排横着,下面对应数据
\G:字段在左侧竖着,数据在右侧横着
设置表属性:engine、charset、collate
alter table 表名 表选项 值;
注意:数据库如果确定,存在数据了,不要轻易修改表选项
修改表结构:
数据库中数据表名字通常有前缀:取数据库的前两个字母加上下划线
修改表名:
rename table 旧表名 to 新表名;
修改表选项:
alter table 表名 表选项 新值;
新增字段:
alter table 表名 add column 新字段名 列类型[列属性][位置first/after字段名];
修改字段名:
alter table 表名 change 旧字段名 新字段名 字段类型[列属性][新位置];
修改字段类型(属性):
alter table 表名 modify 字段名 新类型 [新属性][新位置];
删除字段:
alter table 表名 drop 字段名;
删除表结构:
drop table 表名1[,表名2...]; 可以同时删除多个数据表
数据基础操作:
插入操作:
本质含义:将数据以SQL的形式存储到指定的数据表(字段)
向表中指定字段插入数据:
Insert into 表名[(字段列表)] values(对应字段列表) ;
向表中所有字段插入数据:
Insert into 表名 values (对应表结构) ;
值列表必须与字段列表一致
注意:1、values中的对应的值列表只需要与前面的字段列表相对应即可(不一定与表结构完全一致)
2、字段列表并不一定非要有所有的表中字段
查询操作:
查询表中全部数据:
select * from 表名;
查询表中部分字段:
select 字段列表 from 表名; 多个字段列表使用,隔开
简单条件查询语句:
select 字段列表/* from 表名 where 字段名 = 值;
删除操作:
delete from 表名[where 条件];
如果没有where条件意味着系统会自动删除该表所有数据
更新操作:
将数据进行修改(通常是修改部分字段数据)
update 表名 set 字段名 = 新值 [where 条件];
如果没有where条件意味着对应表中所有字段都会被修改
字符集
字符编码概念:
字符是各种文字和符号的总称,包括国家文字、标点符号、图形符号、数字等。
计算机中看到的任何内容都是字符构成的。
字符编码:计算机针对各种符号,在计算机中的一种二进制存储代号。
常见:ASCLL、GB2312、BIG5、GB18030、Unicode、UTF-8
set names 字符集;
深层原理:客户端、服务端、连接层(show variables like 'character set_%')
Client Server conection
Set names字符集的本质:一次打通三层关系的字符接,变得一致
系统中有三个变量记录这三个关系对应的字符集:
show variables like 'acaracter_set%';
举例:
Set character_set_client = gbk;//为了让服务器识别客户端传来的数据
Set character_set_connection = gbk;//为了更好的帮助客户端与服务端之间进行字符集转换
Set character_set_results = gbk;//为了告诉客户端服务端所返回的数据字符集
列类型(字段类型)
整数类型
Tinyint:迷你整形
系统采用一个字节来保存的整型 1byte=8位
表示的数值范围:0-255
mysql默认的为整型增加了负数 -128-127
Smallint:小整形
系统采用两个字节来保存的整型
表示的数值范围:0-65535
Mdeiumint:中整型
系统采用三个字节来保存数据
Int:整型(标准整型)
系统采用四个字节来保存数据
Bigint:大整形
系统采用八个字节来保存数据。
实际应用中应该根据对应的数据范围选定对应的整数类型,通常都是Tinyint和Int
无符号标识设定:
无符号:表示存储的的数据在当前字段中,没有负数
类型 unsigned;
显示长度
指数据(整型)在数据显示的时候最多可以显示多长位
只是代表了这个数据是否可以达到指定的长度,但是不会自动满足到指定长度
如果想要数据现实的时候保持最高位(显示长度),还需要给字段增加一个zerofill属性才可以
insert table my_int add int_1 tinyint zerofill first;
zerofill:从左侧开始填充0(左侧不会改变数值大小)所以负数的时候不能使用zerifill,一旦使用就相当于确定该字段为unsigned
显示长度可以自己设定:超出长度(不超出范围)不会影响
只会对不够长度(显示长度)的进行补充
小数类型
专门用来存储小数的,在Mysql中将小数类型又分为了两类,浮点型,定点型
浮点型:(精度类型)是一种有可能丢失精度的数据类型,数据有可能不那么准确(尤其是超出范围的时候)
应用:保存一些数量特别大,大到不用那么精确的数据
浮点型之所以能存较大的数值,原因就是利用存储数据的位来存储指数
整形:所有位都是1
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
浮点型:有部分存储数据,部分存指数
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
前三位转换成是禁止后,作为10的指数:10……7数据值
Float:
单精度类型,系统提供四个字节用来存储数据,但是能表示的数据范围比整型大的多
范围:10^38
精度:7位左右的精度
语法:
Float:表示不指定小数位的附件数
Float(M,D):表示一共存储M个有效数字,其中小数部分占D位
Float(10,2):整数部分为8位,小数部分为2位
Double:
双精度类型,系统提供8个字节用来存储数据
范围:10^308
精度:15位左右的精度
定点数
能够保证数据精确的小数(小数部分可能不精确,因为超出长度会四舍五入),整数部分一定精确
应用:涉及到钱的时候可能使用定点数
Decimal:
系统自动根据存储的数据来分配存储空间
每大概9个数,就会分配四个字节来进行存储
同时小数和整数部分是分开的(动态分配)
Decimal(M,D)
M表示总长度,最大值不能超过65
D代表小数部分长度,最大不能超过30
日期时间类型
Date:
日期类型:系统使用三个字节来存储数据
格式:YYYY-mm-dd
范围:1000-01-01到9999-12-12,初始值为0000-00-00
Time:
时间类型:能够表示某个指定的时间,系统提供三个字节来存储
格式:HH:ii:ss
范围:-838:59:59~838:59:59
用处:描述时间段
Datetime:
日期时间类型:将日期和时间类型合并起来,表示的时间,使用八个字节存储数据
格式:YYYY-mm-dd HH:ii:ss
范围:1000-01-01 00:00:00到9999-12-12 23:59:59,初始值为0000-00-00 00:00:00
Timestamp:
时间戳类型:MySQL中的时间戳知识表示从格林威治时间开始,但是格式依然是:YYYY-mm-dd HH:ii:ss
当对应的数据被修改时,会自动更新(被修改的数据不是自己)
Year:
年类型:占用一个字节来保存
范围:1900~2155年
year有两种数据插入方式:0~99到四位数的具体年
字符串型
Char
定长字符:指定长度之后,系统一定会分配指定的空间用于存储数据。
char(L) L代表字符数(中文与英文字母一样)L长度为0-255
Varchar
变长字符:指定长度后,系统会根据实际存储的数据来计算长度,分配合适的长度(数据没有超出长度)
Varchar(L) L代表字符数,L的长度理论值为0-65535
因为varchar要记录数据长度(系统根据数据长度自动分配空间),所以每个varchar数据产生后
系统都会在数据后面增加1-2个字节的额外开销,用来保存数据所占用的空间长度
如果数据本身小于127个字符,额外开销一个字节;如果大于127个,额外开销两个字节;
char和varchar数据存储对比(utf8,一个字符都会占用三个字节)
存储数据 |
char(2) |
Varchar(2) |
Char所占字节 |
Varchar所占字节 |
A |
A |
A |
2*3 = 6 |
1*3+1 = 4 |
Char和Varchar的区别:
1、char一定会使用指定的空间,varchar是根据数据来定空间
2、char的数据查询效率比varchar高。因为varchar需要根据记录数来计算
如果确定数据一定是占指定长度,那么使用char类型 如果不确定数据到底有多少,使用varchar类型
如果数据长度超过255个字符,无论是否固定长度,都会使用Text,不再使用char和varchar
Text
文本类型:本质上mysql提供了两种文本类型
Text:存储普通的字符文本
Blob:存储二进制文本(图片,文件)一般都不会使用blob存储文件本身,通常使用一个链接指向对应的文件本身
Text:系统中提供了四种text
Tinytext:系统使用一个字节来保存,实际能够存储的数据为:2^8+1;
Text:使用两个字节保存,实际存储:2^16+2;
Mediumtext:使用三个字节保存,实际存储:2^24+3;
Longtext:使用四个字节保存,实际存储:2^32+4;
注意:
1、选择对应的存储文本的时候,不用刻意选择text类型
系统会自动根据存储的数据长度来选择合适的文本类型
2、选择字符存储的时候,如果数据超过255个字符,一定选择text存储
Enum
枚举类型:在数据插入之前先设定几个项。这几个项就是可能最终出现的数据结果。
如果确定某个字段的数据只有那么几个值:如性别,男,女,保密。系统就可以在设定字段的时候,规定当前字段只能存放固定的几个值
enum(数据值1,数据值2,...);
系统提供了1-2个字节来存储枚举数据,通过计算enum列举的具体值来选择实际的存储空间
如果数据值列表在255个以内,那么一个字节就够;如果超过255,但是小于65535,系统采用两个字节保存
存储原理:实际上字段所存储的值并不是真正的字符串,而是字符串对应的下标
当系统设定枚举类型的时候,会给枚举中每个元素定义一个下标;
规则:从1开始
Enum(1=>'男',2=>'女',3=>'保密')
特性:在mysql中系统自动进行类型转换的,如果数据碰到"+,-,*,/"系统就会自动将数据转换成数值;而普通字符串转换成数值位0
select 字段名 +0 from 表名
意义:
1、规范数据本身,限定只能插入规定的数据项
2、节省存储空间
Set
集合:是一种将多个数据选项可以同时保存的数据类型
本质是将指定的项按照对应的二进制位来进行控制
1表示该选项被选中
0表示该选项没有被选中
Set(值1'',值2'',值3''...)
系统为set提供了多个字节进行保存,但是系统会自动计算来选择具体的存储单元
1个字节:set可以表示8个选项
2个字节:set可以表示16个选项
3个字节:set可以表示24个选项
8个字节:set可以表示64个选项
Set和enum一样,最终存储到数据字段中的依然是数字,而不是真实的字符串
1、系统将对应的数据选项按顺序编排,从第一个开始进行转为,每一个都对应一个二进制位
2、存储时,如果被选中,那么对应的值就位1,否则为0
3、系统会自动将得到的最终的二进制颠倒过来,然后进行转换成十进制存储
意义:
1、规范数据
2、节省存储空间
enum:单选框
Set:复选框
MySQL记录长度
mysql中规定:记录长度(record == 行row)总长度不能超过65535个字节
varchar能够存储的理论值为65535个字符:字符在不同的字符集下可能占用多个字节
varchar除了存储数据本身还要占用空间:还需要额外的空间来保存记录长度
Utf8最多只能存储21844个字符
gbk最多只能存储32766个字符
列属性
列属性又称为字段属性,在mysql中一共有6个属性:null,默认值,列描述,主键,唯一键,自动增长
Null属性
null属性:代表字段位空
注意:
1、在设计表的时候,尽量不要让数据为空
2、Mysql的记录长度为65535个字节,如果一个表中有字段允许为null,那么系统就会设计保留一个字节来存储NULL
最终有效存储长度为65534个字节。
默认值
Default:默认值,当字段被设计的时候,如果允许默认条件下,用户不进行数据的插入那么就可以使用实现准备好的数据来填充,通常为NULL
显示的告知字段使用默认值,在进行数据插入的时候,对字段值直接使用default
列描述
comment 是专门用于给开发人员进行维护的一个注释说明
comment '字段描述';
主键
主要的键,primary key 在一张表中,有且只有一个字段,里面的值具有唯一性
创建主键:
随表创建:
系统提供了两种增加主键的方式
1、直接在需要当做主键的字段之后,增加primary key属性来确定主键
create table my_pri(
username varchar(10) primary key
)charset utf8;
2、在所有的字段之后增加primary key选项:primary key(字段信息)
create table mu_pri(
username varchar(10),
primary key(username)
)charset utf8;
表后增加:
alter table 表名 add primary key(字段);
查看主键:
方法1:查看表结构
desc 表名;
方法2:查看表的创建语句
show create table 表名;
删除主键:
alter table 表名 drop primary key;
复合主键:
案例:有一张学生选修课标,一个学生可以选修多个选修课,一个选修课可以有多个学生选择,但是一个学生在一个选修课只能有一个成绩
create table my_score(
student_no char(10),
course_no char(10),
score tinyint not null
primary key(student_no,course_no)
)charset utf8
主键约束:
主键一旦增加,那么对应的字段有数据要求
1、当前字段对应的数据不能为空;
2、当前字段对应的数据不能有任何重复
主键分类:
主键分类采用的是主键所对应的字段的业务意义分类
业务主键:主键所在的字段,具有业务意义(学生ID,课程ID)
逻辑主键:自然增长的整形(应用广泛)
自动增长
自动增长:auto_increment:当给定某个字段该属性后,该列的书籍在没有提供确定数据的时候,系统会根据之前已经存在的数据进行自动增加后,填充数据。
通常自动增长用于逻辑主键
原理:
1、在系统中有维护一组数据,用来保存当前使用了自动增长属性的字段,记住当前对应的数据值
再给定一个指定的步长
2、当用户进行数据插入的时候,如果没有给定值,系统在原始值上再加上步长,就变成新的数据
3、自动增长的触发:给定属性的字段没有提供值
4、自动增长只适用于数值
使用自动增长:
基本语法:在字段之后增加一个属性auto increment
create table my_auto(
id int primary key auto_increment,
name varchar(10) not null comment'用户名',
pass varchar(50) not null comment'密码',
charset utf8;
)
插入数据,触发自动增长,不能够给定值
insert into my_auto values(null,'Tom','123456');
修改自动增长:
1、查看自增长:自增长一旦触发使用之后,会自动在表选项中增加一个选项(一张表最多只能拥有一个自增长)
2、表选项可以通过修改表结构来实现
alter 表名 auto_increment = 值;
删除自动增长:
删除自增长:字段属性之后不再保留auto_increment
当用户修改自增长所在字段是,如果没有看到auto_increment属性,系统会自动清除自增长
初始设置:
在系统中有一组变量用来维护自增长的初始值和步长
查看自增长初始变量
show variables like 'auto_increment'
细节问题:
1、一张表只有一个自增长:自增长会上升到表选项中
2、如果数据插入中,没有触发自增长(给定了数据)那么自增长不会表现
3、自增长在修改的时候,值可以较大,但是不能比当前已有的自增长字段的值小
唯一键
unique key 用来保证对应的字段中的数据唯一的
主键也可以用来保证字段数据唯一性,但是一张表只有一个主键
特点:
1、唯一键在一张表中可以有多个
2、唯一键允许字段数据为NULL,NULL可以有多个
创建唯一键
创建为一键与创建主键非常相似
1、直接在表字段之后增加唯一键标识符:unique[key]
2、在所有的字段之后使用unique key(字段列表);
3、创建完表之后也可以增加唯一键
alter table 表名 add unique key(字段列表);
查看唯一键
查看表结构实现
唯一键效果:在不为空的情况下,不允许重复
查看表创建语句的时候,会看到与主键不同的一点
删除唯一键
一个表中允许存在多个唯一键
alter table 表名 drop index 唯一键名;
index关键字:索引,唯一键是索引的一种(提升查询效率)
修改唯一键:先删除后增加
复合唯一键
唯一键与主键一样可以使用多个字段来共同保证唯一性
一般主键都是单一字段(逻辑主键)而其他需要唯一性的内容都是由唯一键来处理
表关系
表与表之间(实体)有什么样的关系,每种关系应该如何设计表结构
一对一
一张表中的一条记录与另外一张表中最多有一条明确的关系;
通常此设计方案保证两张表中使用同样的主键即可
学生表
学生ID(PRI) |
姓名 |
年龄 |
性别 |
籍贯 |
婚姻状况 |
住址 |
在使用表的过程中,常用的信息会经常去查询,而不常用的信息才会偶尔用到。
解决方案:将两张表拆分,常见的放一张表,不常见的放一张表
常用表:
学生ID(PRI) |
姓名 |
年龄 |
性别 |
不常用表
学生ID(PRI) |
籍贯 |
婚姻状况 |
住址 |
公用相同的学生ID-----保证两张表中使用同样的主键
一对多
也叫做多对一的关系
通常一对多的关系设计的方案,在“多”关系的表中去维护一个字段,这个字段是“一”关系的主键
母亲表
母亲ID |
姓名 |
年龄 |
身高 |
M1 |
|||
M2 |
孩子表
孩子ID |
姓名 |
年龄 |
身高 |
母亲ID |
K1 |
M1 |
|||
K2 |
M1 |
核心:在“多”表中维护一个“一”表中的主键,得到对应关系
多对多
一张表中的一条记录在另外一张表中可以匹配到多条记录,反过来也是一样。
如果按照多对一的关系维护的话,维护苦难,会出现一个字段中有多个其他表的主键,在访问的时候会带来不便
既然通过两张表自己增加字段无法解决问题,那么就通过第三张表来解决
举例:师生关系
1、一个老师教过多个班级的学生
2、一个学生听过多个老师讲的课
首先得有两个实体,老师表个对应的学生表
老师表:
Tid |
name |
age |
gender |
T1 |
张三 |
30 |
男 |
T2 |
韩梅梅 |
20 |
女 |
学生表:
Sid |
name |
age |
gender |
S1 |
王五 |
16 |
男 |
S2 |
赵四 |
20 |
男 |
S3 |
小红 |
16 |
女 |
S4 |
小明 |
17 |
男 |
从中间设计一张表,这张表维护两张表对应的联系,每一种联系都包含
中间表
id |
Tid |
Sid |
1 |
T1 |
S1 |
2 |
T1 |
S2 |
3 |
T1 |
S3 |
4 |
T2 |
S1 |
5 |
T2 |
S5 |
多对多解决方案:增加一个中间表,让中间表与对应的其他表形成两个多对一的关系
以上就是数据库中最基础的知识与基本操作,希望能对大家有所帮助