首页 > 数据库 >Mysql--操作

Mysql--操作

时间:2024-09-12 19:52:37浏览次数:11  
标签:varchar 字节 删除 -- 数据库 Mysql 操作 NULL TABLE

目录

数据类型

数据类型的属性

为什么建表时,加not null default '' / default 0

答:不想让表中出现null值.

为什么不想要的null的值

答:(1)不好比较,null是一种类型,比较时,只能用专门的is null 和 is not null来比较.

碰到运算符,一律返回null

(2)效率不高,影响提高索引效果

1、整型
  • MySQL数据类型 含义(有符号)
    tinyint(m) 1个字节 范围(-128~127)
    smallint(m) 2个字节 范围(-32768~32767)
    mediumint(m) 3个字节 范围(-8388608~8388607)
    int(m) 4个字节 范围(-2147483648~2147483647)
    bigint(m) 8个字节 范围(+-9.22*10的18次方)
  • 取值范围如果加了unsigned,则最大值翻倍,如tinyint unsigned的取值范围为(0~256)。
    int(m)里的m是表示SELECT查询结果集中的显示宽度,并不影响实际的取值范围,没有影响到显示的宽度,不知道这个m有什么用。

2、浮点型(float和double)
MySQL数据类型 含义
float(m,d) 单精度浮点型 8位精度(4字节) m总个数,d小数位
double(m,d) 双精度浮点型 16位精度(8字节) m总个数,d小数位

说明:小数类型,也可以加unsigned,但是不会改变数据范围,例如:float(3,2) unsigned仍然只能表示0-9.99的范围。

float和double在不指定精度时,默认会按照实际的精度(由实际的硬件和操作系统决定)来显示设一个字段定义为float(5,3),如果插入一个数123.45678,实际数据库里存的是123.457,但总个数还以实际为准,即6位。

3、定点数(numeric等价于decimal)

以字符串形式存放,比浮点数更精确。定点类型占M+2个字节

浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。
decimal(m,d) 参数m<65 是总个数,d<30且 d<m 是小数位。

4、字符串(char,varchar,_text)
MySQL数据类型 说明 典型声明方式 范围
char 定长字符串 gender Char(1) Char(M)
0<=M<=255
varchar 变长字符串 email varchar(20) 约2w--6w
最多65535个字符(受字符集影响)
text 可变文本串 content text 约2w--6w(受字符集影响)
tinytext 可变长度 最多255个字符
mediumtext 可变长度 最多2的24次方-1个字符
longtext 可变长度 最多2的32次方-1个字符

char和varchar:
1.char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格,varchar不限于此。
2.char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),所以varchar(4),存入3个字符将占用4个字节。
3.char类型的字符串检索速度要比varchar类型的快。

varchar和text:
1.varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字节。
2.text类型不能有默认值。
3.varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用。

哪些情况使用char更好

一,存储很短的信息,比如门牌号码101,201……这样很短的信息应该用char,因为varchar还要占个byte用于存储信息长度,本来打算节约存储的现在得不偿失。

二,固定长度的。比如使用uuid作为主键,那用char应该更合适。因为他固定长度,varchar动态根据长度的特性就消失了,而且还要占个长度信息。

三,十分频繁改变的column。因为varchar每次存储都要有额外的计算,得到长度等工作,如果一个非常频繁改变的,那就要有很多的精力用于计算,而这些对于char来说是不需要的。

5.二进制数据(xxxBLOB和xxxBINARY了解就行)

BINARY和VARBINARY类型类似于CHAR和VARCHAR类型,但是不同的是,它们存储的不是字符字符串,而是二进制串。所以它们没有字符集,并且排序和比较基于列值字节的数值值。当保存BINARY(M)值时,在它们右边填充0x00(零字节)值以达到指定长度。取值时不删除尾部的字节。比较时所有字节很重要(因为空格和0x00是不同的,0x00<空格),包括ORDER BY和DISTINCT操作。比如插入'a '会变成'a \0'

BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。分别与四种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT对应有相同的最大长度和存储需求。在TEXT或BLOB列的存储或检索过程中,不存在大小写转换。BLOB和TEXT列不能有默认值。BLOB或TEXT对象的最大大小由其类型确定,但在客户端和服务器之间实际可以传递的最大值由可用内存数量和通信缓存区大小确定。你可以通过更改max_allowed_packet变量的值更改消息缓存区的大小,但必须同时修改服务器和客户端程序

