【黄啊码】MySQL入门—2、使用数据定义语言(DDL)操作数据库

大家好!我是黄啊码,上一节的知识点你了解多少了,掌握了多少了,别偷懒哦,今天我们就来掌握一下数据定义语言,说得高级点就是Data Definition Language,简称DDL。

很多同学对DDL的了解都是在于数据库的增、删、改、查,那下边我们就具体来讲讲。

1、创建删除数据库
CREATE DATABASE user; // 创建一个名为 user的数据库
DROP DATABASE user; // 删除一个名为 user的数据库

2.对数据表进行定义
创建表结构的语法是这样的:

CREATE TABLE table_name

比如我们在用户数据库中创建user_info这个表

CREATE TABLE user_info (
user_id int(11) NOT NULL AUTO_INCREMENT,
user_name varchar(255) NOT NULL
);

如上,我们创建了一个叫做user_info的表, 里面有两个字段,一个是 user_id ,它是 int 类型,另一个 user_name 字段是varchar(255)类型。这两个字段都不为空,且 user_id 是递增的,而其中的not null表示非空,切记语句最后要加;【千万要记住】AUTO_INCREMENT代表主键自动增长。有刚入门的同学说什么是主键?>>文章后边我会单纯讲述,别着急。

然而在实际工作中,我们肯定很少写过DDL,这里啊码用Navicat代替,它是一个数据库管理和设计工具,跨平台,支持很多种数据库管理软件,比如 MySQL、Oracle、MariaDB 等,当然你有更好、更符合自己编码的工具也是可以的,不做强制。

【黄啊码】MySQL入门—2、使用数据定义语言(DDL)操作数据库

我们还可对user_name字段进行索引,索引类型为Unique。使用 Navicat 设置如下:

【黄啊码】MySQL入门—2、使用数据定义语言(DDL)操作数据库

相信这时候很多同学又会问我,什么是索引,额,这个如果展开出来会比较长,我们放在后边单独一节课讲就行,啊码只告诉你,索引是把双刃剑,用得好,查得爽,用不好,鱿鱼炒。

3、操作表结构
在创建表结构之后,我们还可以对表结构进行修改,虽然直接使用 Navicat进行操作,但对于刚入门的你,有必要了解如何使用 DDL 命令来完成表结构的修改。

1、添加字段,比如我在数据表中添加一个 age 字段,类型为int(11)

ALTER TABLE user_info ADD (age int(11));

2、修改字段名,将 age 字段改成user_age

ALTER TABLE user_info RENAME COLUMN age to user_age

3、修改字段的数据类型,将user_age的数据类型设置为float(3,1)

ALTER TABLE user_age MODIFY user_age float(3,1);

【黄啊码】MySQL入门—2、使用数据定义语言(DDL)操作数据库

我看到不少教程写成这样

ALTER TABLE user_age MODIFY user_age (float(3,1));

然后执行起来就芭比Q了

【黄啊码】MySQL入门—2、使用数据定义语言(DDL)操作数据库

【黄啊码】MySQL入门—2、使用数据定义语言(DDL)操作数据库

4、 删除字段, 删除刚才添加的user_age字段

ALTER TABLE user_info DROP COLUMN user_age;

好了,到这里,我们就开始讲讲上边所说的数据库的常见约束:

主键约束

表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键,通过它可强制表的实体完整性。当创建或更改表时可通过定义 PRIMARY KEY 约束来创建主键。一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值。由于 PRIMARY KEY 约束确保唯一数据,所以经常用来定义标识列。

作用:

1)保证实体的完整性;

2)加快数据库的操作速度

3)在表中添加新记录时,DBMS会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。

4)DBMS自动按主键值的顺序显示表中的记录。如果没有定义主键,则按输入记录的顺序显示表中的记录。

外键约束

确保了表与表之间引用的完整性。一个表中的外键对应另一张表的主键。外键可以是重复的,也可以为空。比如 user_id 在 user_info 表中是主键,如果你想设置一个成绩表即 user_score,就可以在 user_score 中设置 user_id 为外键,关联到 user_info 表中。

