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

MySQL学习之DDL操作

目录

数据库的操作

创建

查看

选择

删除

修改

数据类型

表的创建

表的修改

表的约束

主键 PRIMARY KEY

唯一性约束 UNIQUE

非空约束 NOT NULL

外键约束

约束小结

索引

索引分类

常规索引

主键索引

唯一索引

外键索引

优点

缺点

视图

创建

删除

修改

查看

优点

范式

第一范式

第二范式

第三范式

表与表的关系

1:1

1:N

N:N


数据库的操作

创建
create database 数据库名 charset utf8;
查看
show databases;
show create databases db;
select database();
选择
use 数据库名;
删除
drop database 数据库名;
修改
alter databases db1 charset utf8;

数据类型

image-20220505191209237

image-20220505191226792

表的创建

首先要对操作的数据有一个基础型的了解,

-- 学号 姓名 性别 出生日期 入学时间 专业 院系 创建时间 -- 学号 int

姓名 varchar

性别 char

出生日期 date

入学时间 date

专业 varchar

院系 varchar

创建时间 timestamp

create table t_student(sno int,sname varchar(40),gender char(1),birthday date,schooltime date,major varchar(255),department varchar(255),createtime timestamp
);

表的修改

-- 根据查询语句创建表
CREATE TABLE STU01 AS SELECT * FROM t_student;
-- 添加两列(一次alter table操作只能添加一列)
alter table t_student add loc timestamp default now();
alter table t_student add phone timestamp default now();
-- 删除一列
alter table t_student drop column phone;
-- 修改一列
alter table t_student modify major varchar(20);
-- 修改列名
alter table t_student change COLUMN  birthday birth DATE;
'''
如果数据类型不同,您需要相应地修改。
假设要将birthday列(原本是DATE类型)修改为VARCHAR(255)类型的birth列,修改的语句如下:
ALTER TABLE t_student CHANGE birthday birth VARCHAR(255);
在 MySQL 中,修改列名通常使用 CHANGE 关键字,而不是 RENAME 。
但需要注意的是,在某些数据库管理工具(如 Navicat 等)中,可能支持使用 RENAME COLUMN 来修改列名,但这并非是 MySQL 原生语法所支持的。
为了保证在纯 MySQL 环境中的兼容性和可移植性,建议使用 CHANGE 来修改列名。
'''
-- 修改表名
rename table t_student to t_s;
-- 删除一张表
drop table t_s;

表的约束

约束指的是我们创建的表,对数据的约束,而不是对创建人的约束

主键 PRIMARY KEY
  • 主键值必须唯一标识表中的每一行且不能为空NULL,即表中不可能存在有相同主键值的两行数据

  • 主键分为单字段主键和多字段联合主键

  • 联合主键不能包含不必要的多余字段。当把联合主键的某一字段删除后,如果剩下的字段构成的主键仍然满足唯一性原则,那么这个联合主键是不正确的。这是最小化原则。

    create table t_pk01(id int(11) primary key,name varchar(25),deptid int(11),salary float
    );
    ​
    create table t_pk02(tid int(11),cid int(11),salary float
    );
    ​
    -- ALTER TABLE 数据表名 ADD PRIMARY KEY(字段名);
    alter table t_pk02 add primary key(id);
    ​
    -- ALTER TABLE 数据表名 DROP PRIMARY KEY;
    alter table t_pk02 drop primary key;

唯一性约束 UNIQUE

列中的值可以为空但是不能相同

create table tb_unique01(id int(11) primary key,name varchar(22),phoneum varchar(11) unique,location varchar(50)
);
​
-- ALTER TABLE 数据表名 ADD CONSTRAINT 唯一约束名 UNIQUE(列名);
alter table tb_unique01 add
constraint t_unique01_unique_location
unique(location);
​
-- ALTER TABLE 表名 DROP INDEX 唯一约束名;
alter table tb_unique01 drop
index t_unique01_unique_location;

非空约束 NOT NULL

列中的值不能为null

CREATE TABLE tb_null01(
id INT(11) PRIMARY KEY,
name VARCHAR(22) NOT NULL,
location VARCHAR(50)
);
​
-- ALTER TABLE 数据表名 CHANGE COLUMN 字段名 字段名 数据类型 NOT NULL;
-- 将 tb_null01 表中的 location 列的数据类型修改为 VARCHAR(50) ,并设置为不允许为空值。
ALTER TABLE tb_null01 
CHANGE COLUMN location location VARCHAR(50) NOT NULL;
​
-- ALTER TABLE 数据表名 CHANGE COLUMN 字段名 字段名 数据类型 NULL;
-- 再次修改 location 列,将其数据类型仍保持为 VARCHAR(50) ,但设置为允许为空值。
ALTER TABLE tb_null01 
CHANGE COLUMN location location VARCHAR(50) NULL;

