MySQL五种约束类型(普通 /自增主键,外键等) + 进阶查询(聚合查询,内 /外连接查询,自连接查询,子查询,合并查询)

news2024/11/24 12:32:18

文章目录

  • 前言
  • 一、五种约束
    • NOT NULL 约束
    • UNIQUE 约束
    • DEFAULT 约束
    • PRIMARY KEY 主键约束(重点)
      • 普通主键
      • 自增主键
    • FOREIGN KEY 外键约束(重点)
  • 二、进阶查询
    • 聚合查询
      • 聚合函数
      • GROUP BY子句
      • HAVING
    • 联合查询
      • 笛卡尔积
      • 内连接
      • 外连接
      • 自连接
      • 子查询
        • 单行子查询:返回一行记录的子查询
        • 多行子查询:返回多行记录的子查询
      • 合并查询
  • 总结


前言

本人是一个普通程序猿!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果你也对编程感兴趣的话,互关一下,以后互相学习,共同进步。这篇文章能够帮助到你的话,劳请大家点赞转发支持一下!


一、五种约束

约束类型说明
NOT NULL指示某列不能存储 NULL 值
UNIQUE保证某列的每行必须有唯一的值
DEFAULT规定没有给列赋值时的默认值
PRIMARY KEYNOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录
FOREIGN KEY保证一个表中的数据匹配另一个表中的值的参照完整性

NOT NULL 约束

  • NOT NULL 约束,在创建表时,指定某个字段不能为NULL。

创建一个学生表,有三个字段,id(学号),name(名字),age(年龄);指定id字段不能为NULL。

create table student (id int NOT NULL,name varchar(10),age int);

表结构
在这里插入图片描述
插入示例
在这里插入图片描述


UNIQUE 约束

  • UNIQUE 约束,在创建表时,指定某个字段数据是唯一的,不能重复。

创建一个学生表,有三个字段,id(学号),name(名字),age(年龄);指定id字段是唯一的,不能重复。

create table student (id int UNIQUE,name varchar(10),age int);

表结构
在这里插入图片描述

插入示例
在这里插入图片描述


DEFAULT 约束

  • DEFAULT 约束,在创建表时,设置某个字段插入数据时为空的默认值。
    (默认值是insert语句指定字段插入时,其他未被指定到的字段就是按照默认值来填充)

创建一个学生表,有三个字段,id(学号),name(名字),age(年龄);指定name字段为空时,给定一个 “无名氏” 默认值。

create table student(id int,name varchar(10) DEFAULT "无名氏",age int);

表结构
在这里插入图片描述

插入示例
在这里插入图片描述


PRIMARY KEY 主键约束(重点)

普通主键

每个表中只能有一个主键

  • PRIMARY KEY 主键约束,在创建表时,指定 某个字段或几个字段综合起来 插入数据不能为NULL,不能重复。

主键类似于NOT NULL + UNIQUE;此时这个主键就等同于这条数据独一无二的身份标识。
独一无二的身份标识,就类似于咱们的身份证号码,即使重名,出生日期也是同一天,依旧可以凭借身份证号码,找到那个独一无二的你。

创建一个学生表,有三个字段,id(学号),name(名字),age(年龄);指定id字段为主键。

create table student (id int PRIMARY KEY,name varchar(10),age int);

表结构

在这里插入图片描述

插入示例
在这里插入图片描述
当然,此处MySQL只是实现了检查校验的工作,当插入数据粗心时,仍会报错。
但是对于字段类型为int的主键,MySQL贴心的提供了自增主键,来帮你解决。


自增主键

只有int类型的字段可以设置为自增主键

  • 自增主键与普通主键的区别是当你插入数据时, 自增主键的字段为NULL或没有为这个字段插入数据时 ,会 自动给定一个值:当前该列最大值+1(如该列没有数据时,默认是0)

创建一个学生表,有三个字段,id(学号),name(名字),age(年龄);指定id字段为自增主键。

create table student (id int PRIMARY KEY auto_increment,name varchar(10),age int);

表结构

在这里插入图片描述

插入示例
在这里插入图片描述


FOREIGN KEY 外键约束(重点)

  • 外键用于关联其他表的主键或唯一键。

