[MYSQL数据库]--表的增删查改和字段类型

news2024/11/19 19:36:30

前言

作者:小蜗牛向前冲

名言:我可以接受失败,但我不能接受放弃

  如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 

目录

一、表的增删查改

1、表的创建

​2、表的查看

3、表的修改

4、表的删除

二、字段的类型 

1、数据类型

2、tinyint类型

3、bit类型

4、float类型 

5、decimal类型 

5、字符类型 

 6、日期和时间类型

 7、enum和set


对表的增删查改,字段的类型:tinyint,bit,float,decimal,字符,日期和时间,enum,set类型。

一、表的增删查改

1、表的创建

语法:

CREATE TABLE table_name (
field1 datatype,
field2 datatype,
field3 datatype
) character set 字符集 collate 校验规则 engine 存储引擎

说明:

  • field 表示列名 datatype 表示列的类型
  • character set 字符集,如果没有指定字符集,则以所在数据库的字符集为准
  • collate 校验规则,如果没有指定校验规则,则以所在数据库的校验规则为准

创建表案例 

在创建表的时候我们要先建立库:库的建立不懂可以看这里(传送门) 

这里我们建立了一个test1的数据库,并且use test。

在我们建库后在下面的路径下,可以看到的test1库,其实就是一个目录(查看这里需要root权限su -)

/var/lib/mysql

 进入到目录里面后,默认只要一个db.opt的文件,里面配置了默认的字符集和校验规则。

了解完这些,我们继续来创建表 

create table users(
    name varchar(20) comment '用户名字',
    password char(32) comment '用户密码',
    birthday date comment '生日'
) charset=utf8 collate=utf8_general_ci engine=MyIsam;

说明:

  • 不同的存储引擎,创建表的文件不一样。
  • users 表存储引擎是 MyISAM ,在数据目中有三个不同的文件,分别是:
  • users.frm:表结构 users.MYD:表数据 users.MYI:表索引

这里我们继续创建users2 ,但我们改用了InnoDB存储引擎

这里我们继续在数据库test1的目录下查看发现,存储引擎的不同,其实就是文件类型的不同。

 2、表的查看

语法:

desc 表名;

 这里我们分别查看一下我们上面创建的users和users2

 Field:表示字段名字

Type:表示字段的类型

当然我们也可以用下面命令查看建表的细节

show create table users \G

当我们怎么发现和我们写的代码好像,不一样?

这是因为mysql会对我们的命令进行词法语法的分析,优化成mysql的标准。 

3、表的修改

在项目实际开发中,经常修改某个表的结构,比如字段名字,字段大小,字段类型,表的字符集类型, 表的存储引擎等等。我们还有需求,添加字段,删除字段等等。这时我们就需要修改表。

语法:

ALTER TABLE tablename ADD (column datatype [DEFAULT expr][,column
datatype]...);
ALTER TABLE tablename MODIfy (column datatype [DEFAULT expr][,column
datatype]...);
ALTER TABLE tablename DROP (column);

 案例:

将users表名字改为user1

alter table users renmae to user1;

 在表中添加数据:

insert into user1 values('张三','123456','2001-2-24');
insert into user1 values('李四','242421','2012-2-1');

 查看表中信息

select * from user1

在user1表添加一个字段(添加列),用于保存图片路径 

alter table user1 add image_path varchar(128) comment '这是用户头像的路径' after birthday;

 插入数据后是对原来数据没有影响的

删除password列

alter table user1 drop password;

删除字段一定要小心,删除字段及其对应的列数据都没了 

修改name,将其长度改成60

 alter table user1 modify name varchar(60);

将name列修改为xingming 

 alter table user1 change name xingming varchar(60);

注意这里新的字段要完整定义 

4、表的删除

语法:

DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ...

这里我们删除我们以前建的users2

drop table users2;

二、字段的类型 

1、数据类型

MySQL支持多种数据类型,这些类型可以分为几个主要的类别,包括数值类型、日期和时间类型、字符串类型、二进制类型等。以下是MySQL中常见的数据类型:

整数类型:

  • TINYINT: 1字节,范围从-128到127(有符号),0到255(无符号)。
  • SMALLINT: 2字节,范围从-32,768到32,767(有符号),0到65,535(无符号)。
  • MEDIUMINT: 3字节,范围从-8,388,608到8,388,607(有符号),0到16,777,215(无符号)。
  • INTINTEGER: 4字节,范围从-2^31到2^31-1(有符号),0到2^32-1(无符号)。
  • BIGINT: 8字节,范围从-2^63到2^63-1(有符号),0到2^64-1(无符号)。

 小数类型:

  • FLOAT: 单精度浮点数。
  • DOUBLEREAL: 双精度浮点数。
  • DECIMALNUMERIC: 固定小数点数。

