MySQL:数据库的约束

news2025/1/6 17:26:03

目录

1.数据库约束

1.1 非空:not null

1.2 唯一:unique

        ​​​​​​​ 1.3 默认值:default

1.4 列描述:comment

1.5 主键约束:primary key

1.6 外键约束

1.7 综合案例

2.插入查询结果

3.聚合函数

4.group by(分组查询)


1.数据库约束

关系型数据库的一个重要功能,就是需要保证数据的完整性,正确的数据~

可以通过人工的方式来观察确认数据的正确性,可以,但是不合适,这个事情可能会导致人的疏忽,把一些错误没检查出来。

约束,就是让数据库帮助程序员更好的检查数据是否正确。

1.1 非空:not null

create table student(id int not null);

1.2 唯一:unique

unique 的作用:规定这个值是唯一的,不能重复出现

create table student(id int unique);

数据库如何判定,当前这一条记录是重复的呢?

数据库会先查找,再插入,但是加上约束之后,数据库的执行过程可能就变了,很可能执行时间、执行效率就受到很大影响,但是这里的代价再大,也比你手工检查一遍代价小很多,而且准确率也高很多。

1.3 默认值:default

和前面的约束条件一样,只需要在添加的元素后加上即可

默认值的生效:数据在插入的时候不给该字段赋值,就使用默认值

create table student(id int,name varchar(20) default '无名氏');

1.4 列描述:comment

没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA 来进行了解。类似于注释。

1.5 主键约束:primary key

实际开发中,大部分的表,一般都会带有一个主键,主键往往是一个整数表示的id,比如int id

主键约束,就是同时拥有not null + unique的约束

主键同样是在插入记录的时候,需要先查询,再插入

正因为主键和unique都有先查询的过程,mysql就会默认给primary key和unique这样的列,自动添加索引,来提高查询的速度~

1.在MySQL中,一个表里只能有一个主键,不能有多个

2.虽然主键不能有多个,MySQL允许把多个列放到一起共同作为一个主键(联合主键)

3.自增主键:

create table student(id int primary key auto_increment);

Extra中有auto_increment代表这个就是自增主键

同时插入id的时候,可以手动指定,也可以不手动指定(null),后者会有mysql自动生成

同时自增主键,并不会重复利用中间的空隙,是依照之前的最大值来往后累加的

1.6 外键约束

外键约束是约束中较难的,因为涉及到两个表的约束。什么是外键约束呢?

表1记录了学生信息,表2记录了班级信息,但是要保证表2的班级信息和表1的学生信息对得上,就需要外键来约束,防止某个学生出现在不存在的班级的情况出现。

要想完成这样一个外键约束,该怎么做呢?

先创建父表:

 再创建子表:

 注意这条语句,这就是创建外键的语句,基本格式为:

foreign key (子表中需要被约束的元素) references 父表(父表中对应的列);

在这个案例中,代表着stu中的class_id要在myclass表中的id列中存在!

此时如果只有两个班级,那么插入30班的时候就会报错!

需要注意的点:

1.若要创建外键,那么父表中对应的列要有主键或者unique约束

2.当我们删除被外键约束的元素时,会提示删除失败,只有将父表和子表同时删除才能删除这个元素。

如何理解外键约束:

首先我们承认,这个世界是数据很多都是相关性的。 理论上,上面的例子,我们不创建外键约束,就正常建立学生表,以及班级表,该有的字段我们都有。 此时,在实际使用的时候,可能会出现什么问题? 有没有可能插入的学生信息中有具体的班级,但是该班级却没有在班级表中? 比如学校只开了1班,但是在上课的学生里面竟然有2班的学生(这个班目前并不存在),这很明显是有问题的。 因为此时两张表在业务上是有相关性的,但是在业务上没有建立约束关系,那么就可能出现问题。 解决方案就是通过外键完成的。建立外键的本质其实就是把相关性交给mysql去审核了,提前告诉mysql表之间的约束关系,那么当用户插入不符合业务逻辑的数据的时候,mysql不允许你插入。

1.7 综合案例

  • 有一个商店的数据,记录客户及购物情况,有以下三个表组成:
  • 商品goods(商品编号goods_id,商品名goods_name, 单价unitprice, 商品类别category, 供应商 provider)
  • 客户customer(客户号customer_id,姓名name,住址address,邮箱email,性别sex,身份证card_id)
  • 购买purchase(购买订单号order_id,客户号customer_id,商品号goods_id,购买数量nums)
  • 要求需要有:
  • 每个表的主外键
  • 客户的姓名不能为空值
  • 邮箱不能重复
  • 客户的性别(男,女)
  • create datebase mall;
    
    use mall;
    
    create table goods(
        goods_id int primary key auto_increment,
        goods_name varchar(32),
        unitprice int,
        category varchar(12),
        provider varchar(64)
    );
    
    create table customer(
        customer_id int primary key auto_increment,
        name varchar(32),
        address varchar(256),
        email varchar(64) unique key,
        sex enum('男','女') not null,
        card_id char(18) unique key
    );
    
    create tablepurchase(
        order_id int primary key auto_increment,
        customer_id int,
        goods_id int,
        nums int,
        foreign key (customer_id) references customer(customer_id),
        foreign key (goods_id) references goods(goods_id)
    );

