【MySQL】查询进阶

查询进阶

  • 数据库约束
    • 约束类型
    • NULL , DEFAULT , UNIQUE 约束
    • 主键约束
    • 外键约束
  • 聚合查询
    • 聚合函数
    • group by子句
    • HAVING
  • 联合查询
    • 内连接
    • 外连接
    • 自连接
    • 子查询
      • 单行子查询
      • 多行子查询

数据库约束

约束类型

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

NULL , DEFAULT , UNIQUE 约束

CREATE TABLE student(id INT NOT NULL,sn INT UNIQUE,name VARCHAR(20) DEFAULT 'unkown',qq_mail VARCHAR(20)
);

主键约束

CREATE TABLE student (id INT NOT NULL PRIMARY KEY,sn INT UNIQUE,name VARCHAR(20) DEFAULT 'unkown',qq_mail VARCHAR(20)
);

对于整数类型的主键,常配搭自增长auto_increment来使用。插入数据对应字段不给值时,使用最大值+1。

即在设定主键约束后加auto_increment

CREATE TABLE student (id INT NOT NULL PRIMARY KEY auto_increment,sn INT UNIQUE,name VARCHAR(20) DEFAULT 'unkown',qq_mail VARCHAR(20)
);

外键约束

在数据库中,外键约束(Foreign Key Constraint)用于建立表与表之间的关系,通过将一个表的列与另一个表的主键或唯一键相关联来定义这种关系。外键约束有助于维护数据的完整性和一致性。

在使用外键约束时,有两个重要的角色:主表从表主表包含被引用的主键或唯一键列,而从表包含外键列,该列引用主表中的主键或唯一键列。

通过使用外键约束,可以确保在插入或更新数据时,从表的外键值必须存在于主表的关联列中。这有助于维护数据的完整性,并确保相关表之间的一致性。

举例

create table classes(id int primary key auto_increment,name varchar(20),`desc` varchar(100)
);create table student(int id primary key auto_increment,sn int unique,name varchar(20) default 'unkown',qq_mail varchar(20),classes_id int,foregin key (classes_id) references classes(id);
);

用上述代码创建学生表和班级表

我们在学生表的最后添加了外键约束让student表中的classes_id字段和classes表中的id字段连接起来

此时student表称为从表,classes表称为主表

我们可以通过show create table 表名来查看创建表的信息

我们查看student表的创建信息
在这里插入图片描述
我们发现倒数第二行专门来描述约束

CONSTRAINT student_ibfk_1 FOREIGN KEY (classes_id) REFERENCES classes (id)
CONSTRAINT来表示约束
student_ibfk_1 第一个字段studetn是表名 第二个字段ibfk是InnoDB Foreign Key的缩写 表示存储引擎是innoDB 且是外键约束,字段_1是计数 表示是第一个约束

那么外键约束有什么作用呢?

我们先往班级表中插入几条数据
在这里插入图片描述
接着我们尝试向学生表中插入数据
在这里插入图片描述
在插入前几条数据时 都可以正常插入 但是我们在插入最后一条数据时 出现了错误
根据报错信息我们可以知道是由于外键约束 我们插入的classes_id 为5 但是在主表classes中只有1-4的班级id 因此出现的报错

这时我们会想到 如果现在删除classes表中的数据 会不会对student表中的数据产生影响
在这里插入图片描述
**我们发现还出现的报错 **

**所以我们可以得出结论 外键约束对于主表和从表都存在约束 **

聚合查询

聚合函数

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

group by子句

SELECT 中使用 GROUP BY 子句可以对指定列进行分组查询

需要满足:使用 GROUP BY 进行分组查询时,SELECT 指定的字段必须是“分组依据字段”,其他字段若想出现在SELECT 中则必须包含在聚合函数中。

准备测试表

create table emp(id int primary key auto_increment,name varchar(20) not null,role varchar(20) not null,salary numeric(11,2)
);
insert into emp(name, role, salary) values
('马云','服务员', 1000.20),
('马化腾','游戏陪玩', 2000.99),
('孙悟空','游戏角色', 999.11),
('猪无能','游戏角色', 333.5),
('沙和尚','游戏角色', 700.33),
('隔壁老王','董事长', 12000.66);

查询每个角色的平均工资 最大工资和最小工资
在这里插入图片描述

HAVING

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

where是对分组前的数据进行筛选
having是对分组后的数据进行筛选

联合查询