日期和时间类型:

  • DATE: 日期,格式为'YYYY-MM-DD'。
  • TIME: 时间,格式为'HH:MM:SS'。
  • DATETIME: 日期和时间,格式为'YYYY-MM-DD HH:MM:SS'。
  • TIMESTAMP: 时间戳,表示自1970年1月1日以来的秒数。
  • YEAR: 年份,格式为'YYYY'。

字符串类型:

  • HAR: 定长字符串。
  • VARCHAR: 变长字符串。
  • TEXT: 长文本字符串。
  • ENUM: 枚举类型。
  • SET: 集合类型。

 二进制类型:

  • BINARY: 定长二进制数据。
  • VARBINARY: 变长二进制数据。
  • BLOB: 二进制大对象,用于存储大量数据。

下面进行一些比较常见类型的介绍 

2、tinyint类型

我们创建一个tinyint类型的数据(取值范围:-128~127),进行插入测试:

create table t1(num tinyint)
insert into t1 values(-128);
nsert into t1 values(127);
insert into t1 values(66);
insert into t1 values(-666);
select * from t1;

  • 在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。
  • 可以通过UNSIGNED来说明某个字段是无符号的

比如上面例子:只要在 创建t2的指定为为无符号的类型就可以了。

create table t1(num tinyint unsigned)

注意:我们在使用unsigned要根据场景来使用尽可能的节约资源。

3、bit类型

基本语法:

bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。

举例:

create table t3(id int,online bit(1));
insert into t3 (id,online) values(123,0);
insert into t3 (id,online) values(456,1);
insert into t3 (id,online) values(124,4);
desc t3;
select *from t3;


 这里我们创建了标t3里面online是bit位图类型,0就表示用户不在线,1表示在线

bit字段在显示时,是按照ASCII码对应的值显示。这里我们继续把位图改大

并且分别以ASCII码对应的值显示和十进制显示。

alter table t3 modify online bit(64);
insert into t3 (id,online) values(234,42);
desc t3;
select *from t3;
select id,hex(online) from t3;

4、float类型 

语法:

float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节

案例 

小数:float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入。

这里我们继续创建表t4,并且对里面数据进行插入内容,salary我们设置为float型。

insert into t4(id,salary) values(1,99.99);
insert into t4(id,salary) values(2,-99.99);
insert into t4(id,salary) values(3,23.23);
insert into t4(id,salary) values(3,2.123);
insert into t4(id,salary) values(3,100);
insert into t4(id,salary) values(3,2.129);

 当我们对salary插入100肯定是被mysql约束不允许插入的,但我们也可以观察到float类型是有四舍五入的。

这里我继续建立t5试试float类型的无符号类型 

如果定义的是float(6,4) unsigned 这时,因为把它指定为无符号的数,范围是 0 ~ 99.99

为表插入一些数据 

 seletc *from t5;

5、decimal类型 

语法:

decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数

  •  decimal(5,2) 表示的范围是 -999.99 ~ 999.99
  • decimal(5,2) unsigned 表示的范围 0 ~ 999.99
  • decimal和float很像,但是有区别: float和decimal表示的精度不一样

这里我们分别插入数据:

insert into t6(id,salary1,salary2) values(1, 25.12345678,25.12345678);

明明我们插入的值是一样的,但是salary1和salary2存储的值却不一样,这是因为, float表示的精度大约是7位。而decimal的精度却很高。

  • decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略, 默认是10
  • 建议:如果希望小数的精度高,推荐使用decimal。

5、字符类型 

char语法:

char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255

但是我们这里要注意的是,这里说的是字符长度不是子节长度 。

char(1),可以插入1字母,也可1个中文(在UTF8的校验码占三个字节)。

举例:

 varcahr语法:

varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节

 关于varchar(len),len到底是多大,这个len值,和表的编码密切相关:

  • varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字 节数是65532。
  • 当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占 用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符 占用2字节)。

见一见 varcahr

create table t8( id int, name varchar(4));
insert into t8(id,name) values(1,'小明');
insert into t8(id,name) values(2,'中国是我心中最好的国家');//error
mysql> alter table t8 modify name varchar(65535);//1:error
mysql> alter table t8 modify name varchar(21845);//2:error
mysql> alter table t8 modify name varchar(21843);//3:error
alter table t8 modify name varchar(21842);
insert into t8(id,name) values(2,'中国是我心中最好的国家');
 select *from t8;




这里我在修改 varcahr大小的时候报了三次错误,

错误1,2上面已经解释过了,但是为什么我明明都已经预留了存放1 - 3 个字节用于记录数据大小的字节数,还是报错误3,那是因为id也在同一行中,也会占字节大小。

