MySQL初阶学习日记(4)--- 插入、聚合、分组查询 + 数据库约束

这一篇补充几个查询,顺便开新的内容,重点是数据库约束中的主键约束和外键约束

1.插入查询

1.1 语法

sql 复制代码
insert into table_name select ... ;

简单解释就是:把一个查询语句的结果,作为另外一个插入语句的要插入的对象。显而易见,我们select查询的列的个数和类型要和要插入的那个表要匹配,列名不一样没影响。

1.2 示例

1.2.1 示例一:将测试表 1 中的数据插入到测试表 2 中

**1)**前置准备

需要两张测试表,表 2 中没有数据

sql 复制代码
*创建测试表1
create table text_table1(
 id int,
 name varchar(20)
 );
 *插入测试数据
 insert into text_table1 values
 (1,"a"),(2,"b"),(3,"c"),(4,"d");
 
 *创建测试表2
create table text_table2(
 id int,
 name varchar(20)
 );
 
 select*from text_table1;
 select*from text_table2;

**2)**插入操作

1.2.2 示例二:现需要合并两个表格,且两个表格中有重复数据需要合并后并完成去重操作

**1)**前置准备

sql 复制代码
*创建一个测试表1
create table exam1 (
 id int,
 name varchar(20)
 );
 insert into exam1 values
 (1,"a"),(2,"b"),(3,"c"),(4,"d"),(1,"a");

 *创建测试表2,表1中有重复数据,表2没有数据
 create table exam2 (
 id int,
 name varchar(20)
 );

**2)**插入并去重操作

2.聚合函数

聚合函数属于 SQL 中自带的函数

2.1 常用函数

2.2 示例

2.2.1 count

count( ) 函数的详细用法

**1)**count( * ):统计表中所有行数,包括包含 null 值的行

**2)**count( 列名 ):统计指定列中非空 null 值的数量

**3)**count( distinct 列名 ):统计指定列中不重复值的数量

2.2.2 sum

举例:统计所有学生数学成绩总分

2.2.3 avg

举例:统计平均总分

2.2.4 max

举例:查询语文成绩最高分

2.2.5 min

举例:查询数学成绩 > 70 分以上的数学最低分

3.分组查询

分组查询(group by )可以将数据集划分为几个小组,然后可以对若干个分组进行数据处理,我们直接通过举例来 get 它的用法

3.1 示例

3.1.1 准备测试表
sql 复制代码
 *准备测试表
 create table emp(
  id bigint,
  name varchar(20),
  role varchar(20),
  salary decimal(10,2)
  );

  *插入测试数据
  insert into emp values 
  (1,'甲','老板',200000.00),(2,'乙','老板',100000.00),
  (3,'丙','员工',12000.00),(4,'丁','员工',15000.00),
  (5,'戊','实习生',3000.00),(6,'己','实习生',3000.00);
3.1.2 统计每个角色的人数
3.1.3 统计每个角色的平均工资、最高工资、最低工资

非 group by 的列,不能直接作为被查询的列,但是可以通过聚合查询来进行分组

3.2 having 子句

示例:显示平均工资低于 5000 的角色和它的平均工资

3.3 having 和 where 的区别

核心区别(看下表)

4.数据库约束

我们一般在创建表的时候使用约束,使其在插入数据时,这个数据会受到我们设定的约束

4.1 非空约束( not null )

字面意思,就是约束插入的数据不能为空,我们在某些特定场景下会要求插入的数据不能为空

sql 复制代码
   create table text_1(
   id int,
   name varchar(20)
   );
   insert into text_1(id) values (1);
   
   drop table text_2;
   create table text_2(
   id int,
   name varchar(20) not null
   );
   insert into text_2(id) values (1);

**示例:**我们现在有两个测试表,表 1 没有设置约束,所以我们在插入数据时可以只插入 id ,name 默认为 null ;表2有设置 name 的非空约束, 所以我们在往表 2 插入数据时,就需要保证我们插入的数据的 name 列不能为空,否则会出现报错

4.2 指定默认值( default )

给列指定默认值,可以对没有赋值的列进行补充数据

**4.2.1 示例一:**给名字列指定默认值 " 匿名 "

这个操作可以方便我们想要统计一些各别列没有数据的情况

**4.2.2 示例二:**我们现需要统计一些学生的成绩,但有几个学生只有其中一科的成绩

**1)**当我们没有给表格设置默认值时:

**2)**当我们给表格设置一个成绩默认值为 0 时:

4.3 唯一约束( unique )

