[SQL Statements] 基本的SQL知识 之DDL针对表结构和表空间的基本操作

news2024/10/2 6:39:38

[SQL Statements] 基本的SQL知识 之DDL针对表结构和表空间的基本操作

什么是数据库的表以及表空间

在MySQL中,一个数据库可以包含多个表,每个表是由若干个列(column)和行(row)组成的。表是存储数据的基本单位,用于组织、管理和存储数据。

MySQL中的表空间(Tablespace)是一个逻辑存储单元,它是由若干个数据文件(data files)组成的。表空间用于存储表和索引数据,每个表和索引都有一个关联的表空间。在MySQL中,每个表和索引都必须属于一个表空间,而每个表空间可以包含多个表和索引。

MySQL中的表空间有两种类型:系统表空间和用户表空间。系统表空间是MySQL内部使用的表空间,包括InnoDB的数据文件和redo log文件。用户表空间是由用户创建的,用于存储用户定义的表和索引数据。

在MySQL中,创建表时可以指定它所属的表空间。如果没有指定表空间,则会使用默认的表空间。

你可以这样理解数据库中的表,可以简单地理解这就是一个excel表格,而表空间就是一个或多个表组成一个表空间。

我们常说的一个表中有多个字段,这个字段其实就表示一列。

如图所示:

在这里插入图片描述

其中,表结构规定了这一列存放什么类型的数据,这就涉及到表的设计了。

如何进行表结构设计?

设计的主要步骤如下:
  1. 确定表的目的和需求:确定表的用途和需求,包括需要存储哪些数据、如何组织数据等方面的内容。
  2. 确定表的列和数据类型:确定表的列,包括列名、数据类型、长度、是否允许为空等属性。通常需要根据数据的类型和业务需求进行选择。
  3. 设计表的主键和索引:主键是用于标识表中每个记录的唯一标识符,通常使用自增长整数作为主键。索引可以提高查询性能,通常需要根据查询需求设计相应的索引。
  4. 设计表的约束:约束用于限制表中数据的取值范围,包括主键约束、唯一约束、非空约束、默认值约束等。
  5. 设计表之间的关系:如果有多个表需要进行关联,需要确定表之间的关系,包括一对一、一对多和多对多关系。
  6. 进行数据类型和范式的优化:对于大型和复杂的数据库,需要进行数据类型和范式的优化,以提高性能和减少数据冗余。
  7. 进行表的命名和注释:为表设置一个有意义的名称,并对表进行适当的注释,以方便后续的管理和维护。

在进行表结构设计时,需要根据具体的业务需求和数据库规模进行调整。同时,需要遵循一定的设计原则,如避免数据冗余、优化数据类型、保持表的一致性和正确性等。

举例

假设我们需要创建一个简单的学生信息管理系统,包括以下两个表:学生信息表和课程成绩表。

  1. 学生信息表包括以下列:
  • 学生ID(student_id):整数类型,作为主键
  • 学生姓名(student_name):字符串类型,最大长度为50
  • 学生年龄(student_age):整数类型
  • 学生性别(student_gender):字符串类型,最大长度为10
  • 学生专业(student_major):字符串类型,最大长度为50
  1. 课程成绩表包括以下列:
  • 成绩ID(score_id):整数类型,作为主键
  • 学生ID(student_id):整数类型,作为外键关联学生信息表中的学生ID列
  • 课程名称(course_name):字符串类型,最大长度为50
  • 课程成绩(course_score):浮点数类型

对于学生信息表和课程成绩表之间的关系,我们可以使用一对多关系,即一个学生可以对应多个成绩。在这种情况下,学生信息表中的学生ID列作为主键,课程成绩表中的学生ID列作为外键。同时,我们需要在学生ID列上创建索引,以提高查询性能。

为了遵循设计原则,我们可以将学生姓名、年龄、性别和专业信息拆分成一个独立的表,从而避免数据冗余。此外,我们还可以将学生信息表和课程成绩表拆分成不同的表空间,以便于管理和维护。最后,我们可以为表设置有意义的名称和注释,如学生信息表(students)和课程成绩表(scores),以方便后续的管理和维护。

