数据库MySQL进阶

[复制链接]
发表于 2025-5-25 09:06:34 | 显示全部楼层 |阅读模式
前情回顾:
数据表
1)创建表
creat table 表名(列名 范例,列名 范例。。。);
2)检察数据库中的所有表
show tables;
3)检察指定表的表结构
desc 表名;
4)删除表
drop table 表名;
插入
insert into 表名 values (值,值。。。);(个数和范例要和表结构一致)
insert into 表名 (列名,列名。。。) values (值,值。。。);(只给某些指定的列进行插入数据)
insert into 表名 values (值,值),(值,值)。。。;  (一次插入多行记录)
查询
1)全列查询
select * from 表名;  (这样的操作,在公司的生产环境数据库中,一定要慎重使用
2)指定列查询
select 列名,列名 from 表名;(按需进行查询)
3)表达式查询
select 表达式 from 表名;(加减乘除之类的运算,针对列进行的运算,会把当前表的每一行这里的对应列进行盘算~ 【此处的运算只是针对从数据库服务器查询出的数据进行运算的,是临时的数据,不会影响到数据库服务器原有的生存的数据】)
4)带别名的查询
select 表达式 as 别名 from 表名;(查询效果的临时表中,列名就是刚才的别名了)
as 别名,可以是针对  表达式,列,表名,as也可以省略(通常不建议省略)

1.增删查改(CRUD)

查询

去重 

distinct 修饰某个列/多个列 值雷同的行,只会保留一个


查询的时间排序

把行进行排序
-》明确排序规则~~
a)针对哪个列作为比力规则
b)排序的时间是升序还是降序
   select 列名 from 表名 order by 列名 asc/desc;(指定某个列进行排序)
  -》asc升序(如果省略,就是升序排序) desc 降序
-》mysql是一个客户端服务器结构的步伐  把哀求发给服务器之后,服务器进行查询数据,并且把查询到效果进行排序之后,再组织成相应数据返回给客户端【排序仍然是针对临时数据来展开的,此处的排序,不影响原有数据在mysql服务器上存储的顺序】

-》 如果一个sql不加order by此时查询的效果数据的顺序,是“不确定的”/“无序的”
当前只是咱们在自己的呆板上进行了一些简朴的操作,看起来似乎顺序没变,但是如果进行一些更复杂的操作,就不一定了~
如果不加order by 代码就不应该依赖上述顺序,尤其在代码中,就不能依赖上述的顺序来展开一些逻辑,数据库没有答应过你这个数据是有顺序的~
-》order by 指定的列,如果你select 的时间没有把这一列查出来,也不影响排序

->order by 还可以针对表达式进行排序

->指定多个列来排序,order  by 后面可以写多个列,使用,来分隔开

先按照数学成绩来排序,如果数学成绩雷同,再按照语文排序 

->null参与各种运算,效果还是null 
条件查询:where

会指定具体的条件,按照条件针对数据进行筛选
   select 列名 from 表名 where 条件;
  ->遍历这个表的每一行记录,把每一行的数据分别带入到条件中
如果条件成立,这个记录就会被放入效果聚集中,如果条件不成立,这个记录就pass
比力运算符


-》sql中没有==,是使用=表示比力相等
-》<>上古时期的写法 
-》模糊匹配,通过一些特别符号,描述出规则/特性 后续哪些值,符合上述特性
逻辑运算符


 

-》无论有几个列,都可以使用上述运算符来描述条件的 

-》条件查询搭配表达式

唐三藏 null 98.0 null 不会显示出来是由于  null<200=>null=>false
-》注意明白,select 条件查询执行的顺序:


  • 遍历表中的每个记录
  • 把当前记录的值代入条件,根据条件进行筛选
  • 如果这个记录条件成立  ,就要保留,进行列上的表达式盘算
  • 如果有order by,会在所有的行都被获取到之后(表达式也算完了)再针对所有的效果进行排序