2.插入查询结果

在SQL中,还可以把查询的结果,插入到另一个表中~

insert into (student1) select * from student2;

在这个例子中,就是把student2插入到了student1中

同时要求student2和student1 列数和列的类型要匹配~

3.聚合函数

聚合查询本质上是在行与行之间进行运算,通常我们用SQL中的内置函数来完成:

同时这些操作都是针对某个列的所有行来进行运算的

 eg:count (返回查询到的数据的数量)

select count(*) from exam_result;

这个操作就相当于先进行select*,然后针对返回的结果,再进行count运算,求结果集合的行数

4.group by(分组查询)

在select中使用group by 子句可以对指定列进行分组查询

现在有这样的一群数据:

 现在要求算平均工资:

 但是我们可以发现,所有人的平均工资都被平均下来了,参考价值不大,我们需要的是程序员的平均工资,这个时候我们就需要用到group by来对role这一个条件进行分类:

这样我们就能得到程序员和老板分别的平均工资,这也就是group by 的用法~

把某一列,相同的行分成一组,再进行下一步计算,并且group by 默认是升序排序。

having和group by配合使用 对group by结果进行过滤

select avg(sal) as myavg from EMP group by deptno having myavg<2000;

--having经常和group by搭配使用,作用是对分组进行筛选,作用有些像where。

本章完~

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

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

相关文章

AI心理咨询师:舒缓焦虑,解放压力的秘诀

在如今高压力的生活和工作环境下&#xff0c;焦虑和内耗成为了越来越多人的问题。这一现象对我们的身体和心理都会造成很大的影响。如何治愈我们的焦虑和精神内耗&#xff1f; 1.减少工作压力 - 了解和认可自己的能力和限制&#xff0c;不要让工作压力压垮自己。 - 适当的规…

软件测试工程师的职业发展方向

一、软件测试工程师大致有4个发展方向: 1 资深软件测试工程师 一般情况&#xff0c;软件测试工程师可分为测试工程师、高级测试工程师和资深测试工程师三个等级。 达到这个水平比较困难&#xff0c;这需要了解很多知识&#xff0c;例如C语言&#xff0c;JAVA语言&#xff0c…

浙大数据结构

题目详情&#xff1a;06-图1 列出连通集 给定一个有N个顶点和E条边的无向图&#xff0c;请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时&#xff0c;假设我们总是从编号最小的顶点出发&#xff0c;按编号递增的顺序访问邻接点。 输入格式: 输入第1…

<数据结构>NO5.栈和队列

目录 栈 Ⅰ.栈的概念 Ⅱ.栈的实现 Ⅲ.测试代码 队列 Ⅰ.队列的概念 Ⅱ.队列的实现 &#x1f4ad;前言 栈和队列也是一种常见的线性存储的数据结构&#xff0c;只不过它们的某些操作受到了限制&#xff0c;比如栈只允许从栈顶插入删除元素、队列只允许从队尾插入元素&…

[算法] ArrayList 和 LinkedList 的优缺点比较及使用场景

&#x1f61a;一个不甘平凡的普通人&#xff0c;致力于为Golang社区和算法学习做出贡献&#xff0c;期待您的关注和认可&#xff0c;陪您一起学习打卡&#xff01;&#xff01;&#xff01;&#x1f618;&#x1f618;&#x1f618; &#x1f917;专栏&#xff1a;算法学习 &am…

MySQL高级_第12章_数据库其它调优策略

MySQL高级_第12章_数据库其它调优策略 1. 数据库调优的措施 1.1 调优的目标 尽可能 节省系统资源 &#xff0c;以便系统可以提供更大负荷的服务。&#xff08;吞吐量更大&#xff09; 合理的结构设计和参数调整&#xff0c;以提高用户操作 响应的速度 。&#xff08;响应速…

使用Visual Studio进行cuda编程配置环境四大坑(附解决方案)

写在前面&#xff0c;用于没有使用过Visual Studio进行cuda编程的同学看&#xff0c;以免在安装环境的时候踩到坑 第一坑&#xff1a;CUDA版本与NVIDIA显卡版本不匹配问题: 安装cuda版本坑&#xff0c;强烈建议看下自己的显卡支持什么版本的cuda&#xff0c;切记不要用最新版…

由浅入深Netty基础知识NIO网络编程

目录 1 非阻塞 vs 阻塞1.1 阻塞1.2 非阻塞1.3 多路复用 2 Selector2.1 创建2.2 绑定 Channel 事件2.3 监听 Channel 事件2.4 select 何时不阻塞 3 处理 accept 事件3.1 事件发生后能否不处理 4 处理 read 事件4.1 为何要 iter.remove()4.2 cancel 的作用4.3 不处理边界的问题4.…

