学点儿数据库_Day11_多表、等值连接、内连接、模糊查找

1 多表

学生表、班级表、课程表、班级课程表
在这里插入图片描述
在这里插入图片描述
关系型数据库: MySql、SqlServer、Oracle
相同的数据出现多次绝不是一件好事,这是关系数据库设计的基础。关系表的设计就是要把信息分解成多个表,一个数据一个表,各表通过某些共同的值互相连接,所以才叫关系数据库。
将数据存储到多个表能更有效的存储,更方便的处理,但这些好处是有代价的:如果数据存储在多个表中,怎么用一条SELECT语句就检索出数据呢?答案是使用:子查询、联结

非关系型数据库: Redis ,MongoDB 速度非常快(日志信息)
可以理解为一个大的Map结构

-- 多对多
-- 班级表
CREATE TABLE banji(id INT PRIMARY KEY AUTO_INCREMENT,`name` CHAR(10) NOT NULL
);INSERT INTO banji(`name`) VALUES ('Java1807'), ('Java1812');-- 学生表
CREATE TABLE student(id INT PRIMARY KEY AUTO_INCREMENT,`name` CHAR(10) NOT NULL,age INT,gender CHAR(1),banji_id INT,FOREIGN KEY(banji_id) REFERENCES banji(id)
);INSERT INTO student(`name`,age,gender,banji_id)
VALUES('张三',23,"男",1),('李四',21,'男',2),('王五',20,'女',1);-- INSERT INTO student(`name`,age,gender,banji_id) VALUES('张三',23,"男",3);-- 课程表
CREATE TABLE course(id INT PRIMARY KEY AUTO_INCREMENT,`name` CHAR(10) NOT NULL,credit INT COMMENT '学分'
);
INSERT INTO course(`name`,credit) VALUES('Java',5),('UI',4),('H5',4);-- 班级课程表
CREATE TABLE banji_course(-- id INT PRIMARY KEY AUTO_INCREMENT,banji_id INT,course_id INT,PRIMARY KEY (banji_id,course_id),-- 联合主键FOREIGN KEY(banji_id) REFERENCES banji(id),FOREIGN KEY(course_id) REFERENCES course(id)
); INSERT INTO banji_course(banji_id, course_id) VALUES(1,1),(1,3),(2,1),(2,2),(2,3);-- 子查询:嵌套查询,一个查询语句是另一个查询语句的条件
-- 查询班级是Java1812班所有学生信息
-- SELECT * FROM student WHERE banji_id = 2;
SELECT id FROM banji WHERE `name`='Java1812';
SELECT * FROM student WHERE banji_id = (SELECT id FROM banji WHERE `name`='Java1807');-- 班级是java1807班或者java1812班所有学生信息SELECT * FROM student WHERE banji_id=1 OR banji_id=2;
SELECT * FROM student WHERE banji_id IN(1,2);
SELECT id FROM banji WHERE `name`='Java1807' OR `name`='Java1812';
-- ① 不行
SELECT * FROM student WHERE banji_id = (SELECT id FROM banji WHERE `name`='Java1807' OR `name`='Java1812');
-- ② 可以 太长
SELECT * FROM student WHERE banji_id = (SELECT id FROM banji WHERE `name`='Java1807') OR 
banji_id = (SELECT id FROM banji WHERE `name`='Java1812');
-- ③ OK
SELECT * FROM student WHERE banji_id IN (SELECT id FROM banji WHERE `name`='Java1807' OR `name`='Java1812');-- 计算字段使用子查询:班级id 班级名字 班级人数
-- 执行这条查询遵循下面的步骤:
-- 1、从banji表检索班级列表
-- 2、对检索出的每个banji,统计其在student表中的数量
-- 班级id 班级名字 班级人数
-- 数据库 >>>  ExcelSELECT id,`name`,(SELECT COUNT(*)FROM student WHERE student.banji_id = banji.id) AS total_count
FROM banji;SELECT id,`name`,(SELECT COUNT(*)FROM studentWHERE student.banji_id=banji.id) AS total_count
FROM banji
ORDER BY `name` DESC;

在这里插入图片描述
total_count是一个计算字段,它是由括号中的子查询建立的,该子查询对检索出的每个banji执行一次
总结:
1、“=”:要求子查询只有一个结果。 “in”:子查询可以有多个结果。
2、子查询的SELECT语句只能查询单个列,企图检索多个列将返回错误。
3、能嵌套的子查询的数目没有限制,不过在实际使用时由于性能的限制,不能嵌套太多的子查询。
子查询也可以使用下面的连接来实现

2 等值连接

从左表中取出每一条记录,去右表中与所有的记录进行匹配:匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留

