草庐IT

三战MySQL数据库【终极篇】

孤寒者 2024-06-14 原文

MYSQL入门系列——第三篇

每篇前言:


0.准备工作:

准备一个表,用于实操演示效果:

1.表结构修改:(关键字alter)

  1. 修改表名:alter table 表名 rename to 新表名;

温馨小提示:alter修改字段的时候,字段的类型一定要加上。

  1. 修改字段名:alter table tb_name change name new_name data_type;

name为要修改的字段名,new_name为新的字段名,注意:字段名后面一定要加字段类型。

  1. 修改字段类型:alter table tb_name modify field_name data_type;

注意修改字段类型时一定要注意不要超出范围。

  1. 添加字段:alter table tb_name add [column] field_name data_type;

column可加可不加。


小拓展:

添加字段到指定位置(即指定字段下面):

如果想要添加到第一行,则将after id改为first即可。

  1. 删除字段:alter table tb_name drop [column] field_name;

column可加可不加。

2.约束条件:

约束是一种限制,通过对表中的数据做出限制,来确保表中数据的完整性,唯一性。

(1)默认约束(default):

插入数据的时候,如果没有明确为字段赋值,则自动赋予默认值,在没有设置默认值的情况下,默认值为NULL.

create table tb( id int default ‘a’ , name varchar(20));

  • 主动使用默认值: insert into 表名 value(default,default);

  • 修改默认值: alter table 表名 modify 字段名 字段类型 default 新的默认值;(使用modify修改字段类型的命令修改默认值)

(2)非空约束(not null):

限制一个字段的值不能为空,Insert的时候必须为该字段赋值。如果不赋值,则使用默认值null,但规定非空,即不能为null,所以会报错。

  • 注意:空字符不等于NULL。

create table tb( id int not null, name varchar(20));

删除非空约束,直接在后面加上null。

  • 添加非空约束:

alter table tb_name modify field_name data_type not null;

(3)唯一约束(unique key):

限制一个字段的值不重复,该字段的数据不能出现重复的。
作用:确保字段中值的唯一。

create table tb2( id int unique key, name varchar(20));

  • 删除唯一约束: drop index 字段名 on 表名;

(4)主键约束(primary key):

作用: 通常每张表都需要一个主键来体现唯一性,每张表里面只能有一个主键。
特点: 主键 = 非空 + 唯一。

create table  tb3(id int primary key,    name varchar(20));


  • 删除主键: alter table 表名 drop primary key;

增加主键(共三种方式):

  1. alter table 表名 add primary key(字段名);

  2. alter table tb_name change name new_name data_type primary key;

  3. alter table tb_name modify field_name data_type primary key;

(5)自增长约束(auto_increment):

默认值从1开始,每次在最后一个值的基础上增加1。

  • 自动编号,和主键组合使用,一个表里面只能有一个自增长(原因:auto_increment 要求用在主键上,一张表就一个主键)
create table  ta( id int primary key auto_increment,    name varchar(20));

  • 设置自增长的增长幅度(默认为1): set @@auto_increment_increment = 指定步长;

(6)外键约束(foreign key):

(建议给下面第三部分—表关系看完之后再来看看本部分,会有茅塞顿开的感觉哦~)

外键:通过外键关联两张表,必须连接另外一张表里面的主键,另外一张表就是主表,本表就是副表。

保持数据的一致性,我有的你一定有, 你没有的, 我绝对没有。
(这里的我指副表;你指主表)

  • 主表和副表是因为使用外键连接表才产生的概念。

  • 删除外键约束:alter table h2 drop foreign key fk_name;

  • 创建外键约束:alter table 表名1 add constraint 表名2 foreign key(id1) references 表名3(id2);
    (创建一个外键约束,自己这张表(h1)里面的id连接另外一张表(h2)里面的id)
    表名1代表要添加外键约束的表;
    表名2代表外键名字;
    id1代表自己表里的字段;
    表名3代表外键表名;
    id2代表主键字段名。

注意:

  1. 外键名字可以随便取,因为如果你创建表的时候就增加外键,系统默认会有一个外键名字,可以通过show create table 表名;查看。
  2. 自己的这张表连接另外一张表的主键(注意连接的一定要是主键),连接的主表里面没有的数据,添加外键的这张表里也一定不能有。

实战讲解—外键约束代码操作:

  • 第一张表有主键,第二张表没主键且没在创建表的时候就增加外键约束,所以下面增加外键:

  • 通过命令查看创建的外键约束:

  • 删除外键约束:


  1. b表中的id_b字段,只能添加 id_a中已有的数据 。
    即插入修改规则: 主表没有的这个字段值,副表也不能有。

  2. a表中id_a 被参照的数据, 不能被修改和删除
    即删除规则:先删除副表,副表里面没有的数据,主表才能删除。

3.表关系:

(1)一对一关系—主键连接主键

自己这张表的主键连接另外一张表的主键。通过外键的方式来实现!!!(给主键的字段连接外键)

实操引入:假设有两张表,一张是学生表student,学生表中有学号、姓名、学院,但学生还有些比如电话,家庭住址等比较私密的信息,这些信息不会放在学生表当中,会新建一个学生的详细信息表data1来存放。这时的学生表和学生的详细信息表两者的关系就是一对一的关系,因为一个学生只有一条详细信息。用主键加主键的方式来实现这种关系。

下面是实操讲解(主要目的是讲解,所以我将两张表的字段做了简化):

  • 第一步:学生表的创建

  • 第二步:学生详细信息表的创建:
    注意:通过外键关联两张表,必须连接另外一张表里面的主键,则另外一张表(student)就是主 表 ,本表data1就是副表。

  • 第三步:通过外连接实现一对一:
    这里还体现了外键约束。

  • 注意:删除数据的时候:
    要先删除副表的,再删除主表的,才能删掉 。如果直接删除主表的将报错。