查看某个数据库中有哪些表

使用show tables;

例如,我在test2数据库下查看我有哪些表

在这里插入图片描述

数据类型

在去创建表之前,我们需要知道mysql中有哪些数据类型,以方便创建指定的字段时使用正确的数据类型进行存储

数字类型

数字类型数据主要包括两种,和其他编程语言的数据类型一样,分为精确数和浮点数。

这每种数据类型均可以指定参数,用来表示这个数有多长

精确数

又分为两种:整数(integer) 和 定点数(Fixed-Point)

Integer类型 - INTEGER, INT, SMALLINT, TINYINT,MEDIUMINT, BIGINT

类型字节长度最小值无符号情况下最小值最大值无符号情况下最大值
TINYINT1-1280127255
SMALLINT2-3276803276765535
MEDIUMINT3-83886080838860716777215
INT 最常用4-2147483648021474836474294967295
BIGINT8-2^6302^63 -12^64 -1

定点数据 - DECIMAL, NUMERIC

存在这种固定的数据是很有必要的,在需要保持精确度很高的情况下就得用到这种类型,例如用户的金钱余额、交易金额等数据,就必须要保持极高的数据准确的。对于这种数据采用浮点显然不合适,因此需要用到定点数据

在MySQL里面,NUMERIC类型的实现就是DECIMAL.

DECIMAL:可以指定 精度和小数位

例如:对于薪资(salary)这一列,设置精度为6,小数位为2的数据类型

salary DECIMAL(6,2) 这意味着该字段的数据存储范围是 -9999.99 到 9999.99

标准SQL中的 DECIMAL(M) 等价于 DECIMAL(M,0) ,MySQL支持这两种写法

浮点类型 - FLOAT, DOUBLE

和其他编程语言的一样,表示的数据是一个近似值,没有特别特别要求精确的小数就用这种类型

FLOAT:单精度 4byte

DOUBLE: 双精度 8byte

位值类型 - BIT

用来存储1位的值 范围1~64

对于上述数据类型,最容易出现的问题便是,超出范围和溢出

当MySQL将一个值存储在列数据类型的允许范围之外的数字列中时,该结果取决于当时有效的SQL模式:

  • 如果启用了严格的SQL模式,则MySQL将拒绝带有错误的超出范围的值,并且按照SQL标准,插入将失败。
  • 如果没有启用限制性模式,MySQL会将该值剪辑到列数据类型范围的适当端点,并存储结果值。

当将超出范围的值分配给一个整数列时,MySQL将存储表示列数据类型范围的相应端点的值。

其实说实话,一般的解决方案就是,修改该列的数据类型,存得更大更多一点。

日期和时间类型

表示日期和时间的数据类型如下:

DATE, TIME, DATETIME,TIMESTAMP, YEAR

在使用日期和时间类型时,请记住以下一般注意事项:

  • MySQL以标准输出格式检索给定日期或时间类型的值,但它试图解释您提供的输入值的各种格式(例如,当您指定要分配给日期或时间类型或与日期或时间类型进行比较的值时)。我们期望您提供有效的值。如果您使用其他格式的值,则可能会出现不可预测的结果。
  • 尽管MySQL尝试以几种格式解释值,但必须始终给出日期部分 year-month-day 顺序,而不是其他地方的 month-day-year 或 day-month-year 顺序,将其他顺序的字符串转换为年-月-日的顺序,可以使用 STR_TO_DATE() 方法
  • 年份不要只用后两位代替,因为无法知道你到底是1999年还是2099年。虽然这种存储是可以的,但极度不建议。
  • 默认情况下,当MySQL遇到一个日期或时间类型的值超出范围或对该类型无效时,它会将该值转换为该类型的“零”值。
  • 通过将SQL模式设置为适当的值,您可以更准确地指定您希望MySQL支持的日期类型。
  • MySQL允许在DATE 或DATETIME列中存储日期或月和日期为零的日期。比如在你不需要确切知道出生日期的时候,只需要知道年月时,可以存储’1998-02-00’,但这样的数据就不要拿来进行运算了。
  • MySQL允许将“0000-00-00”的“0”值存储为“虚拟日期”。在某些情况下,这比使用NULL值更方便,并且使用更少的数据和索引空间。如要不允许存“0000-00-00”,请启用NO_ZERO_DATE模式。
  • ‘ZERO’在走 Connector/ODBC 的时候会自动转化为NULL

