MySQL表的进阶知识

news2024/11/27 8:30:45

目录

一、数据库约束

1、not null

2、unique

3、primary key

4、auto_increment

5、default

6、foreign key

7、check

二、插入数据

三、设计表 

1、一对一

2、一对多 

3、多对多 

四、查询 

1、聚合查询

a、聚合函数查询

b、group by 

c、having

2、联合查询

a、内连接

b、外连接

c、自连接

3、子查询

4、合并查询


一、数据库约束

1、not null

不能为空的约束,比如在学生表当中,学生的学号,姓名就不能为空。

使用演示:

 create table student1(id int not null,name varchar(20) not null);

2、unique

表示唯一约束,比如在学生表当中,学生的学号是惟一的,不能有两个学生的学号相同。

使用演示:

 create table student2(id int not null unique,name varchar(20) not null);

3、primary key

主键约束,主键约束就是不能为空,并且是惟一的,也就是含有前两个约束条件,在上述市里的student2表中,对id进行not null 和unique约束后,在查看表结构时,就出现id是primary key的结果。

在一张表中只能有一个字段为主键。

使用演示:

create table student3(id int primary key,name varchar(20) not null);

 与student2的表结构相同。

4、auto_increment

主键自动增长约束,例如在插入数据时,未插入主键,则就在已插入元组的主键+1,作为新插入元组的主键,主要针对整型类型的主键,默认从一开始。

 使用演示:

create table student9(id int primary key auto_increment,name varchar(20));

5、default

默认约束,通常在插入数据时,如果对某一字段没有赋值就默认为null,但是在使用default约束后,默认就是所设置的值。 

使用演示:

create table student4(id int primary key,name varchar(20) default "无名氏");

 插入一个名字为空的学生信息:

此时默认的名字不再是null,而是无名氏。

6、foreign key

foreign key(参照字段) references 被参照表名(被参照字段);

 外键约束,就是一个表的某字段需要参照另一个表中的某一字段,例如:在学生表和班级表中,学生表中的班级就要参照班级表中的班级号。

使用演示: 

 create table class(id int primary key,number int not null);
create table student(id int primary key,name varchar(20) not null,class int ,foreign key(class) references class(id));

 

注意:

  • 在使用外键约束时,参照字段的数值类型和被参照字段的数值类型要一致。
  • 在删除被参照表的某一元组时,若参照表中有元组依赖被参照字段的值时,就无法成功删除。就比如说学生表中有2班的学生,class表在删除2班这一元组时,就无法删除。
  • 参照字段的取值范围就是被参照字段的值。

7、check

check约束主要是插入元组时,对范围进行约束,例如在插入学生分数时,分数不能超过100 ,就可以写成如下所示:

 create table student2(id int primary key,name varchar(20) not null,score int,check(score<=100));

但是 MySQL8之前的版本会忽略check约束,也就是不生效 。

二、插入数据

可以使用select语句的查询结果作为insert的数据进行插入。一般情况下select得到的就是插入表的外键。

这是student表和class表的结构:

 例如将查询class表中的所有的id作为数据插入到student表中:

三、设计表 

在实际应用过程中通常是在复杂的关系中设计表,需要分析表结构,表之间常见关系有一对一、一对多、多对多。

1、一对一

比如每个班级的班长是唯一的,一个班级只有一个班长,一个班长只能服务一个班级。

2、一对多 

一个班级拥有多个学生,多个学生在一个班级。

3、多对多 

比如课程和学生之间就是多对多的关系。一门课程对应多个学生,一个学生有多门课程。

在多对多关系中,一般需要建立三个表来进行联系。

对于学生和课程来说,需要建立学生表、课程表、分数表:

学生表:

create table student(id int primary key auto_increment,name varchar(20) not null,sex varchar(2) not null);

课程表: 

create table course(id int primary key auto_increment,name varchar(20) not null);

 

分数表:

create table score(student_id int,course_id int,score double(3,1),
foreign key(student_id) references student(id),
foreign key(course_id) references course(id));

 

四、查询 

1、聚合查询