char和varcahr比较 

 如何选择定长或变长字符串?

  • 如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号。
  • 如果数据长度有变化,就使用变长(varchar), 比如:名字,地址。
  • 但是你要保证最长的能存的进去。 定长的磁盘空间比较浪费,但是效率高。
  • 变长的磁盘空间比较节省,但是效率低。
  • 定长的意义是,直接开辟好对应的空间。
  • 变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。

 6、日期和时间类型

常用的日期有如下三个:

  • date :日期 'yyyy-mm-dd' ,占用三字节
  • datetime 时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从 1000 到 9999 ,占用八字节
  • timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用 四字节

举例:

 create table t9( time date, time2 datetime, time3 timestamp);
 insert into t9(time,time2) values('1990-2-4','2414-4-2 12:3:23');
 select *from t9;

update t9 set time = '2002-1-1';
select *from t9;

更新了time的数据,其中tiem3时间戳的数据也会更新。 

 7、enum和set

 语法:

enum:枚举,“单选”类型; enum('选项1','选项2','选项3',...);、

该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考 虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,....最多65535 个;当我们添加枚举值时,也可以添加对应的数字编号。

set:集合,“多选”类型; set('选项值1','选项值2','选项值3', ...);

该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率 考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,.... 最多64个。 

 案例:

create table votes( username varchar(20), 
gender enum('男','女'),
 hobby set('跑步','美食','看电影','打球')
);
 insert into votes values('张三','男','跑步');
insert into votes values('李四','女','美食');
insert into votes values('赵六','男','3');
insert into votes values('老陈','1','打球,看电影,跑步');
select * from votes;

为什么我在存存放赵六hobby的时候,填3会存放的是跑步,而填老陈性别写1会是男。

因为这些是存放在放在位图中的,对赵六

爱好有4个所以对应的位图是0000;变1就是有这个爱好

当我们填3--->位图0011。而位图中不就是表示赵六的爱好为跑步和美食。

对来陈

性别有二种:位图为00,变1就是对应的选择(男或者女)

填1--->位图01。位图就表示男。

enum和set的选择 

select * from votes where hobby='美食';

 但是这样我们仅仅查到了有美食爱好的只有李四,赵六不也是有这个爱好吗

因为这语句过滤出了所有"hobby"列值为"美食"的行,如果含义其他的就查出来了。

集合查询使用find_ in_ set函数:

  • find_in_set(sub,str_list) :
  • 如果 sub 在 str_list 中,则返回下标;
  • 如果不在,返回0; str_list 用逗号分隔的字符串。

select * from votes where find_in_set('美食', hobby);

 通过find_in_set就可以找到我们想要的分类。

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

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

相关文章

[力扣 Hot100]Day48 路径总和 III

题目描述 给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到…

ChatGPT 消息发不出去了?我找到解决方案了.

ChatGPT消息发不出去了?我找到解决方案了 今天忽然发现 ChatGPT无法发送消息,能查看历史对话,但是无法发送消息。 猜测原因 出现这个问题的各位,应该都是点击登录后顶部弹窗邀请加入多语言 alapha测试]了,并且语言选择了中文&am…

【JS】APIs:事件流、事件委托、其他事件、页面尺寸、日期对象与节点操作

1 事件流 捕获阶段&#xff1a;从父到子 冒泡阶段&#xff1a;从子到父 1.1 事件捕获 <body> <div class"fa"><div class"son"></div> </div> <script>const fadocument.querySelector(.fa);const sondocument.qu…

【MATLAB】语音信号识别与处理:移动中位数滤波算法去噪及谱相减算法呈现频谱

1 基本定义 移动中位数滤波算法是一种基于中位数的滤波方法&#xff0c;它通过对信号进行滑动窗口处理&#xff0c;每次取窗口内的中位数作为当前点的估计值&#xff0c;以去除噪声。该算法的主要思想是利用中位数的鲁棒性&#xff0c;对信号中的噪声进行有效的消除。 具体来说…

RocketMQ入门指南:从零开始学习分布式消息队列技术

RocketMQ 1. MQ介绍1.1 为什么要用MQ1.2 MQ的优点和缺点1.3 各种MQ产品的比较 2. RocketMQ快速入门2.1 准备工作2.1.1 下载RocketMQ2.2.2 环境要求 2.2 安装RocketMQ2.2.1 安装步骤2.2.2 目录介绍 2.3 启动RocketMQ2.4 测试RocketMQ2.4.1 发送消息2.4.2 接收消息 2.5 关闭Rocke…

【AIGC+VisionPro】空间视频生意的创业者