ZERO数据:

日期类型零值(你也可以通过这个零值知道存储的格式)
DATE0000-00-00
TIME00:00:00
DATETIME0000-00-00 00:00:00
TIMESTAMP0000-00-00 00:00:00
YEAR0000

datetime和timestamp区别:

datetime范围是1000-01-01 00:00:00.000000 到 9999-12-31 23:59:59.999999

timestamp范围是 1970-01-01 00:00:01.000000 到 2038-01-19 03:14:07.999999

字符和字符串类型数据

CHAR, VARCHAR, BINARY, VARBINARY, BLOB, TEXT, ENUM, 以及SET

char 和 varchar

两者的差别在于存储和检索方式不同,在最大长度和是否保留尾随空间的方面也不同

要存储的值char(4)存储空间varchar(4)存储空间
‘’’ ’4byte‘’1byte
‘ab’'ab ’4byte‘ab’3byte
‘abcd’‘abcd’4byte‘abcd’5byte
‘abcdefghijkklm’‘abcd’4byte‘abcd’5byte

char类型: 长度 0~255

varchar类型:长度 0~65535

BINARY 和 VARBINARY

这两者和char varchar很像,这个存储的是 字节字符串 而不是 字符串。也就是说它们有二进制字符集、排序比较等方式

而且最大长度也对应相同

blob 和 text

BLOB是一个二进制的大对象,它可以保存可变量的数据。

blob有四个类型: tinyblob、blob、mebiumblob、longblob

text是MySQL对Blob类型的具体实现,四个类型不同就在于对最大的数据值支持情况不同

也就是说:

text对应的也有四个类型:tinytext、text、mebiumtext、longtext

Enum

ENUM是一个字符串对象,其值从在表创建时在列规范中明确枚举的允许值列表中选择。

比如

 ENUM('Mercury', 'Venus', 'Earth')

每个值对应的索引如下:

索引
NULLNULL
‘’0
‘Mercury’1
‘Venus’2
‘Earth’3

SET

SET是一个字符串对象,它可以有零个或多个值,每个值都必须从创建表时指定的允许值列表中选择。

一个SET列最多可以有64个不同的成员

创建表

-- 直接创建表
create [Temporary] table [if not exists] 表名
(建表定义, ...) [表选项] [分区选项]

-- 通过一个查询表达式创建表
create [Temporary] table [if not exists] 表名
[(建表定义, ...)] [表选项] [分区选项] [as] 查询表达式

-- 通过一个旧表创建
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] 表名
{ like 旧表名| (like 旧表名) }

将创建一个具有给定名称的表。您必须具有对该表的创建权限。默认情况下,将使用InnoDB存储引擎在默认数据库中创建表。如果该表存在、没有默认数据库或该数据库不存在,则会发生错误。

在创建表时,您可以使用 TEMPORARY关键字。临时表仅在当前会话中可见,并且在会话关闭时会自动删除。

使用CREATE TABLE ... LIKE,根据另一个表的定义创建一个空表,包括在原始表中定义的任何列属性和索引

  • 建表定义:

    主要是指创建表中的每个字段 通过 字段名 字段定义 进行创建

  • 字段定义:

    字段定义中又主要是指定义字段的类型,除此之外,还可以定义字段是否为空,默认值,是否自增,是否是外键,是否是主键,注释信息等

    数据类型 [not null | null] [default (值)] [auto_increment] [unique [key]] [primary [key]] [comment '注释信息']

  • 表选项:

    用来设置表的属性,比如存储引擎,字符集,压缩方式等

    在这里插入图片描述

  • 分区选项:

    在这里插入图片描述