被指定了唯一约束的列,不能出现重复值,如学号,证件号类等

sql 复制代码
create table exam4(
 id int,
 chinese int,
 math int,
 english int
 );
  insert into exam4 values (1,98,95,67),(2,79,89,97)
  ,(3,87,89,80),(4,87,69,79);
  select*from exam4;
  insert into exam4(id,chinese) values (1,89);
  
  create table exam5(
 id int unique,
 chinese int,
 math int,
 english int
 );
  insert into exam5 values (1,98,95,67),(2,79,89,97)
  ,(3,87,89,80),(4,87,69,79);
  select*from exam5;
  insert into exam5(id,chinese) values (1,89);

4.4 主键约束( primary key )

4.4.1 主键

**1)**主键:我们可以理解为是一种身份标识;而主键约束,就是将描述表中的某列或者几列作为 " 主键 " , " 主键 " 可以起到区分的效果

**2)**主键的特点:不能重复 + 不能为空;一个表中只有一个主键(不是说只有一列,我们可以有联合主键)

4.4.2 自增主键( auto_increment )

1) 自增主键一般只针对整数,我们可以通过 **desc +**表名,查看表的结构

**2)**通常把主键列设置为自动增长,让数据库来维护主键值,插入数据时不设置主键列的值

**3)**如果某条记录写入失败,新生成的主键值会失效

**4)**主键值可以不连续,我们可以手动指定主键值,后一个数据的主键会从主键的最大值开始

4.4.3 复合主键

我们刚刚讲到一个表只能有一个主键,但不是只有一个列,我们的复合主键就是有多个列共同组成的主键,主键是否冲突以多个列的组成进行判定的

4.5 外键约束( foreign key )

4.5.1 概念

外键约束本质上是用于定义主表和从表的关系(可以简单理解为父子表的关系),我画个图简单理解一下

具体示例(创建两个表演示一下):

4.5.2 特点

**1)**对子表进行插入时会自动触发对父表的查询,如果子表想要插入的数据父表中没有,就会出现报错

**2)**要删除父表中某个数据时,子表中不能有对这条数据的引用

**3)**删除主表前,要先删除子表

sql 复制代码
  *创建一个年级表(父表)
  create table class(
  id int primary key auto_increment comment "编号",
  class_name varchar(20) comment "班级名字"
  );
  *插入数据
  insert into class values(null,"Java1"),(null,"Java2"),(null,"C++");
  *父表创建成功
  
  
  *创建一个班级表(子表)
  create table student(
  id int primary key auto_increment comment "序号",
  name varchar(20) comment "名字",
  class_id int comment "班级编号",
  foreign key (class_id) references class(id)
  );
  *插入数据
  insert into student values
  (null,"李一",1),(null,"张二",2),(null,"赵三",1),(null,"王四",3);
  
  *查看表结构
  desc student;
  
  *对子表进行插入时会自动触发对父表的查询,如果子表想要插入的数据父表中没有,就会出现报错
  insert into student values(null,"午安",5);
  insert into student values(null,"午安",3);
  *删除
  delete from student where class_id = 3;
  
  *要删除父表中某个数据时,子表中不能由对这条数据的引用
  delete from class where id = 3;
  
  *删除父表前要先删除子表
  drop table class;
  drop table student;

4.6 截断表( truncate table )

4.6.1 特点

截断表是一种更快速、更高效的删除表操作,且只能删除全表,不能指定条件

4.6.2 截断表和删除表的区别

慢慢来吧 (●'◡'●) ,努力赶进度中~~

相关推荐
西岭千秋雪_7 小时前
MySQL集群搭建
java·数据库·分布式·mysql
马克学长7 小时前
SSM实验室预约管理系统5x7en(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·实验室预约管理系统·ssm 框架
盐焗西兰花7 小时前
鸿蒙学习实战之路 - 应用追踪实践最佳实践
学习·华为·harmonyos
四谎真好看7 小时前
Java 黑马程序员学习笔记(进阶篇31)
java·笔记·学习·学习笔记
Element_南笙7 小时前
吴恩达新课程:Agentic AI(笔记11)
大数据·人工智能·笔记·算法·机器学习
古城小栈7 小时前
MySQL 配置优化 绿皮书
数据库·mysql
懵萌长颈鹿7 小时前
Tkinter 学习文档
学习
YJlio7 小时前
Active Directory 工具学习笔记(10.1):AdExplorer 实战(一)— 连接到域与界面总览
笔记·学习·安全
崇山峻岭之间8 小时前
C++ Prime Plus 学习笔记025
c++·笔记·学习