说明
假设:每个班级有一个班级表(class),每个学生有一个学生表(student)

class表中的学号字段是主键,每个同学都有唯一不重复的学号。
student表当中的学号必须在对应的班级表中的学号字段中存在。

此时,student表当中的学号字段就可以当成外键来处理,关联的是class表中的学号字段。
如果插入数据时, 外键关联的表中的对应字段中没有匹配到相同数据,则插入失败报错 在。

class是student的父表
student是class的子表

创建一个班级表,有两个字段,class_id(班级表中的学号),name(名字);指定class_id字段为自增主键。

create table class(class_id int PRIMARY KEY auto_increment,name varchar(10));

创建一个学生表,有三个字段,student_id(学生表中的学号),name(名字),score(成绩),class_id(班级表中的学号);指定class_id字段为外键,关联class表中的class_id字段。

create table student(student_id int PRIMARY KEY auto_increment,name varchar(10),score int,class_id int,FOREIGN KEY(class_id) REFERENCES class(class_id));

表结构
class表
在这里插入图片描述

student表
在这里插入图片描述

插入示例

在这里插入图片描述
向子表插入数据时,MySQL会拿着你要插入的外键字段数据,去绑定的父表中的字段去匹配,匹配成功,才能完成后续插入,匹配失败,插入失败。

子表约束父表
以上都是父表在约束子表,但是同时,子表也在约束父表。

如果父表中被关联的字段,已经被匹配成功过,那么这个字段就不可修改删除
在这里插入图片描述

同样, 一旦父表被关联,那么只有子表被删除后,才能删除父表 (无论父表中的字段有没有被匹配成功过)。
在这里插入图片描述

因此如果在某场景下要删除父表中的某条数据,没办法直接删除,建议在建表时,添加一个字段,来标记这个字段是否被删除。


二、进阶查询

更高阶的MySQL查询语句。

聚合查询

聚合函数

常见的统计总数、计算平均值等操作,可以使用聚合函数来实现,常见的聚合函数有:

函数说明
COUNT([DISTINCT] expr)返回查询到的数据的 数量
SUM([DISTINCT] expr)返回查询到的数据的 总和,不是数字没有意义
AVG([DISTINCT] expr)返回查询到的数据的 平均值,不是数字没有意义
MAX([DISTINCT] expr)返回查询到的数据的 最大值,不是数字没有意义
MIN([DISTINCT] expr)返回查询到的数据的 最小值,不是数字没有意义

创建一个学生成绩表,有三个字段,id(学号),name(名字),score(成绩);并插入了四条数据。

在这里插入图片描述

使用示例

COUNT(*): 代表查询出来的数据的个数 。 COUNT(字段): 代表查询出来的数据中该字段不为NULL的个数
在这里插入图片描述

下面的示例中的字段必须是数字

SUM(字段): 返回所有符合条件的字段的总和 在这里插入图片描述
AVG(字段): 返回所有符合条件的字段的平均值 在这里插入图片描述

MAX(字段): 返回所有符合条件的字段中的最大值 在这里插入图片描述

MIN(字段): 返回所有符合条件的字段中的最小值 在这里插入图片描述

GROUP BY子句

  • SELECT 中使用 GROUP BY 子句可以对某个字段进行分组查询或多个字段综合起来进行分组查询。

注意!

SELECT 中使用 GROUP BY 子句对“分组依据字段”重复的数据,只显示一次。
SELECT指定查询的字段最好是GROUP BY 子句的“分组依据字段”,如果想查询其他字段最好包含在聚合函数中。

创建一个学生成绩表,有四个字段,id(学号),name(名字),course(课程名),score(成绩);并插入了五条数据。

在这里插入图片描述

如果查询字段中包含非“分组依据字段”,那么他就只会返回查询到的第一条,不会返回所有条可以理解为他针对“分组依据字段”去重了。如下 在这里插入图片描述

查询张三的总成绩 在这里插入图片描述


HAVING

  • GROUP BY 子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 WHERE 语句,而需要用HAVING,用法相同。

还拿上面的student_score表举例。

查询张三哪科的成绩最高
在这里插入图片描述


联合查询

下面不同的联合查询均用以下两表为例