笛卡尔积:
由没有联结条件的表关系返回的结果为笛卡尔积。检索出的行的数目将时第一个表中的行数乘以第二个表中的行数。通俗的说就是查询所得的结果行数是两张表行数的乘积。
返回笛卡尔积的联结,也称为叉联结cross join。

--  笛卡尔积   等值连接
SELECT * 
FROM student,banji;SELECT * 
FROM student,banji
WHERE student.banji_id=banji.id;

注意:联结查询非常消耗资源,因此应该注意,不要联结不必要的表。联结的表越多,性能下降越厉害。

3 内连接

内连接有两种写法,一种是inner join,另一种是join,这两种写法都是一样的,可以理解为join是inner join的缩写。还可以看出,等值连接和内连接的效果一样,但是开发中建议使用内连接

-- 内连接SELECT *
FROM student INNER JOIN banji;-- 与笛卡尔积效果一样SELECT *
FROM student AS s INNER JOIN banji AS b-- 与等值连接效果一样
ON s.banji_id=b.id;-- 查询的结果也是一张表    分组?? 按班级分组 数数量 刚才的统计班级人数SELECT id, -- 子查询`name`,(SELECT COUNT(*)FROM student WHERE student.banji_id=banji.id) AS total_count
FROM banji;SELECT b.id,b.`name`,COUNT(*) AS total_count -- 内连接结果 作为新表,在新表里用GROUP
FROM student AS s INNER JOIN banji AS b
ON s.banji_id=b.id
GROUP BY b.id;-- 分组SELECT b.id,b.`name`
FROM student AS s INNER JOIN banji AS b
ON s.banji_id=b.id
GROUP BY b.id;-- 分组-- 学生id 学生姓名   班级名称
SELECT s.id AS '学生ID',s.`name` AS '学生姓名',b.`name` AS '班级名称'
FROM student AS s INNER JOIN banji AS b-- 与内连接效果一样
ON s.banji_id=b.id;-- 学生id   学生姓名   班级名称   课程名称    学分
SELECT *
FROM student AS s INNER JOIN banji AS b-- 与内连接效果一样
ON s.banji_id=b.id
INNER JOIN banji_course AS bc
ON b.id=bc.banji_id;-- 内连接
SELECT s.id AS '学生ID',s.`name` AS '学生姓名',b.`name` AS '班级名称',c.`name` AS '课程名称',c.credit AS '学分'
FROM student AS s INNER JOIN banji AS b-- 与内连接效果一样
ON s.banji_id=b.id
INNER JOIN banji_course AS bc
ON b.id=bc.banji_id
INNER JOIN course AS c
ON bc.course_id=c.id
ORDER BY s.id;
-- 把inner join之后查询的结果当成一张表来使用, 在这个结果集里面根据班级id统计每个班级下面学生数量。
-- 等值连接(没有WHERE 就是笛卡尔积)
SELECT s.id AS '学生ID',s.`name` AS '学生姓名',b.`name` AS '班级名称',c.`name` AS '课程名称',c.credit AS '学分'
FROM student s,banji b,banji_course bc,course c
WHERE s.banji_id=b.id AND b.id=bc.banji_id AND bc.course_id=c.id
ORDER BY s.id;

总结:多表查询主要是注意下面两点
1、整个查询涉及到几张表,涉及到几张表就连接这几张表。
2、如果涉及到这几张表的关系搞不清楚,画一下ER图,弄清楚表和表之间的关系(就是根据外键建立的关系)

4 inner join on、left join on、right join on区别

inner join on 只有左右两个表有关联的才查询出来
left join on 左表中都显示出来,右表没有显示空
right join on 右表都显示,左表没有显示空
左连接,也成为左外连接:从左表那里返回所有的行,即使在右表中没有匹配的行.left join on
在这里插入图片描述
在这里插入图片描述

-- inner join on、left join on、right join on区别SELECT *
FROM student AS s INNER JOIN banji AS b
ON s.banji_id=b.id;SELECT *
FROM student AS s LEFT JOIN banji AS b
ON s.banji_id=b.id;SELECT *
FROM student AS s RIGHT JOIN banji AS b
ON s.banji_id=b.id;

5 模糊查找

语法形式:字段 like '要查找字符'
说明:
1、like模糊查找用于对字符类型的字段进行字符匹配查找。
2、要查找的字符中,有两个特殊含义的字符:% , _:
2.1: %含义是:代表0或多个的任意字符
2.2: _含义是:代表1个任意字符
3、语法:like '%关键字%'