唯一性约束

唯一性约束表明了字段在表中的数值是唯一的,即使我们已经有了主键,还可以对其他字段进行唯一性约束。需要注意的是,唯一性约束和普通索引(NORMAL INDEX)之间是有区别的。唯一性约束相当于创建了一个约束和普通索引,目的是保证字段的正确性,而普通索引只是提升数据检索的速度,并不对字段的唯一性进行约束。

NOT NULL 约束。对字段定义了 NOT NULL,即表明该字段不应为空,必须有取值。

DEFAULT,表明了字段的默认值。如果在插入数据的时候,这个字段没有取值,就设置为默认值。比如我们将user中的身高 height 字段的取值默认设置为 0.00,即DEFAULT 0.00。

CHECK 约束,用来检查特定字段取值范围的有效性,CHECK 约束的结果不能为 FALSE,比如我们可以对身高 height 的数值进行 CHECK 约束,必须≥0,且<300,但在常见的数据库操作中,我们很多时候都会把这类约束放在前后端一起结合验证

数据表设计原则及三范式
第一范式(1NF)
每一列属性都是不可再分的属性值,确保每一列的原子性
合理的根据实际业务数据需求来决定属性,合并相似或相同的列,避免冗余
比如你弄了一个用户表,但有个列叫做身体部位,可身体部位还能继续分,比如五官之类的。

第二范式(2NF)
需要确保数据库表中的每一列都和主键相关,如果是联合主键,则需要和所有主键均相关而不能只与主键和某一部分相关
在一个数据库表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中
这个就好理解了,在我们生活中,我们喜欢分类收纳,就跟垃圾分类一样,你总不能湿垃圾和干垃圾丢在一起吧【我们只说常规操作,不要杠哈】

第三范式(3NF)
确保数据表一个记录中的数据都和主键直接相关,而不是间接相关,不能存在传递关系
属性不依赖于其他非主属性
假设有个表叫做班级表,学号为主键,它存在 学号 –> 班级编号 –> 班级信息 这么一个主键学号与班级信息的传递关系,不符合第三范式

【解决办法】(1)提取学生表;(2)提取班级表;
学生肯定在某一个班级中,所以班级编号可以作为学号(主键)的一个直接关联属性,但班级的其他信息应该放在以班级编号为主键的表中,即可符合第三范式。

遵循范式的优缺点
通过以上的了解,可以发现,范式规则有如下特点

结构合理,表含义容易理解及区分
冗余较小
但性能有所降低,多表查询比单表效率低下
总结:数据库表的设计,可以借鉴三大范式的指导办法,同时也需要依赖于实际业务需求,良好的数据库结构不仅可以提高开发人员的开发效率,降低开发难度,还可以提高数据库查询效率,给程序增加可变弹性,当冗余的代价小于查询性能降低的代价时,就应该考虑冗余实现。

对于职场老鸟,三大范式我们早就滚瓜烂熟了吧,那啊码在这里整理了一套常见使用优化方法:

数据表应尽量简单可复用。怎么说呢:简单指的是用更少的表、更少的字段、更少的联合主键字段来完成数据表的设计。可复用则是通过主键、外键的使用来增强数据表之间的复用率。因为一个主键可以理解是一张表的代表。键设计得越多,证明它们之间的利用率越高。

好了,今天的课程稍微有一丢丢多,大家要好好消化一下,多举一反三,有问题的留个言,别忘了一键三连,下次我们还会再见!

我是黄啊码,码字的码,退。。。退。。。退。。。朝!