6.日期时间类型
类型 说明 标准格式 范围
date 日期 YYYY-MM-DD 1000-01-01到9999-12-31
time 时间 HH:MM:SS -838:59:59'和'838:59:59'
datetime 日期时间 YYYY-MM-DD HH:MM:SS '1000-01-01 00:00:00'到'9999-12-31 23:59:59'
year 年份类型 YYYY和YY(不推荐) 1901---2155
timestamp (时间戳)自动存储记录修改时间 YYYY-MM-DD HH:MM:SS “1970-01-01 00:00:01”到“2038-01-19 03:14:07"

若定义一个字段为timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新,所以这个数据类型的字段可以存放这条记录最后被修改的时间。

一般存注册时间、商品发布时间等,不建议使用datetime存储,而是使用时间戳,因为datetime虽然直观,但不便于计算。而且timestamp还有一个重要特点,就是和时区有关。

7.位类型(bit)

BIT数据类型可用来保存位字段值。BIT(M)类型允许存储M位值。M范围为1~64,默认为1。

BIT其实就是存入二进制的值,类似010110。如果存入一个BIT类型的值,位数少于M值,则左补0。如果存入一个BIT类型的值,位数多于M值,MySQL的操作取决于此时有效的SQL模式:如果模式未设置,MySQL将值裁剪到范围的相应端点,并保存裁减好的值。如果模式设置为traditional(“严格模式”),超出范围的值将被拒绝并提示错误,并且根据SQL标准插入会失败。

对于位字段,直接使用SELECT命令将不会看到结果,可以用bin()或hex()函数进行读取。

8.枚举(enum)

MySql中的ENUM是一个字符串对象,其值来自表创建时在列规定中显式枚举的一列值:

可以插入空字符串""和NULL(如果运行NULL的话)如果你将一个非法值插入ENUM(也就是说,允许的值列之外的字符串),如果是严格模式,将不能插入,如果是非严格模式,将选用第一个元素代替,并警告 ENUM最多可以有65,535个成员,需要2个字节存储当创建表时,ENUM成员值的尾部空格将自动被删除

值的索引规则如下:

来自列规定的允许的值列中的值从1开始编号

空字符串错误值的索引值是0

NULL值的索引是NULL

9.集合(set)

SET和ENUM类型非常类似,也是一个字符串对象,里面包含0~64个成员

SET和ENUM存储上有所不同,SET是根据成员的个数决定存储的字节数

SET和ENUM最主要的区别在于SET类型一次可以选择多个成员,而ENUM则只能选择一个

10.特殊的NULL类型

Null类型特征:

(1)所有的类型的值都可以是null,包括int、float等数据类型

(2)空字符串””,不等于null,0也不等于null,false也不等于null

(3)任何运算符,判断符碰到NULL,都得NULL

(4)NULL的判断只能用is null,is not null

(5)NULL 影响查询速度,一般避免使值为NULL

基本操作

DDL

数据库管理

create创建数据库

第二种该方式创建的数据库,会指明创建数据库时使用的字符集
同样该方式创建的数据库,在数据库已经存在的情况下再创建该数据库就会报,如下,同样的错误

第三种该方式创建数据库可以指明创建数据库的字符集
该方式创建的数据库,当数据库不存在时,会创建数据库,但数据库已经存在时,不会创建数据库,同时也不会报错,而是默默的退出,并给予警告,如下:

create database firstDB;/*第一种方式*/
CREATE DATABASE  + 数据库名 CHARACTER SET '设定的字符集';
/* character set 表示设定的字符集是 */
CREATE DATABASE IF NOT EXISTS +数据库名 CHARACTER SET '设置字符集';
/* if not exists 表示 如果不存在 该数据库 创建,已存在不创建 
   character set 设置该数据库的字符集*/

show查看数据库
mysql> show databases;

+--------------------+
| Database           |
+--------------------+
| information_schema |
| firstDB            |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)
alter 修改数据库

alter 命令修改数据库编码:

默认创建的数据库默认不支持中文字符,如果我们需要它支持中文字符,则将它的编码设置为utf8格式:

mysql> ALTER DATABASE testDB CHARACTER SET UTF8;
Query OK, 1 row affected (0.00 sec)
use 使用数据库
mysql> use firstDB;
Database changed
查看当前使用的数据库
mysql> select database();
+------------+
| database() |
+------------+
| firstdb    |
+------------+
1 row in set (0.00 sec)
drop删除数据库
mysql> drop database firstDB;
Query OK, 0 rows affected (0.00 sec)

表管理

create创建表
mysql> create table PEOPLE (
    -> ID int AUTO_INCREMENT PRIMARY KEY,
    -> NAME varchar(20) not null,
    -> AGE int not null,
    -> BIRTHDAY datetime);                                                     
