快速掌握数据库基础?看这一篇就够了

什么是数据库?存储数据的仓库

概念:按照数据结构来组织、存储和管理数据的简历在计算机存储设备上的仓库

分类:

        网络数据库

                把数据库技术引入到计算机网络系统中,借助网络技术将存储于数据库的信息及时发出去,用户与网络中的数据库进行实           时动态数据交互

        层级数据库

                层次结构模型实质上是一种友根节点的定向有序树(无回的连通图)

        关系数据库

                建立在关系模型基础上的数据库

                借助于集合代数等数学概念和方法来处理数据库中的数据

数据库的另外一种分类方式:基于存储介质

        存储介质分;两种:磁盘和内存

                关系型数据库:存储在磁盘中

                非关系型数据库:存储在内存中


关系型数据库

三大特点:

关系数据结构:指数据以什么方式存储,是一种二维表的形式存储。(行、列)

本质:二维表(体现数据放在对应的位置)

姓名

年龄

身高

体重

张三

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地址 指定端口号 用户名 密码

注意事项:

  1. 通常端口都可以默认
  2. 密码的输入可以先输入-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

多对多解决方案:增加一个中间表,让中间表与对应的其他表形成两个多对一的关系


以上就是数据库中最基础的知识与基本操作,希望能对大家有所帮助

发布了120 篇原创文章 · 获赞 37 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Zhengxinyu666/article/details/99743390