实际开发中往往数据来自不同的表,所以需要多表联合查询。多表查询是对多张表的数据取笛卡尔积:
在这里插入图片描述

内连接

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

外连接

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

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

自连接

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

例如显示所有"计算机原理"成绩比"Java"成绩高的信息

#第一步先在course表中找到计算机原理和java课程的id号
select * from course where name='计算机原理' or name = 'Java'#再查询成绩表中,“计算机原理”成绩比“Java”成绩 好的信息
select *
from score s1, score s2
where s1.student_id = s2.student_id
and s1.course_id = 3
and s2.course_id = 1
and s1.score > s2.score;

在这里插入图片描述
上述操作我们分成两步执行 且没有显示学生信息

SELECTstu.*,s1.score Java,s2.score 计算机原理
FROMscore s1JOIN score s2 ON s1.student_id = s2.student_idJOIN student stu ON s1.student_id = stu.idJOIN course c1 ON s1.course_id = c1.idJOIN course c2 ON s2.course_id = c2.idAND s1.score < s2.scoreAND c1.NAME = 'Java'AND c2.NAME =

在这里插入图片描述

子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询

单行子查询

查询与"不想毕业"同学的同班同学

select *
from student
where classes_id = (select classes_idfrom studentwhere name = '不想毕业'
);

在这里插入图片描述

多行子查询

返回多行记录的子查询

查询"语文"或"英文"课程的成绩信息

select *
from score
where course_id in (select idfrom coursewhere name = '语文' or name = '英文'
);

若要查询不在范围内的只需要在in之前 加 not
在这里插入图片描述

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

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

相关文章

CSS科技感四角边框