第三步界说的别名,where是第二步执行的,执行where的时间,total还处于“未界说”的状态,所以报错(算是理由,但是也不算是,实现sql剖析引擎的时间,是完全可以做到,把这里的别名预先的界说好,然后再执行1 2 3 ,保证执行到where的时间也能访问到别名,但是mysql当前没这样实现,不知道为啥没这么做)

 -》and   or  

sql中and的运算符优先级更高,不建议各人来记这个优先级,可以加上括号!
-》between and 双闭区间


-》使用in来表示一个离散的聚集

 -》like 模糊匹配
通配符,就是一些特别的字符,能够表示特定的含义
%代指恣意个恣意字符
- 代指一个恣意字符
   通配符,雷同于扑克中的“会儿”
  特别牌,可以用来代替恣意的点数和花色
  4 5 7 少了6,但是你手里有一个王,王就可以代替6
  查询姓孙的同砚的成绩,名字中,以孙开头~ 

 孙%:查询以孙开头的内容:孙
%孙:查询以孙末端的内容:孙
%孙%:查询包罗孙的
   此处模糊查询的功能是有限的,在盘算机中,进行模糊匹配字符串,还有“正则表达式”【一般都是去现查,要否则光靠背,还是很容易搞错的】这样的方式来实现(JavaSE有个章节String 此中有个方法是split 参数其实就是一个正则表达式)
  正则表达式,匹配的服从是很慢的,对于mysql本身就不快~
  

-》只能看到一个列~  

-》可以针对两个列比力的  

分页查询:limit

使用select*这种方式查询,是比力危险的~需要保证一次查询,不要查出来东西太多
limit 可以限定这次查询最多能查出来多少个效果
有的时间,数据非常多,一次全都显示出来,会影响到服从,也会不方便用户去看
分页查询的效果   limit 这次查询,查出几个记录;offset偏移量 也就是一个下标 从0开始的



offset偏移量    是盘算机中广泛使用的概念    寻址(找指定的内存)
   什么是汇编
  编程语言,分成三个大类
  1.呆板语言(盘算机,CPU能认识的二进制指令
  盘算机干活,具体要干啥,咋干,都是由cpu来完成的,干的活的内容,就是“指令”
  每一小步都可以进一步的拆成更小的步骤,拆到一定程度,就不能再拆了,叫做指令
  
  CPU研发的时间,就会确定我这个cpu都支持哪些指令~【以二进制的方式来进行表示的】
  咱们市面上最主要cpu是两个大类:
  x86系列的cpu,intel,amd给电脑用的(固然如今cpu x86系列是8086的后代,实际上支持的指令已经差异极大了)
  arm系列的cpu,高通,苹果给手机用的
  这两类CPU支持的指令是截然不同的
  
  2.汇编语言 
  呆板语言是二进制(一串010101)不方便人来看,所以就引入了一些“助记符”
  简朴的英文单词,用英文单词来代替各种指令的二进制形式
  汇编语言中的每个代码都是和cpu支持的指令(呆板语言)是逐一对应的
  
  由于cpu差别很大,对应的也就产生了不同的汇编~
  汇编语言这么多,咱们在学校学的汇编语言一般是8086 cpu的汇编
  
  3.高级语言(C Java)
  
  408:计组 计网 数据结构 操作体系 编译原理
  盘算机体系结构(计组的进阶课)
  总结mysql的具体操作:
查询:
1.全列查询
select * from 表名;
2.指定列查询
select 列名 from 表名;
3.表达式查询
select 表达式 from 表名;(不会影响到数据库服务器硬盘上存储的原始数据)
4.查询字段指定别名
select 表达式 as 别名 from 表名;
5.查询的时间进行去重,把值雷同的行,只保留一个
select distinct 列名 from 表名;
6.查询的时间进行排序
select 列名 from 表名 order by 列名 asc/desc;(不会影响到数据库服务器硬盘上存储的原始数据)
7.条件查询
select 列名 from 表名 where 条件;(通过一些关系运算符/逻辑运算符构成表达式)
8.分页查询
select 列名 from 表名 limit N offset M;
N 表示这次查询最多查出几个记录
M表示这次查询的这N 个记录,是从第几个下标开始算
上述写法都属于最根本的查询操作
修改✨

update 表名 set 列名 = 值 where 条件;限定这次操作具体 要修改哪些行数据 
   set 这个词,盘算机里,有两种典范含义
  1)设置 gatter/setter
  2)聚集   TreeSet/HashSet
  盘算机中,一个术语,往往有多种含义,必须要结合上下文来明白这个含义是啥意思
  

