MySQL数据库 数据库基本操作(三):表的增删查改(中)

1. 数据库的约束

1.1 约束类型(一般发生于表的创建中)

  • NOT NULL - 指示某列不能存储 NULL 值
  • UNIQUE - 保证某列的每行必须有唯一的值
  • DEFAULT - 规定没有给列赋值时的默认值
  • PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录
  • FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性
  • CHECK - 保证列中的值符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句。(8之后的版本支持)

1.2 null约束

创建表的时候,可以指定某列不为空.
create table student (id int not null , sn int ,name varchar(5),qq_mail varchar(20));
创建一个学生表,规定id一列不可以为空.
在这里插入图片描述

1.3 unique约束

create table student (id int not null , sn int unique ,name varchar(5),qq_mail varchar(20));
创建一个学生表,规定sn一列为唯一的,不重复的.
在这里插入图片描述

1.4 default约束

create table student (id int not null , sn int unique ,name varchar(10) default 'unknown' ,qq_mail varchar(20));
创建一个表,name一列默认为unknown;
在这里插入图片描述
[注意]: 在默认值的上面要加上’ '表示字符串

1.5 primary key约束–>主键约束

create table student (id int primary key , sn int unique ,name varchar(10) default 'unknown' ,qq_mail varchar(20) );

指定id为主键
在这里插入图片描述
对于整数类型的主键,通常搭配自增长auto_increment来使用,插入对应数据对应字段不给值时(如给null),使用最大值+1.

create table student (id int primary key auto_increment , sn int unique ,name varchar(10) default 'unknown' ,qq_m ail varchar(20));

在这里插入图片描述
[注意] 每个表的主键只可以有一个.

1.6 foreign key–>外键约束

外键用于关联其他表的主键或者是唯一键.(关联的必须是使用primary key修饰的列或者unique修饰的列)
语法:
foreign key (字段名) reference 主表(列)
案例:

  • 创建班级表,id为主键.

create table class (id int primary key,name varchar(10));

在这里插入图片描述
创建班级表student , 一个学生对应一个班级,一个班级对应多个学生,使用id为主键,class_id为外键,关联班级表id.
create table student (id int primary key ,name varchar(10),class_id int ,foreign key (class_id) references class( id));

在这里插入图片描述
[注意]

  • 加外键的表称为子表,使用外键关联的表称为父表.
  • 在创建外键的时候,和主键的创建方式不一样,它的创建在所有列的最后,且要指定子表中的列和父表和父表中的列.
  • foreign拼写要正确,references注意不要少加s.
  • 关联之后,父表会对子表产生约束作用,下面进行举例.
 insert into class values(1, 'java 1');
 insert into student values(1, '张三' ,2);

在这里插入图片描述
在这里,我们可以看到,我们指定student的班级id为2,但是班级id为2的班级在父表中不存在,所以插入不成功.

  • 关联之后,子表也会对父表产生一定的制约,下面进行举例.
insert into student values(1,'张三',1);
insert into class values(2,'java 2');
delete from class where id=1;
delete from class where id=2;

在这里插入图片描述
在上图中我们看到在删除class表中id为1的行时候,删除失败,而删除id为2的时候删除成功,是因为子表student存在class_id为1的学生,所以不可以删除.

2. 表的设计

三大范式:

  1. 一对一
    在这里插入图片描述
  2. 一对多
    在这里插入图片描述
    就像我们在上面展示外键案例的时候,学生和班级之间的关系就是一对多,一个学生只可以属于一个班级,但是一个班级中可以有多个学生.
  3. 多对多
    在这里插入图片描述
 create table course (id int primary key,name varchar(10));
 create table student_course (student_id int , course_id int ,foreign key (student_id) references student(id),foreign key (course_id) references course(id));

我们在课程表和学生表之间创建一个中间表,叫student_course表,把学生和课程关联起来,这个表插入的元素取决于一个课程都被哪些同学选择,或者是一个学生都选择哪些课程.

3. 新增–>insert

插入查询结果,也就是把另一个表中所查询到的数据复制过来.
语法:
insert into 表名 (列名) select …
案例:把student的id和name数据复制到新建的student2中

create table student2 (id int primary key , name varchar(10),class_id int);
insert into student2 (id,name) select id,name from student;
select * from student2;

在这里插入图片描述
这里我们看到,student中的两列数据被成功地插入了student2这张表中.这里需要注意的一点是,前面insert插入操作的时候,列名要加括号,在后面select操作的时候,列名不需要加括号,还有插入表中的数据要和查询出来的数据类型相吻合.

4. 查询–>select

4.1 聚合查询

4.1.1 聚合函数

常见的统计总数,计算平均值等都可以用聚合函数来实现.常见的聚合函数如下:

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