Original: https://www.cnblogs.com/huangama/p/16506688.html
Author: 黄啊码
Title: 【黄啊码】MySQL入门—2、使用数据定义语言(DDL)操作数据库

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/619693/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 计算机图形学

    计算机图形学 光追一般指光线追踪。 光线跟踪(也叫ray tracing或者光束投射法)。是一个在二维(2D)屏幕上呈现三维(3D)图像的方法。 BRDF是双向反射分布函数(Bid…

    数据库 2023年6月14日
    075
  • Python 3.10 is coming!

    看看Python 官网的文档 whatsnew,Python 3.10 已然距离我们越来越近了,然我们看看 Python 3.10 相较于 Python 3.9 有哪些改变吧 新特…

    数据库 2023年6月6日
    0100
  • How to code like a pro in 2022 and avoid If-Else

    高级开发人员如何编写代码: var input = "Dog"; var map = new Dictionary<string, string> …

    数据库 2023年6月11日
    069
  • 异步线程里的日志不好追踪?小支一招,轻松搞定!

    众所周知,通过唯一的链路id来追踪一次请求的所有日志,对于排查生产问题来说,会是非常给力的。这个比较容易实现。我之前的博客也有多次提及 ▄︻┻┳═一 https://www.cnb…

    数据库 2023年6月9日
    089
  • Redis SCAN命令

    获取指定前缀的key 需求描述: Redis中有大量以xxx开头的key,在不使用keys命令的情况下,如何快速获取这些前缀的key 解决方案: redis自带的scan命令可以解…

    数据库 2023年6月14日
    078
  • 云数据库技术|“重磅升级”后再测 TDSQL-C

    标题 1.摘要 前段时间,测试了国内主要云原生数据库 PolarDB、TDSQL-C、GaussDB 的性能,参考:《再测云原生数据库性能》。在上次测试结果中,由于地域版本差异,腾…

    数据库 2023年6月11日
    080
  • MySQL锁(乐观锁、悲观锁、多粒度锁)

    锁 并发事务可能会发生什么情况: [En] What may happen to concurrent transactions: 读-读事务并发:此时是没有问题的,读操作不会对记…

    数据库 2023年5月24日
    094
  • Redis内存满了怎么办(新年快乐)

    Redis内存满了怎么办(新年快乐) 入我相思门,知我相思苦。 长相思兮长相忆,短相思兮无穷极。 一、配置文件 Redis长期使用或者不设置过期时间,导致内存爆满或不足,可以到Re…

    数据库 2023年6月14日
    061
  • 基于mybatis的java代码生成存储过程

    1 — — powered by wanglifeng https://www.cnblogs.com/wanglifeng717 2 DROP PROCEDURE IF EX…

    数据库 2023年5月24日
    079
  • 设计模式之适配器模式

    一、适配器模式:把两个不匹配的接口通过一个中间层变成可匹配的,这个中间层叫适配器,比如两脚插头+三脚插座无法进行匹配,可使用一个转接头来结合使用,这个转接头就是适配器。 二、实现思…

    数据库 2023年6月14日
    071
  • 运行jar包使用外部依赖

    nohup java -Dloader.path=”lib/” -Dfile.encoding=utf-8 -jar test.jar > test….

    数据库 2023年6月9日
    059
  • Vue 3.x基础

    Vue 3.x基础 模版 <template> // html </template> <script setup> // setup API …

    数据库 2023年6月11日
    083
  • MYSQL/Oracle中常用函数总结

    记录在日常工作或者学习中中使用到的函数,以下是做一个备忘~ MySQL: 窗口函数: 原文地址:https://zhuanlan.zhihu.com/p/92654574 1、窗口…

    数据库 2023年6月14日
    0101
  • django中的视图层

    1.什么是视图层 简单来说,就是用来接收路由层传来的请求,从而做出相应的响应返回给浏览器 2.视图层的格式与参数说明 2.1基本格式 from django.http import…

    数据库 2023年6月14日
    067
  • innobackupex备份源码解析

    目前MySQL的物理备份大多数采用xtrabackupex进行,其备份过程如下图所示,这里通过解析 xtrabackup 的源码来详细看看其是如何进行备份的,xtrabackup …

    数据库 2023年6月9日
    0101
  • Jenkins+gitlab+docker+harbor容器化自动部署详细流程

    环境:Linux版本:Centos7 一、更新源:yum update 二、安装docker:yum install docker -y 启动docker: systemctl s…

    数据库 2023年6月16日
    0127
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球