创建一个student表(本校学生表),有三个字段,id(学号),name(名字),age(年龄)。
创建一个score表(多校联考成绩表),有四个字段,id(学号),name(名字),course(课程名),score(成绩)。
并插入了一些数据。


此处建表一切从简,没有考虑任何实际场景,在实际应用中,要根据不同的场景需求,建立不同的表及约束。
在这里插入图片描述
在这里插入图片描述


笛卡尔积

实际开发中往往数据来自不同的表,所以需要多表联合查询。多表查询是对多张表的数据取笛卡尔积

对多张表的数据取笛卡尔积:就是 对多张表的字段进行拼接,将所有的数据可能组合都拼接出来 即A表中的每条数据都要和其他表的所有数据进行拼接。
在这里插入图片描述

对student表,score表取笛卡尔积,共查出72条数据
在这里插入图片描述


内连接

共有两种语法:

select 字段... from1 别名1 join2 别名2 on 连接条件 and 其他条件;
select 字段... from1 别名1,2 别名2 where 连接条件 and 其他条件;

不同表中相同名称字段的表示,格式: 表名.字段

内连接是公平的查询,不会偏袒任何一方,当两张表拼接出来的数据符合条件才会返回。

如下图,只会取两表拼接数据符合条件的部分。
在这里插入图片描述

使用内连接查询本校学生参加考试的科目成绩为例:

 select student.id,student.name,student.age,score.course,score.score from student,score where student.name = score.name;

在这里插入图片描述


外连接

外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接;右侧的表完全显示我们就说是右外连接。

-- 左外连接,表1完全显示
select 字段名  from 表A left join 表B on 连接条件;
-- 右外连接,表2完全显示
select 字段 from 表A right join 表B on 连接条件;

左外连接: 如下图,左边表的全部都会显示,右边表只显示符合条件部分,不符合条件部分显示为:NULL
在这里插入图片描述

右外连接: 如下图,右边表的全部都会显示,左边表只显示符合条件部分,不符合条件部分显示为:NULL
在这里插入图片描述

左外连接查询本校学生的所有科目成绩

select student.id,student.name,student.age,score.course,score.score from student left join score on student.name = score.name;

孙七和周八没参加任何考试,但是也显示出来了。
在这里插入图片描述

右外连接查询联考所有科目成绩的本校学生信息

select student.id,student.name,student.age,score.course,score.score from student right join score on student.name = score.name;

有四门科目的考生不是本校学生,也显示出来了。
在这里插入图片描述


自连接

自连接是指在同一张表连接自身进行查询。

找到英语I的成绩比高等数学I的成绩高的同学。

select s1.id,s1.name,s1.course,s1.score,s2.course,s2.score from score as s1,score as s2 where s1.name = s2.name and s1.course = "英语I" and s2.course = "高等数学I" and s1.score > s2.score;

在这里插入图片描述


子查询


子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询。
子查询就是把()中select语句返回的信息当作条件使用。


单行子查询:返回一行记录的子查询


查询本校学生张三的各科成绩。
子查询,把()中select语句返回的信息当作条件使用。

select * from score where id = (select id from student where name = "张三");

此时()中的select语句至多有一条结果,超过一条会报错。
在这里插入图片描述


多行子查询:返回多行记录的子查询

使用 IN关键字,就可以 在多条信息中进行检索

使用 NOT IN关键字,就可以 排除这多条信息

查询本校学生单科成绩大于等于80的学生信息。

select * from student where id in (select id from score where score >= 80);

在这里插入图片描述


查询本校学生单科成绩小于80的学生信息。

select * from student where id not in (select id from score where score >= 80);

在这里插入图片描述


合并查询


在实际应用中,为了 合并多个select的执行结果,可以使用集合操作符 UNION,UNION ALL 。使用UNION和UNION ALL时, 前后查询的结果集中,字段需要一致


查询联考中单科成绩小于80,与参加高等数学I科目的同学信息。

select id,name from score where score <= 80 
union
select id,name from score where course = "高等数学I";

union关键字自动进行去重
在这里插入图片描述

select id,name from score where score <= 80 
union all
select id,name from score where course = "高等数学I";

union all 关键字不进行去重
在这里插入图片描述


总结