案例:

  • count
    select count(*) from emp;
    在这里插入图片描述
    这里我们看到总共有八个人,count(*)返回的值就是8
    当然也可以对查询加上限制条件:
    select count(*) from emp where role='测试工程师';
    在这里插入图片描述
    我们看到,测试工程师一共有三人.
  • sum
    select sum(salary) from emp;
    统计所有人的薪资总和.
    在这里插入图片描述
    也可以令别名
    select sum(salary) as total from emp;
    在这里插入图片描述
    我们看到,表头被改为了total.
    也可以加入限制条件.
    select sum(salary) as total from emp where role='java工程师';
    在这里插入图片描述
    上述返回的就是所有java工程师的工资总和.

[注意]
sum中所包含的列一定是可加和的对象,如果说包含不可加和对象,则不会计入总和中.原理就是:在MySQL拿到一个不可直接运算的类型的时候,如字符串类型,sql会先尝试转化为double类型数据,若转换失败,则该数据不参与运算,并报出警告.

  • avg
    select avg(salary) from emp;
    统计所有人工资的平均值.
    在这里插入图片描述

  • max
    select max(salary) from emp;
    返回工资最高的人.
    在这里插入图片描述

  • min
    select min(salary) from emp;
    返回工资最少的人
    在这里插入图片描述

4.1.2 group by子句

select中使用group by子句可以对指定的列进行分组查询
语法:
select 列名,聚合函数(列名)… from table group by 列名
select role,avg(salary) from emp group by role;
计算各个岗位的平均工资.
在这里插入图片描述
这么看比较一整句话有些抽象,我们把这句话拆开来看,我们来分析它的执行逻辑:

  1. 先执行select role,salary from emp;查找出表中所有的结果.
  2. 再执行group by role,对查找出的结果进行分组.
  3. 再执行聚合函数,把avg(salary)带入每个分组进行计算.

可以再对薪资进行排序:
select role,avg(salary) from emp group by role order by avg(salary);
在这里插入图片描述
[注意]
select指定的字段必须为"分组的依据字段",其他字段要想出现在select语句中,必须使用聚合函数.否则返回的数据就是无意义的数据.
select name,role,avg(salary) from emp group by role;
在这里插入图片描述
这里我们看到,name一列返回的数据是没有任何规律的,是分组中随机的值.

4.1.3 having

group by 子句对结果进行分组之后,需要对分组之后的结果进行过滤,此时不可以使用where语句,要使用having语句.
select role,avg(salary) as avg from emp group by role having avg>=13000;
显示平均工资大于13000的岗位.

在这里插入图片描述
此时我们看到,大于13000的岗位有java和c++.

[辨析]使用having限制和使用where限制
在使用having限制的时候,是对分组之后的结果进行过滤,比如上面的例子,而使用where是对分组之前的结果进行遍历.下面来举一个where的例子.
select role,avg(salary) as avg from emp where name!= '张三' group by role;
计算各个岗位的平均工资,但是不包含张三.

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一站式自动化测试平台-Autotestplat

3.1 自动化平台开发方案 3.1.1 功能需求 3.1.3 开发时间计划 如果是刚入门、但有一点代码基础的测试人员,大概 3 个月能做出演示版(Demo)进行自动化测试,6 个月内胜任开展工作中项目的自动化测试。 如果是有自动化测试基础的测试人员,大概 …

突破!AI机器人拥有嗅觉!仿生嗅觉芯片研究登上Nature子刊

我们一直梦想着让AI与人类能够更加相似,赋予它们视觉与听觉。而让机器人拥有嗅觉一直以来面临着巨大的困难。 香港科技大学范志勇教授领导的研究团队凭借最新研发的仿生嗅觉芯片(BOC)在这一领域取得了重大突破。该研究成果目前已被发表到IF …

代码随想录算法训练营DAY17|C++二叉树Part.4|110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和

文章目录 110.平衡二叉树思路伪代码CPP代码 257.二叉树的所有路径思路伪代码实现CPP代码 404.左叶子之和思路伪代码CPP代码 110.平衡二叉树 力扣题目链接 文章讲解:110.平衡二叉树 视频讲解:后序遍历求高度,高度判断是否平衡 | LeetCode&…

COCO格式转YOLO格式训练

之前就转换过好几次,每次换设备训练,由于压缩包太大,u盘不够用。每次都要找教程从网上再下载一遍。因此这里记录一下,以免下次重新找教程。 在coco数据集中,coco2017train或coco2017val数据集中标注的目标(类别)位置在…

Qt事件学习案例

视频链接 https://www.bilibili.com/video/BV18B4y1K7Cs?p7&spm_id_frompageDriver&vd_sourcefa4ef8f26ae084f9b5f70a5f87e9e41bQt5跟着视频做即可,Qt6部分代码需要改动,改动的地方注释有写 素材 百度云 链接:https://pan.baidu.com/s/158j…

金三银四面试题(十四):Java基础问题(5)

