这一篇补充几个查询,顺便开新的内容,重点是数据库约束中的主键约束和外键约束
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 截断表和删除表的区别

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





