5.21数据库mySQL

服务器存储信息的能力是有限的,需要将信息存储在磁盘上。

存在主要是两个问题,就是将数据从磁盘中读出数据来,将数据从服务器中存储到磁盘上。

那么接下来的问题就是如何对于数据进行存储方便于进行读取,数据库就是起这样的作用。

mySQL就是这样的一个软件,其中有读写的逻辑进行磁盘中数据的管理。

数据的分类:关系型数据库和非关系型(常用数据库不止这两种)

在工作中往往是关系型数据库(SQL数据库)和非关系型数据库(NOSQL数据库)结合进行使用。

关系型数据库:维护数据是依靠关系维护的

建立多个表格这样的话,这样的在籍贯中的地址部分用编号进行填充,这样类似宏了修改一个也没有关系。

关系型数据库:数据之间依靠关系进行维护

非关系型数据:数据在存储的时候不依赖于关系进行存储,并不是说数据之间是没有关系的。

非关系型数据库了解

数据库的构成:管理数据的代码,数据。

有时可能使用radis进行存储数据。

radis:内存中存储的非关系型数据库,读取的数据速度可以更快

但是问题是内存断电丢失,存量有限。

根据数据使用的场景进行选择,也可以将数据进行结合使用

关系型数据库基本上使用的大多都是mySQL

使用者是不关心数据库的实现(也就是不管是哪一个数据库),只是关心结果是什么样的。所以说定义一种结构化的标准语言(对于关系数据库使用)来接受用户发过来的信息。也就是sql语言,都是一样的,数据库就是接收这样的标准化语言,实现响应的功能,底层啥样无所谓。

【重要】每一个关系型数据库都是支持SQL语言

服务器和数据库的通信是通过socket实现,数据一般默认监听3306端口。

所有数据的请求都是通过发送请求获取数据,但是都不能进到数据库中是不安全的

这个地方在安装的时候也是可以知道需要安装client端。

前面一个socket用于和用户进行沟通,后面的一个socket用于和数据库进行通信,后面的一个socket是不用自己写的,是封装在一个动态库中,直接使用SQL语言就可以。

开和关的的其实都是客户端,服务器端一直都是打开的。

客户端是在系统中是可以直接来连接的,但是当时navicat的时候,需要借助于ssh服务器来进行中间。

数据库组织磁盘文件(数据部分)是通过三级结构来实现。

1. 一个数据服务器(口头叫做数据库)中包含多个数据库,由一个数据库管理软件管理

2. 在一个数据库中包含多个数据表

3. 一个表中包含多行数据

【注意】每一行是最小的数据单元

所有的sql语句都是以;结束。

库操作

开始会有四个库这四个数据库是不能删的,就像是wins中的一些系统文件

SQL语句都需要记住(一般的)

第一个命令:显示所有的数据库

第二个就是%表示0个或者多个字符,‘%t%’ 显示名字中含t的数据库

第三个就是显示一个数据库是怎么创建出来的。

注释语句的的写法:-- # /**/ 记得-- 后需要空一个格

create database test  create database `test`(esc下面那个键)

create database test character set utf8;指定创建的库的类型,因为库的默认类型是latin1,但是latin1是不能存储汉字的,所以想要在文档中存储汉字的话,需要使用utf8格式。

这两种方式一种是不需要加··,一种是加,第二种方式是以免和关键字出现冲突。

在创建的时候latin1不支持中文的输入方式。这是一种默认的编码格式(第五版mysql的设置)

中文常用的有utf8和utfmb4。编码格式只是对字符串类型其效果。

utf8在数据库中占三个字节默认叫utf8mb3,在utf8mb4汉字依然是占三个字节,总的是四个字节为了存储enjoy实现。

【重要】任何的数据库都是不能删除的,任何的数据都是很有价值的

更不能删库,赶紧关机,使得内存不能被其他数据占用。

drop database 删库命令

修改库,只能修改库的编码格式但是一般不会修改。一开始我们设置的是库编码格式,表和行的编码格式都是跟随库的编码格式。但是当我们想要再去存储一个enjoy表情的时候utf8存不了。这个时候我们修改库的编码格式,以前的表格编码格式不会改变。以后的表的格式会变就混乱了。