Python 迭代器与生成器

一. 迭代器 迭代是Python最强大的功能之一&#xff0c;是访问集合元素的一种方式。 &#xff08;1&#xff09;迭代器对象从集合的第一个元素开始访问&#xff0c;直到所有的元素被访问完结束。 &#xff08;2&#xff09;迭代器可以记住遍历的位置的对象&#xff0c;并且只能…

Springboot 整合 spring security,简单实现认证和授权

一.简介 Spring Security 是 Spring 家族中的一个安全管理框架。 一般来说&#xff0c;常见的安全管理技术栈的组合是这样的&#xff1a; SSM ShiroSpring Boot/Spring Cloud Spring Security 对于一个权限管理框架而言&#xff0c;无论是 Shiro 还是 Spring Security&am…

tf.image.decode_jpeg(别名tf.io.decode_jpeg)函数工作原理分析

1 问题提出 最近在阅读某个论文的源代码时&#xff0c; 发现作者在读取图像数据时没有使用PIL.Image或opencv库&#xff0c;而是使用了tf.image.decode_jpeg&#xff0c;代码节选如下&#xff1a; # tf1中的函数, 用于读取文件 # tf2中该函数更改为了tf.io.read_file image_c…

【Linux权限的概念及理解】

目录 一、认识linux下的用户分类二、什么叫权限三、没有权限会怎么样&#xff08;见一见&#xff09;四、权限的修改问题4.1chmod指令4.2chown指令4.3chgrp指令 五、两个问题粘滞位5.1Question15.2Question25.3粘滞位 一、认识linux下的用户分类 Linux下有两种用户&#xff1a…

mysql中的Redo log

目录标题 前言redolog保证持久性redolog工作过程 redo log中的WAL&#xff08;先写日志&#xff0c;再写磁盘【写入redo log file】&#xff09;刷盘策略 重要参数innodb_flush_log_at_trx_commit如何选择 Redo log file日志文件日志文件组redo log刷盘与数据页刷盘redo log何时…

Vue CLI Todo-List案例

3.7. Todo-List 案例 组件化编码流程 拆分静态组件&#xff1a;组件要按照功能点拆分&#xff0c;命名不要与html元素冲突实现动态组件&#xff1a;考虑好数据的存放位置&#xff0c;数据是一个组件在用&#xff0c;还是一些组件在用 一个组件在用&#xff1a;放在组件自身即…

Cesium入门之八:Cesium加载矢量数据

目录 一、什么是矢量数据二、Cesium支持的矢量数据格式KML格式KmlDataSource CZML格式CzmlDataSource GeoJSON格式GeoJsonDataSource 三、Cesium加载GeoJSON数据格式的中国地图示例 一、什么是矢量数据 矢量数据是用于描述地理空间几何特征的一类基于向量的地理信息数据&#…

RabbitMQ的几种通讯方式及其代码示例

文章目录 一、引言二、RabbitMQ介绍三、RabbitMQ安装四、RabbitMQ架构4.1 官方的简单架构图4.2 RabbitMQ的完整架构图4.3 RabbitMQ 通讯方式4.4 Hello-World案例演示4.5 基本原理 五、SpringBoot整合RabbitMQ的使用5.1 导入依赖5.2 在application.properties中增加配置5.3 Hell…

前端学习--Vue(2)

一、Vue简介 1.1 概念 Vue是一套用于构建用户界面的前端框架 框架&#xff1a;现成解决方案&#xff0c;遵守规范去编写业务功能 指令、组件、路由、Vuex、vue组件库 1.2 特性 数据驱动视图 vue连接页面结构和数据&#xff0c;监听数据变化&#xff0c;自动渲染页面结构…

Vue--》Vue 3 路由进阶——从基础到高级的完整指南

目录 Vue3中路由讲解与使用 路由的安装与使用 路由模式的使用 编程式路由导航 路由传参 嵌套路由 命名视图 重定向与别名 Vue3中路由讲解与使用 Vue 路由是 Vue.js 框架提供的一种机制&#xff0c;它用于管理网页上内容的导航。Vue 路由可以让我们在不刷新页面的情况下…

【ChatGPT】通过 ChatGPT 用文字描述来绘制插画

点击上方“独立开发者杂谈” 喜欢本文&#xff0c;请置顶或星标 使用文字描述绘制插画具有以下好处 无需绘画技巧&#xff0c;体验与AI结合&#xff0c;创意灵活性&#xff0c;节省时间。 使用 Figma 工具 Figma &#xff08;https://www.figma.com&#xff09;是一款流行的设计…

Linux:iptables防火墙

Linux&#xff1a;iptables防火墙 一、iptables防火墙概述1.1 iptables防火墙1.2 netfilter/iptables 关系 二、Linux防火墙基础2.1 iptables的表、链结构2.2 数据包控制的匹配流程 三、编写防火墙规则3.1 基本语法、控制类型3.2 添加、查看、删除规则等3.3 规则的匹配条件3.3.…