举例

  1. 直接创建表的示例:
CREATE TABLE IF NOT EXISTS my_table (
   id INT PRIMARY KEY,
   name VARCHAR(50),
   age INT,
   address VARCHAR(100)
) CHARSET=utf8mb4;

该语句创建一个名为 my_table 的表,有四个列,分别为 idnameageaddress,其中 id 是主键。存储引擎为 InnoDB,字符集为 utf8mb4。

  1. 通过一个查询表达式创建表的示例:
CREATE TEMPORARY TABLE IF NOT EXISTS my_temp_table AS
SELECT name, age, address FROM my_table WHERE age >= 18;

该语句创建一个名为 my_temp_table 的临时表,列名为 nameageaddress,与 my_table 中对应列的数据类型相同,数据来自于 my_tableage 大于等于 18 的记录。

  1. 通过一个旧表创建的示例:
CREATE TABLE IF NOT EXISTS my_new_table LIKE my_table;

该语句创建一个名为 my_new_table 的表,与 my_table 的结构完全一致,但不包括索引和数据。

修改表

alter table 表名
[修改操作,...]

alter table 将会更改表的结构,例如,可以添加或删除列、创建或销毁索引、更改现有列的类型,或重命名列或表本身。

举例说明

  1. 添加列:
ALTER TABLE my_table ADD COLUMN email VARCHAR(50) AFTER address;

该语句在 my_table 表中添加一个名为 email 的列,数据类型为 VARCHAR(50),在 address 列之后。

  1. 修改列:
ALTER TABLE my_table MODIFY COLUMN age INT UNSIGNED NOT NULL DEFAULT 0;

该语句将 my_table 表中的 age 列修改为无符号整数类型,非空且默认值为 0。

  1. 删除列:
ALTER TABLE my_table DROP COLUMN address;

该语句删除 my_table 表中的 address 列。

  1. 添加主键:
ALTER TABLE my_table ADD PRIMARY KEY (id);

该语句在 my_table 表中添加一个名为 id 的主键。

  1. 添加外键:
ALTER TABLE orders ADD CONSTRAINT fk_customer_id FOREIGN KEY (customer_id) REFERENCES customers(id);

该语句在 orders 表中添加一个名为 fk_customer_id 的外键,引用 customers 表中的 id 列。

  1. 添加索引:
ALTER TABLE my_table ADD INDEX idx_name (name);

该语句在 my_table 表中为 name 列添加一个名为 idx_name 的普通索引。

  1. 删除索引:
ALTER TABLE my_table DROP INDEX idx_name;

该语句删除 my_table 表中名为 idx_name 的索引。

  1. 更改表名:
ALTER TABLE my_table RENAME TO new_table;

该语句将 my_table 表的名称更改为 new_table

这些操作只是 ALTER TABLE 语句的一部分,实际使用时可以根据需要选择相应的操作。

删除表

drop [temporary] table [if exists] 表名[,表名...] [restrict|cascade] 

这个操作将会删除一个或者多个表

举例

  1. 删除表:
DROP TABLE my_table;

该语句将 my_table 表从数据库中删除。

  1. 判断表是否存在:
DROP TABLE IF EXISTS my_table;

该语句先判断 my_table 表是否存在,如果存在则删除,否则不执行任何操作。

  1. 删除表的同时删除关联的索引:
DROP TABLE my_table CASCADE;

该语句将 my_table 表从数据库中删除,并删除与其关联的所有索引。

  1. 删除表的同时删除关联的触发器:
DROP TABLE my_table CASCADE CONSTRAINTS;

该语句将 my_table 表从数据库中删除,并删除与其关联的所有索引和触发器。

一个安全的删表方式

-- 创建备份表并复制数据
CREATE TABLE my_table_backup LIKE my_table;
INSERT INTO my_table_backup SELECT * FROM my_table;

-- 删除原表
DROP TABLE my_table;

-- 如果删除了错误的表,可以使用备份表恢复数据
-- INSERT INTO my_table SELECT * FROM my_table_backup;