以下演示以school表为基础:

a、聚合函数查询

聚合函数有:

涉及数字的聚合函数遇到null值会进行忽略。

聚合函数查询可以搭配where子句。 

例如:统计school表中的元组个数:

select count(*) from school;

例如:求出学校表的姓张的平均工资:

 select avg(salary) from school where name like '张%';

 例如:求出学校表的最高工资:

select max(salary) from school;

b、group by 

分组查询:对表中的数组先进行分组,再进行相关查询。

例如:查询每个职位的最低工资:

 select posts, min(salary) from school group by posts;

 

 同样,group by也可以搭配where子句使用:

例如:查询除了院长的职位的最高工资:

 select posts, max(salary) from school where posts!="院长" group by(posts);

 c、having

having对group by分组之后的结果进行筛选,而where是在group by分组之前进行筛选。  

例如:查询school表中的平均工资在一万以上的:

select posts,avg(salary) from school group by posts having avg(salary)>10000;

 2、联合查询

在实际开发中,通常使用的是联合查询,也就是联合多个表进行查询,那么就必须了解表之间的笛卡尔积:

笛卡尔乘积是指在数学中,两个集合XY的笛卡尔积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。

那么两个表的笛卡尔积:

a,b两个表进行笛卡尔积,笛卡尔积表的列数=a的列数+b的列数,笛卡尔积表的行数=a的行数*b的行数,

通俗来讲,笛卡尔积就是两个表全排列的所有情况。

后续操作是在以下三个表的基础上:

学生表:

 

课程表:

 

分数表:

  

 a、内连接

两个表之间的某一字段相等的连接。

语法格式:

select 字段名 from 表1,表2 where 连接条件 and 其他条件;

select 字段名 from 表1 join 表2 on 连接条件 and 其他条件;

连接条件指的是两个表中的相同字段名相等。

例如:查找Java成绩高于85的学生信息 :

select student.name,course.name,score from student,course,score 
where student.id=score.student_id and course.id=score.course_id 
and course.name='Java' and score>85;
--或者
select student.name,course.name,score from student join course join score 
on  student.id=score.student_id and course.id=score.course_id 
and course.name='Java' and score>85;

查询结果:

例如:按照学生的平均分进行排名:

select student.id,student.name,avg(score) as avg from student,course,score 
where student.id=score.student_id and course.id=score.course_id
group by(student.id) order by(avg) desc;
--或者
select student.id,student.name,avg(score) as avg from student join course join score 
on student.id=score.student_id and course.id=score.course_id
group by(student.id) order by(avg) desc;

查询结果:

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

b、外连接

通俗来讲,就是把一张表的某些字段连接到另一张表上。

外连接可分为:左外连接和右外连接。

左外连接的语法格式:

select 字段名 from 表1 left join 表2 on 连接条件;

右外连接的语法格式:

select 字段名 from 表1 right join 表2 on连接条件;

例如:查询所有学生的各科成绩:

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

查询结果: 

 

 c、自连接

在同一张表中进行自身的查询,就是将行与行之间的查询转换成列与列之间的查询。

例如:在score表中查询Java成绩高于C++的:

select s1.student_id,s1.course_id,s1.score,s2.course_id,s2.score 
from score as s1,score as s2 where s1.student_id=s2.student_id 
and s1.course_id=12 and s2.course_id=13 and s1.score>s2.score;

 查询结果:

3、子查询

是指在select查询语句中再嵌套一个查询语句。

 例如:查询选修Java的学生姓名:

select student.name from student where id in
(select student_id from score where course_id=12);

4、合并查询

与 or 关键字查询结果基本一致,只是or是属于单表查询,而合并查询是多表查询。

语法格式:

select …… union select……:对查询结果去重

select …… union all select……:对查询结果不去重

 例如:查询选修Java或者分数大于90的学生id:

select student_id from score where course_id=12
union
select student_id from score where score>90;

查询结果:

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

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

相关文章

pikachu靶场-8 越权漏洞