操作一个表首先需要告知操作那个库,use 库名

show tables

表的操作:

表中的数据类型:

TINYINT(小整数) 1个字节    一般表示有符号数 -128 - 127

比如说是年龄用这个表示可以的

INT但是实际上工作中一般都是偷懒直接用int类型,4个字节。

BIGINT 占用8个字节表示更大的范围。

在创建一个表格的时候int类型默认的是11位,也就是int类型最大可以表示的数大概20亿10位+1符号

【注意】【重要】一般不要限制数据的表示位数,使用默认的11位也就是说int类型后面不用加括号就可以

存储数据的大小范围由类型维持,设置int类型的位数是8的时候,并不限制实际上也可以填写数据的范围,不超出这个范围的时候是填充空格的,超出这个8不超出11位就可以。

create table user(

        id int 

);

【注意】初始化一个表的时候,对于每一列都应该有自己的注释comment “sfsdf”;

(1)在int后面不添加任何内容,这种情况下是NULL default NULL;

这个时候NULL也会被认为是一条数据

(2)如果后面添加not NULL,则不允许数据为NULL

(3)允许NULL,默认值为1

(4)不允许NULL, 默认值为3

浮点数(【重要】必须要指明浮点数的位数)

包括float和double类型

float浮点数类型中的括号中的数据是有意义的,例如float(5,2),表示一共有5位,小数点后面有两位。不能超出范围。小数不够位数补0超出会四舍五入,整数超出范围直接报错。

日期(在数据库中常常用到日期类型)

按照基本原则讨论,表中的数据(每一行)最基本是要加产生时间和修改时间。

YEAR      1个字节      TIME时分秒   DATE日期   DATATIME,TIMESTAMP表示年月日时分秒  

在工作中常常使用DATATIME日期类型

default 日期也可以设置默认值 ‘2024-5-22’ DATA或者是TIMESTAMP是有固定类型的字符串,记得按照规定

9999-12-31 23:59:59

字符串(分为两种定长和变长)

CHAR强制指明宽度是有默认长度的1,这样的话只能存一个字符,如果存名字那么只能存z不能存zs,在默认的情况下1长度是可以用来存储性别的m

【注意】相比于int类型这个地方(CHAR和VERCHAR)的宽度是有实际的意义的当超过长度是不能存储的。

注意字节长度:定长字符长度和变长字符长度

定长是按照固定的来进行分配

表中的数据是按照库的编码格式的。

【注意】这个地方如果是varchar类型的话,那么数据的存储大小不是按照定义的编码格式大小确定空间而是根据实际(中(3)英文(2)情况再加上一个描述长度的1个字节或者两个)

一般来想就是最好是使用变长的长度,这样内存使用会节省,但是数据增删麻烦

各有优势

因此用char来存储定长字符串例如i性别,var存储非定长字符串

至于为什么还需要+1或者+2是为了表明这个字符串有多长,可能是额外存一个字节或者两个字节,因为后面跟随的内容可能一个字节是存储不了的。为什么需要这样的一个操作是因为需要确定字符串到什么位置是截止的。c语言中如果存000000怎么搞??????

如果存储的数据很大的话,可以在本地存储,然后在数据库中存储路径。

绝大多数情况都是用VARCHAR(必须要指明宽度)

【注意】char数据可以用“”,也可以用‘’

查看表
show tables;

show create table t;

describe table t;查看表中的列可以简写为desc

删除表:drop table 名;

主键

如果一个表中给某一列设置了主键, 主键值必须唯一标识表中的每一行,且不能为 NULL,即表中不可能存在有相同主键值的两行数据。

如果用户没有定义主键,也没有定义索引,那么InnoDB引擎会在创建表的时候, 自动生成一个不可见的ROW_ID的列名的聚簇索引,该列是一个6字节的自增数值,随着插入而自增, 来起到主键的作用。

主键分为单字段主键和多字段联合主键(不建议),-- 单字段主键: 既将表中的一个字段设置主键; 通过 PRIMARY KEY 关键字来指定主键.