-- 如果不再需要备份表,可以删除
-- DROP TABLE my_table_backup;

联的所有索引。

  1. 删除表的同时删除关联的触发器:
DROP TABLE my_table CASCADE CONSTRAINTS;

该语句将 my_table 表从数据库中删除,并删除与其关联的所有索引和触发器。

一个安全的删表方式

-- 创建备份表并复制数据
CREATE TABLE my_table_backup LIKE my_table;
INSERT INTO my_table_backup SELECT * FROM my_table;

-- 删除原表
DROP TABLE my_table;

-- 如果删除了错误的表,可以使用备份表恢复数据
-- INSERT INTO my_table SELECT * FROM my_table_backup;

-- 如果不再需要备份表,可以删除
-- DROP TABLE my_table_backup;

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

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

相关文章

2023年clang12编译问题与解决的记录

最近编译clang12以及尝试基于clang开发一个C的静态代码分析工具,如下是遇到的环境相关的编译问题与解决方案。在此做个记录,同时供可能会遇到同样问题的同学参考 环境说明 注:如下是最终编译成功的环境 clang分支: branch : a…

HTTP 请求头中的 Remote_Addr,X-Forwarded-For,X-Real-IP | Spring Cloud 13

一、$remote_addr 表示发出请求的客户端主机的 IP 地址,但它的值不是由客户端提供的,而是Nginx与客户端进行TCP连接过程中,获得的客户端的真实地址 IP 地址,REMOTE_ADDR 无法伪造,因为建立 TCP 连接需要三次握手&…

Java学习教程,Java基础教程(从入门到精通)

Java 是一门面向对象编程语言,不仅吸收了 C 语言的各种优点,还摒弃了 C 里难以理解的多继承、指针等概念。Java 不但可以用来开发网站后台、PC 客户端和 Android APP,还在数据分析、网络爬虫、云计算领域大显身手。 从学术的角度讲&#xff…

VR全景云展厅,实现7*24小时的线上宣传能力!

数字化时代,虚拟现实技术的应用越来越广泛,其中VR全景云展厅是一种新兴的展示方式,具有独特的展示优势。随着VR技术的不断发展,越来越多的企业、机构和个人开始使用VR全景云展厅来展示他们的产品和服务。一、展厅营销痛点1、实地到…

内网渗透-基础环境

解决依赖,scope安装 打开要给cmd powershell 打开远程 Set-ExecutionPolicy RemoteSigned -scope CurrentUser; 我试了好多装这东西还是得科学上网,不然不好用 iwr -useb get.scoop.sh | iex 查看下载过的软件 安装sudo 安装git 这里一定要配置bu…

105.第十九章 MySQL数据库 -- MySQL半同步复制、复制过滤器、复制的问题和解决方案(十五)

6.1.6 半同步复制 Mysql的主从复制它的复制机制我们称为所谓的异步复制,这里面提到了一个概念异步,那什么叫异步复制呢,所谓异步复制实际上说白了就是在用户发请求到数据库做一些修改的时候,那我们在前面讲过主从复制,如果我们有一个主节点,另外带若干个从节点,假设有2个…

Typescript 全栈最值得学习的技术栈 TRPC

如果你想成为一个 Typescript 全栈工程师,那么你可能需要关注一下 tRPC 框架。本文总共会接触到以下主要技术栈。Next.jsTRPCPrismaZodAuth.js不是介绍 tRPC 吗,怎么突然出现这么多技术栈。好吧,主要这些技术栈都与 typescript 相关&#xff…

知道一个服务器IP应该怎么进入

首先我是国内,访问国外的网站比如谷歌等,访问特别慢,有时候甚至登录不进去。现在知道了一个台湾或者国外的服务器应该怎么登录进去呢?知道服务器IP之后,你还需要知道服务器的远程端口帐号密码才能登录的。知道上面信息…

Java 19和IntelliJ IDEA,如何和谐共生?

Java仍然是目前比较流行的编程语言,它更短的发布节奏让开发者每六个月左右就可以试用新的语言或平台功能,IntelliJ IDEA帮助我们更流畅地发现和使用这些新功能。IntelliJ IDEA v2022.3正式版下载(Q技术交流:786598704)在本文中&am…