越权漏洞 越权漏洞概述 由于没有对用户权限进行严格的判断&#xff0c;导致低权限的账号&#xff08;比如普通用户&#xff09;可以去完成高权限账号&#xff08;比如超级管理员&#xff09;范围内的操作 平行越权&#xff1a;A用户和B用户属于同一级别用户&#xff0c;但各…

虚拟主播怎么做出来的?今日安利:AI虚拟人物怎么弄?

某天&#xff0c;一位品牌店的老板向我寻求帮助&#xff0c;大概内容就是&#xff1a;“他最近要开拓线上店铺的直播渠道&#xff0c;直播时间较长&#xff0c;雇一位主播又费钱又辛苦&#xff0c;想制作一个符合品牌调性的AI虚拟人物来带货。”于是我跟他分享了制作虚拟主播的…

北京医保定点医院2022年版

文章目录概述官方查询方法49家A类定点医院政府公告初始19家2021年4月新增13家A类医院2021年11月新增7家A类医院2022年6月新增10家A类医院定点中医/专科医院定点社区卫生服务机构附录问题医保电子凭证4家定点医院的查询和修改北京医保个人账户资金定向使用北京医院排行榜单概述 …

基于BINN算法的CCPP全路径覆盖算法

1.CCPP整体算法文档 1.1 ccpp基础介绍 全路径覆盖算法&#xff08;CCPP: Complete Coverage Path Planning&#xff09;作为扫地机器人较为关键的组成部分&#xff0c;其问题的本质是&#xff1a;在栅格地图中,全覆盖路径规划问题就演变为寻找机器人的下一个移动位置,只有准确…

java计算机毕业设计ssm职工社保信息管理系统t22xh(附源码、数据库)

java计算机毕业设计ssm职工社保信息管理系统t22xh&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#…

建设银行互联网经营战略优化方案设计

目 录一、绪论 1 &#xff08;一&#xff09;项目背景 1 &#xff08;二&#xff09;项目意义 1 &#xff08;三&#xff09;项目内容和方法 1 二、互联网金融与我国商业银行概述 3 &#xff08;一&#xff09;互联网金融的内涵 3 &#xff08;二&#xff09;互联网金融的功…

【云计算与大数据计算】Hadoop MapReduce实战之统计每个单词出现次数、单词平均长度、Grep(附源码 )

需要全部代码请点赞关注收藏后评论区留言私信~~~ 下面通过WordCount&#xff0c;WordMean等几个例子讲解MapReduce的实际应用&#xff0c;编程环境都是以Hadoop MapReduce为基础 一、WordCount WordCount用于计算文件中每个单词出现的次数&#xff0c;非常适合采用MapReduce进…

描述统计 | 学习笔记 (全)

一.导论 统计学是通过收集&#xff0c;整理&#xff0c;分析&#xff0c;描述数据等手段&#xff0c;以达到推断所测对象的本质&#xff0c;甚至预测对象未来的一门综合性科学。其目的是探索数据的内在数量规律性&#xff0c;以达到对客观事物的科学认识 统计的本业是消化数据…

一种近红外I区荧光染料ICG-CBT 主要应用领域,是药品监督管理局(FDA)批准的体内应用染料

英文名称:ICG-CBT 保存条件:-20℃ 产品类别:化学试剂 结构式&#xff1a; 产品描述&#xff1a;&#xff08;ICG&#xff09;是一种近红外I区荧光染料[1]&#xff0c;是药品监督管理局&#xff08;FDA&#xff09;批准的体内应用染料。其激发和发射波长分别在785 nm、810 nm…

【C++初阶7-stringOJ】上手用一下

前言 本期通过几道OJ题&#xff0c;上手用用string。 1. 把字符串转换成整数 描述 将一个字符串转换成一个整数&#xff0c;要求不能使用字符串转换整数的库函数。 数值为 0 或者字符串不是一个合法的数值则返回 0 数据范围&#xff1a;字符串长度满足0 ≤ n ≤100 进阶&am…

【读书笔记】万物原理——打开客观世界与主观情感的大门