1. 产品概述 -一款基于人工智能的2D到3D视频/图像转换工具,可将普通的2D视频/图像转换为令人惊艳的3D视觉体验。 - 它支持在PC上进行转换,并输出适用于Meta Quest、Apple Vision Pro等XR设备的3D格式。 2. 产品功能 - 利用尖端的3D AI系统,可将任何视频(Youtube、电影、游戏、…

C++第一弹---C++入门(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 【C详解】 C入门 1、C关键字(C98) 2、命名空间 2.1、命名空间定义 2.2、命名空间使用 3、C输入&输出 4、缺省参数 4.1、缺省参数概念 4.2、缺省参…

《Ubuntu20.04环境下的ROS进阶学习0》

一、逛ROS应用商店 在上一专栏http://t.csdnimg.cn/oGlcu&#xff0c;我们了解了ROS的基本功能。这一专栏将会在此基础上做出进一步拓展学习。那么首先我们要学会下载并阅读别人的代码。常用的两个应用商店一个是ROS的官方应用商店ROS index&#xff0c;另一个就是我们熟知的gi…

基于SpringBoot+MYSQL的房屋租赁系统

1、 前言介绍 社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个用户的使用。互联网具有便利性&#xff0c;速度快&#xff0c;效率高&#xff0c;成本低等优点。 因此&#xff0c…

学校Java的第七天

目录 一、什么是数组 二、作用 三、如何使用数组 1、声明数组变量 2、创建数组 示例&#xff1a; 3、数组的使用 示例&#xff1a; 4、数组的遍历 for循环示例&#xff08;不知道for循环的可以查看我之前发的文章&#xff09; for-each循环&#xff08;也就是增强for…

Visual Studio单步调试中监视窗口变灰的问题

在vs调试中&#xff0c;写了这样一条语句 while((nfread(buf, sizeof(float), N, pf))>0) 然而&#xff0c;在调试中&#xff0c;只要一执行while这条语句&#xff0c;监视窗口中的变量全部变为灰色&#xff0c;不能查看&#xff0c;是程序本身并没有报错&#xff0c;能够继…

每日OJ题_链表⑤_力扣25. K 个一组翻转链表

目录 力扣25. K 个一组翻转链表 解析代码 力扣25. K 个一组翻转链表 25. K 个一组翻转链表 难度 困难 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总…

2024-03-10 c++

&#x1f338; MFC下拉框控件 | Combo Box eg 计算器 1。新建MFC项目&#xff08;基于对话框、静态库&#xff09; 2。添加控件&#xff0c;删除初始的3个多余控件 加3个edit control 加1个combo box&#xff0c;属性sort改为false&#xff0c;data为 ;-;;;% 加1个static text…

invoke()到底是个什么方法???

调用jquery的方法返回属性值 1、invoke&#xff08;‘val’&#xff09; 在form的select下&#xff1a; cy.get(.action-select-multiple).select([apples, oranges, bananas])// when getting multiple values, invoke "val" method first jquery中val方法是用于返…

【c语言 】 函数入门

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

笔记 mysql text 不能设置他的默认值如not null

mysql text 不能设置他的默认值 那么插入时默认值是多少&#xff1f; 在 MySQL 中&#xff0c;TEXT 类型的字段不能直接指定默认值 因此&#xff0c;如果你尝试在创建表时为 TEXT类型的字段指定默认值&#xff0c;MySQL 会抛出错误。 然而&#xff0c;虽然不能在表定义中为 TE…

2024年腾讯云优惠券_云服务器代金券_优惠折扣整理

腾讯云代金券领取渠道有哪些&#xff1f;腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券&#xff0c;大家也可以在腾讯云百科蹲守代金券&#xff0c;因为腾讯云代金券领取渠道比较分散&#xff0c;腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…

【零基础学习01】嵌入式linux驱动中pinctrl和gpio子系统实现

大家好,为了进一步提升大家对实验的认识程度,每个控制实验将加入详细控制思路与流程,欢迎交流学习。 今天给大家分享一下,linux系统里面pinctrl和gpio子系统控制实验,操作硬件为I.MX6ULL开发板。 第一:pinctrl和gpio子系统简介 Linux系统是一个庞大又完善的系统,如果采用…

matlab 基操~

MATLAB基本操作 1. 对象定义 使用sym定义单个对象、使用syms定义多个对象 2. 使用limit求极限 $$ \lim_{v \rightarrow a} f(x) $$ limit(f,v,a) % 使用limit(f,v,a,left)可求左极限 3. 导数 使用diff(f,v,n)对$ f(v)v^{t-1} $求 $ n $ 阶导 $ \frac{d^nf}{d^nv} $&#xf…

【题解】—— LeetCode一周小结10

【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结9 4.用栈实现队列 题目链接&#xff1a;232. 用栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a…