实现效果:使用before和after就可以实现,代码量不多,长度颜色都可以自己调整 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title><style>*{margin:0;padding:0;}html,body{…

PostgreSQL MVCC的弊端

数据库有很多种&#xff08;截至 2023 年 4 月有 897 个&#xff09;。面对如此多的数据库&#xff0c;很难知道该选择什么&#xff01;但有一个有趣的现象&#xff0c;互联网集体决定新应用程序的默认选择。在 2000 年代&#xff0c;传统观点选择 MySQL 是因为像 Google 和 Fa…

vue3+vite+pinia+vue-router+ol项目创建及配置

一、vite (一)、定义 vite官网 (二)、操作步骤 注意&#xff1a;两种方式创建目录结构一致 方式一&#xff1a;vite创建脚手架命令&#xff1a; 命令行&#xff1a;npm create vitelatest 然后选择 方式二&#xff1a;命令行直接声明带上vue 二、pinia (一)、定义 定义&#xf…

快速批量改名文件!随机字母命名,让文件名更有创意!

想要让文件名更加有创意和个性化吗&#xff1f;不妨尝试使用随机字母来批量改名文件&#xff01;无论是照片、文档还是其他文件&#xff0c;只需要简单的几个步骤&#xff0c;您就可以为它们赋予一个独特的随机字母命名。这不仅可以帮助您整理文件&#xff0c;还能增加一些乐趣…

非50欧系统阻抗的S参数测试

1. S参数依赖于系统阻抗 S参数的定义需要约定一个系统阻抗。同一个微波电路&#xff0c;在不同系统阻抗下的S参数是不同的。例如&#xff0c;50欧电阻在50欧系统阻抗下的S11为零&#xff0c;是没有反射的匹配状态&#xff1b;但50欧电阻在75欧系统阻抗下的S11不为零&#xff0…

Orange:一个基于 Python 的数据挖掘可视化平台

本篇介绍一个适合初学者入门的机器学习工具。 Orange 简介 Orange 是一个开源的数据挖掘和机器学习软件。Orange 基于 Python 和 C/C 开发&#xff0c;提供了一系列的数据探索、可视化、预处理以及建模组件。 Orange 拥有漂亮直观的交互式用户界面&#xff0c;非常适合新手进…

计算机网络 day11 tcpdump - 传输层 - netstat - socket - nc - TCP/UDP头部

目录 故障排查 tcpdump抓包工具 传输层&#xff08;TCP和UDP协议&#xff09; 传输层的作用 应用程序和端口号有什么关系&#xff1f; 传输层端对端连接实现拓扑图 如何查看自己的linux机器开放了哪些端口&#xff1f; 1、netstat(network status 网络的状态) netsta…

【ceph】存储池pg个数如何设置

存储池pg个数如何设置 参考官方文档说明&#xff1a;https://old.ceph.com/pgcalc/参数说明TargePGs per OSD&#xff1a;每个OSD的pg数OSD#存储池包含osd个数%Data存储池写入数据占总OSD容量百分比Size存储池冗余数

【复盘】记录一次类型不一致导致的Kafka消费异常问题

背景 业务主要是通过A系统向B系统写入Kafka&#xff0c;然后B系统消费Kafka 将结果写到Kafka中&#xff0c;A进行消费最终结果。 在整个流程中&#xff0c;A写入Kafka会写入一张 record1表记录&#xff0c;然后在A消费最终结果的时候也记录一张record2表。主要改动的话 只是B系…

设计模式07-责任链模式

责任链模式属于行为设计模式&#xff0c;常见的过滤器链就是使用责任链模式设计的。 文章目录 1、真实开发场景的问题引入2、责任链模式讲解2.1 核心类及类图2.2 基本代码 3、利用构建者模式解决问题4、责任链模式的应用实例5、总结5.1 解决的问题5.2 使用场景5.3 优缺点 1、真…

MFC 基于数据库的管理系统

文章目录 初始化设置菜单 添加数据库类创建数据库配置数据库 全部代码 初始化 创建文件选择基于CListView 初始化数据 public:CListCtrl& m_list;CSQLView::CSQLView() noexcept:m_list(GetListCtrl()) {// TODO: 在此处添加构造代码}void CSQLView::OnInitialUpdate() {C…

数据结构与算法——什么是线性表(线性存储结构)

我们知道&#xff0c;具有“一对一”逻辑关系的数据&#xff0c;最佳的存储方式是使用线性表。那么&#xff0c;什么是线性表呢&#xff1f; 线性表&#xff0c;全名为线性存储结构。使用线性表存储数据的方式可以这样理解&#xff0c;即“把所有数据用一根线儿串起来&#xf…

餐饮业油烟在线监测系统的具体应用 安科瑞 许敏

摘要&#xff1a;本文利用物联网技术&#xff0c;构建了一套餐饮企业智能油烟在线监测系统&#xff0c;该系统前台由厨房端和管道端组成&#xff0c;通过网关接入云平台管理系统&#xff0c;实时监控烟道阀门的启闭、变频风机的启停与风速及功率调节、油烟浓度数据等。结合动态…

随手笔记——如何手写高斯牛顿法

随手笔记——如何手写高斯牛顿法 说明源代码 说明 将演示如何手写高斯牛顿法 源代码 #include <iostream> #include <chrono> #include <opencv2/opencv.hpp> #include <Eigen/Core> #include <Eigen/Dense>using namespace std; using names…

HBase

一 HBase简介与环境部署 1.1 HBase简介&在Hadoop生态中的地位 1.1.1 什么是HBase HBase是一个分布式的、面向列的开源数据库HBase是Google BigTable的开源实现HBase不同于一般的关系数据库, 适合非结构化数据存储 1.1.2 BigTable BigTable是Google设计的分布式数据存储…

【Linux工具】编译器、调式器、项目自动化构建工具以及git的使用3(GDB调试器的基础使用)

【Linux工具】编译器、调式器、项目自动化构建工具以及git的使用3&#xff08;GDB调试器的基础使用&#xff09; 目录 【Linux工具】编译器、调式器、项目自动化构建工具以及git的使用3&#xff08;GDB调试器的基础使用&#xff09;背景gdb的一些指令gdb实际运用显示代码运行程…

【NLP】transformers的位置编码

一、背景 本文是“实现的变压器”系列的第二篇。它从头开始引入位置编码。然后,它

划片机的作用将晶圆分割成独立的芯片

划片机是将晶圆分割成独立芯片的关键设备之一。在半导体制造过程中&#xff0c;晶圆划片机用于将整个晶圆切割成单个的芯片&#xff0c;这个过程被称为“晶圆分割”或“晶圆切割”。 晶圆划片机通常采用精密的机械传动系统、高精度的切割刀具和先进的控制系统&#xff0c;以确保…

恢复idea删除的git本地文件

idea中删除git本地文件无法远程拉取pull已删除文件的问题 当前本地库处于另一个分支中&#xff0c;需将本分支Head重置&#xff0c;git 强行pull并覆盖本地文件 解决方式一&#xff1a; git fetch --all git reset --hard origin/master git pull解决方式二&#xff1a; git…