外键约束

定义外键时,需要遵守下列规则:

  • 主表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则主表与从表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。

  • 必须为主表定义主键。

  • 主键不能包含空值,但允许在外键中出现空值。即只要外键的每个非空值出现在指定的主表中,这个外键的内容就是正确的。

  • 在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或唯一性键。

  • 外键中列的数目必须和主表的主键中列的数目相同。

  • 外键中列的数据类型必须和主表主键中对应列的数据类型相同。

-- 1位老师对应N个学生 teacher表为主表,student表为外键表 tid为外键
create table t_teacher(tid int(10) PRIMARY KEY,tname VARCHAR(40)
);
CREATE table t_student(sid int(10) PRIMARY KEY,sname varchar(40),tid int(10),CONSTRAINT fk_teacher_student_tid FOREIGN KEY(tid) references t_teacher(tid) on delete cascade  
);
​
INSERT into t_teacher VALUES('001','唐老师');
INSERT into t_teacher VALUES("002",'杜老师');
INSERT into t_teacher VALUES('003','唐老师');
INSERT into t_student VALUES('111','图图','001');
INSERT into t_student VALUES('112','莉莉','002');
INSERT into t_student VALUES('113','小欧','003');
INSERT into t_student VALUES('114','麦吉','003');
INSERT into t_student VALUES('115','丁倩','003');
-- 错误数据,因为主表主键没有d
insert into student values('5','xiaohu','d');
​
-- 修改表
ALTER TABLE 数据表名 ADD CONSTRAINT 外键名 FOREIGN KEY(列名) REFERENCES 主表名(列名);

索引

在MySQL中,索引(index)也叫做“键(key)”,它是存储引擎用于快速找到记录的一种数据结构。

索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对性能的影响就愈发重要。

索引优化应该是对查询性能优化最有效的手段。

-- CREATE INDEX indexName ON mytable(username); 
Create Index index_dept_dname on dept(dname); -- B-tree
Drop Index index_dept_dname on dept;
索引分类
常规索引

常规索引,也叫普通索引(index或key),它可以常规地提高查询效率。一张数据表中可以有多个常规索引。常规索引是使用最普遍的索引类型,如果没有明确指明索引的类型,我们所说的索引都是指常规索引。

主键索引

主键索引(Primary Key),也简称主键。它可以提高查询效率,并提供唯一性约束。一张表中只能有一个主键。被标志为自动增长的字段一定是主键,但主键不一定是自动增长。一般把主键定义在无意义的字段上(如:编号),主键的数据类型最好是数值。

唯一索引

唯一索引(Unique Key),可以提高查询效率,并提供唯一性约束。一张表中可以有多个唯一索引。

外键索引

外键索引(Foreign Key),简称外键,它可以提高查询效率,外键会自动和对应的其他表的主键关联。外键的主要作用是保证记录的一致性和完整性。

索引是数据库中一块独立的空间,专门存储索引值的一棵B-树,我们可以通过B-树快速的定位到要查找的数据

特别注意:尽量不要对重复数据的列添加索引,比如:性别

优点
  • 索引可以让MySQL快速地查找到我们所需要的数据,但这并不是索引的唯一作用。

  • 索引大大减少了MySQL服务器需要扫描的数据量。

  • 索引可以帮助服务器避免排序和临时表。

  • 索引可以将随机I/O变为顺序I/O。

缺点
  • 影响数据库的增删改速度

视图

MySQL 视图(View)是一种虚拟存在的表,同真实表一样,视图也由列和行构成,但视图并不实际存在于数据库中。

行和列的数据来自于定义视图的查询中所使用的表,并且还是在使用视图是动态生成的。

创建
-- CREATE VIEW <视图名> AS <SELECT语句>
-- <视图名>:指定视图的名称。该名称在数据库中必须是唯一的,不能与其他表或视图同名。
-- <SELECT语句>:指定创建视图的 SELECT 语句,可用于查询多个基础表或源视图。
CREATE VIEW v_swordsman AS
( SELECT tid, NAME FROM t_teacher ) UNION ALL
( SELECT sid, NAME FROM t_student );
删除
DROP VIEW IF EXISTS <视图名1> [ , <视图名2> …]
修改
ALTER VIEW <视图名> AS <SELECT语句>
-- <视图名>:指定视图的名称。该名称在数据库中必须是唯一的,不能与其他表或视图同名。
-- <SELECT 语句>:指定创建视图的 SELECT 语句,可用于查询多个基础表或源视图。

查看
-- 查询视图的数据 
SELECT * 
FROM
v_swordsman
​
-- DESCRIBE 视图名;查看视图的列结构信息
DESCRIBE v_swordsman
​
-- SHOW CREATE VIEW 视图名;获取创建视图的具体定义语句
SHOW CREATE VIEW v_swordsman