SELECT * FROM student WHERE `name` LIKE '张%'; -- 以张开头
SELECT * FROM student WHERE `name` LIKE '张_'; -- 以张开头,而且名字是两个字
SELECT * FROM student WHERE `name` LIKE '%张%'; -- 名字里面只要有张就可以

注意: NULL
通配符%看起来像是可以匹配任何东西,但有个例外,这就是NULL

SELECT * FROM student WHERE `name` LIKE '%';

不会匹配nameNULL的行

-- 模糊查找
SELECT * FROM student WHERE `name` = '张三';
SELECT * FROM student WHERE `name` LIKE '%张%';
SELECT * FROM student WHERE `name` LIKE '张%';
SELECT * FROM student WHERE `name` LIKE '张_';
SELECT * FROM student WHERE `name` LIKE '%张';
SELECT * FROM student WHERE `name` LIKE '%';-- 把id是1的学生,名字改为:张三,age:24,gender:女UPDATE student SET age = 24,name='张三三' WHERE id=1;

注意:(也是面试题)
SQL的通配符很有用,但这种功能是有代价的,即通配符搜索要消耗更长的处理时间,使用通配符的技巧:
1、不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
2、在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处 '%张'把通配符置于开始处,搜索起来是最慢的

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

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

相关文章

three.js扩展库--物理引擎CannonJS / CannonES

物理引擎概念解释 所谓物理引擎,就是通过代码模拟物理世界。举个简单例子,比如你初高中都学过物理学,其中力、速度、加速度、位移都是比较常见的物理量,咱们通过CannonJS等物理引擎,都可以辅助你计算生活中物体的速度、位移,比如计算一个小球在地球重力的作用下,下落的…

最新版puppeteer 在linux下的安装教程

最新版的 puppeteer 在安装的时候,Chromium不会自动下载,导致安装失败 这个时候需要跳过Chromium的安装,然后手动下载Chromium并安装。 1、先设置npm跳过Chromium下载 export PUPPETEER_SKIP_DOWNLOADtrue 2、安装puppeteer npm i pup…

iOS_convert point or rect 坐标和布局转换+判断