Rows matched   where 条件筛选出了一行记录    Changed  修改乐成了一行
-》使用update ,可以一次修改多个列

 set 列 = 值,列= 值。。。 相称于是赋值了
-》将总成绩倒数前三的3位同砚的数学成绩减上30

Rows matched : 3   3行 所有的行数 正好是3    Changed :2  只修改2个记录 ,没修改的那个是NULL,没法被修改
如果Warnings:2    show warnings 告诫
原来87.5  /2 =》43.75  最后输出酿成43.8 超出了decimal(3,1)这样的范围,于是就进行了截断(truncated),暴出告诫
 -》update 后面不写任何条件,就是针对所有行都进行修改
删除

delete from 表名 where 条件/order by /limit;(会把符合条件的行,从表中删除掉)

 -》不指定任何条件,就是删除整个表
delete from student;
   和 drop table 还不太一样
  drop table 是删除了表,也删除了表里的记录
  delete 是只删除了表里的记录,表还在(空表)
  delete 和 update 都是很危险的操作!
delete 一旦删除的条件没设置好 ,就大概把不该删除的给删掉了~
sql步步都是危险操作
这里的修改/删除恒久生效的,都会影响到数据库服务器硬盘中的数据~
   数据库的备份,有很多种方式  拷贝~
  1.数据库最终都是存储在硬盘上,以文件的形式体现的(文件是二进制),可以把这里的文件直接拷贝走放到别的呆板上(全量备份
  2.mysqldump工具(mysql自带的一个步伐)会把你mysql中的数据导出成一系列的insert语句,再把这些insert语句,放到另一个mysql中进行执行(全量&增量都行)
  3.mysql 还有一个binlog功能(把Mysql中的各种操作,都通过日志日志记录下来)借助binlog(让另一个数据库按照binlog的内容执行,就也能得到一样的数据)(增量备份/实时备份)
    mysql服务器在启动的时间,需要绑定一个端标语3306(后面再解释),要想搞多个mysql服务器,需要把端口给设置成不同的,数据目录也需要设置成不同的。
  一般不会一个主机摆设多个mysql服务器~ 
  增删改   没有进阶的,查询是有进阶的~
2.进阶版

数据库束缚

有的时间,数据库中的数据,是有一定要求的~
有些数据以为是合法数据,有些是非法数据,相对于盘算机来说,靠人工查抄不靠谱,所以数据库有自动的对数据的合法性进行校验查抄的一系列机制~
目标就是为了保证数据库中能够避免被插入/修改一些非法的数据
mysql中提供了一下束缚:

NOT NULL 


UNIQUE 


唯一的


-》duplicate 重复   entry 入口 条目账目记录       
    Map遍历
  Java遍历聚集类,都是通过迭代器来进行的
  对应的聚集类,得实现Iterable interface才能够进行  迭代器遍历
  Map没实现Iterable
  entrySet方法  把Map转换成个Set,里面的元素就是一个一个的Entry(条目,包罗了key和value)
  这个东西不但仅是限定插入,也会限定修改~
 -》unique束缚,会让后续插入数据/修改数据的时间,都先触发一次查询操作,通过这个查询,来确定当前这个记录是否已经存在
-》数据库引入束缚之后,执行服从就会受到影响,就大概会降低很多,这就意味着数据库其实是比力慢的体系,也比力吃资源的体系,摆设数据库的服务器,很容易成为一整个体系的“性能瓶颈”
DEFAULT

规定没有给列赋值时的默认值

描述这一列的默认值,默认的默认值是null,可以通过default束缚,来修改默认值
-》desc 表名;desc=>describe 描述
order by 列名 desc;  desc=>descend 降序
写代码,不要任意搞缩写,缩写了之后,代码的含义就大概变得难以明白了

 后续插入数据的时间,default 就会在没有显示指定插入的值的时间生效了

 上述设置束缚的过程,都是先删除表,再重新创建表,能不能不删除表,直接设置束缚呢?也是可以的,但是比力贫苦,暂且不提
-》可以实现一个列有多个限定

PRIMARY KEY 

(相称于unique + not null)
这个是最重要的束缚,一行记录的身份标识!!!

一张表里只能有一个primary key
一张表里的记录,只能有一个作为身份标识的数据~
固然只能有一个主键,但是主键不一定只是一个列,也可以用多个列共同构成一个主键(联合主键)


对于带有主键的表来说,每次插入数据/修改数据,也会涉及到进行先查询的操作
mysql会把带有unique 和primary key的列自动生成索引,从而加快查询速度
    怎样保证主键唯一呢?
  mysql提供了一种‘‘自增主键’’这样的机制~
  主键经常会使用int/bigint,步伐猿插入数据的时间,不必手动指定主键值~
  由数据库服务器自己给你分配一个主键,会从1开始,依次递增的分配主键的值
  


这里写作null其实是交给数据库服务器自行分配! 


就是从刚才最大的数值开始,继承今后分配的~
相称于使用了一个变量,来生存了当前表id的最大值,后续分配自增主键都是根据这个最大值来分配的,如果手动指定id,也会更新最大值
4~9之间的id是不是就用不上了?浪费了呢?确实如此,浪费就浪费,没事儿【手动插入能插进去,自动分配就分配不到了】

   此处这里的id的自动分配,也是有一定范围性的,如果是单个mysql服务器,没题目标;如果是一个分布式体系,有多个mysql服务器构成的集群,这个时间依赖自增主键就不行了~
  
  分布式体系:
  面对的数据量大(大数据),客户端的哀求量比力大(高并发),一台服务器搞不定,就需要多台呆板(分布式)【引入多个数据库服务器的主机,分库分表,某一个表或某几个表,数据量特别大】
  
  此时来了一个新商品,商品id该怎样分配呢?肯定是要把这个记录生存在某个数据库的表中,但是怎样保证这里的id和别的两个数据库中id不重复呢?
  
  分布式体系中生成唯一id的算法,这里的实现算法有很多种具体的方式~
  公式:
  分布式唯一id=时间戳+机房编号/主机编号+随机因子(随机因子这里有一定概率生成雷同的因子,但是概率比力小)【+是指字符串拼接,不是算术相加,拼出来的效果是一个比力长的字符串】
  
  如果添加商品的速度慢,直接使用时间戳就够了,但是如果一个时间内,添加了多个商品,添加的多个商品,是要落到不同的主机上的,就可以保证同一时间内,添加到不同主机上的商品的编号,是不同的了
  
  ✨经典的口试题~进阶类题目
  同一个ms之内,给同一个呆板上添加的多个数据,随机因子恰好雷同了~
  理论上来说,这样的情况大概存在的,概率不为0,但是咱们是步伐猿(工程师),做的事工程,不涉及理论盘算,做工程的一定会涉及到误差的,只要误差在合理的范围之内,就可以忽略不计~
  总结
修改:
update 表名 set 列名 = 值,列名 = 值 where 条件/order by/limit
                   实际修改的列                               定位到要修改的行
删除:
delete from 表名 where 条件;
把匹配条件的行,删除掉了,如果不写条件,就相称于把整个表里的所有数据都删除了

insert into 表名;
select *from 表名;
update 表名;
delete from 表名;
这是一个典范反面课本,设计一个东西,给别人使用,要尽量降低使用成本,保持接口风格一致
 Java也是
获取数组长度:arr.length;
获取字符串长度:str.length();
获取list长度:list.size();

束缚:
not null 非空
unique 唯一
default 默认值
primary key 主键  每一行记录的身份标识

FOREIGN KEY

外键   描述了两个表之间的关联关系~

外键就是用来描述这样的束缚过程的,class表中的数据,束缚了student表中的数据,把class表,称为‘‘父表;束缚别人的表’’,把student表称为‘‘子表;被别人束缚的表’’
   references  JavaSE 引用  此处表示了当前这个表的这一列中的数据,应该出自于另一个表的哪一列
  



执行这个插入操作,就会触发针对class表的查询,就会查200是否在class表中存在~
父表束缚子表~~言传身教:
比如,针对父表进行修改/删除操作,如果当前被修改/删除的值,已经被子表引用了,这样的操作也会失败!
外键束缚始终要保持,子表中的数据在对应的父表的列中,要存在~~此时万一把父表的这条数据删除了,也就打破了刚才的束缚了~

 -》那可以修改父表的班级名吗?
可以。外键准确来说,是两个表的列产生关联关系~其他的列是不受影响的

-》我如果直接尝试drop table class 你以为能否删除整个表??
要想删除表,就得先删除记录~~此处的删表,一定不可以的,父表没了,子表后续添加新元素,就没得参考了

正确的删除方式 先删子表 再删父表

-》为啥这次不行了? 
class表没有主键,由于指定外键束缚的时间,要求父表中被关联的这一列,得是主键大概unique
   应用场景 :

  思量如今是一个电商网站的场景
  商品表(googsId,。。。) 
                     1                 衬衫
  订单表(orderId,goodsId 。。。)foreign key (goodsId )references 商品表(goodsId)
                      100                    1
  过了一段时间之后,商家想把这个衬衫给下架(删除掉),怎样完成删除??尝试删除父表数据的时间,如果父表的数据被子表引用了,是不能删除的,就报错了~电商网站,怎样做到保证外检束缚存在的条件下实现"商品下架"功能
  方法:给商品表新增一个单独的列,表示是否在线(不在线,就相称于下架了)
  商品表(googsId,。。。,isOk) 
  值为1,表示商品在线  值为0,表示商品下线 如果需要下架商品,使用update 把isOk从1-》0即可
  查询商品的时间 都加上WHERE isOk = 1这样的条件
  这种就叫做逻辑删除
  
  电脑上有个xx 文件,你想删除掉,也是通过逻辑删除的方式实现的.
在硬盘上,数据还有,被标记成无效了.后续其他文件就可以重复使用这块硬盘空间了.
  
  比如想把电脑的某个文件彻底删除掉,通过扔进回收站,清空回收站……没有用的~~
  硬盘上的数据啥时间彻底消亡,就需要时间,需要后续有文件把这块标记无效的空间重复使用,才会真正消散~~
  
  怎样才是正确的,彻底删除数据的方式呢?
  物理删除-》把硬盘砸了
  
咱们在公司中,工作使用的电脑,就会存储很多公司的焦点数据(商业机密)
比如,你要换电脑了~~
旧的电脑怎么处置处罚??尤其是一些大公司,都是有专门的团队来负责处置处罚的~~
  
  按照逻辑删除的思路,表中的数据,会无限的扩张?是否就会导致硬盘空间被占满?
  当然会有的,不外硬盘比力便宜,也可以通过增长主机(分布式)来进一步的扩充存储空间

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

快速回复 返回顶部 返回列表