优点

1) 定制用户数据,聚焦特定的数据

2) 简化数据操作

3) 提高数据的安全性

4) 共享所需数据

5) 更改数据格式

6) 重用 SQL 语句

范式

创建表需要遵循的规范

第一范式

【不可再分割原则】数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组

第二范式

【数据库中每一行数据必须依赖于主键】每一个行数据都要有主键,主键是一行数据的唯一性标识

第三范式

【非主键的列必须要全部依赖于主键】表中非主键的列要完全依赖于主键,不能出现部分属性依赖于其他属性,当出现传递依赖的时候要将非依赖于主键的列专门创建一张表进行管理

表与表的关系

为了维护两张表的关系,根据两张表的对应关系可以分为:

1:1

两张表中的数据 1条只和1条对应

关联方案:

让关联数据主键值相同

在一张表中存放另外一张表的主键

1:N

A表中的一条数据有可能对应B表中的多条记录。比如 1老师:N学生

关联方案

在N方的表中设计一个1方的主键列,也称之为外键关联

N:N

A表中的一条数据有可能对应B表中的多条记录,同时B表中的一条数据有可能对应A表中的多条记录

比如 1学生:N课程,1课程:N学生

关联方案

s学生表 c课程表

一般都会创建第三章表专门管理学生与课程的关系

sid,cid 作为联合主键管理信息

id ,sid ,cid 以ID作为这张表的单独主键

相关文章:

MySQL学习之DDL操作

目录 数据库的操作 创建 查看 选择 删除 修改 数据类型 表的创建 表的修改 表的约束 主键 PRIMARY KEY 唯一性约束 UNIQUE 非空约束 NOT NULL 外键约束 约束小结 索引 索引分类 常规索引 主键索引 唯一索引 外键索引 优点 缺点 视图 创建 删除 修改…...

游戏AI实现-寻路算法(A*)

A*&#xff08;A-star&#xff09;是一种图遍历和寻路算法&#xff0c;由于其完整性、最优性和最佳效率&#xff0c;它被用于计算机科学的许多领域。给定一个加权图、一个源节点和一个目标节点&#xff0c;该算法将找到从源到目标的最短路径&#xff08;相对于给定的权重&#…...

spring学习(spring的IoC思想、spring容器、spring配置文件、依赖注入(DI)、BeanProxy机制(AOP))

目录 一、spring-IoC。 &#xff08;1&#xff09;spring框架。(诞生原因及核心思想) 1、为什么叫框架&#xff1f; 2、spring框架诞生的技术背景。 &#xff08;2&#xff09;控制反转&#xff08;IoC&#xff09;。 &#xff08;3&#xff09;spring的Bean工厂和IoC容器。 &a…...

谁说C比C++快?

看到这个问题&#xff0c;我我得说&#xff1a;这事儿没有那么简单。 1. 先把最大的误区打破 "C永远比C快" —— 某位1990年代的程序员 这种说法就像"自行车永远比汽车省油"一样荒谬。我们来看个例子&#xff1a; // C风格 char* str (char*)malloc(100…...

GEE+本地XGboot分类

GEE本地XGboot分类 我想做提取耕地提取&#xff0c;想到了一篇董金玮老师的一篇论文&#xff0c;这个论文是先提取的耕地&#xff0c;再做作物分类&#xff0c;耕地的提取代码是开源的。 但这个代码直接在云端上进行分类&#xff0c;GEE会爆内存&#xff0c;因此我准备把数据下…...

OpenCV相机标定与3D重建(24)计算两个二维点集之间的最佳仿射变换矩阵(2x3)函数estimateAffine2D()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算两个二维点集之间的最优仿射变换&#xff0c;它计算 [ x y ] [ a 11 a 12 a 21 a 22 ] [ X Y ] [ b 1 b 2 ] \begin{bmatrix} x\\ y\\ \en…...

UIP协议栈 TCP通信客户端 服务端,UDP单播 广播通信 example

文章目录 1. TCP通信 客户端&#xff08;关键配置&#xff09;2. TCP 服务端配置3. UDP 点播通信4. UDP 广播通信5. UIP_UDP_APPCALL 里边的处理example6. TCP数据处理 &#xff0c;UIP_APPCALL调用的函数 UIP_APPCALL TCP的数据都在这个宏定义的函数里进行数据处理的 UDP 数据…...

【NoSQL系列】为什么要使用Redis?

第一次知道Redis是以前准备面试的时候&#xff0c;只知道是用来缓存数据的。随着这几年的工作&#xff0c;对软件的认识从盲人摸象到睁眼看世界。 在常用的软件架构评价模型中&#xff0c;性能、可用性、安全性和可维护性是常见的评价属性&#xff0c;客户总希望系统响应又快有…...

MySQL Explain 分析SQL语句性能

