MySQL进阶-增删查改(全网最详细sql教学)-1

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: MySQL进阶-增删查改(全网最详细sql教学)

数据库约束

数据库约束其实是一种强制让数据库内容变得更加完整的方式, 就比如说有的字段里面可以为null, 但是为了其完整性, 可以使用not null 约束他来让他变得更加完整.


约束类型概览

  1. not null
  2. unique
  3. default
  4. primary key
  5. foreign key


NOT NULL

唯一约束, 对应字段的记录不能为null

创建表的时候,可以指定某个字段不为空, 例如:


drop table if exists student;

create table student (

id int not null,

sn int,

name varchar(20)

);


对于表student的id字段,我们将其设置为not null, 如果此时插入的记录里面,如果id为null,则会插入失败:


815adb1e9c4664fe99df26a5a7637423_14d085941861420aa6b5d2e08c297ce5.png

有时候, 一些实体所抽象出来的数据, 必须有一个识别码,也可以成为sn码, 就如同人的身份证一样,用来标识这些实物或者信息, 这些sn码是必不可少的, 所以这些用来标识身份的sn码就可以设置为not null约束(当然也需要避免重复), 来避免sn码为空, 数据也就更有意义和价值了.


UNIQUE

唯一约束, 对应字段的记录不能与其他记录重复.

创建表的时候, 指定sn码为unique约束


DROP TABLE IF EXISTS student;

CREATE TABLE student (

id INT NOT NULL,

sn INT UNIQUE,

name VARCHAR(20),

);被unique修饰的字段, 那么这个字段里面的每一条数据是唯一的,例如:

例如往里面插入:

然后插入具有相同sn码的"lisi":


发生异常:

Duplicate entry '1' for key 'sn': 键“sn”的重复条目“1”

注意: 所有的null 都遵循unique约束原则:


例如,对sn字段被unique修饰后, 连续插入两个null将不会抛出异常.

DEFAULT

默认值约束, 被default修饰的字段, 如果输入为null, 就会使用默认值来代替, 但是代替的类型必须一致


例如, 将name 设置为default约束, 如果输入name 的值没有被指定的时候, 那么就用 "unknown"代替(若name被指定为null, null不会被默认值替代)


PRIMARY KEY

主键约束, 指定字段约束为主键,能唯一的 标识表中的每一行

一个表中只能有一个primary key 主键列,被primary key 修饰的列不能为空,并且主键列的所有值都是唯一的.相当于同时被 not null 和 unique修饰


对于整形类型的主键, 一般搭配auto_increment 来使用, 插入字段的记录不给值的时候,使用表中主键的最大值 +1 .

例如:


create table student(

id int not null primary key,

sn int unique,

name varchar(20) default 'unknown'

);


表中已经有一个记录,如果继续插入:

搭配auto_increment :

插入两个记录,其中被primary key auto_increment 标记的字段传入值为null ,自动从0开始记录:

a020200201caea343386a46338186eb6_3c9638f8efc9427d8434d5576642e301.png


如果这个时候, 被 primary key auto_increment标记的id 传入一个指定 值的时候,然后再传空值:

66c9b84dab8b407cc256d558ef630adc_ee1262e13d3a4129b8a1e4e2463306e7.png

结果是主键最大值2,直接跳过被设置为指定的数值,然后后面的空值会继续跟着主键最大值自增.

FOREIGN KEY

外键约束

使用语法:

foreign key 字段 references 主表


添加class表,classId为主键:


create table class(classId int primary key auto_increment, className varchar(20));

添加student表,studentId为主键:


create table student(studentId int primary key auto_increment, name varchar(20), classId int, foreign key( classId) references class( classId));

设置student中的classId字段被foreign key约束, 其约束项为class 表中的classId字段, 也就是说:


student 表中的classId 中的每一个数据, 都必须在class表中的classId 字段的记录中存在.


此时,student表被class表约束, 我们称student为class的子表, 称class 为student 的父表


如果向student里面插入或者修改的记录对应的foreign key 外键约束的字段数据在对应父表中不存在的话, 那么就会插入失败.


相反,如果要删除class表中的数据, 如果对应约束项的记录已经在子表中存在, 那么删除就会失败


更直观的来看个例子:


创建两个表:


商品表(Id, name, price....)


订单表(orderId, userId, goodsId, time.....)


其中商品id被外键约束, 其约束的内容为订单表中的goodsId, 用MySQL的语言就是:


create table orderList (orderId int primary key auto_increment , userId int, goodsId int, foreign key(id) references goodsList(Id));

505ce0e806d6d93244ff657b128d7d5c_eeaaf9700cc44f1e86aea3c63318a364.png

假如这个商品表需要有一个商品下架功能, 但是, 这里面的id又有外键约束, 如果要在商品表中删除一个商品, 但是他的id 在订单表中还在被使用, 那么此时就无法直接删除, 那么这个功能该如何实现??


解决办法:给商品表加一个列字段, 用来表示该商品是否被下架,通过update 来修改这个字段, 此时外界约束就不会收到影响, 订单可以继续实时查看.


表的设计

