当前位置: 首页 > news >正文

【MySQL】数据库基础

目录

连接MySQL服务器

什么是数据库

SQL分类

库的操作

创建数据库

系统编码

查看数据库编码集

查看数据库校验集 

查看数据库支持的字符集

修改数据库

删除数据库 

确认当前是在哪个数据库

备份和恢复

查看当前有谁在使用数据库

表操作

创建表

查看表结构 

​编辑

修改表

修改表名

新增列

修改列属性

删除列

数据类型

数值类型

BIT类型

小数类型

decimal

字符串类类型

char类型

varchar类型

char和varchar比较 

日期和时间类型

枚举类型 

enum

set


连接MySQL服务器

mysql -h 127.0.0.1 -P 3306 -u root -p
  1. -h:指明登录部署了mysql服务的主机
  2. -P:指明我们要访问的端口号
  3. -u:指明登录用户
  4. -p:指明需要输入密码

什么是数据库

问题抛出:存储数据使用文件就可以了,为什么还需要使用数据库?

文件保存数据有以下几个缺点:

  1. 文件的安全性问题
  2. 文件不利于数据查询和管理
  3. 文件不利于存储海量数据
  4. 文件在程序中控制不方便

一般的文件确实已经提供了数据的存储功能,但是文件没有提供非常好的数据管理能力,数据库的本质就是对数据内容存储的一套解决方案,得到字段或者要求,返回结果即可。

  1. mysql是数据库服务的客户端
  2. mysqld是数据库服务的服务器端

mysql是一套提供数据存取服务的网络程序,本质是基于C(mysql)S(mysqld)模式的一种网络服务。

数据库一般指的是,在磁盘或内存中存储的特定结构组织的数据。

SQL分类

1、DDL:数据定义语言,用来维护存储数据的结构,代表指令:create、drop、alter

2、DML:数据操纵语言,用来对数据进行操作,代表指令:insert、delete、update。

  • DML中又单独分了一个DQL:数据查询语言,代表指令select

3、DCL:数据控制语言,主要负责权限管理和事务,代表指令:grant、revoke、commit

库的操作

创建数据库

CREATE DATABASE IF NOT EXISTS db_name;

系统编码

创建数据库的时候,有两个编码集:

  1. 数据库编码集 ---  数据库未来存储数据采用的编码集。
  2. 数据库校验集 ---  数据库进行字段比较使用的编码,本质上也是一种读取数据库中数据采用的编码格式。

数据库无论对数据做任何操作,都必须保证操作和编码必须是编码一致的。

查看数据库编码集
show variables like 'character_set_database';

可以看到,目前我们数据库的编码集是utf8的。 

查看数据库校验集 
show variables like 'collation_database'

结果如下: 

查看数据库支持的字符集
show charset;

这里只展示部分结果:

当我们在创建数据库时没有指定字符集和校验规则时,系统使用默认字符集:utf8,校验规则:utf8_general_ci

  • 创建一个使用utf8字符集的名为'db2'的数据库
#第一种方法
create database db2 charset=utf8;
#第二种方法
create database db2 charset set utf8;
  • 创建一个使用utf字符集,并带校对规则的'db3'数据库。
create database db3 charset=utf8 collate utf8_general_ci;

utf8_general_ci校验集不区分大小写。

修改数据库

修改数据库的编码集和校验集

alter database test1 charset=gbk collate gbk_chinese_ci;

删除数据库 

DROP DATABASE IF EXISTS db_name;

确认当前是在哪个数据库

SELECT DATABASE();

备份和恢复

备份

mysqldump -P3306 -u root -p -B 数据库名 > 数据库备份存储的文件路径;

如果备份的是张表 

mysqldump -P3306 -u root -p -B 数据库名 表名1 表名2 > 数据库备份存储的文件路径;

还原

source 文件路径名(.sql结尾的文件);

查看当前有谁在使用数据库

show processlist;

表操作

创建表

语法:

CREATE TABLE table_name(

        field1 datatype,

        field2 datatype,

        field3 datatype

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

说明:

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

查看表结构 

desc 表名 ;

结果如下: 

修改表

修改表名

alter table 原表名 rename to 新表名;

  • to可省略。

新增列

alter table 表名 add 新增列名 类型 comment '备注' after 列名(新增列名放到哪一列的后面);

修改列属性

第一种方法:

alter table 表名 modify 列名 新改的类型;

  • modify会把对应的列名原本的属性全部覆盖

第二种方法:

alter table 表名 change column 原来的列名 新的列名 新列的属性

删除列

alter table 表名 drop 列名;

  • 删除列需要谨慎,对应的列数据也会被删除。

数据类型

数值类型

类型字节最小值最大值
带符号的/无符号的带符号的/无符号的
TINYINT1-128127
TINYINT UNSIGNED0255
SMALLINT2-3276832767
                065535
MEDIUMINT3-838860883688607
016777215
INT4-21474836482147483647
04294967295
BIGINT8-92233720368547758089223372036854775807
018446744073709551615

BIT类型

语法:

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

小数类型

语法:

float [(m,d)] [unsigned]:

  • M指定显示的长度(包含小数位数,整数部分长度=M-d)
  • d指定小数位数
  • 占用空间4个字节
  • float(4,2)范围是-99.99~99.99,如果指定unsigned,直接将[-99.99,0]变成非法数据,不进行扩展。
  • 如果不指定(m,d),直接使用float,当精度到达一定长度(正常是7位)或整体长度过长时,会损失精度。

当多出的位数是小数部分的话, 会进行四舍五入,比如

float (4,2);  90.976  插入可以成功,会四舍五入称90.98,在-99.99~99.99范围内,会进行四舍五入。

但是当99.996时四舍五入会变成100.00超出指定长度,导致插入失败。

decimal

语法:

decimal (m,d) [unsigned]

  • 定点数m指定长度
  • d表示小数点后的位数
  • 有效规避float的精度损失
  • decimal整数最大位数m为65,支持最大位数d是30,如果d省略,默认0,m省略,默认10

字符串类类型

char类型

语法:

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

varchar类型

语法:

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

  • varchar(len),len值和表的编码密切相关,len是指定最大分配的大小,在len范围内,用多少给多少。而char是固定大小,你指定多少,就给多少。
  • varchar长度可以指定0到65535之间的值,但是有1-3字节用于记录数据大小(也就是varchar有效数据长度),所以实际有效字节数是65532。
  • 使用utf8编码时,varchar(n)的参数n最大值65532/3=21844(因为utf8一个字符占3个字节)。
  • 使用gbk编码时,varchar(n)的参数n最大值65532/2=32766(因为gbk一个字符占2个)。
char和varchar比较 
实际存储char(4)varchar(4)char占用字节varchar占用字节
abcdabcdabcd4*3=124*3+1=13(+多少取决于字符长度,这里只有12,用1字节表示即可)
AAA4*3=121*3+1=4
  • 如果确定长度一样,就是用定长(char),比如身份证号。
  • 如果数据长度有变化,就使用变长,比如:名字。
  • 定长的磁盘空间比较浪费,但是效率高。
  • 边长的磁盘空间比较节省,但是效率低。

日期和时间类型

  1. date:日期'yyyy-mm-dd',占用三字节。
  2. datetime:时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从1000到9999,占用八字节。
  3. timestamp:时间戳,从1970年开始, 'yyyy-mm-dd HH:ii:ss'格式与datetime一致,占用四字节。

第一种和第二种需要程序员自己以字符串的形式输入数据,timestamp会自动更新。

枚举类型 

enum

enum:枚举,“单选”类型。

语法:

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

  • 插入值时,除了直接插入选项值以外,也可以直接插入选项值下标(从1开始)

set

set:集合,“多选”类型。

语法:

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

  • 插入方式:insert into 表名 values ('选项1,选项2,选项3')
  • 也可以不使用选项值,传入相应比特位为1的数字(比如传入3,011第一个爱好和第二个爱好被选择),也就是用位图的方式,0表示空串不会显示NULL,1表示对应选项1
  • enum和set可以为空,不插入值,显示为NULL

如果要查找set类型中包含某种选项的数据,使用find_in_set函数

示例:

select * from votes where find_in_set('羽毛球',hobby);

  • votes为表名
  • hobby为set集合类型的字段
  • 查询爱好有羽毛球

相关文章:

  • 【计算机网络】TCP
  • Android 蓝牙OTA固件升级
  • Yashan SQL语句
  • OSCP最新备考攻略:迎接2024改版后的OSCP+认证
  • STM32-I2C通信协议
  • 苦瓜书盘官网,免费pdf/mobi电子书下载网站
  • SyntaxError: Unexpected identifier
  • 期权帮|中证1000股指期权交割结算价怎么算?
  • WEB登录认证与鉴权
  • (七)企业级高性能 WEB 服务 - HTTPS 加密
  • C语言_数据结构总结4:不带头结点的单链表
  • fopen
  • 简单的二元语言模型bigram实现
  • Maxbotix超声波测距传感器:高灵敏度与抗干扰能力,确保复杂环境中的稳定性能
  • 一周学会Flask3 Python Web开发-SQLAlchemy简介及安装
  • 4.归一化技术:深度网络中的关键优化手段——大模型开发深度学习理论基础
  • R语言使用scitable包交互效应深度挖掘一个陌生数据库
  • 数字化转型的点、线、面、体
  • 基于磁数据的伤痕、生锈、断丝分类训练平台搭建规划
  • 单细胞的一组基因或富集分数的高低表达分组差异分析作图教程
  • 自己写的网页怎么发布到网上/长沙seo袁飞
  • 简单网站首页/关键词排名方法
  • 网站做伪静态/活动营销
  • 县总工会网站建设情况介绍/免费舆情监测平台
  • 铜仁市建设招投标网站/推广seo优化公司
  • 文化馆网站建设/今日新闻热点10条