探讨MySQL中 “约束“ 下的查询
目录:
一. 数据库约束
二. 表的设计
三. 聚合查询
四.联合查询

一. 数据库约束:
1.约束类型汇总:
约束类型 说明 NULL约束 使用NOT NULL指定列不为 空 UNIQUE唯一约束 指定列为唯一的、不重复的 DEFAULT默认值约 束 指定列为空时的默认值 主键约束(primary key) NOT NULL 和 UNIQUE 的 结合
外键约束 关联其他表的主键或唯一键
语法:foreign key (列) references 主表(列)
CHECK约束 保证列中的值符合指定的条件 1.1 NULL约束:
创建表时,可以指定某列不为空:
DROP TABLE IF EXISTS student; CREATE TABLE student (id INT NOT NULL,sn INT,name VARCHAR(50),qq_mail VARCHAR(50) );1.2 DEFAULT:默认值约束:
mysql> CREATE TABLE student (-> id INT NOT NULL,-> name VARCHAR(20) DEFAULT '默认为无名氏');
1.3 PRIMARY KEY:主键约束:
CREATE TABLE student2 (-> id bigint primary key auto_increment,-> name VARCHAR(20) DEFAULT '默认为无名氏');这里还使用了auto_increment,在插入时不指定,可以让id字段自增。
注意这里一个表不可以有多个主键,都是可以有复合主键
如下:
1.4 FOREIGN KEY:外键约束:
外键用于关联其他表的主键或唯一键
语法:
foreign key (本表要关联的字段) references 主表(列)
例子:创建班级表classes,id为主键;
创建学生表student,一个学生对应一个班级,一个班级对应多个学生。使用id为主键, classes_id为外键,关联班级表id。
create table student(-> id INT PRIMARY KEY auto_increment,-> class_id int,-> foreign key (class_id) references class (id)-> );create table class(-> id INT PRIMARY KEY auto_increment,-> name varchar(50)-> );注意:这里的class_id的类型,要和主表class的id类型一致这里都是(int)
不然会报类型不兼容错误导致定义失败
二. 表的设计:
1.设计表的时候要遵循三大范式。
第一范式:表里的字段不可以再进行拆分
第二范式:再满足第一范式的基础上,不存在非关键字段对任意候选键的部分函数依赖
(简单来说就是非主键字段对任意主键,外键,唯一键的部分函数依赖)
小结:一个表没有复合主键就天然满足第二范式
第三范式:再满足第二范式的基础上,不存在非关键字段对任意候选键的传递依赖
第三范式可以解决数据冗余,更新异常,插入异常,删除异常等问题
2.设计时表之间的三大关系:
一. 一对一:比如用户和账号信息,可以建立在一个表中
二. 一对多:一个班级有多个学生设计如下:
三. 多对多:一个学生可以选多门课,一门课可以被多个学生选
学生表和课程表是多对多的关系,这里通过课程表(关系表)关联
三. 聚合查询:
1.常见的统计总数、计算平局值等操作,可以使用聚合函数来实现,常见的聚合函数有:
函数 说明 COUNT([DISTINCT] expr) 返回查询到的数据的 数量 SUM([DISTINCT] expr) 返回查询到的数据的 总和,不是数字没有意义 AVG([DISTINCT] expr) 返回查询到的数据的 平均值,不是数字没有意义 MAX([DISTINCT] expr) 返回查询到的数据的 最大值,不是数字没有意义 MIN([DISTINCT] expr) 返回查询到的数据的 最小值,不是数字没有意义 例子:
1.1COUNT:统计行数
统计班里有多少同学:
1.2 SUM:
统计语文成绩总分:
1.3 AVG:
统计语文平均分:
1.4 MAX:
语文最高分:
1.5 MIN
语文最低分:
2.GROUP BY子句:
2.1 SELECT 指定的字段必须是“分组依据字段”,其他字段若想出现在SELECT 中则必须包含在聚合函 数中。
2.2:语法:
select 需要分组的列, sum(column2), .. from table group by 需要分组的列
2.3:例子:
mysql> create table emp(-> id int primary key auto_increment,-> name varchar(20) not null,-> role varchar(20) not null,-> salary numeric(11,2)-> ); Query OK, 0 rows affected (0.07 sec)mysql> insert into emp(name, role, salary) values-> ('马云','服务员', 1000.20),-> ('马化腾','游戏陪玩', 2000.99),-> ('孙悟空','游戏角色', 999.11),-> ('猪无能','游戏角色', 333.5),-> ('沙和尚','游戏角色', 700.33),-> ('隔壁老王','董事长', 12000.66); Query OK, 6 rows affected (0.04 sec)查询每个角色的最高工资:
3.HAVING条件语句:
GROUP BY 子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 WHERE 语句,而需要用 HAVING
例子:查询每个角色小于一万的最高工资:
四.联合查询:
1.实际开发中往往数据来自不同的表,所以需要多表联合查询。多表查询是对多张表的数据取笛卡尔积。
笛卡尔积其实是个全排列的过程
语法:
select * from 表名 表名
如图:
上面有很多无用数据,我们可以通过连接条件过滤
2.内连接:
写法一:select 字段 from 表1 别名1 join 表2 别名2 on 连接条件 and 其他条件;
写法二:select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;
例子:这里我们过滤一下上面的class和student的查询
从图可以看出两个表的class_id有依赖关系,只要他们相等即可。
3.外连接:
外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接;右侧的表完 全显示我们就说是右外连接
语法:
-- 左外连接,表1完全显示 select 字段名 from 表名1 left join 表名2 on 连接条件;
-- 右外连接,表2完全显示 select 字段 from 表名1 right join 表名2 on 连接条件;
如果是left join,就以左边的表为基准显示;
如果是right join ,就以右边的表为基准显示;
这里就是以右边student表为基准表显示的
4.自连接:
自连接是指在同一张表连接自身进行查询
5.子查询:
子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询。
分为:
5.1.单行子查询:返回一行记录的子查询(返回一个对象)
例子:查询与“韩立” 同学的同班同学
5.2.多行子查询:返回多行记录的子查询(返回一个集合,包含多个对象);用到IN关键字
例子:在成绩表中查询彩儿和清涟同学的成绩的成绩信息
6.合并查询:
在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all。使用UNION 和UNION ALL时,前后查询的结果集中,字段需要一致也就是两张表要完全一致。
6.1 UNION:
该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行
例子:
6.2.nion all:

相关文章:
探讨MySQL中 “约束“ 下的查询
目录: 一. 数据库约束 二. 表的设计 三. 聚合查询 四.联合查询 一. 数据库约束: 1.约束类型汇总: 约束类型 说明 NULL约束使用NOT NULL指定列不为 空UNIQUE唯一约束指定列为唯一的、不重复的DEFAULT默认值约 …...
Nuxt3【布局】layouts 详解
Nuxt 内置布局框架,用法如下: 修改 app.vue <template><NuxtLayout><NuxtPage /></NuxtLayout> </template>NuxtLayout 为 Nuxt 的内置组件,默认加载 layouts/default.vue ,若页面中指定了布局&…...
获取数据源(多种方式爬虫介绍)
获取不同类型的数据源: 对于看上的网站如何获取其信息: 1.分析原网站是如何获取到这些数据的?哪个接口?哪些参数? 2.用程序去调用接口(python/java都可以) 3.处理一些数据,优化数…...
Linux下FTP服务器搭建配置:vsftpd的安装与配置实验
文章目录 vsftpd的安装与配置指南1. vsftpd的安装2. vsftpd配置详解3. 匿名访问测试4. 本地用户访问FTP的配置5. 修改匿名用户和本地用户的默认根目录6. 黑名单与白名单的使用7. 使用Windows文件资源管理器登录8. 拓展FTP的使用场景9. 注意事项 vsftpd的安装与配置指南 本文详…...
使用Java调用Apache commons-text求解字符串相似性实战
目录 前言 一、字符串距离的几种计算方法 1、Levenshtein 距离 2、Overlap Coefficient计算 3、Q-gram Matching 4、余弦相似性计算 二、基于余弦相似性的基地名称对比 1、加载百科中的基地信息列表 2、设置忽略词列表 3、将数据库地名和Excel进行对比 三、总结 前言…...
http request-01-XMLHttpRequest XHR 简单介绍
http 请求系列 http request-01-XMLHttpRequest XHR 简单介绍 http request-01-XMLHttpRequest XHR 标准 Ajax 详解-01-AJAX(Asynchronous JavaScript and XML)入门介绍 Ajax XHR 的替代方案-fetch Ajax XHR 的替代方案-fetch 标准 Ajax 的替代方案…...
关于tresos Studio(EB)的MCAL配置之DIO
General Dio Development Error Detect开发者错误检测 Dio Flip Channel Api翻转通道电平接口Dio_FlipChannel是否启用 Dio Version Info Api决定Dio_GetVersionInfo接口是否启用,一般打开就行。 Dio Reverse Port Bits让端口的位(通道)进…...
【漫谈C语言和嵌入式003】1394总线
1394总线(FireWire或IEEE 1394)是一种高速串行总线标准,最初由苹果公司开发,并在1995年被IEEE(电气与电子工程师协会)批准为国际标准。它最初的目标是提供一种高性能、低延迟的数据传输方法,用于…...
python爬虫爬取某图书网页实例
文章目录 导入相应的库正确地设置代码的基础部分设置循环遍历遍历URL保存图片和文档全部代码即详细注释 下面是通过requests库来对ajax页面进行爬取的案例,与正常页面不同,这里我们获取url的方式也会不同,这里我们通过爬取一个简单的ajax小说…...
Linux 用户管理的基本概念、常用工具及操作流程
😀前言 本篇博文是关于Linux 中用户管理的基本概念、常用工具及操作流程,并提供了一些实用的示例和注意事项。希望这些内容能帮助读者在日常工作中更加高效地管理 Linux 系统的用户账户,希望你能够喜欢🥰 🏠个人主页&a…...
手撕C++入门基础
1.C介绍 C课程包括:C语法、STL、高阶数据结构 C参考文档:Reference - C Reference C 参考手册 - cppreference.com cppreference.com C兼容之前学习的C语言 2.C的第一个程序 打印hello world #define _CRT_SECURE_NO_WARNINGS 1 // test.cpp // …...
NPM版本控制策略:实现版本候选行为的指南
引言 在现代JavaScript项目中,依赖管理是确保应用稳定性和安全性的关键环节。NPM(Node Package Manager)作为Node.js的包管理器,提供了一套灵活的版本控制机制,允许开发者精确控制依赖包的版本。版本候选行为…...
问题集锦6
1.外调外围接口数据库没有变化 我已经修改完发到线上,看调用用代码释放更新了 or 自己掉测试环境试下 handledList 2.list每次写入最前面 List<Integer> snew ArrayList<>();s.add(1);s.add(2);s.add(0,0);System.out.println(s);3.集合 List<Inte…...
【研发日记】嵌入式处理器技能解锁(四)——TI C2000 DSP的Memory
文章目录 前言 背景介绍 Memory映射 RAM ROM 外设Register Memory分配 应用实例 总结 参考资料 前言 见《【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法》 见《【研发日记】嵌入式处理器技能解锁(二)——TI C2000 DSP的SCI(串口)通信》 见《…...
Ubuntu离线安装docker
查看操作系统版本: rootzyh-VMware-Virtual-Platform:~/install# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 24.04 LTS Release: 24.04 Codename: noble rootzyh-VMware-Virtual-Platform:~/install#…...
【抓耳挠腮,还是升职加薪,一起来画架构图!】
1. 焦头烂额 最近又遇到个焦头烂额的事情 ,老板有了新想法,业务有所转向,需要新的方案设计 ,架构设计,以进行后续实施。很快,第一次汇报来了, 由于前期准备时间短,模块拆分不清晰&a…...
算法的学习笔记—合并两个排序的链表(牛客JZ25)
😀前言 在算法面试中,链表问题是经常遇到的考点之一,其中合并两个排序链表是一个非常经典的问题。本文将详细介绍如何通过递归和迭代两种方式实现两个有序链表的合并。 🏠个人主页:尘觉主页 文章目录 😀合并…...
《虚拟之旅:开启无限可能的机器世界》简介:
1.Ubonto的介绍: Ubuntu 是一个流行的开源操作系统,基于 Linux 内核。 它具有以下一些特点和优势: 开源免费:任何人都可以免费使用、修改和分发。丰富的软件库:通过软件包管理器可以方便地安装各种应用程序。良好的…...
centos7 服务器搭建
1. 查看 centos 版本 cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)2 .查看 ip地址 ip addr sudo yum install net-tools -y 3. 是否能够上网 ping www.baidu.com ping 114.114.114.114 sudo systemctl restart network 4. DNS 更新DNS配置 编辑/etc/r…...
【Godot4自学手册】第四十五节用着色器(shader)制作水中效果
本节内容,主要学习利用着色器制作水波纹效果,效果如下: 一、搭建新的场景 首先我们新建场景,根节点选择Node2D,命名为Water,给根节点添加两个Tilemap节点,一个命名为Background主要用于绘制地…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...






