一、EXPLAIN简介 使用EXPLAIN关键字可以模拟优化器执行SQL查询语句&#xff0c;从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。 &#xff08;1&#xff09; 通过EXPLAIN&#xff0c;我们可以分析出以下结果&#xff1a; 表的读取顺序数据读取…...

IIS部署程序https是访问出现403或ERR_HTTP2_PROTOCOL_ERROR

一、说明 在windows server 2016中的IIS程序池里部署一套系统&#xff0c;通过https访问站点&#xff0c;同时考虑到安全问题以及防攻击等行为&#xff0c;就用上了WAF云盾功能&#xff0c;能有效的抵挡部分攻击&#xff0c;加强网站的安全性和健壮性。 应用系统一直能够正常…...

学技术学英文:代码中的锁:悲观锁和乐观锁

本文导读&#xff1a; 1. 举例说明加锁的场景&#xff1a; 多线程并发情况下有资源竞争的时候&#xff0c;如果不加锁&#xff0c;会出现数据错误&#xff0c;举例说明&#xff1a; 业务需求&#xff1a;账户余额>取款金额&#xff0c;才能取钱。 时间线 两人共有账户 …...

青少年编程与数学 02-004 Go语言Web编程 02课题、依赖管理

青少年编程与数学 02-004 Go语言Web编程 02课题、依赖管理 课题摘要:一、项目结构各目录说明&#xff1a; 二、依赖项三、依赖管理任务四、依赖管理步骤1. 初始化Go Modules项目2. 添加依赖3. 指定依赖版本4. 更新依赖5. 清理未使用的依赖6. 离线工作7. 模块隔离8. 可重现构建 …...

MyBatis写法汇总

Mybatis写法汇总 1. 批量操作 1.1 批量插入 <insert id"batchInsert" parameterType"java.util.List">INSERT INTO user (username, password, create_time) VALUES<foreach collection"list" item"item" separator"…...

【Linux学习】十五、Linux/CentOS 7 用户和组管理

文章目录 一、组的管理1.组的创建格式&#xff1a;参数&#xff1a; 2.组的删除格式&#xff1a;参数&#xff1a; 3.组的属性修改格式&#xff1a;参数&#xff1a; 4.查看组的信息①cat /etc/group 命令②getent group 命令③仅显示系统中所有组名 二、用户的管理①超级用户&…...

三维无人机航迹算法的目标函数如何确定

一、定义目标函数 在三维无人机航迹算法中,目标函数的确定通常基于具体的任务需求和飞行约束。以下是一个简单的例子,展示了如何为三维无人机航迹规划定义一个目标函数。 例子:最小化飞行时间和避障的三维无人机航迹规划 1.任务描述:无人机需要从起点飞到终点,同时避开一些…...

uniapp v-tabs修改了几项功能,根据自己需求自己改

根据自己的需求都可以改 这里写自定义目录标题 1.数组中的名字过长&#xff0c;导致滑动异常2.change 事件拿不到当前点击的数据&#xff0c;通过index在原数组中查找得到所需要的id 各种字段麻烦3.添加指定下标下新加红点显示样式 1.数组中的名字过长&#xff0c;导致滑动异常…...

用vscode,进行vue开发

使用Visual Studio Code&#xff08;VSCode&#xff09;进行Vue.js开发是一个很好的选择&#xff0c;因为VSCode提供了强大的编辑功能以及丰富的插件生态。以下是使用VSCode进行Vue开发的基本步骤&#xff1a; 1. 安装Node.js和npm 首先&#xff0c;确保你的计算机上安装了No…...

Kafka 磁道寻址过程详解

前言 Apache Kafka 是一款高吞吐、分布式的消息流平台&#xff0c;广泛应用于实时数据处理和事件驱动系统。在 Kafka 中&#xff0c;消息是存储在磁盘上的&#xff0c;这种高效的数据读写性能得益于 Kafka 独特的磁盘存储架构和寻址机制。本文将从 Kafka 的存储结构、磁道寻址…...

基于Spring Boot的社区药房系统

一、系统背景与目的 随着医疗改革的深入和社区医疗服务的不断完善&#xff0c;社区药房在居民健康保障中扮演着越来越重要的角色。然而&#xff0c;传统的药房管理方式存在着库存管理混乱、药品销售不透明、客户信息管理不规范等问题。为了解决这些问题&#xff0c;基于Spring…...

005 QT常用控件Qwidget_上

文章目录 前言控件概述QWidgetenable属性geometry属性windowTitle属性windowlcon属性 小结 前言 本文将会向你介绍常用的Qwidget属性 控件概述 Widget 是 Qt 中的核心概念. 英文原义是 “⼩部件”, 我们此处把它翻译为 “控件” . 控件是构成⼀个图形化界面的基本要素. QWi…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...