-- 单主键
-- 如果一个表表在创建的时候没有主键, 增加主键的sql
-- alter table 表名 add primary key (主键列);
alter table user add primary key (id);
-- 联合主键: 复合主键(不建议)。这意味着id和name的组合在table_primary3表中表示主键。
CREATE TABLE table_primary3(
id INT(11),
name VARCHAR(25),
job VARCHAR(25),
salary FLOAT,
PRIMARY KEY(id, name)
);

唯一键(了解)

// 唯一键(Unique Key)是数据库中的一个约束,用于确保表中的所有记录在指定的一列或列组合上是唯一的。即:组合唯一。
// 与主键不同的是,唯一键允许有空值(NULL)
// 表中可以有多个唯一键约束。
// 在某些情况下,唯一键也可以作为主键的一部分。

CREATE TABLE table_primary3(
   id INT(11),
   name VARCHAR(25),
   job VARCHAR(25),
   salary FLOAT,
   primary KEY(id),
   unique key (job, salary)
);

自增问题

CREATE TABLE table_primary1(
id INT(11) PRIMARY KEY AUTO_INCREMENT , -- 主键
name VARCHAR(25),
job VARCHAR(25),,
salary FLOAT
);
-- AUTO_INCREMENT 的初始值是 1,数据增加一条,该字段值自动加 1。
-- 建议: 一个表中应该只有一个字段使用 AUTO_INCREMENT 约束,且该字段一般位为作为索引/主键的id字段。
-- AUTO_INCREMENT 字段应该要设置 NOT NULL 属性。
-- AUTO_INCREMENT 约束的字段只能是整数类型。
-- AUTO_INCREMENT 上限为所约束的类型的数值上限。

-- 如果一个表表在创建的时候某些列没有自增, 设置自增
-- alter table 表名 modify 列名 int auto_increment;
alt

修改表(仅作了解,因为工作中较少用到)

alter table employee  add column height  float(5,2);
alter table employee  add column height  float(5,2) first;
alter table employee  add column height  float(5,2) after name;
alter table employee modify  column age float(5, 0);

添加数据

insert into employee1 (id, name, gender, graduate_year, birthday, job, 
salary, create_time)values(1, 'zs', '男', 2022, '1999-01-01', '程序员', 
 100.2, '2022-09-09 16:51:49'),(2, 'ls', '男', 2020, '1997-01-01', 
'程序员',  10000.2, '2022-09-09 16:51:50');

select * from `user`; 对于表格数据进行查看

数据中字符串和日期应该包含在引号中。

修改数据

update employee1 set job='老程序员'where salary >10000;

注意如果没有where子句指明条件, 那么修改就是对所有行的修改。
修改一行数据的多个列值时,SET 子句的每个值用逗号分开即可。

删除数据

在工作中删除数据, 一般是逻辑删除.

delete from employee;
delete from employee where id=4;
如果没有where以及条件, 默认删除是表中所有数据。
delete不能单独只删除某一列数据, delete删除数据的最小单元为行。
delete语句仅删除数据记录, 删除的不是表, 如果要删除表需要使用drop table语句。

删除的是行而不是列。
插入数据

INSERT INTO students (id, name, class, chinese, english, math) VALUES (1, '武松', '一班', 70, 90, 60);
INSERT INTO students VALUES (2, '林冲', '一班', 70, 90, 90);

第一行的指令是就是可以中间省略一些列,只要数据是对应的就可以

第二行的指令是没有指定的情况下必须要全部每一个需要填充一下

特殊关键字where

【注意】用于删改查,不会用于增加数据

select id, name from students where id > 10;

使用 WHERE 关键字并指定<code>查询/删除/修改的条件</code>, 让操作在<code>满足条件</code>的情况下执行 数据操作.

1.可以使用算数运算符

select *, (chinese*0.5 + english*0.1 + math *0.4)  
from students where (chinese*0.5 + english*0.1 + math *0.4) <= 60 ;  

2.可以使用比较和逻辑运算符(有一些比较奇怪的内容)

(1)运算符用在结果中 select name, chinese + english + math from students;