这部分面试题多用于面试的热身运动,对很多找实习和准备毕业找工作的小伙伴至关重要。 避免序列化 可以使用transient 关键字修饰不想进行序列化的变量。 transient 关键字的作用是:阻止实例中那些用此关键字修饰的变量序列化;当对象被反序列…

Python 网络请求:深入理解Requests库

目录 引言 一、Requests库简介 二、安装与基本使用 三、requests库的特性与优势 四、requests库在实际应用中的案例 1.get请求 2.post请求 3.超时重试 4.headers设置 5.session会话 6.携带cookie​​​​​​​ 7.携带代理​​​​​​​ 8.携带身份认证​​​​​…

Windows集群部署项目

目录 一,环境准备 1.1.安装MySQL 1.2.安装JDK 1.3.安装TomCat 1.4.安装Nginx 二,部署 2.1.后台服务部署 2.2.Nginx配置负载均衡及静态资源部署 一,环境准备 1.1.安装MySQL 可以参考博客:http://t.csdnimg.cn/A75bg 1.2.…

FPGA(Verilog)实现uart传输协议传输数据(含仿真)

实现功能: 1.接收uart串行数据,输出并行数据(1byte)。 2.输入并行数据(1byte),输出uart串行数据。 3.完成uart传输的1次环回。 uart协议的1帧数据传输 uart_test系统框图 Verilog代码实现 1.uart接收模块:接收串行数据,输出并行数据和其有…

72小时内报告!美国发布关键基础设施网络攻击通报新规草案

美国网络安全和基础设施安全局(CISA)本周四发布了关键基础设施企业如何向政府报告网络攻击的规定草案。 新规基于拜登2022年3月15日签署的美国《关键基础设施网络事件报告法案》(简称CIRCIA)。这是美国联邦政府首次提出一套跨关键基础设施部门的全面网络安全规则。CISA正在就规…

计算机网络-HTTP相关知识-基础

HTTP基础 基本概念:HTTP是一种计算机之间交流通信的规范,它允许数据在两点之间传输,这个过程可以包括中转或接力。HTTP不仅仅包括文本,还可以包括图片、音频等超文本。状态码:HTTP状态码分为五类: 2xx&…

intellij idea 使用git撤销(取消)commit

git撤销(取消) 未 push的 commit Git,选择分支后,右键 Undo Commit ,会把这个 commit 撤销。 git撤销(取消) 已经 push 的 commit 备份分支内容: 选中分支, 新建 分支,避免后续因为操作不当,导…

windows版本-idea中下载的java版本在哪

1、点击idea的file-projectStructure 进入: 通过电脑目录进入该目录 找到bin目录,copy该目录地址 copy下来之后设置到系统环境变量中

经济学 博弈论 行为经济学

四种市场结构: 划分依据:生产者的数量,对价格的控制力,进入市场的难度(新的商家进入市场的困难难度) 1.完全竞争市场(大多数农业产品:草莓) 个体商家对价格没有控制力&a…

Android屏幕自适应

Android屏幕自适应 Android屏幕适配出现的原因为什么Android需要进行屏幕适配? 屏幕基本概念屏幕尺寸屏幕分辨率和像素sppxdp 密度无关像素dpiDensity 屏幕方向横屏竖屏自动切换禁用自动切换屏幕方向 Android屏幕自适应1. dp原生方案2. 线形布局权重示例代码 3. Jav…

阿里云短信服务业务

一、了解阿里云用户权限操作 1.注册账号、实名认证; 2.使用AccessKey 步骤一 点击头像,权限安全的AccessKey 步骤二 设置子用户AccessKey 步骤三 添加用户组和用户 步骤四 添加用户组记得绑定短信服务权限 步骤五 添加用户记得勾选openApi访问 添加…

Higgsfield AI: 对飙Sora打造个性化视频新浪潮,重塑社交媒体内容创作

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

对于个人如何选择服务器是最适合的?

选择适合的服务器对于个人来说是一个重要的决策,因为它会直接影响到你的网站或应用的性能、稳定性和成本。以下是一些建议,帮助你选择最适合的服务器: 京东云服务器,一年2G2H3M只需要50元!! 进入活动会场…

isc-dhcp-server DNS配置

我遇到一个有趣的问题,我先在一台Ubuntu服务器上使用isc-dhcp-server在其其中一个网口运行DHCP服务,然后我自己的笔记本电脑直连到这个网口,来上网。 本来直接就应该能上网,但是我的电脑只有在打开Clash时才能访问互联网&#xf…

【御控物联】JavaScript JSON结构转换(18):数组To对象——多层属性重组

文章目录 一、JSON结构转换是什么?二、案例之《JSON数组 To JSON对象》三、代码实现四、在线转换工具五、技术资料 一、JSON结构转换是什么? JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换,生成新的JS…