如何设计表?

  1. 了解实际信息体的"实体"
  2. 明确实体之间的关系
  3. 按照实体的关系带入到表的体系当中.


无关联

各表之间没有关系, 只需要根据实体的个性 自行设计即可


一对一

例如, 一个学生表中 有许多关于学生的字段, 这些字段可以是姓名, 年龄等, 同时还存在一个账号表, 这两张表有很直接的关联, 那就是一个账号只能供一个学生使用, 同时 一个学生也只能拥有一个账号.


这种一对一的, 就可以直接设计成一张表:


student -- account ( studentId, studentName, studentAccount);


此外,更推荐将其设计成两个表, 然后让他们相互关联, 可以使用studentId进行关联, 也可以使用account进行关联.


一对多

一个班级可以包含多个学生, 但是一个学生只能存在于一个班级, 这就形成了一对多或者多对一的情况


student (studentID, name, age ....)

class (classID, className, studentList(每个记录为一个学生数据 集合 ) )

98b37ea7f229392d5c4289abadcc1b3b_27e9d3b5952d4f9f802ca4c553ac34aa.png

student表包含学生的基本数据, class 包含班级的数据, 同时也包含着具有的学生列表, 但是学生列表有很多行学生的数据, 不可能在一行里面显示, 但是使用数组的形式存放这些学生的记录的方法在MySQL是不支持的. 但是有些数据库支持以数组的形式存放, 比如redis ,


此外还可以使用外键约束来设计这个一对多的表:

417cb16ea0f7afa976cdeeb2dcf754a2_56dff7f5267f4f7da81e901742302604.png


多对多

例如, 一个学生可以上多个课程, 一个课程也可以有多个学生:


studentList (studentID, name );

course ( courseID, courseName );

将他们两个关联起来:


student_courseList (studentID, courseID );

ce8d0f732299f2c2482d687c812cdbb6_6e40135787744a789c03d0272e359b2c.png

进阶增删改查

与前面的直接使用insert into 表名 values (value1, value2, value3, ....)了不同的是, 这里的新增是直接插入查询结果. ;例如:


这里创建两张学生表:


student (id int, name varchar(20))

student2 (id int, name varchar(20))

student表中插入三个数据:


insert into student values (1, "张三"),(2, "李四"),(3, "王八");

如果这个时候, 我想把student表中的数据拷贝到student2 当中去, 使用将values改成select查询语句:


insert into student2 select * from student;

注意 :这并不代表任何两个表之间都可以这样操作, 查询的结果得到的列数, 对应字段的数据类型必须一样( 列名可以不一样, 但是类型必须一致 )


MySQL进阶-增删查改(全网最详细sql教学)-2

https://developer.aliyun.com/article/1517134

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
9天前
|
SQL 关系型数据库 MySQL
mysql 简单的sql语句,入门级增删改查
介绍MySQL中的基本SQL语句,包括数据的增删改查操作,使用示例和简单的数据表进行演示。
mysql 简单的sql语句,入门级增删改查
|
14天前
|
SQL 缓存 关系型数据库
揭秘MySQL一条SQL语句的执行流程
以上步骤共同构成了MySQL处理SQL语句的完整流程,理解这一流程有助于更有效地使用MySQL数据库,优化查询性能,及时解决可能出现的性能瓶颈问题。
35 7
|
5天前
|
SQL 存储 缓存
MySQL 是怎么执行 SQL 语句的?
MySQL 是怎么执行 SQL 语句的?
10 0
|
8天前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
18天前
|
NoSQL 关系型数据库 MySQL
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。
|
20天前
|
存储 SQL 关系型数据库
使用MySQL Workbench进行数据库备份
【9月更文挑战第13天】以下是使用MySQL Workbench进行数据库备份的步骤:启动软件后,通过“Database”菜单中的“管理连接”选项配置并选择要备份的数据库。随后,选择“数据导出”,确认导出的数据库及格式(推荐SQL格式),设置存储路径,点击“开始导出”。完成后,可在指定路径找到备份文件,建议定期备份并存储于安全位置。
160 11
|
2月前
|
弹性计算 关系型数据库 数据库
手把手带你从自建 MySQL 迁移到云数据库,一步就能脱胎换骨
阿里云瑶池数据库来开课啦!自建数据库迁移至云数据库 RDS原来只要一步操作就能搞定!点击阅读原文完成实验就可获得一本日历哦~
|
16天前
|
存储 SQL 关系型数据库
MySQL的安装&数据库的简单操作
本文介绍了数据库的基本概念及MySQL的安装配置。首先解释了数据库、数据库管理系统和SQL的概念,接着详细描述了MySQL的安装步骤及其全局配置文件my.ini的调整方法。文章还介绍了如何启动MySQL服务,包括配置环境变量和使用命令行的方法。最后,详细说明了数据库的各种操作,如创建、选择和删除数据库的SQL语句,并提供了实际操作示例。
58 13
MySQL的安装&数据库的简单操作
|
21天前
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
|
3天前
|
关系型数据库 Unix MySQL
MySQL是一种关系型数据库管理系统
MySQL是一种关系型数据库管理系统
11 2
下一篇
无影云桌面