【MySQL】表的操作和数据类型

news2024/12/22 16:55:45

前言

        大家好呀~,今天继续我们的mysql学习!

        本篇博客主要记录Mysql创建完数据库后,要在数据库中创建表,那么首先需要定义表的结构约束(SQL-DDL)等,这篇主要介绍基础定义表的结构(创建、删除、修改、查找)以及一些数据类型的学习。

我的上一篇MySQL笔记:【MySQL】库的操作_柒海啦的博客-CSDN博客

目录

一、表的结构操作-DDL

1.创建表

2.查找表

-查找当前数据库所有的表

-查看表结构

-查看表的创建语句

3.修改表

-修改列名

-修改表名

4.删除表

二、数据类型

1.数值类型

-整数类型

-比特类型

-小数类型

2.文本类型

3.日期时间类型

4.enum和set类型

find_in_set()


一、表的结构操作-DDL

1.创建表

        首先sql语句创建表的格式如下:

create table [if not exists] table_name(

        filed1 datatype,

        filed2 datatype,

        ......

)engine 存储引擎 charset(character set 字符集)=字符集 collate=校验规则;

注意:

        ()后面均是必带内容,但是根据mysql的软件层上的设置可以不用带,因为完全可以继承当前环境下创建数据库的属性或者默认设置的属性。

        存储引擎:就是在MySQL架构中提到的第三层,对于不同的引擎存在不同的存储方式,下面的实验就可以看到。(比如MyISAM引擎和InnoDB引擎)

        filed 为列属性名字。注意,对于所有自己定义的变量名都可以使用` - 反引号括起来。

        datatype 数据类型、约束条件等等。(后面会讲,下面知识举例)

        下面只是做个示例,我们需要一个存储用户id,账号,密码的表,请创建出其的结构,存储引擎为MyISAM,同时也创建一个相同的表,存储类型为InnoDB。

create table `User1`(
    `nm` int(3) zerofill comment '用户num',
    `id` char(5) comment '用户id固定为5个长度',
    `pw` char(7) comment '用户密码固定7个长度'
)engine MyISAM default charset=utf8;

create table `User2`(
    `nm` int(3) zerofill comment '用户num',
    `id` char(5) comment '用户id固定为5个长度',
    `pw` char(7) comment '用户密码固定7个长度'
)engine InnoDB character set utf8 collate utf8_bin;

         可以发现,因为存在存储引擎的区别,所以数据文件的保存方式也都不同。(mysql默认保存数据文件的路径为/var/lib/mysql)

        那么既然创建出表结构了,我们如何查找我们的表结构或者表呢?

2.查找表

-查找当前数据库所有的表

show tables;

-查看表结构

desc 表名;

-查看表的创建语句

show create table 表名[\G]

\G为了整理格式便于观看

        可以发现,我们之前设置的comment约束可以看到了,此约束设置就是为了给程序员看的。

        此时表的结构就定下来了。但是如果中途我们需要改某些属性该怎么办呢?使用关键字alter即可。

3.修改表

        修改表的结构同样存在三种:

alter table 表名 怎么改 (属性名 [datatype,......]) [after 属性名]

解释:

        怎么改分为三类:

        add 新增,后面跟属性名以及对于的类型以及约束条件,after表示新增属性在指定属性的后面。

        drop 删除,后面只需要跟属性名即可。

        modify 修改,后面跟属性以及对应类型以及约束条件。

注意:

        -当前表中如果存在数据就有可能出现问题,所以表的结构一定前期要想好,别动不动就要上来修改表的结构。

        -修改操作的时候均为覆盖式操作,所以必须讲约束条件写完整。

        -删除属性的时候,当前列的所有数据也会被删除,一定三思而行。

        -删除当只剩一列的时候,不可执行删属性操作,而是删表操作。(一个表结构至少存在一个属性)

        下面对三种修改操作进行演示,并且结合注意事项进行说明。 

        首先,我们对表User1结构进行新增修改操作,将name属性增加到id的后面。

alter table User1 add name varchar(10) after id;

         其次,我们对id属性修改为int(5)数据类型。

alter table User1 modify id int(5);

         然后删除行nm。

alter table User1 drop nm;

         现在测试将User2表的全部列删完(删的完么?)

alter table User2 drop nm;
alter table User2 drop id;
alter table User2 drop pw;

         可以发现,当表剩下一列的时候,是无法直接删除属性的,需要连表一起删除的,否则无属性的表是不存在意义的。

-修改列名

        修改列名很简单:

        alter table 表名 change oldname newname (datatype.....)  // 约束条件等。

        注意修改列名也是覆盖式的操作。

        比如我们修改表User1的id为ID:

         需要注意因为是覆盖式的修改,所以原本创建的数据类型以及约束类型也都要保持和之前的完整哦。

-修改表名

        数据库省略了修改数据库名的操作,但是表的名字是可以修改的。

        alter table old表名字 rename new表名(to new表名);

        比如我们将User2表修改为Temp表。

4.删除表

        删除表使用关键字drop即可。

        drop table 表名1[, 表名2......];

注意:删表操作也需要三思而行哦。

        比如我们删除表Temp:

         对应之前创建的所有数据文件也都会清理掉。

二、数据类型

        数据类型就是在创建表属性的时候一种约束。在MySQL中数据类型大致分为四类,并且根据不同的应用场景而设计出来的。

        数据类型之所以称为约束,就是因为能够将数据限制在一个范围或者不同类型中,从而约束用户只能输入对应类型的,否则就报错。

         下面针对不同的类型抽出几个典型来讲。

1.数值类型

-整数类型

tinyint [[unsigned](n)] [zerofill];

int [[unsigned](n)] [zerofill];

......

        unsigned:用于区分此数值类型是有符号还是无符号。

        tinyint分配的空间是1byte(2^8),所以在有符号的取值范围为-128 ~ 127,无符号的情况下取值范围为0~255.

        int分配的空间是4byte(2^32),所以在有符号的取值范围为-2^31 ~ 2^31 - 1,无符号就是0~2^32 - 1;

        n表示在n个宽度的展示下,补充零的个数(注意只有后面加上约束zerofill才会生效),比如n = 3,表示1的时候就是001.需要注意的是,加上zerofill约束条件后只能是unsigned才能生效,所以会默认填充unsigned。(之后专门讲表的约束的适合会专门讲)

        下面重点重点演示一下zerofill的约束。我们在User1表中,插入两个属性:test1和test2,使用alter进行修改插入:

alter table User1 add test1 tinyint(3) zerofill after pw;
alter table User1 add test2 int(5) zerofill after test1;

         简单插入几个数据就可以得到如下的结果:

-比特类型

bit[(M)];

        M表示其bit的位数,默认为1.最多64位。

        需要注意的是,bit对应就是bit类型,根据对应的编码规则提取出来的时候,不是像整数类型那样直接提取出来了,而是被用作ASCII值提取出来的。

        比如用下面的例子举例说明bit类型和其他数值类型的区别:

        给表User1插入一个属性test3,定义位bit(7) (2^7),然后和id同时插入97,select查询数据的时候看看效果:

alter table User1 add test3 bit(7) after ID;
insert into User1(ID, test3) values(97, 97);
select * from User1;

        可以发现,虽然同时插入的是97,但是根据校验规则,bit类型的数据是按照ASCII码的标识取得,97对应得就是字母a,int就直接按照数值得方式取出了。 

-小数类型

float[(M, D)] [unsigned];

decimal[(M, D)] [unsigned];

参数解释

        M:表示显示宽度。M >= 小数个数 + 整数个数

        D:小数点的位数

        float和decimal的区别:decimal精度表示比float高

        占用空间4byte。

注意

        如果插入的元素小数位数超过了D,存在不同的舍去策略,当前我的环境下是四舍五入(不包括5)。

        对于unsigned 的float(4, 2)来说,取值范围就是 0 ~ 99.99

        我们验证一下四舍五入的事实,为表User1增加属性f1,表示一个浮点数宽度为4,小数占2位,并且插入9.985和9.986。

alter table User1 add f1 float(4, 2);
insert into User1 values(9.985);
insert into User1 values(9.986);

 

         可以发现,虽然小数部分超过了D,但是对于四舍五入(不包括5),就可以进行正常插入数据。(注意,每个版本的mysql的策略不同,我当前的版本是支持这样的)

         如果整数部分位数大于n - 小数位数就会直接报错的哦。

        对于float和decimal类型来说,我们设置(10, 8)使用23.12345612进行分别插入,select进行查询后就可以知道结果了。

        可以发现,float存储精度果然存在缺失,但是decimal精度很好。所以两者的本质区别在于存储精度的问题。需要高精度的话就选择decimal即可。

2.文本类型

char(size);

varchar(size);

参数解释

        char为固定长度字符串,varchar为可变长字符串。

        其中size表示可以表示的字符个数。char最多255个,varchar最多65535个byte(长度根据编码字符大小而变,并且需要存在3byte记录每个字符的byte,所以有效字符个数为65532byte)。

注意

        对于char类型,因为是固定的长度字符串,那么开辟空间就严格按照size给出的大小进行开辟,如果是编码格式为utf8来说,一个字符用3byte,那么此时char开辟的空间大小为size * 3;

        对于varchar类型,是可变的字符串,意思是动态进行申请长度的,size只是限制最大的长度。在mysql中,字符的byte为(1 ~ 3)中进行变化的,和编码相关,utf8就是3。另外,如果存储的数据不超过 255 字节,那么实际占用的存储空间就是数据的实际长度再加上一个字节用于存储长度信息,如果存储的数据长度超过 255 字节,则需要占用两个字节存储长度信息。此时varchar开辟的大小为:(n为实际字符个数,n<= size)

        if <= 255:n*3 + 1;

        else n*3 + 2;

        所以,如果对于一个数据确定了长度的话,使用char固定字符串能够更加节省空间,如果不确定就使用varchar更节省空间。

        比如插入电话和名字的时候,电话可以使用固定的长度,名字是可变的长度。

alter table User1 add c1 char(11) commit '电话11固定长度';
alter table User2 add c2 varchar(10) commit '名字不超过10个字符';

 

 

  

3.日期时间类型

date;

datetime;

timestamp;

参数解释

        date表示格式:'yyy-mm-dd',表示年月日,占用空间3byte.

        datetime表示格式:'yyy-mm-dd HH:ii:ss' 表示年月日小时分钟秒,占用空间8byte。

        timestamp是时间戳,占用4byte。显示查询的时候会显示datetime的格式,并且用户不需要显示插入(设置了default),会自动获取插入的时候的时间戳,显示日期和时间。并且设置非空。全都是默认形成。(后续在进行插入或者修改的时候,都会进行自动更新)

        

        三种都存在不同的应用场景,对于空间占用大小就忽略不计了

        给User1表增加属性d1,d2,d3,检测三种属性的特点。

alter table User1 add d1 date;
alter table User1 add d2 datetime;
alter table User1 add d2 timestamp; 

         首先插入数据:insert into User1(d1, d2) values('1949-10-01', '2008-10-01 16:41:32');

        可以发现d3已经自动更新插入的时候时间戳了。当我们进行修改的时候,同样会发生变化(不对d3做任何处理)。

        update User1 set ID=3 where ID is NULL;

         可以发现,只要对当前元组进行修改数据(涉及到DML数据操纵语言的学习),d3即timestamp时间戳都会进行更新的。 

4.enum和set类型

enum('选项1', '选项2', ......);

set('选项1', '选项2', ......);

参数解释

        enum类似于C中的枚举,mysql中表示单选类型。即限制给此数据属性插入数据的话必须是enum选项中的其中一个。实际上,每个选项底层存的是数字,'选项1'可以用1进行代替,从1开始,最多65535个选项。

        set是多选类型,限制对此数据属性输入时只能是这些的不定项个。为了效率,同样这些底层也都是数字存储,只不过利用的是位图结构。比如如果当前为3个选项的话,表示第一个选项为001 = 1,第二个010 = 2,第一个和第二个 011 = 3....类似这样的去表示的。最多表示的选项个数为64个(2^64)

        比如,我为我们的User1表增加属性e和s,其中e为enum包括a,b,c;s为set包括u,f,o。

alter table User1 add e enum('a', 'b', 'c');
alter table User1 add s set('u', 'f', 'o');

         我们随便插入几个数据:

insert into User1(e, s) values('a', 'u');
insert into User1(e, s) values('c', 'f,o');
insert into User1(e, s) values(2, 7);  -- 'b' 'u,f,o'

         那么这里对于set的查询就存在一定问题了。因为一个属性严格区分不同的属性,我们想要查找数据中只存在f这种元组,直接select * from User1 where s='f';可以吗?自然不行,我们需要一个函数,帮我们解决这个问题。

find_in_set()

        select find_in_set('a', 'a,b,c');

        对于函数find_in_set(a, b),能够将单元素a,从b组合中提取出对应的位置,从1开始,没有为0。所以对应select查询语句中的where,只要查找到返回>1即可。我们就可以找到只存在‘f’的元素。

select * from User1 where find_in_set('f', s);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/425793.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习React与Next.js过程中的疑惑

学习React与Next.js过程中的疑惑1、为什么React中函数作为props的时候&#xff0c;会出现无限调用的情况&#xff0c;而把函数放在箭头函数中就可以解决呢&#xff1f;2、next.js与node.js有什么区别&#xff1f;3、什么是快速刷新&#xff1f;4、Hooks出现的原因是什么&#x…

2020年11月信息系统项目管理师真题(综合+案例)

请点击↑关注、收藏&#xff0c;本博客免费为你获取精彩知识分享&#xff01;有惊喜哟&#xff01;&#xff01; 1、&#xff08; &#xff09;使系统的描述及信息模型的表示与客观实体相对应&#xff0c;符合人们的思维习惯&#xff0c;有利于系统开发过程中用户与开发人员的…

【从零开始学Skynet】实战篇《球球大作战》(十二):场景代码设计(上)

场景服务会处理绝大部分的游戏逻辑。新建service/scene/init.lua&#xff0c;开始编写相关代码。1、Ball类 场景中包含小球和食物这两种对象&#xff0c;先看看小球的实现。代码如下所示&#xff1a;--球 local balls {} --[playerid] ballfunction ball()local m {playerid…

项目打包记录提交id

某天上午正在摸鱼的小邓&#xff0c;突然被领导拉倒一个2年前项目的现场问题沟通群&#xff0c;说是现场数据无法入库&#xff0c;需要排查&#xff0c;奈何不知道版本&#xff0c;无奈的小邓值得用时间记录一个点一个点的从gitlab中查找&#xff0c;为了防止后续提供到现场的版…

【蓝桥杯嵌入式】蓝桥杯嵌入式2023年第十四届省赛真题解答

目录 0 题目介绍 1 题目分析 2 Cubemx配置 4 代码 5 效果显示 0 题目介绍 具体要求如下图 1 题目分析 拿到题目咋一看&#xff0c;就是基本操作&#xff0c;实际做起来一堆定时器操作&#xff0c;很容易把人绕晕。 首先看看需要用到的外设 1. GPIO(key/led) 2.LCD 3…

SpringCloud:ElasticSearch之RestClient查询文档

文档的查询同样适用RestHighLevelClient对象&#xff0c;基本步骤包括&#xff1a; 1&#xff09;准备Request对象2&#xff09;准备请求参数3&#xff09;发起请求4&#xff09;解析响应 1.快速入门 我们以match_all查询为例 1.1.发起查询请求 代码解读&#xff1a; 第一步…

Downie4如何使用?Downie4最常用的几种下载方法

Downie 4是一款流行的 Mac 视频下载工具&#xff0c;可让您从各种网站下载视频&#xff0c;包括 YouTube、Vimeo、Twitter 等。但是Downie有多少种下载视频的方法你知道吗&#xff1f;接下来为大家带来最常用的几种下载方法&#xff0c;欢迎大家点赞收藏&#xff01; 拖链接下载…

〖Python网络爬虫实战①〗- HTTP原理

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;目前专栏免费订阅&#xff0c;在转为付费专栏前订阅本专栏的&#xff0c;可以免费订阅付费…

道路病害识别领域创新产品RADSDS系统让道路检测更高效更实用

自从我国公路总里程数居世界第一&#xff0c;道路养护成为交通运维工作的重要环节。公路养护维修工作的开展&#xff0c;离不开对公路客观状况的检测。以往&#xff0c;我国依靠人工步行完成这项工作&#xff0c;不但干扰公路上车辆的正常通行&#xff0c;对检测人员安全不利&a…

【Linux】来写一个udp的服务端+客户端

来写一个udp的代码 1.socket编程接口 // 创建 socket 文件描述符 (TCP/UDP, 客户端 服务器) int socket(int domain, int type, int protocol); // 绑定端口号 (TCP/UDP, 服务器) int bind(int socket, const struct sockaddr *address,socklen_t address_len); // 开始…

个人邮箱与企业邮箱的区别有哪些?如何选择?

很多用户不了解企业邮箱&#xff0c;认为使用个人邮箱完全可以满足需求&#xff0c;其实这都是错误的观点&#xff0c;企业邮箱不同于个人邮箱&#xff0c;企业邮箱更适于商务应用的邮箱。今天就简单的做个对比。 个人邮箱与企业邮箱的区别&#xff1a; 1、企业形象 企业邮箱&…

STC单片机DS1307+ssd1306 oled时钟显示

STC单片机DS1307+ssd1306 oled时钟显示 📌相关篇《STC单片机DS1302+ssd1306 oled时钟显示》📍《STC单片机对DS1307读写操作》✨效果演示: 🌿实验对象:STC12C5A60S2🌿屏幕型号:I2C ssd1306 0.96“ oled🌿晶振频率:11.059MHz🌿串口波特率:9600📜串口打印读取信…

rk3568 点亮HDMI

rk3568 Android11/12 适配HDMI HDMI&#xff08;High-Definition Multimedia Interface&#xff09;是一种数字化音视频接口标准&#xff0c;用于连接高清电视、电脑、游戏机、蓝光播放器等设备。它是由HDMI联盟&#xff08;HDMI Licensing, LLC&#xff09;制定的&#xff0c…

奥威BI数据可视化大屏分享|多场景、多风格

数据可视化大屏一般应用在品牌推广展示、商务交流、数据分析决策、数据监控等场景&#xff0c;由此催生出各种不同风格的BI数据可视化大屏设计。下面就从奥威BI软件的BI报表模板中截取几个有着不同风格&#xff0c;起着不同作用的BI数据可视化大屏报表&#xff0c;一起来了解一…

【Transformer系列(3)】 《Attention Is All You Need》论文超详细解读(翻译+精读)

前言 哒哒~时隔好久终于继续出论文带读了&#xff0c;这次回归当然要出一手王炸呀——没错&#xff0c;今天我们要一起学习的就是传说中的Transformer&#xff01;在2021年Transformer一经论文《Attention is All You Need》提出&#xff0c;就如龙卷风一般震惊学术界&#xf…

关于ROS机器人-文心一言和CatGPT怎么看-

交流截图&#xff1a; 文字版本如下&#xff08;W-文心&#xff1b;C-猿如意&#xff09;&#xff1a; 如何通过蓝桥云课学习ROS机器人&#xff1f; W&#xff1a; 如果你想通过蓝桥云课学习ROS机器人&#xff0c;可以按照以下步骤进行&#xff1a; 确认ROS机器人的版本和教…

【记录】笔记本新加SSD,重装系统win10,再装双系统ubuntu18.04

记录一下&#xff0c;希望下次装系统可以来的晚一点一、前言二、换SSD三、装Windows1.安装系统2.删除多余系统3.遇到问题&#xff1a;无法关机4.改注册表&#xff0c;开不开机&#xff0c;黑屏有鼠标三、装ubuntu1.安装完&#xff0c;设置root2.更新源3.时间设置4.win和ubuntu共…

大语言模型及其应用

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 机器学习 机器学习&#xff08;Machine Learning&#xff0c;ML&#xff09;是指从数据中自动学习规律和模式&#xff0c;并利用这些规律和模式&#xff0c;在新的数据中完成…

nssctf web 入门(6)

这里通过nssctf的题单web安全入门来写&#xff0c;会按照题单详细解释每题。题单在NSSCTF中。 想入门ctfweb的可以看这个系列&#xff0c;之后会一直出这个题单的解析&#xff0c;题目一共有28题&#xff0c;打算写10篇。 目录 [SWPUCTF 2021 新生赛]caidao [SWPUCTF 2021 新…

力扣题库刷题笔记64-最小路径和

1、题目如下&#xff1a; 2、个人Python代码实现&#xff1a; 以上代码主要是照抄题解&#xff0c;根据调试bug了解每一步的逻辑&#xff0c;然后注释利于读懂本题&#xff0c;写本篇文章的目的在于初步了解动态规划。 本题的逻辑主要如下&#xff1a; a、列表中每个数字代表当…