即使这一列数据是不存在的,也是会显示额外的一列

(2)逻辑运算符用在结果中 可以用在条件中也可以用在结果中

【注意】加减乘除等运算符结果和条件都可以使用,但是is null 大于等是不能用于结果中只能条件

select * from where id =10; select * from where id <=>10;这两者是基本是相同的,

但是=是查不出来等于NULL的一行的数据的

【注意】比较常用的还有not

【注意】实际使用不会用<=>即使比较NULL也不用<=> 而是用is null  

当然is null 也可以加not描述

逻辑运算符and (&&虽然也可以使用,但是和别的语言会指令混合的,少用)

like 只是用于字符串(模糊查询)

【注意】like可以使用通配符,=不能使用通配符

%占位0-多个,_占位一个字符

在显示数据库的时候也有类似的操作,除了操作表中的数据。

show databases like '%数据库名%'; 

【了解】-- 4.查询全体学生的姓名、出生年份和所属部门 使用列别名改变查询结果的列标题
select name,(100 - math) as remain,math from student;

distinct 去重

select distinct math from student;

select distinct math chinese from studnet;这个时候只有组合是重复的时候才只显示一个

distinct语句是直接加在

limit重要(分段功能)(一般与order by组合使用)

分段排序给数据,因为不可能将数据全部都给用户,例如阿里服务器有100w挂号关于手机的信息,只会给一部分数据。

SELECT name,math from student order by math limit 3;

只要前三名学生的信息。

SELECT name,math from student order by math limit 2, 3;

从下标2开始要三个人的信息

【注意】第一个参数是下标

另一种写法:从下标2开始要三个人的信息

SELECT name,math from student order by math limit 3 offset 2;

order by(排序)

select name math from student order by math desc;默认是升序,加desc就降序。

order by语句是可以在加在以前写的语句的后面表示将显示的结果按一种顺序显示。

SELECT name,math from student order by math;
【注意】显示两列不要忘记+,

写法

每一个部分单独占一行,只是不能加,aaaaa
SELECT name, chinese + math + english as sum 
from student
ORDER BY chinese + math + english desc;

【注意】select查询的表是一个临时的表

group by 分组

聚合函数的单独使用是没有什么价值的,一般是进行分组以后求分组的情况

select

class,count(id),avg(neth) 

from student

group by class

order by avg(math);

count这个时候并不是对于表中每一个数据进行聚合,而是按分组

【注意】错误的,因为按班级分组以后,可以给出组名但是不能给出组内每个成员的名字,不能这么写

错误:select class, name

from student

group by class;

即想得到分组还想得到分组中的内容

正确:select class,  group_concat(name) as all name

from student

group by class;

group by容易出现问题

【注意】先where然后再使用group

正确:

错误:这个地方因为走到group没有进行分组,所以不能知道avg意义??????????????????????????????????

正确:having只能用于group后面类似where用于解决不能再group以后用where命令

聚合函数(一般是和分组函数一块使用)(在工作中尽量减少分组和聚合,效率很低)

count函数的使用(计数表示有几条数据)

SELECT count(*) from student;

SELECT count(name) from student;
sum 求和函数

 数据处理性能下面有两种情况

第一种情况是没有问题的

第二种情况可能会对于大量的无用数据进行分组然后再选择仅有的一点有用的数据

针对于这种情况进行sql的优化     sql 语句,业务优化

如果一定要使用分组聚合该怎么办呢因为服务器并不是一直在忙碌的,所以可以在晚上跑以前得到的数据进行相应的的分组聚合的程序。

稍微复杂的sql指令(进行逐渐的完善)

navicat是把指令交给数据库,指令的执行顺序

//执行顺序,select和having的执行顺序不一定
(5) SELECT column_name, ... 
(1) FROM table_name, ... 
(2) [WHERE ...] 
(3) [GROUP BY ...] 
(4) [HAVING ...] 
(6) [ORDER BY ...];
(7)	[Limit ...]

having和select的执行顺序是不一定的。

并不是自己的指令给的顺序是什么,数据库的执行顺序就是什么。

where 1=1在传过去的时候就已经被优化掉