文章目录 1. 坐标转换2. 布局转换3. 包含、相交 如:有3个色块 let view1 UIView(frame: CGRect(x: 100.0, y: 100.0, width: 300.0, height: 300.0)) view1.backgroundColor UIColor.cyan self.view.addSubview(view1)let view2 UIView(frame: CGRect(x: 50.0, …

阿里云服务器优惠价格61元一年,多配置报价,来看看

2024年阿里云服务器优惠价格表,一张表整理阿里云服务器最新报价,阿里云服务器网aliyunfuwuqi.com整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单,大家也可以直接移步到阿里云CLUB中心查看 aliyun.club 当前最新…

芒果YOLOv7改进88:上采样篇,即插即用,上采样CARAFE:顶会ICCV出品,轻量级通用上采样算子,只引入很少的参数量和计算代价

该专栏完整目录链接: 芒果YOLOv7深度改进教程 芒果专栏 基于 CARAFE 的改进结构,改进源码教程 | 详情如下🥇 👉1. CARAFE 结构 💡本博客 改进源代码改进 适用于 YOLOv7 按步骤操作运行改进后的代码即可 即插即用 结构。博客 包括改进所需的 核心结构代码 文件改进后的…

【MD】激光驱动原子动力学的全尺寸从头算模拟

Zeng Q, Chen B, Zhang S, et al. Full-scale ab initio simulations of laser-driven atomistic dynamics[J]. npj Computational Materials, 2023, 9(1): 213.核心研究内容: 本文研究了激光驱动的原子动力学的全尺度从头算模拟。研究的重点是探讨在极端条件下材料…

maya导入导出bvh 自动 脚本

目录 maya打开脚本编辑器 运行打开bvh脚本 maya导出bvh脚本 maya打开脚本编辑器 打开Maya软件,点击右下角 “脚本编辑器” 运行打开bvh脚本<

数据结构:堆和二叉树遍历

堆的特征 1.堆是一个完全二叉树 2.堆分为大堆和小堆。大堆&#xff1a;左右节点都小于根节点 小堆&#xff1a;左右节点都大于根节点 堆的应用&#xff1a;堆排序&#xff0c;topk问题 堆排序 堆排序的思路&#xff1a; 1.升序排序&#xff0c;建小堆。堆顶就是这个堆最小…

034—pandas 试验一次扔两个骰子和为多少的概率最大

前言 经典的掷骰子试验是我在学习概率中经常接触的例子&#xff0c;这是利用了骰子在赌博游戏中的随机性&#xff0c;方便我们理解概率的意义。 #今天&#xff0c;我们用 Python 来做一个实验&#xff0c;一次掷出两个骰子&#xff0c;每次计算所得点数的和&#xff0c;从而得…

python装饰器的作用

装饰器是Python中的一个特殊语法&#xff0c;用于修改或扩展函数的功能。它可以在不改变原函数代码的情况下&#xff0c;通过在函数定义前使用 装饰器函数 的语法来对函数进行修饰。 装饰器的作用可以总结为以下几点&#xff1a; 函数功能的扩展&#xff1a;装饰器可以在不修改…

搜索与图论——Dijkstra

最短路算法 稠密图与稀疏图 n为点数&#xff0c;m为边数。m远小于n的平方为稀疏图&#xff0c;m接近n的平方为稠密图。 稀疏图用邻接表存&#xff0c;稠密图用邻接矩阵存 朴素版dijkstra时间复杂度为O(n^2),对于稠密图可以ac&#xff0c;但遇到稀疏图时会TLE。 dijkstra函数实…

python函数-变量和参数-2.4

目录 在高阶函数中使用匿名函数 map() 函数&#xff1a; sorted() 函数&#xff1a; filter() 函数&#xff1a; 函数练习-9 在高阶函数中使用匿名函数 map() 函数&#xff1a; 描述&#xff1a; map() 会根据提供的函数对指定序列做映射。 第一个参数 function 以参数序…

USART发送单字节数据原理及程序实现

硬件接线&#xff1a; 显示屏的SCA接在B11&#xff0c;SCL接在B10&#xff0c;串口的RX连接A9&#xff0c;TX连接A10。 新建Serial.c和Serial.h文件 在Serial.c文件中&#xff0c;实现初始化函数&#xff0c;等需要的函数&#xff0c;首先对串口进行初始化&#xff0c;只需要…

【嵌入式DIY实例】-火焰报警系统

DIY火焰报警系统 文章目录 DIY火焰报警系统1、硬件准备2、硬件接线3、代码实现火灾报警器有时也称为烟雾报警器,是一种检测火灾、烟雾和热量并发出警告信号的设备。 它们可以固定在天花板或墙上,让您有更多时间离开那个地方。 如果您的房屋没有安装火灾报警器,您可能不会意识…

速看!MC-CCPIT第二十二届中国国际冶金工业展览会

METALLURGY CHINA 2024 MC-CCPIT第二十二届中国国际冶金工业展览会 ——冶金装备品牌展示区 主办单位&#xff1a;中国钢铁工业协会 中国国际贸易促进委员会冶金行业分会 承办单位&#xff1a;冶金工业国际交流合作中心 地 点&#xff1a;上海新国际博览中心 时 间&am…

第5章 数据建模和设计

思维导图 5.1 引言 最常见的6种模式&#xff1a;关系模式、多维模式、面向对象模式、 事实模式、时间序列模式和NoSQL模式 每种模式分为三层模型&#xff1a;概念模型、逻辑模型和物理模型 每种模型都包含一系列组件&#xff1a;如实体、关系、事实、键和属性。 5.1.1 业务驱…

修改Jupyter Notebook的默认路径,以及在PowerShell中自定义其启动路径

修改Jupyter Notebook的默认路径&#xff0c;以及在PowerShell中自定义其启动路径 设置 Jupyter Notebook 配置文件&#xff0c;修改默认路径要在PowerShell中设置自定义的启动脚本&#xff0c;以确保Jupyter Notebook能够自动定位到当前路径设置后的效果 在使用Jupyter Notebo…

设置asp.net core WebApi函数输入和返回类型中的属性名称开头大小写格式

以下列类型定义为例创建简单的ASP.NET Core的WebApi函数&#xff0c;此时输入参数和返回结果的属性名称开头默认为小写&#xff0c;如下图所示。 public class UserInfo { public string UserName { get; set; }public string UserSex { get; set; }public string UserP…

机器翻译.

0机器翻译 - 蓝桥云课 (lanqiao.cn) 题目描述 小晨的电脑上安装了一个机器翻译软件&#xff0c;他经常用这个软件来翻译英语文章。 这个翻译软件的原理很简单&#xff0c;它只是从头到尾&#xff0c;依次将每个英文单词用对应的中文含义来替换。对于每个英文单词&#xff0c;软…

如何写出防御性代码(屎山代码)

一、想说的 这两年各大公司纷纷实现广进计划&#xff0c;开猿节流&#xff0c;吾辈程序员家人们深受其害。大厂程序员被裁&#xff0c;向下挤压中小厂老铁们的岗位&#xff0c;内卷的不行。 为了咱们保住咱们的饭碗&#xff0c;形成护城河&#xff0c;形成核心竞争力&#xff…