(2)多对一(或者称一对多)关系—非主键连接主键

自己的这张表的非主键连接另外一张表的主键。通过外键的方式实现。(给非主键的字段连接外键)

  • 第一步:创建一个没有主键的表:
    没有主键的这张表的非主键连接另外一张有主键的表的主键。则实现了多对一。
    因为:非主键可以重复,主键唯一。
  • 第二步:创建一个有主键的表:

  • 第三步:通过外连接查看多对一:

(3)多对多关系:

思路是非主键连接非主键,但是外键必须连接主键,所以必须有一个中间表,负责结合两张表的主键

联合主键: (1,1)

  • 添加联合主键:alter table 表名 add primary key(字段1,字段2);

实操引入:学生要报名选修课,一个学生可以报名多门课程,一个课程有很多的学生报名,那么学生表和课程表两者就形成了多对多关系。

下面是实操讲解(主要目的是讲解,所以我将两张表的字段做了简化):

  • 第一步:创建第一个表:


  • 第二步:创建第二个表:

  • 第三步:上面已经创建了两张表,还需要一张中间表:
    这张中间表就将上面两张表都连接起来了,实现了多对多:

    上面这张图的primary key(s_id,c_id)是创建联合主键

    • foreign key(s_id) references student(id)是关联学生的id
    • foreign key(s_id) references cours(c_id)是关联课程的c_id

      但这样查看不直观,所以用连接查询看:

4.拓展:

1.视图:(把查询出来的结果变成一张表)

特点:可以引用多张表。是一张虚表!!!

优点:

  • 简单化,数据所见即所得

  • 安全性,用户只能查询或者修改他们看得到的数据

  • 逻辑独立性,可以屏蔽真实表结构变化带来的影响。比如:如果给一张有主键的表建立视图,那么这张表的视图是没有主键的。

缺点:

  • 性能较差,简单的查询也会变得复杂

  • 修改不方便,复杂的聚合视图基本无法修改

  1. 创建视图: create view 视图名字 as select * from 表名;
一张表形成的视图是可以进行增删改查的;对视图进行修改,对应的原表也会跟着修改。
但是多张表(通过连接查询生成的视图)形成的视图不能进行修改操作。
  1. 删除视图: drop view 视图名字;

2.索引:

(1)为什么要有索引?

  • 原因:sql语句直接查询太慢了!

(2)那么,为什么sql语句直接查询很慢呢?

  1. 查询语句写的太烂;

  2. 索引失效;

  3. 关联查询太多了;

  4. 服务器问题。

(3)索引原理:

索引原理可以理解为把数据放进一本本书里面,查询不需要一个个数据查询;而是先找到放所需数据的书,在找页…可以加快查询数据的速度!

(4)什么情况下使用到索引:

  1. 主键自动建立唯一索引

  2. 频繁查询条件的字段

  3. 外键关系自动建立索引

  4. 经常需要改变的数据不要建立索引

  5. where条件里用到的字段不要创建索引

  6. order by 要建立索引

  7. 聚合和分组字段也要建立索引

(4)什么情况下不要建立索引:

  1. 表记录太少

  2. 经常需要增删改的数据不要建立索引

  3. 太多重复且平均的字段不要建立索引

(5)使用:

  1. 建立索引:
    create index 索引名字 on 表名(字段名);

  2. 删除索引:
    drop index 索引名字 on 表名;

  3. 显示表里索引:
    show index from 表名;

小知识点:

如果是连接查询
explain 连接查询语句;
这样可以查看查询表的先后顺序。

3.mysql正则:(regexp)

正则表达式大家肯定都熟的不能再熟了(如果不熟的可以去看看Python基础分栏里的正则表达式讲解!),所以此处就简单使用几个常见的说明下如何在MYSQL中使用即可~

符号含义
^h以h开头
a$以a结尾
[^h]不是h的都可以
+一个到多个
*零个到多个
{m,n}控制次数
.通配符,任意字符

实操讲解:

准备工作—使用的表:

  1. 找到name中含有h的:

  2. 找到name中以h开头的:

  3. 找到名字中以a结尾的:

  4. 只要包含h的都找到:

  5. 只要是name里不是h的都找到:

  6. .是通配符,代表任意字符,一个代表一个任意字符

  1. {m,n}控制次数

  2. *零个到多个:

  3. +一个到多个:

4.mysql创建拥有指定权限的用户&&修改用户名和密码操作

(1)创建:

  1. 创建用户:
 create user'xiaoming'@'%' identified by '123456';


2. 赋予权限:

 grant select on test.student to 'xiaoming'@'%';
  • select:赋予查看权限(对应有增删改查四种权限,all表示赋予所有权限);
  • test.student:数据库名.表名(*.*即为整个数据库);
  • ‘xiaoming’@‘%’:赋予权限的用户。
 flush privileges;
  • 最后别忘了刷新权限哦~

测试:
以新用户登录即可,只拥有指定数据库,表的指定权限:

mysql -uxiaoming -p123456

(2)修改:

①修改用户名:

  1. 要先进入mysql数据库中哦:
    因为用户信息表user就在这个数据库中~
use mysql;
  1. 修改用户名:
 update user set user = 'xm' where user = 'xiaoming';

别忘了刷新权限:

flush privileges;

更改成功:

②修改密码:

  • 修改密码为1234567:
set password for 'xm'@'%' = password('1234567');

刷新下权限:

 flush privileges;

有关三战MySQL数据库【终极篇】的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  3. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  4. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  5. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  6. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  7. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  8. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  9. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

  10. 微信小程序通过字典表匹配对应数据 - 2

    前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立

随机推荐