小樽C++ 多章⑧ (叁) 指针与字符串、(肆) 函数与指针

目录 叁、函数与字符串 肆、函数与指针 4.1 指针作为函数参数 4.2 函数返回指针 4.3 函数指针与函数指针数组 4.4 结构体指针 ​​​​​​​​​​​​​​小樽C 多章⑧ (壹) 指针变量https://blog.csdn.net/weixin_44775255/article/details/129031168 小樽C 多章⑧ …

数据可视化的正确逻辑和关键点

由于移动互联网和手机的普及发展,截至2022年6月,我国短视频的用户规模达9.62亿;即时通信用户规模达10.27亿;网络新闻用户规模达7.88亿;网络直播用户规模达7.16亿......这些数据都意味着互联网已经涉及我们的方方面面&a…

Java并发编程与API详解

文章目录前言操作系统——进程和线程进程进程组成进程状态进程控制进程创建进程终止进程阻塞和唤醒进程通信线程线程组成线程状态线程控制线程的实现方式用户线程内核线程混合方式CPU调度调度的层次调度的实现调度器调度的时机、切换与过程进程调度的方式闲逛进程两种线程的调度…

合作伙伴管理软件如何帮助简化您的业务流程?

随着合作伙伴数量的增加,企业需要处理更多的信息和数据,并在更多的项目上进行协调和管理。这会增加企业的复杂性和工作量,使管理变得更加困难。同时,随着合作伙伴项目数量的增加,企业需要与更多的合作伙伴进行协调和沟…

Echarts 水波图实现

开发的项目中需要实现这样一个水波图,例如下图在echarts官网中找了很久没找到,后面是在Echarts社区中找到的,实现了大部分的样式,但是还有一些数据的展示没有实现。水波图的数值展示是默认整数百分比,我的需求是需要保…

【算法数据结构体系篇class14、15】:并查集

一、并查集1)有若干个样本a、b、c、d…类型假设是V2)在并查集中一开始认为每个样本都在单独的集合里3)用户可以在任何时候调用如下两个方法:boolean isSameSet(V x, V y) : 查询样本x和样本y是否属于一个集合void union(Vx, V y) : 把x和y各自所在集合的所有样本合并…

带你玩转modbusTCP通信

modbus TCP Modbus TCP是一种基于TCP/IP协议的Modbus通信协议,它是Modbus协议的一种变体,用于在以太网上进行通信。Modbus TCP协议是一种开放的通信协议,它支持多种编程语言和操作系统,并且可以在不同的硬件和软件平台上进行通信…

从0开始学python -49

Python MySQL - mysql-connector 驱动 -2 插入数据 插入数据使用 “INSERT INTO” 语句: demo_mysql_test.py: 向 sites 表插入一条记录。 import mysql.connectormydb mysql.connector.connect(host"localhost",user"root",passwd"…

液氮恒温器概述

恒温器是直接或间接控制一个或多个热源和冷源来维持所要求的温度的一种装置。 恒温器要实现这种功能,就必须具有一个敏感元件和一个转换器,敏感元件量度出温度的变化,并对转换器产生所需的作用。转换器把来自敏感元件的作用转换成对改变温度…

创建型设计模式(C++)

文章目录1.简单工厂模式&静态工厂模式2.工厂方法模式3.抽象工厂模式4.原型模式5.单例模式a.饿汉式b.懒汉式6.建造者模式(生成器模式)创建型模式提供了创建对象的机制,旨在提升已有代码的灵活性和可复用性。 部分插图来自: ht…

20230308 Apdl lsdyna两杆撞击案例学习笔记

本次模拟使用的是ANSYS 16.0 一、设置Element type 首先打开APDL界面 添加element type 在LS-DYNA Explicit选择条件下,选择3D solid 164 二、设置材料类型 选择material models 选择Elastic-Isotropic-输入 Density:密度 EX:杨氏模量 NUXY:泊松比 三、几何模型建…