MySQL下对[表]的操作数据类型

news2025/1/12 10:02:24

目录

表的操作

创建表:

 查看表结构:

修改表:

删除表:

数据类型 

 数据类型分类:

数值类型: 

tinyint类型越界测试:

 bit类型:

小数类型:

字符串类型: 

char:

varchar:

char和varchar对比:

日期和时间类型:

enum和set:

使用find_in_set函数:


表的操作

创建表:

语法:

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

 说明:

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

例如:

create  table users (
 id int,
 name varchar(20) comment '用户名',
 password char(32) comment '密码是32位的md5值',
 birthday date comment '生日'
) character set utf8 engine MyISAM;

 说明:

  • 不同的存储引擎,创建的表文件不一样。

users表存储引擎是MyISAM在数据目录中有三个不同的文件,分别是:

  • users.frm:表结构
  • users.MYD:表数据
  • users.MYI :表索引

 

 查看表结构:

desc 表名;

 

修改表:

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

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表中添加两条记录
mysql> insert into users values(1,'a','b','1900-11-14'),(2,'b','c','1999-09-
09');
  • 在users表添加一个字段,用于保存图片路径
mysql> alter table users add assets varchar(100) comment '图片路径' after
birthday;
  •  修改users表中的users字段长度改成60
mysql> alter table users modify name varchar(60);

mysql> desc users;
+----------+--------------+------+-----+---------+-------+
| Field    | Type        | Null    | Key   | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id       | int(11)     | YES |   | NULL  |         |
| name     | varchar(60) | YES |   | NULL  |         |<= 长度变成60
| password | char(32)    | YES |   | NULL  |         |
| birthday | date        | YES |   | NULL  |         |
| assets   | varchar(100)| YES |   | NULL  |         |
+----------+--------------+------+-----+---------+-------+
  • 删除password列 
mysql> alter table users drop password;

mysql> desc users;
+----------+--------------+------+-----+---------+-------+
| Field    | Type        | Null    | Key   | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id       | int(11)     | YES |   | NULL  |         |
| name     | varchar(60) | YES |   | NULL  |         |<= 长度变成60
| birthday | date        | YES |   | NULL  |         |
| assets   | varchar(100)| YES |   | NULL  |         |
+----------+--------------+------+-----+---------+-------+
  • 修改表名为employee 
mysql> alter table users rename to employee;
  •  将name列修改为xingming
mysql> alter table employee change name xingming varchar(60); --新字段需要完整定义
mysql> alter table users modify name varchar(60);

mysql> desc users;
+----------+--------------+------+-----+---------+-------+
| Field    | Type        | Null    | Key   | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id       | int(11)     | YES |   | NULL  |         |
| xingming | varchar(60) | YES |   | NULL  |         |<= 长度变成60
| birthday | date        | YES |   | NULL  |         |
| assets   | varchar(100)| YES |   | NULL  |         |
+----------+--------------+------+-----+---------+-------+

删除表:

语法:

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

例子:

drop table t1;

数据类型 

 数据类型分类:

数值类型: 

tinyint类型越界测试:

mysql> create table tt1(num tinyint);
Query OK, 0 rows affected (0.02 sec)

mysql> insert  into tt1 values(1);
Query OK, 1 row affected (0.00 sec)

mysql> insert  into tt1 values(128); -- 越界插入,报错
ERROR 1264 (22003): Out of range value for column 'num' at row 1
  • 在MySQL中,整型可以指定是有符号和无符号,默认有符号 
  • 可以通过UNSIGNED来说某个字段是无符号的

 bit类型:

语法:

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

例如:

mysql> create table tt4 ( id int, a bit(8));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into tt4 values(10, 10);
Query OK, 1 row affected (0.01 sec)

mysql> select * from tt4; #发现很怪异的现象,a的数据10没有出现
+------+------+
| id  | a     |
+------+------+
|  10 |       |
+------+------+
1 row in set (0.00 sec)

注意事项:

  • bit字段在显示的时候,是按照ASCII码对应的值显示 
mysql> insert into tt4 values(65, 65);

mysql> select * from tt4;
+------+------+
| id  | a     |
+------+------+
|  10 |       |    
|  65 | A     |
+------+------+
  • 如果有这样的值,只存放0或1,这是可以定义bit(1)。可以节省空间 
mysql> create table tt5(gender bit(1));
mysql> insert into tt5 values(0);
Query OK, 1 row affected (0.00 sec)

mysql> insert into tt5 values(1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into tt5 values(2); -- 当插入2时,已经越界了
ERROR 1406 (22001): Data too long for column 'gender' at row 1

小数类型:

float语法:

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

例如:

mysql> create table tt6(id int, salary float(4,2));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into tt6 values(100, -99.99);
Query OK, 1 row affected (0.00 sec)

mysql> insert into tt6 values(101, -99.991); #多的这一点被拿掉了
Query OK, 1 row affected (0.00 sec)

mysql> select * from tt6;
+------+--------+
| id  | salary  |
+------+--------+
|  100 | -99.99 |
|  101 | -99.99 |
+------+--------+
2 rows in set (0.00 sec)

 

decimal语法:

decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
  • decimal(5,2),表示的范围就是-999.99 ~ 999.99
  • decimal(5,2),unsigned表示的范围就是 0 ~ 999.99
  • decimal和float很像,但是有区别,他们表示的精度不一样
mysql> create table tt8 ( id int, salary float(10,8), salary2 decimal(10,8));

mysql> insert into tt8 values(100,23.12345612, 23.12345612);
Query OK, 1 row affected (0.00 sec)

mysql> select * from tt8;
+------+-------------+-------------+
| id   | salary      | salary2     |
+------+-------------+-------------+
|  100 | 23.12345695 | 23.12345612 | # 发现decimal的精度更准确,因此如果我们希望某
+------+-------------+-------------+ # 个数据表示高精度,选择decimal

说明:

  • float表示的精度大约是7位
  • decimal整数最大位数m为65,支持小数最大位数d时30.d的缺省为0,m的缺省为10 

字符串类型: 

char:

语法: 

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

例子:

mysql> create table tt9(id int, name char(2));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into tt9 values(100, 'ab');
Query OK, 1 row affected (0.00 sec)

mysql> insert into tt9 values(101, '中国');
Query OK, 1 row affected (0.00 sec)

mysql> select * from tt9;
+------+--------+
| id  | name    |
+------+--------+
|  100 | ab     |
|  101 | 中国    |
+------+--------+

varchar:

语法:

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

例子:

mysql> create table tt10(id int ,name varchar(6)); --表示这里可以存放6个字符

mysql> insert into tt10 values(100, 'hello');

mysql> insert into tt10 values(100, 'world');

mysql> select * from tt10;
+------+--------------------+
| id  | name                |
+------+--------------------+
|  100 | hello              |
|  100 | world              |
+------+--------------------+

说明:

关于varchar(len),len到底多大这个和表的编码相关

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

char和varchar对比:

实际存储char(4)       varchar(4)char占用字节varchar占用字节
abcdabcdabcd4*3=124*3+1=13
AAA4*3=121*3+1=4
AbcdeXX超过长度超过长度

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

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

 

日期和时间类型:

常用的日期有如下三个:

  • date :日期 'yyyy-mm-dd' ,占用三字节
  • datetime 时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从 1000 到 9999 ,占用八字节
  • timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字
//创建表
mysql> create table birthday (t1 date, t2 datetime, t3 timestamp);
Query OK, 0 rows affected (0.01 sec)

//插入数据:
mysql> insert into birthday(t1,t2) values('1997-7-1','2008-8-8 12:1:1'); --插入两种时间
Query OK, 1 row affected (0.00 sec)

mysql> select * from birthday;
+------------+---------------------+---------------------+
| t1         | t2                  | t3                  |
+------------+---------------------+---------------------+
| 1997-07-01 | 2008-08-08 12:01:01 | 2024-01-17 18:28:55 |--添加数据时,时间戳自动补上当前时间
+------------+---------------------+---------------------+


//更新数据
mysql> update birthday set t1='2000-1-1';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from birthday;
+------------+---------------------+---------------------+
| t1         | t2                  | t3                  |    
+------------+---------------------+---------------------+
| 2000-01-01 | 2008-08-08 12:01:01 | 2017-11-12 18:32:09 | -- 更新数据,时间戳会更新成当前时间
+------------+---------------------+---------------------+

enum和set:

  • enum:枚举,"单选"类型;
  • enum("选项1","选项2","选项3",..);

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

  • set:集合,"多选"类型;
  • set('选项1','选项2','选项3',...);

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

所以:不建议在添加枚举值和集合值的时候采用数字的方式,不利于阅读


例如:有一个调查表votes,需要调查人的喜好, 比如(登山,游泳,篮球,武术)中去选择(可以多选),(男,女)[单选]

mysql> create table votes(
     -> username varchar(30),
     -> hobby set('登山','游泳','篮球','武术'), --注意:使用数字标识每个爱好的时候,想想Linux权限,采用比特位位置来个set中的爱好对应起来

     -> gender enum('男','女'));   --注意:使用数字标识的时候,就是正常的数组下标
        Query OK, 0 rows affected (0.02 sec)

这里设置字符型,其实枚举值和集合值在Linux后都是有数字(key)映射

对于enum有点像 enum[0]  = '男',enum[1]  = '女'

对月set有点像 set[1] = '登山' ,set[2] = '游泳',set[4] = '篮球' ,set[8] = '武术' ;

可以参考这种来理解---

插入数据:

insert into votes values('雷锋', '登山,武术', '男');
insert into votes values('Juse','登山,武术',2);
select * from votes where gender=2;
+----------+---------------+--------+
| username | hobby     | gender     |
+----------+---------------+--------+
| Juse     | 登山,武术  | 女         |
+----------+---------------+--------+

假如有以下数据:

+-----------+---------------+--------+
| username | hobby     | gender |
+-----------+---------------+--------+
| 雷锋     |  登山,武术 | 男      |    
| Juse     | 登山,武术  | 女     |
| LiLei    | 登山      | 男      |
| LiLei    | 篮球      | 男      |
| HanMeiMei| 游泳      | 女      |
+-----------+---------------+--------+

 那么使用下面查询语句:

mysql> select * from votes where hobby='登山';
+----------+--------+--------+
| username | hobby | gender  |
+----------+--------+--------+
| LiLei    |登山    | 男     |
+----------+--------+--------+

不能够查所有爱好为登山的人,只能查出来爱好只有登山 的人

使用find_in_set函数:

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

mysql> select find_in_set('a', 'a,b,c');
+---------------------------+
| find_in_set('a', 'a,b,c') |
+---------------------------+
|             1 |
+---------------------------+
mysql> select find_in_set('d', 'a,b,c');
+---------------------------+
| find_in_set('d', 'a,b,c') |
+---------------------------+
|             0 |
+---------------------------+

 那么现在查询爱好登山的人:

mysql> select * from votes where find_in_set('登山', hobby);
+----------+---------------+--------+
| username | hobby     | gender   |
+----------+---------------+--------+
| 雷锋      | 登山,武术 | 男       |
| Juse     | 登山,武术  | 女       |   
| LiLei    | 登山       | 男      |
+----------+---------------+--------+

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

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

相关文章

JAVA中 Lambda 方法引用 算法

算法和数据结构 一、Arrays类 接下来学习的类叫做Arrays&#xff0c;其实Arrays并不是重点&#xff0c;但是我们通过Arrays这个类的学习有助于我们理解下一个知识点Lambda的学习。所以我们这里先学习Arrays&#xff0c;再通过Arrays来学习Lamdba这样学习会更丝滑一些_. 1.1 …

【Qt Quick 项目(第一集Qt Quick UI 项目项目创建)】

# Qt Quick 项目 到底什么是Qt Qml、什么是Qt Quick、QtQuick应用程序与Qt Widget程序有何区别,为了让读者在学习QML之前有一个整体认识,这里先介绍几个Quick项目。 01 Qt Quick UI 项目

Java8的Stream最佳实践

从这一篇文章开始&#xff0c;我们会由浅入深&#xff0c;全面的学习stream API的最佳实践&#xff08;结合我的使用经验&#xff09;&#xff0c;本想一篇写完&#xff0c;但写着写着发现需要写的内容太多了&#xff0c;所以分成一个系列慢慢来说。给大家分享我的经验的同时&a…

【博士每天一篇论文-技术综述】Machine Learning With Echo State Networks 一篇系统讲解ESN知识的五星文章

阅读时间&#xff1a;2023-11-21 1 介绍 年份&#xff1a;2020 作者&#xff1a;徐元超&#xff0c;曼尼托巴大学 期刊&#xff1a; 无 引用量&#xff1a;无 这篇文章是一篇技术报告&#xff0c;从递归神经网络&#xff08;RNNs&#xff09;引入到回声状态网络&#xff08;…

JavaScript基础之JavaScript简介(什么是JavaScript?)

JavaScript简介 JavaScript&#xff0c;通常被缩写为JS&#xff0c;是一种轻量级、跨平台、单线程、解释编译的编程语言。它也被称为网页脚本语言。它以网页开发而闻名&#xff0c;许多非浏览器环境也使用它。 JavaScript是一种弱类型语言。JavaScript可用于客户端开发以及服…

shell编程学习

shell编程学习 变量的高级用法变量替换字符串处理获取字符索引获取子串长度抽取字符串中的子串 案例测试 变量的高级用法 变量替换 ##变量替换&#xff08;贪婪&#xff0c;从前往后匹配&#xff0c;匹配到进行删除&#xff09; test1I love you,you love me echo $test1 han…

Java研学-spring框架(一)

一 概述 1 介绍 Spring框架是一个开源的Java EE应用程序框架&#xff0c;旨在简化Java企业级应用的开发难度和开发周期&#xff0c;主要通过控制反转&#xff08;IoC&#xff09;和面向切面编程&#xff08;AOP&#xff09;等技术实现。   容器&#xff08;Container&#x…

【CVE-2022-22733漏洞复现】

Apache ShardingSphere ElasticJob-UI漏洞 漏洞编号:CVE-2022-22733 文档说明 本文作者:SwBack 创作时间:2024/1/21 19:19:19 知乎:https://www.zhihu.com/people/back-88-87 CSDN:https://blog.csdn.net/qq_30817059 百度搜索: SwBack漏洞描述 Apache ShardingSphere Elast…

Python基础第二篇(Python基础语法)

文章目录 一、字面量二、注释三、变量四、数据类型五、数据类型转换六、标识符七、运算符八、字符串扩展内容&#xff08;1&#xff09;字符串定义&#xff08;2&#xff09;字符串拼接、&#xff08;3&#xff09;字符串格式化&#xff08;4&#xff09;字符串格式化的精度控制…

上位机图像处理和嵌入式模块部署(开篇)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 图像处理是现实生活当中很实用的一门技术。工业上一般采用的是机器视觉&#xff0c;以传统算法和光源控制为主&#xff0c;部分采用了深度学习技术…

MySQL的下载、安装、配置、登录,配置(图+文)(超级详细)

一、 软件的下载 1. 下载地址 官网&#xff1a; https://www.mysql.com 2. 打开官网&#xff0c;点击 DOWNLOADS 然后&#xff0c;点击 MySQL Community(GPL) Downloads 3. 点击 MySQL Community Server 4. 在 General Availability(GA) Releases 中选择适合的版本 …

【C语言基础篇】结构控制(下)转向语句break、continue、goto、return

文章目录 一、break语句 1. break在 while 循环中 2. break在 for 循环中 3. break在 do…while 循环中 4. break在 switch 语句中 5. break 总结 二、continue语句 1. continue在 while 循环中 2. continue在 for 循环中 3. continue在 do...while 循环中 4. con…

Kubernetes网络模型概述

Kubernetes网络模型设计的一个基础原则是&#xff1a;每个Pod都拥有一个独立的IP地址&#xff0c;并假定所有Pod都在一个可以直接连通的、扁平的网络空间中。所以不管这些Pod是否运行在同一个Node中&#xff0c;都要求它们可以直接通过对方的IP进行访问。由于Kubernetes的网络模…

C++泛型编程-类模板的项目实战实现基础的Vector的编写

请设计一个数组模板类&#xff08; Vector &#xff09;&#xff0c;完成对 int 、 char 、 float 、 double 以 及任意的自定义类等类型元素进行管理。 需求 a. 实现构造函数 b. 实现拷贝构造函数 c. 实现 cout << 操作 d. 实现下标访问符 [] 的重载操作 …

中仕教育:应届生可以考军队文职吗?有什么要求?

军队文职&#xff0c;涵盖了各个领域&#xff0c;包括行政、管理、人力资源、后勤等工作岗位&#xff0c;作为国家公务员的一种类型&#xff0c;军队文职同样享有稳定的工作和待遇。 虽然军队文职对所有符合条件的人开放&#xff0c;但对于应届生来说&#xff0c;还需满足以下…

企业Oracle1 数据库管理

Oracle的安装 一、基础表的创建 1.1 切换到scott用户 用sys 账户 登录 解锁scott账户 alter user scott account unlock;conn scott/tiger;发现并不存在scott账户&#xff0c;自己创建一个&#xff1f; 查找资料后发现&#xff0c;scott用户的脚本需要自己执行一下 C:\ap…

Spring:StopWatch

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、输出总耗时 二、输出所有任务的耗时和占比 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、输出总耗时 public void stopWatc…

【web 编程技术】基于 B/S 架构的电商平台(java web)

基于 B/S 架构的电商平台&#xff08;java web&#xff09; 课程设计实验目的课程设计实验环境课程设计功能概述课程设计需求分析三层架构图功能列表系统用例图系统活动图-用户端需求分析 课程设计详细设计实现过程数据库BaseServlet 的实现商品显示模块-分页显示所有商品、查看…

【网站项目】基于SSM的274办公自动化管理系统

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

安全防御-基础认知

目录 安全风险能见度不足&#xff1a; 常见的网络安全术语 &#xff1a; 常见安全风险 网络的基本攻击模式&#xff1a; 病毒分类&#xff1a; 病毒的特征&#xff1a; 常见病毒&#xff1a; 信息安全的五要素&#xff1a; 信息安全的五要素案例 网络空间&#xff1a…