在工作中往往sql语句是写20-30行,为了在工作中兼顾效率和方便书写

为了遵守数据完整性和和范式

数据完整性:

实体完整性

保证中的每一行数据都是中唯一的实体.(即:一个表中每一条数据都应该是唯一的

通过主键的设置使得每一行的数据都是唯一的。

域完整性

类型合适:存分数用int类型而不是用varchar

范围合适:float(5,2)不是超过5五位数

外键

关系型数据库

参照完成性

给一个表的字段,强制关联另一张表的一个字段。

两个表不能随便的改,在关联以后。如果数据在一端被使用中就不能修改,要不然是可以修改的。

外键维持数据的一致性,但是外键导致的性能比较差,在一个表中的数据进行修改的时候,必然导致对于关联的表的遍历。不加外键的时候,也是有参照完整性的,只是加上外键更加安全保证。

外键是参照完整性的强有力的保证手段,外键不等于参照完整性。

【注意】添加外键的sql语句不重要

优点:安全 限制数据的增删改保证数据的一致性

缺点:效率 使用起来不方便

当效率降低的时候,需要考虑别的手段解决这个问题。现实是不加的

【注意】大多数公司不使用外键

数据库排序规则

使用navicat创建数据库:

排序规则:只限定order by对字符串的进行排序一般都是省略默认。

select * from students where chinese = 60;
select * from students where chinese <=> 60;
select * from students where chinese != 60;

select * from students where  name like '曹%';
select * from students where  name like '曹%'  and  chinese = 90;
select * from students where  name like '曹%'  &&  chinese = 90;

select * from student where (chinese > 90 and english > 90) or (math > 90 and english > 90) or (chinese > 90 and math > 90);
sql语句居然也是可以加括号的。

会有一些奇怪的选择名字的方式,直接问AI就可以了。

例如:

新建一个学生表S,有包含如下信息, 并插入10条数据。

 -- 学号 id,
 -- 学生姓名 name,
 -- 性别 gender,
 -- 年龄 age,
 -- 专业 dept,
 -- 所在系编号 …等
 -- 学号格式为 201801 201802 201803...
 -- 性别只有 'male' & 'female'
 -- 院系包含(信息系、数学系,计算机科学系等)

然后做如下查询:

 -- 1.查询全体学生的学号与姓名。
 -- 3.查询全体学生的详细记录。
 下面选做 (需要预习一下where关键字才能做)
 -- 4.查询全体学生的姓名、出生年份和所属部门 使用列别名改变查询结果的列标题
 -- 7.查询所有年龄在20岁以下的学生姓名及其年龄。
 -- 8.查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。
 -- 9.查询年龄不在20~23岁之间的学生姓名、系别和年龄。
 -- 10.查询信息系、数学系和计算机系学生的姓名和性别。
 -- 11.查询既不是信息系、数学系,也不是计算机科学系的学生的姓名和性别。
 -- 12.查询学号为200518的学生的详细情况。
 -- 13.查询所有姓刘学生的姓名、学号和性别。
 -- 14.查询姓“李”且全名为两个汉字的学生的姓名。
 -- 15.查询名字中第2个字为“立"字的学生的姓名和学号。
 -- 16.查询所有不姓刘的学生姓名。
 -- 17.查询学号在201801~201809之间的学生姓名。

select id,name from S;
select * from S;
INSERT INTO employee1 (id, name, gender, age, dept, deptid)
VALUES
    (201821, 'wx', 'male', 42, '计算机科学与技术系', 0865),
    (201822, 'mm', 'female', 43, '计算机科学与技术系', 0865),
    (201823, 'qq', 'male', 44, '计算机科学与技术系', 0865),
    (201824, 'ff', 'female', 45, '计算机科学与技术系', 0865),
    (201825, 'ss', 'male', 46, '计算机科学与技术系', 0865),
    (201826, 'jj', 'female', 47, '计算机科学与技术系', 0865),
    (201827, 'll', 'male', 48, '数学系', 0866),
    (201828, 'cc', 'female', 49, '数学系', 0866),
    (201829, 'bb', 'male', 50, '数学系', 0866),
    (201830, 'zz', 'female', 51, '数学系', 0866);
select name,gender,age from S where age < 45;
select name,gender,age from S where age > 40 and age < 45;
select name,gender,age from S where age < 40 or age > 45;
select name,gender from S where deptid != 866;
select name,gender from S where dept != '数学系';
select name,id,gender from S where name like 'c%';
select name,id,gender from S where name like 'z%' and length(name)=2;
select name,id,gender from S where name like '_z%';
select name,id,gender from S where name not like 'z%';
【注意】表和库(用1,2年)的创建,一般软件图形化界面,数据一般是在sql中进行修改。hh工作中一般都是用软件进行修改。

sql语句也是可以在navicat中写,定位到相关的表中进行新建查询书写sql语句,可以选中运行。在查询中可以查看以前输入的sql语句。同样也可以手动建立表格,也可以获得相应的sql语句。

增加数据

INSERT INTO students (id, name, class, chinese, english, math) VALUES (1, '武松', '一班', 70, 90, 60);可以不用添加需要进行添加的列
INSERT INTO students VALUES (2, '林冲', '一班', 70, 90, 90);这个时候只能全部位置数据都要写。

【注意】增加数据不会用到where

删除数据(不会用到,数据不会删除,使用标记位删除)

【注意】公司中的数据一定不要直接delete

delect from user1;

update user set delete_tag = 1 where id = 1;

笔试:算法和sql各一道题目

多表设计和多表关系

一对一关系(少见因为直接和成一个表):一个表中的一条数据和另外一个表中的一条数据是一一对应的关系

一对多(最常见),多对多同理。

一对多:一个用户多个的订单,一个用户多个地址

多对多:依赖中间有一个表作为联系

一般两个没有什么关联的表之间的联系是通过中间的一个表建立联系

数据库设计范式(站在表的角度考虑)

第一范式:原子性,只要数据可以拆出来就拆。例如将地址拆成很多的小的部分。

二:唯一性,就像是主键不要进行组合标记

三:不冗余,一个表存了,另一个就不再存了。更严格一些的话保证表中的数据是依赖于主键存在的

多表之间的查询:

交叉链接(求多个表的笛卡尔积,尽量少用)

每两条数据都是由有链接的,不管他们本身有没有关系,就是让他们的行数和行数相乘。

【注意】加条件可能会进行底层的优化,但是如果没有加恰当的条件,笛卡尔积相乘得到的临时表是相当大的,可能会有暴库的风险因为数据量是很大的。

select * from class cross join score where class.id = saore.class_id;

加条件来删除一些关联不对的数据。

自然连接(很少使用)

两个表中有相同名字列(列名)进行连接,不管实际有没有联系,所以起名可以更加详细一些

内连接(重要常用)(只显示两个表中匹配的数据)

select * from class c inner_join score s  on c.id = 

这个地方往往用on,where也可以使用

内连接往往会进行优化不像是笛卡尔积

下面这个是隐式连接不建议使用。

与下面的外连接的区别:只显示可以匹配的数据不能匹配的数据就直接过滤掉。

【注意】连接以后的表还可以继续连接,因为连接一次以后的就已经生成了一个表

外连接(相较于内连接显示主表中所有的数据)

外连接又分为左外连接和右外连接

select * from equip left outer join student on student.id = equip.student_id;
    -- outer可省略
    select * from student left join equip on student.id = equip.student_id;
    select * from student right join equip on student.id = equip.student_id;

主副表的问题

左外连接就是让左边的表作为主表这样的话可以匹配的数据就是直接匹配否则的话主表有的内容副表是没有的话也是会填充NULL。可以加where过滤掉where s.cinese is not null

自连接(和子连接配合使用)

    select t1.* from score t1,score t2 where  t2.id = 1 and  t1.chinese < t2.chinese

这个例子只是为了理解,这种情况下不可能用子查询

自连接就是自己和自己连接比。

select * from  student where  id in (select student_id from equip);

自查询

子查询可以用于查询也可以用于修改。

子查询就是在一个查询中用到另外一个的查询。

 

 需要又额外又套了一层因为使用需要修改的表格是会报错的,这个时候需要设置这个新的表为一个临时表

查每个班级中数学成绩最高的语数英成绩

//按两个进行排序
SELECT *
FROM students
ORDER BY deptid ASC, age DESC;

注意where语句使用到的算数运算符和逻辑运算符,算数运算符可以在条件中应用也可以在结果中应用,逻辑运算符只能用于条件中

sql函数

count(),group_cat(),now(),avg()

as起别名

表名可以省略as,列名不要省略as容易混

联合查询问题(鸡肋有的少)

用or:

select * from score where math > 90 or chinese >80;

联合查询:(一般不会用)

select * from score where math > 90

union

select * from score where chinese > 80;

这两者效果是一样的,也就是union会去除重复项

删库以后如何进行数据的恢复,

navcat在选项中进行转储选择响应的数据(已经下载到本地的数据)进行打开。

选择响应的数据和结构都保存下来,放到本地某一个地方

【问题】因为在对于信息进行保存的时候是需要对于数据进行上锁,所以说会会影响性能。

xshell中的数据备份

备份数据是自动化的操作(while循环,sleep二小时system调用一次命令行,记得一点就是因为需要备份很多数据,所以记得每次备份的时候需要修改名字),恢复数据是手动的

图形化界面C_API

是一种c语言操作函数,c语言程序可以连接和操作数据库。

使用流程

【注意注意】这其中的函数(尤其是初始化创建和关闭用模板)完全不需要记忆这个函数

初始化数据库连接:

mysql mysql;

MYSQL *mysql_init(MYSQL *mysql); //一种初始化方式

//通过该函数的返回值初始化

和数据库服务器建立连接:带ip和port找到服务器,账号密码进行验证

数据库不会给外界暴露接口也就是不能通过ip连接,因此说在进行访问到的时候一般是在一个服务器中走本地回环,所以ip使用localhost或者127.0.0.1。如果数据和处理的服务器是分开的,是通过域名等安全方式实现。

请求命令的发送(查询以后一定要拿结果,不然下次查询拿到的是上次的结果,有点像缓冲区)

int mysql_query(
   MYSQL *mysql,//建立连接的MYSQL结构的指针
   const char *query//要执行的SQL语句的字符串(这个SQL字符串不应以分号结尾,并且必须是以空字符结束)
);
// 返回值:成功返回0。失败返回非0值

【注意】不仅仅是可以实现查询功能,该函数可以实现增删查改

【注意】不需要添加;在命令字符串不需要添加;query底层会自动添加

【注意】如果是update语句也就是增加删除修改并不能查看全部的数据,数据库只会返回参数表示成功与否,不会返回数据库中的数据,也就是不能打印全部数据。

// 获取由mysql_query()函数返回的结果(该函数获得一个线性表准确来说应该是一个多行的表以行为单位,感觉就和epoll有点像)(在每次requre之后都要记得进行获得结果不然的话下次再获取的结果就是上次查询的结果)
MYSQL_RES *mysql_store_result(

MYSQL *mysql//建立连接的MYSQL结构的指针
);
// 返回值:
//        成功:返回一个指向MYSQL_RES结构的指针,该结构代表了从服务器返回的结果集。通过这个结构,可以进一步获取查询结果
//        失败:如果SQL没有返回数据(eg:INSERT/UPDATE/DELETE操作,或者SELECT没有找到结果,或者其它错误),则返回NULL

【注意】判断select(只有查询使用)语句有没有从数据库中查到结果用查询行数判断,不用result的返回值进行判断不靠谱

获取一行数据字符串数组指针(无论是在数据库中是什么类型,c语言中都视为字符串类型),查看这个数组的长度

【注意】因此可能需要继续进行类型转换,将字符串转成其他类型

mysql_fetch_row()获取一行的数据,有点像是read读写指针,只能这么一行一行搞,虽然可能不用前面的数据

最后关闭的时候,记得释放资源将查询结果释放和关闭连接close

mysql_error函数进行检错,不是用ERROR_CHECK没有再用到errorno

如下例就是在每个下面放这样一个检错语句

总结注意事项:

quiry可以查询数据也可以增加甚至可以创建表格

每次查询以后记得获得结果集,不然下次再获取的时候获得的就是上次查询的结果。

是获得一个字符串数组,需要改变数据的类型

mysql数据库的基本结构

分为连接器:用于和用户进行登录的验证链接

8.0以前的版本是有cache缓存的,用于对于select查询的数据是存在这个位置,如果说对于select对应的这个表进行update的话那么就把这个缓存就丢掉,比较鸡肋,8.0版本以后就直接丢弃。

分析器对于词法和语法进行分析,不符合sql语法的返回错误信息。

优化器可能出现这样的情况where 1=1,这样的无用的语句在做优化处理的时候就会被优化掉

存储引擎:对于数据的处理逻辑的存储位置

数据文件:分为配置文件和日志文件和数据文件

网络接入层、              服务层、                   存储引擎层和                 文件系统层

连接器          缓存/分析器/优化器 

分别对应图中的信息

数据库的信息分为数据库的的引擎代码,优化处理代码,这些可以通过代码查看被放在哪一个位置。也可以查看数据的存储位置,在磁盘的某一个位置。

我们比较关注的是日志文件和配置文件和数据文件,他们也是会放在相应的位置。

索引主要是在面试中进行考察

索引用来查表数据使用,可以这样理解索引就是相对于字典而言的偏旁和拼音的查找

当需要查询数据的时候,会先将索引加载到内存中,数据是放在ibd文件中。ibd文件中分为两部分一部分是索引内容,另外一部分是数据。

以innodb方式在创建表的时候,就会默认创建一个索引。

在指明主键的时候,进行主键索引。

不指明主键的时候,inodb会自己添加一个不显示可见的主键,会需要额外的空间,因此最好也是自己确定主键。

b树:多路(不只一个孩子)平衡(完全平衡)查找树

平衡:任何节点的高度完全一致->b树添加节点是直接添加在叶子节点处,当不能继续添加的时候就是进行向上生长。

4阶b树又叫234树,因为它的孩子可以有2,3,4个孩子。比较出名是因为4阶b树和红黑树是一一对应的

234树和红黑树的对应:1key的话一个黑色节点,2key一个黑色节点,3key一个黑色节点和2个红色节点,并且在存的时候黑色节点放在上面

红黑树:

注意:这个地方-100和。。。并不是叶节点,而是还有两个未显示出来的叶节点值为NULL

红黑树怎么保证没有连续的红色节点:涉及红黑树添加和删除

旋转中颜色发生变化,

每一个节点只能拆两层,并且让黑色节点先存。不会出现红色节点连续的情况。

没有连续的红色节点保证具有一定平衡性能的条件

红黑树怎么保证平衡的?旋转四种旋转方式

怎么保证从根节点开始到叶子节点的话黑色节点的数目是相同的。可以这样理解因为每一个234树在构成红黑树的时候一个节点只能有一个黑色节点,并且234树是绝对平衡的,所以说一定黑色节点数目是一定的。

每次一个索引节点都是16K大小,其中存放id和地址信息等

引入b+树这样的话,方便于确定数据的范围(默认情况下)

索引和主键是不同的东西,如果有主键的话,那么就默认主键索引。

对比innodb和myisam的区别

(innodb)聚集索引聚簇索引(索引和数据是在一起)

(myisam)非。。 

所以说myisam在存储的时候的表现是三个文件,也是因为索引和数据是分开存储的。

有主键索引和非主键索引,where name = ‘张三’

在这种情况下如果没有设置name索引,就会一个一个遍历。

如果有name索引的话,(回表)那么回去表里面根据name索引去找到id,然后根据id去找到数据或者数据指针。

说索引就是说主键索引所以说inodb是聚集索引,但是了解就是说可能有inodb名字进行索引的时候可能会出现错误。

框架:

数据库一般是三级结构,数据库, 表, 行

对于库的操作:增删改查

数据类型:整数,日期,浮点数

主键:一般是id,作为一行的标识,每一行是不同的,可以设置一个自增机制一般每次增1

增加数据(如果是一一对应就可以只写数据就可以),删除数据

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值