数据库是一类软件,用来管理数据,组织数据;
MySQL的基本结构:客服端-服务端 结构的程序
客户端(client):发出请求的一方
服务端(server):被动接受请求一方
请求(request):客户端主动给服务端发的数据
响应(response):服务端给客户端返回数据
1:7*24小时运行(引用分布式系统,做高可用支持);
2:服务器是不知道客户端什么时候给他发请求,服务器是被动的一方;
3:服务器(负责存储和管理数据,是数据库的本体)可以给多个客户端(和用户交互的界面)提供服务;
(服务器本质就是一台电脑(计算机);
计算机怎么构成的:
CPU(中央处理器),
主板(一块大的电路板,cup装在上面),
内存,硬盘 ->负责存储数据的,
电源,散热器,机箱,
显卡(GPU 专门负责图形渲染相关的计算的,最贵的),
显示器,鼠标,键盘;
存储数据:
1:内存->存储空间较小,访问速度较快,成本高,数据易失(断电数据丢失);
2:硬盘->存储空间较大,访问速度较慢(速度比内存慢速度慢好几个数量级,一个数量级就是10倍),成本低,数据持久(断电数据不会丢失,持久是相对的,并不是永久存在);
MySQL数据库存储数据,数据存储在硬盘(空间大,持久化存储)上;
Redis是将数据存储在内存上,很特殊*;
大数据:一个机器存不了的数据,使用多个机器来存储,这个操作数据的一系列技术体系叫做大数据;
SQL是大小写不明感的,写成大写或者小写都可以;
各种命名名称不能是SQL中的关键字-〉如果非要使用,可以使用反引号进行引起来;
一个汉字占几个字节-〉这是不确定的,要根据字符集(GBK使用2个字节表示一个汉字,UTF8变长编码,一般是3个字节表示一个汉字);
❓误删数据库
控制好权限,MySQL支持丰富的权限配置功能,根据账号限制权限;
备份,重要的数据多备份几份;
线上数据:表示真实的用户数据;
线下数据:用来测试的数据,数据是假的;
1:show databases; 查看现有的数据库
2:create database 数据库名;创建数据库
3:create database 数据库名 charset 字符集名;创建数据库指定字符集
4:use 数据库名;选中数据库
5:drop database 数据库名;删除数据库
2_26
线上环境/生产环境
一、线下环境
1:办公环境-〉开会,做PPT,发邮件,写日报周报,软件聊天;
2:开发环境-〉
简单项目,开发环境就是办公环境;
项目对环境要求较高,公司会发单独的服务器,通过办公电脑连到服务器上开发;
3:测试环境-〉类似于开发环境
二、线上环境
1:生产环境-〉
程序会放到上面,就可以被外面用户真实访问到,如果用户访问量比较大,对于配置比较高;
在生产环境上的程序出现bug了,会被外面的用户直接访问到;
把写好的程序发布到生产环境上,这个过程成为“上线”;
上线是一个非常重要的操作,“误操作”引出的生产环境的问题;
编程语言体系-〉“武当”,“少林”
C(代码好理解,代码好写,不保证代码的正确性);Lisp(更好的能保证代码的正确性,代码不好理解,代码不好写,思考能力极强);
bit 1
tinyint 1
smallint 2
int 4
bigint 8
float(m,d) 4 (m表示长度,d表示小数位数)
double(m,d) 8
decimal(m,d) m/d最大值+2(要最大值)
numeric(m,d) m/d最大值+2
float和double不能精确存储小数,所以避免在金钱,计算机科学前使用;
decimal和numeric是能够精确存储小数的,但是需要消耗的空间和时间更多;
慎重使用 浮点数 比较相等-〉0.1+0.2=0.3 false
varchar(自定义可存放最大值) 可变长的字符串类型,varchar的单位是“字符”,而不是字节,一个汉字就是一个字符;
text 长文本数据,长度靠自适应的,会自动扩容,但是实际开发中会明确数据存储的上限;
mediumtext 更长文本数据,和text一样,谨慎使用;
blob 存储二进制数据,指的是(图片,音频,视频,可执行程序,.class文件),谨慎使用;
datetime 8 1000到9999年,不会进行时区的检索及转换;
timestamp 4 1970到2038,自动检索当前时区并转换;
null-〉数据库中的null表示“这个单元格没填”
🦠create table 表名(列名 类型,列名 类型,....);创建表
🦠desc 表名;查看表结构(desc-〉describe描述;在查询有一个desc-〉descend下降)
🦠drop table 表名;删除表(不仅删除了表,还删除了表中的数据)
MySQL中的注释#和-- (两横杠加一空格)
强类型和弱类型-〉
越支持隐式类型转换的是弱类型,越不支持的是强类型(隐式类型转换就是不需要写代码就就能自动转换类型的);
静态类型和动态类型-〉
一个变量的类型,能否在程序运行过程中发生改变。允许发生改变,就是动态类型;不允许发生改变的就是静态类型;
insert into 表名 values (值,值,...);
insert into 表名 (列名,列名...) values (值,值...);
insert into 表名 values(值,值...),(值,值...);
insert into 表名 (列名,列名...) values (值,值...);
MySQL中有一个专门的函数now()来获取当前系统时间;
sql作为一个编程函数,提供了一些库函数;
时间加入的标准是:“2024-3-2 16:01:00”
select * from 表名;全列查询(select*是一个危险操作,实际工作中,生产环境上要慎用)
select 列名,列名... from 表名;指定列的查询(列名必须存在于要查的表中)
(select只是查询,是读操作,不会影响数据库服务器硬盘上存储的数据)
(decimal限制的是硬盘上的数据,而不是临时表的数据,临时表能够尽可能保证最终计算结果是正确的)
1:select*from 表名;全列查询
2:select 列名,列名 from 表名;指定列查询
3:select distinct 列名 from 表名;去重查询(distinct)
4:select 列名,列名+列名 as 重命名 from 表名;计算查询
5:select * from 表名 order by 列名/表达式;排序查询(order by)默认升序排序
select * from 表名 order by 列名/表达式 desc;降序排序(descend)
❓在SQL中进行算术运算,如果其中某个操作数,结果是null,那么最后结果也是null。(我对这个定义还有一点疑问❓)
6:select * from 表名 order by 列名1,列名2...;order by指定多个列排序(先按照列名1排序,如果列名1有相同的就按列名2排序...)
7:select * from 表名 order by 列名1,列名2 desc...;按列名1升序排序,按列名2降序排序...
8:👍select 列名,列名... from 表名 where 条件;
条件-〉逻辑运算符,关系运算符;
“=”,就表示“等于”的意思。null不安全,例如:null=null结果是null。null和其他的值进行关系运算还是null,相当于false;
“〈=〉”,表示“等于”的意思。使用null是安全的,例如:null〈=〉null结果是true(1);
between a1 and a2,范围在[a1,a2]之间返回true(1);
in(值1,值2....)相当于是一个集合,判断这个值是不是在这个集合里;
is null 是null;is not null 是不为null;
and就是(&&)
or就是(||)
not就是(!)
where和order by可以结合使用,where在前,order by在后;
and的优先级比or优先级高;
1:select * from 表名;全列查询
2:select 列名,列名... from 表名;指定查询
3:select 表达式 from 表名;带有表达式的查询
4:select 表达式 as 别名 from 表名;带有别名的查询(表达式查询只影响临时表)
5:select distinct 列名 from 表名;去重查询
6:select 列名 from 表名 order by 列名/列名 desc;排序查询
7:select 列名 from 表名 where 条件;条件查询
8:select 列名 from 表名 列名 like “x%”;模糊查询
慎用like(🔥)
“x%”以x开头;“%x”以x结尾;“%x%”包含x;
“x_”x开头,_表示一个字,“x__”x开头,__表示两个字;
9:针对空值的查询,〈=〉(可以通过两个列比较)、is null、is not null;
10:分页查询(🌶️)
select * from 表名 limit 值;查询的值小于等于值(此处是offset 0)
select * from 表名 limit 值1 offset 值2;查询跳过值2的数据,查出小于等于值1的条数(offset表示的是偏移量)
select * from 表名 limit 值1,值2;值1是offset,值2是最大条数
1:update 表名 set 列名 = 值,列名 = 值... where 条件;
update修改的是硬盘上存储的数据,select修改的是临时表上的数据;
1:delete from 表名 where 条件;删除的都是以行为维度进行删
2:delete from 表名;删除表中所有数据
一个sql的执行顺序
1:遍历表
2:带入条件
3:计算列名中的表达式(定义别名)
4:排序/聚合 等操作
编程中谈到区间,区间都是前闭后开;
约束可以理解为,数据库提供的一种针对数据的合法性,验证的机制;
1:not null
设定not null,说明列里不能存储空值,表里内容必填
2:unique
这定这一列的所有行的数据都得是唯一的(不能重复)
3:default
指定默认值,当不进行任何指定,默认值就是null
4:primary key
主键:一条记录的身份标识(类似于 学号/身份证 = not null + unique)
5:foreign key
外键涉及到两个表之间的关系
6:check
指定条件,插入/修改数据,数据符号才能插入/修改成功