被尹烨老师推荐种草的&#xff0c;以为是一本讲生命科学的科普书&#xff0c;看上了又以为是说量子物理等高端科学研究的&#xff0c;最后被互补性理论惊到了。这哪里只是一本打开认知客观世界的大门&#xff0c;还让我重识内心。那些看不见摸不着的情感&#xff0c;比如同情心…

数字孪生十大问题有哪些?通俗解释指的是什么?

数字孪生&#xff08;Digital Twins&#xff09;之火热&#xff0c;已经成为了一个不争的事实。数字孪生的概念&#xff0c;起源于制造业&#xff0c;现在已广泛应用到了智慧城市、智慧交通、智慧农业、智慧医疗、智能家居等行业。数字孪生十大问题有哪些&#xff1f;指的是什么…

018 | 服饰颜色与族群名称对颜色认知的影响 | 大学生创新训练项目申请书 | 极致技术工厂

研究目的 本项目以瑶、壮、汉三个民族、六个族群为研究对象&#xff0c;通过七个实验探索服饰颜色与族群名称对颜色认知的影响。重点提出以下两个问题&#xff1a; &#xff08;1&#xff09;服饰颜色是否影响少数民族个体的颜色偏好&#xff1f; &#xff08;2&#xff09;服…

刷完 300 道 LeetCode 题后,我膨胀到要飘起来了!纯正 Java 版

算法题就好像科举考试时代背的八股文&#xff0c;是知识改变命运的代表作。你不刷&#xff0c;不管是校招还是社招&#xff0c;就很过算法题这一关。 我整理的这份 LeetCode 刷题笔记足足 300 道&#xff0c;对算法薄弱和需要提高算法的同学很有帮助。 随便打开一道题解感受下…

【云原生】监视Docker桌面的容器内存和CPU使用情况

目录 一、如何监视Docker桌面的容器内存和CPU使用情况 1、stats命令 2、Docker 统计命令stats是如何工作的 2.1、命令与描述 2.2、OPTIONS 2.3、例子 2.4、格式化 3、满足资源使用扩展 4、如何安装“资源使用情况”扩展插件&#xff1f; 5、总结 一、如何监视Docker桌…

SQL记录

DateDiff函数 定义和用法 DATEDIFF() 函数返回两个日期之间的天数。 语法 DATEDIFF(date1,date2) date1 和 date2 参数是合法的日期或日期/时间表达式。 注释&#xff1a;只有值的日期部分参与计算。 实例 下面是 SELECT 语句&#xff1a; SELECT DATEDIFF(‘2008-11-30’,‘2…

WinRar去除弹窗广告的学习和研究

不可否认WinRar是一款优秀的解压缩软件&#xff0c;尤其是在Windows中使用还是较频繁的。 但是使用时弹出&#xff1a; 这就有点难受了。 那么怎么解决呢&#xff1f;好吧&#xff0c;以学习和研究为目的开始折腾...... 经过对WinRar不同版本的试用&#xff0c;原来这个弹窗是…

ubuntu修改网易云音乐分辨率显示

问题 网易云音乐不能随着系统显示的缩放比自动调整&#xff0c;分辨率较高的显示器上界面显示特别小。只能通过如下的办法解决&#xff1a; ubuntu修改网易云音乐分辨率显示&#xff0c;也就是修改显示 DPI 。 方法 sudo vim /usr/share/applications/netease-cloud-music.d…

12月12日

centos7查找java在哪&#xff0c;which java确认环境变量是否生效&#xff0c;可以输出一下&#xff1a;echo $JAVA_HOME同一个github账号上的所有的项目只需配置一次私钥和公钥&#xff0c;私钥和公钥的作用是你本机ip和这个账户所在github约定的一个对接方式&#xff0c;配置…

微服务框架 SpringCloud微服务架构 分布式事务 38 动手实践 38.5 实现AT 模式

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 分布式事务 文章目录微服务框架分布式事务38 动手实践38.5 实现AT 模式38.5.1 实现 AT 模式38 动手实践 38.5 实现AT 模式 38.5.1 实现 AT…