以上就是今天要讲的内容,本篇文章还是比较繁重的,希望大家可以静下心来认真阅读。本篇文章所建的表都是没有适配任何应用场景的,只是为了体现要讲的知识点,实际场景建表时要考虑许多因素。

路漫漫不止修身,也养性。

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

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

相关文章

AI时代图像安全“黑科技”如何助力人工智能与科技发展?

〇、前言 7月7日下午&#xff0c;2023世界人工智能大会&#xff08;WAIC&#xff09;“聚焦大模型时代AIGC新浪潮—可信AI”论坛在上海世博中心红厅举行。人工智能等技术前沿领域的著名专家与学者、投资人和领军创业者汇聚一堂&#xff0c;共同探索中国科技创新的驱动力量。 在…

搭载下一代人工智能技术,微软推出Power Automate流程挖掘产品

在近日的Microsoft Inspire大会中&#xff0c;微软揭晓了他们即将推出的Power Automate流程挖掘产品&#xff0c;并计划在8月1日正式对外开放。 试用地址&#xff1a;https://powerautomate.microsoft.com/zh-cn/#home-signup 这款产品搭载了下一代人工智能技术&#xff0c;有…

好用的思维导图软件有哪些?这几款简单好用

好用的思维导图软件有哪些&#xff1f;思维导图是一种非常有用的思维工具&#xff0c;可以帮助我们组织和理清复杂的信息。在如今的数字时代&#xff0c;有很多软件可以帮助我们创建和编辑思维导图。下面介绍几款简单好用的思维导图软件。 第一款&#xff1a;迅捷画图 这是一款…

多个信贷范围时客户主数据界面的定制(套头和信用缴纳范围=信贷范围)

客户主数据-销售范围-开票的界面有信贷范围&#xff0c;叫贷方控制范围。 但是默认是看不到的。需要进行配置。 但是SAP的配置里面的名字很奇怪&#xff0c;在客户账户组里面的销售数据中(OVT0)定制 双击后处理的这个界面&#xff0c;和界面的“”开票凭证“”对不上&#x…

云原生微服务应用的平台工程实践

作者&#xff1a;纳海 01 微服务应用云原生化 微服务是一个广泛使用的应用架构&#xff0c;而如何使得微服务应用云原生化却是近些年一直在演进的课题。国内外云厂商对云原生概念的诠释大同小异&#xff0c;基本都会遵循 CNCF 基金会的定义&#xff1a; 云原生技术有利于各组…

Linux内核源代码的目录结构包括部分:

内核核心代码&#xff1a;这部分代码包括内核的各个子系统和模块&#xff0c;如进程管理、内存管理、文件系统、网络协议栈等。这些代码构成了Linux内核的核心功能。 非核心代码&#xff1a;除了核心代码之外&#xff0c;还包括一些非核心的代码和文件&#xff0c;如库文件、固…

【网站搭建】1安装Hexo

1.前期准备工作 安装node.js和git Node.js (nodejs.org) Git - Downloads (git-scm.com) 安装好后验证是否完成安装 2.打开Git安装配置Hexo 由于国内的镜像源速度较慢&#xff0c;所以我们利用 npm 来安装 cnpm &#xff0c;在命令行中输入npm install -g cnpm --registry…

一文详解 requests 库中 json 参数和 data 参数的用法

在requests库当中&#xff0c;requests请求方法&#xff0c;当发送post/put/delete等带有请求体的请求时&#xff0c;有json和data2个参数可选。 众所周知&#xff0c;http请求的请求体格式主要有以下4种&#xff1a; application/jsonapplicaiton/x-www-from-urlencodedmult…

291. 单词规律 II(plus题)

给你一种规律 pattern 和一个字符串 s&#xff0c;请你判断 s 是否和 pattern 的规律相匹配。 如果存在单个字符到 非空 字符串的 双射映射 &#xff0c;那么字符串 s 匹配 pattern &#xff0c;即&#xff1a;如果 pattern 中的每个字符都被它映射到的字符串替换&#xff0c;那…

python发送邮件zmail库

第三方库“zmail”和“yagmail”可实现邮件发送。在实际使用对比zmail比yagmail更简洁。使用zmail&#xff0c;无需登录OA邮箱&#xff0c;便可完成邮件的发送及附件的自动加载。 import zmaildef send_zmail(sender, sender_password, addressee, host, port465, inspect_smtp…