Query OK, 0 rows affected (0.01 sec)
delete删除表
mysql> alter table PEOPLE DROP column star;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0
rename 重命名表名修改表名
mysql> RENAME TABLE PEOPLE TO NEW_PEOPLE;
Query OK, 0 rows affected (0.00 sec)
复制表结构
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
   { LIKE old_tbl_name | (LIKE old_tbl_name) }
复制表结构和数据
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    [(create_definition,...)]
    [table_options]
    select_statement    #将select的结果来作为字段创建新表的字段,但是可能失去属性定义的。

表列管理

添加列

在创建新表时,可以通过CREATE TABLE语句定义列。例如:

CREATE TABLE employees (  
    id INT AUTO_INCREMENT PRIMARY KEY,  
    name VARCHAR(100) NOT NULL,  
    position VARCHAR(100),  
    salary DECIMAL(10, 2)  
);
修改列

当需要修改现有表的列时,可以使用ALTER TABLE语句。这可以包括更改列的数据类型、设置默认值、添加或删除约束等。

更改列的数据类型
ALTER TABLE employees MODIFY COLUMN salary DECIMAL(15, 2);
给列添加默认值
ALTER TABLE employees MODIFY COLUMN position VARCHAR(100) DEFAULT 'Unassigned';
删除列的默认值
ALTER TABLE employees ALTER COLUMN position DROP DEFAULT;
重命名列

注意:MySQL直接不支持重命名列的操作,但可以通过添加一个新列,复制数据,然后删除旧列的方式来实现。

删除列

当某个列不再需要时,可以使用ALTER TABLE语句来删除它。

ALTER TABLE employees DROP COLUMN department;

DML

插入操作

插入数据是向数据库表中添加新记录的操作。可以使用INSERT INTO语句来插入数据

插入单行
  • 表名:指定要插入数据的表名。
  • 列1, 列2, 列3, …:指定要插入数据的列名。
  • 值1, 值2, 值3, …:指定要插入的数据值。
INSERT INTO 表名 (列1, 列2, 列3, ...) VALUES (值1, 值2, 值3, ...);
1
批量插入
INSERT INTO 表名 (列1, 列2, 列3, ...) VALUES (值1, 值2, 值3, ...), (值4, 值5, 值6, ...), ...;

数据更新

单表更新

更新数据是修改数据库表中现有记录的操作。可以使用UPDATE语句来更新数据,语法如下所示:

UPDATE 表名 SET    column_name=value[,column_name2=value2,....] 
[WHERE condition];
  • column_name:要更改的数据列
  • value为修改后的数据,可以为变量、具体值、表达式或者嵌套的SELECT结果
  • condition为筛选条件,如不指定则修改该表所有的列数据
多表更新
1.使用JOIN(MySQL 8.0+)

从MySQL 8.0开始,UPDATE语句支持使用JOIN来同时更新多个表。这使得操作更加直观和高效。

UPDATE table1  
JOIN table2 ON table1.id = table2.table1_id  
SET table1.column1 = value1, table2.column2 = value2  
WHERE condition;

这里,table1table2通过table1.id = table2.table1_id条件进行连接,并同时更新table1table2中的列。

2. 使用子查询

如果你使用的是MySQL的早期版本,或者出于某种原因需要避免使用JOIN,你可以使用子查询来更新一个表,而这个子查询基于另一个表的数据。

UPDATE table1  
SET column1 = (  
    SELECT value  
    FROM table2  
    WHERE table1.id = table2.table1_id  
    LIMIT 1  
)  
WHERE EXISTS (  
    SELECT 1  
    FROM table2  
    WHERE table1.id = table2.table1_id  
);

注意:在这个例子中,使用了LIMIT 1来确保子查询只返回一个值(尽管在连接条件已经确保了一对一关系的情况下这通常是多余的)。同时,EXISTS子句用于确保只更新那些在table2中有对应行的table1中的行。

删除数据(三种删除的区别)

(1)速度上说,drop > truncate > delete

(2) 应用范围。TRUNCATE 只能对TABLE;DELETE可以是table和view

(3) TRUNCATE 和DELETE只删除数据,而不删除表的结构,而DROP则删除整个表(结构和数据)。

(4) TRUNCATE计数值重置。如果想保留标识计数值,请改用 DELETE。

如果要删除表定义及其数据, 请使用 DROP TABLE 语句。

单表删除
DELETE FROM 表名 [WHERE condition];

condition为筛选条件,如不指定则删除该表的所有列数据