<C语言> 自定义类型

1.结构体 结构体是一种用户自定义的数据类型&#xff0c;允许将不同类型的数据项组合在一起&#xff0c;形成一个更大的数据结构。结构体可以包含多个成员变量&#xff0c;每个成员变量可以是不同的数据类型&#xff0c;如整数、字符、浮点数等&#xff0c;甚至可以包含其他结构…

师承AI世界新星|7天获新加坡南洋理工大学访学邀请函

能够拜师在“人工智能10大新星”名下&#xff0c;必定可以学习到前沿技术&#xff0c;受益良多&#xff0c;本案例中的C老师无疑就是这个幸运儿。我们只用了7天时间就取得了这位AI新星导师的邀请函&#xff0c;最终C老师顺利获批CSC&#xff0c;如愿出国。 C老师背景&#xff1…

线程与信号

1.子线程会继承主线程信号处理配置&#xff0c;故信号配置可以全部放在主线程内。 2.同一信号多次触发或者嵌套触发不会嵌套执行。 3.不同信号可以嵌套触发执行。 4.kill()触发的信号由进程&#xff08;主线程&#xff09;执行&#xff0c;pthread_kill()触发的信号由参数指…

数据结构-单链表

#include<stdio.h> #include<stdlib.h>typedef struct Node {int data;struct Node* next; }Node;//创建一个头结点&#xff0c;数据域保存链表节点数 Node* init_single_list() {Node* node (Node*)malloc(sizeof(Node));node->next NULL;node->data 0; …

想知道搭建知识库有什么重点?看这篇就够了

在目前这个提倡无纸化的时代&#xff0c;搭建一个知识库已经是一种潮流。无论是个人还是企业来说&#xff0c;都是特别重要的一个工具。今天looklook就从搭建知识库的重点这方面来展开&#xff0c;详细地告诉大家该如何成功搭建一个完善的知识库。 搭建知识库的重点 1.建立素材…

ASUS华硕飞行堡垒8笔记本FX506LH LI LU FX706原装出厂 Win10系统工厂模式20H2

自带所有驱动、出厂主题壁纸LOGO、Office办公软件、MyASUS电脑管家、奥创控制中心等预装程序 所需要工具&#xff1a;16G或以上的U盘 文件格式&#xff1a;HDI,SWP,OFS,EDN,KIT,TLK多个底包 文件大小&#xff1a;10.95GB 注&#xff1a;恢复时会清空电脑上所有盘的数据&…

大小端模式

文章目录 一、概念二、举例三、判大小端和交换 一、概念 大端模式&#xff08;Big-endian&#xff09;&#xff0c;是一种数据存储方式&#xff0c;其中较高的字节&#xff08;最高有效字节&#xff09;存储在较低的内存地址&#xff0c;较低的字节&#xff08;最低有效字节&am…

php 开发微信 h5 支付 APIv3 接入超详细流程

✨ 目录 &#x1f388; 申请商户号&#x1f388; 申请商户证书&#x1f388; 设置V3密钥&#x1f388; 开通H5支付&#x1f388; 设置支付域名&#x1f388; SDK 下载&#x1f388; 第一次下载平台证书&#x1f388;非第一次下载平台证书&#x1f388; H5下单 &#x1f388; 申…

如何在WordPress网站中更改字体(8 种方法)

字体在网站设计中起着至关重要的作用。它们为设计和整体美学定下了基调&#xff0c;可以增强或削弱其外观和感觉。为您的网站选择字体集后&#xff0c;您需要知道如何更改它们。在 WordPress 中更改字体的方法有多种。如何更改它们取决于许多因素&#xff0c;包括您使用的主题类…

西安---高时空分辨率、高精度一体化预测技术之风、光、水能源自动化预测技术应用

能源是国民经济发展和人民生活必须的重要物质基础。在过去的200多年里&#xff0c;建立在煤炭、石油、天然气等化石燃料基础上的能源体系极大的推动了人类社会的发展。但是人类在使用化石燃料的同时&#xff0c;也带来了严重的环境污染和生态系统破坏。近年来&#xff0c;世界各…