delete from result where StudentID=5;

多表删除(truncate命令)

用于完全清空表数据,但表结构、索引、约束等不变

TRUNCATE [TABLE] table_name 

区别于DELETE命令

相同:

都能删除数据,不删除表结构,但TRUNCATE速度更快

不同:

使用TRUNCATE TABLE重新设置AUTO_INCRENENT计数器

标签:varchar,字节,删除,--,数据库,Mysql,操作,NULL,TABLE
From: https://www.cnblogs.com/yangcurry/p/18410930

相关文章

  • 基于python+flask框架的社区健康数据管理系统APP(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在当今社会,随着人们生活水平的提高和健康意识的增强,对健康管理的需求日益迫切。然而,传统的健康管理方式往往依赖于个人自觉或医疗机构的有......
  • [基于 Vue CLI 5 + Vue 3 + Ant Design Vue 4 搭建项目] 05 创建一个 web 项目
    1.通过vuecreate项目名命令创建项目这里创建一个项目名叫做web的项目vuecreateweb选择Manuallyselectfeatures然后摁回车选择了Router和Vuex然后摁回车选择3.x然后摁回车是否使用历史模式,这里y然后摁回车历史模式和非历史模式(Hash模式)主要......
  • Git开发工作流
    1.git基础首先在当前目录下使用gitinit初始化当前仓库gitclone目标git仓库的ssh地址将远程仓库所有文件克隆到本地gitlog/*commit21e227b2a8e7049322c72030e1da307cea542c7e(HEAD->main,origin/main,origin/HEAD)Author:halfmelon<113506319+halfrmon@use......
  • 宝藏级Docker应用推荐(建议NAS/AllinOne用户收藏)
    梳理收集了个人比较常用的Docker应用,这些应用大多免费开源,能极大提高的提高日常工作效率,也能充分榨干家里闲置设备资源,比如NAS、个人PC、主机服务器等。一、家庭娱乐中心类家庭影音、漫画、小说等1、影视类Jellyfin、Emby(个人可以不开通专业版,免费版够用)推荐原因:看电影......
  • [NOIP 2024 模拟2]矩阵学说
    [NOIP2024模拟2]矩阵学说题意给出\(n\)行\(m\)列的矩阵,第\(i\)行第\(j\)列的元素为\(a_{i,j}\),找出满足以下条件的三元组\((i,j,x)\)的数量:\(1≤i≤n\),\(1≤j\lem\),\(1≤x≤\min(n−i+1,m−j+1)\)矩阵的左上角\((i,j)\)到右下角......
  • 安装CentOS 8报的错误
    虚拟机工具:VMware®Workstation16Pro操作系统:CentOS-8.5.2111-x86_64问题描述:安装时出现以下错误。这是个致命错误,安装将中止。DNFerror:ErrorinPOSTTRANSscriptletinrpmpackagekernel-core解决结果:分区的时候将"/boot"设置为不少于300M。......
  • 【开题报告】基于django+vue校园二手交易平台(论文+程序)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着数字化时代的到来,校园生活的便捷性与资源循环利用意识日益增强。在各大高校中,学生群体对二手物品的需求与供给均呈现出显著增长态势。......
  • [基于 Vue CLI 5 + Vue 3 + Ant Design Vue 4 搭建项目] 03 使用 npm 安装依赖出现 ce
    文章目录问题描述解决问题1.修改镜像源2.清理缓存3.临时禁用SSL证书验证4.再次安装依赖问题描述在使用npminstall进行按安装依赖的时候出现了下面错误npmerrorcodeCERT_HAS_EXPIREDnpmerrorerrnoCERT_HAS_EXPIREDnpmerrorrequesttohttps://registr......
  • [NOIP 2024 模拟2]数组操作
    [NOIP2024模拟2]数组操作题意有\(n+2\)个整数\(a_0,a_1,...,a_n,a_{n+1}\),\(a_0=a_{n+1}=0\)。你需要做确切地\(n\)次操作,每次数组操作为以下形式:选择一个整数\(x\)满足\(a_x\ne0\),使得\(a_x=0\),令\(l=\max_{i<x,a_i=0}i,r=\min_{i>x,a_i=0}i\)......
  • 深度学习介绍
    文章目录一、定义与核心二、工作原理三、优缺点1.优点2.缺点深度学习(DeepLearning,DL)是机器学习(MachineLearning,ML)领域中一个重要的研究方向,旨在通过模拟人脑中的神经网络结构,解决复杂的问题。一、定义与核心定义:深度学习是一种试图使用包含复杂结构或......