学点儿数据库_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.rhkb.cn/news/288410.html

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

相关文章

OpenCV模块熟悉:点云处理相关

1. 显示--VIZ 曾经基于PCL 做过不少点云相关的开发,采样VTK进行有点云显示。后来基于OpenCV做了不少三维重建工作,总是将点云保存下来,然后借助CloudCompare等查看结果。如果能够将VIZ编译进来,预计会提升开发速度。 …

86.分隔链表

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1: ​ 输入:head [1,4,3,2,5,2], x 3 输出&…

unity学习(70)——编译游戏发生错误2

1.全屏问题其实无所谓,windows用tab可以切出来的。 2.现在主要问题是服务器try了以后虽然不崩溃了,但不再显示2个实例对象了,unity和exe此时都只能看到一个实例对象 2.1把之前报错位置的try-catch先注释掉 2.2 unity中此时登录666账号&…

Git工具的详细使用

一、环境说明 [rootgit ~]# getenforce Disabled [rootgit ~]# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)Active: inactive (d…

Avalonia笔记2 -数据集合类控件

学习笔记&#xff1a; 1. DataGrid 笔记1中已经记录&#xff1b; 2. ItemsControl 属性&#xff1a; ItemsSource&#xff1a;数据源 ItemsControl.ItemTemplate&#xff1a;单项数据模板&#xff0c;内部使用<DataTemplate> 示例&#xff1a; <ItemsContr…

docker关闭全部运行容器命令是什么?

环境&#xff1a; docker v22.1 问题描述&#xff1a; docker关闭全部运行容器命令是什么&#xff1f; 解决方案&#xff1a; 要关闭所有正在运行的Docker容器&#xff0c;可以使用如下命令&#xff1a; docker stop $(docker ps -a -q)这条命令首先执行 docker ps -a -q…

35.HarmonyOS App(ArkUI)使用父组件@Builder装饰的方法初始化子组件@BuilderParam报错

HarmonyOS App(ArkUI)使用父组件Builder装饰的方法初始化子组件BuilderParam报错 Type void is not assignable to type () > void. <tsCheck> 去掉括号()就可以了 装饰器&#xff1a; 用于装饰类、结构、方法以及变量&#xff0c;并赋予其特殊的含义。如上述示例中En…

使用LangChain LCEL生成RAG应用、使用LangChain TruLens对抗RAG幻觉

# 导入LangChain的库 from langchain import *# 加载数据源 loader WebBaseLoader() doc loader.load("https://xxx.html")# 分割文档对象 splitter RecursiveCharacterTextSplitter(max_length512) docs splitter.split(doc)# 转换文档对象为嵌入&#xff0c;并…

[ Linux ] git工具的基本使用(仓库的构建,提交)

1.安装git yum install -y git 2.打开Gitee&#xff0c;创建你的远程仓库&#xff0c;根据提示初始化本地仓库&#xff08;这里以我的仓库为例&#xff09; 新建好仓库之后跟着网页的提示初始化便可以了 3.add、commit、push三板斧 git add . //add仓库新增&#xff08;变…

V R元宇宙平台的未来方向|V R主题馆加 盟|游戏体验馆

未来&#xff0c;VR元宇宙平台可能会呈现出以下发展趋势和可能性&#xff1a; 全面融合现实与虚拟世界&#xff1a; VR元宇宙平台将更加无缝地融合现实世界和虚拟世界&#xff0c;用户可以在虚拟环境中进行各种活动&#xff0c;与现实世界进行互动&#xff0c;并且体验到更加逼…

【Linux进阶之路】理解UDP,成为TCP。

前言 学了TCP 和UDP之后&#xff0c;感觉UDP就像是初入职场的年轻人&#xff0c;两耳不闻 “窗外事”&#xff0c;只管尽力地把自己的事情做好&#xff0c;但收获的却是不可靠&#xff0c;而TCP更像是涉世极深的"职场老油条"&#xff0c;给人的感觉就是 “城府极深&a…

【Java.mysql】——数据删改(DU) 附加数据库约束

目录 &#x1f6a9;更新(Update) &#x1f6a9;删除&#xff08;Delete&#xff09; &#x1f6a9;数据库约束 &#x1f388;约束类型 ✅NULL约束 ✅NNIQUE 唯一约束 ✅DEFAULT&#xff1a;默认值约束 ✅PRIMARY KEY&#xff1a;主键约束 ✅FOREIGN KEY&#xff1a;外键…

性价比高一点的diy台式主机怎么搭配?

怎么搭配一台性价比高一点的台式机 建议&#xff1a; 选择合适的CPU和GPU。根据实际需求选择相对较新的CPU和GPU型号&#xff0c;以确保能够运行目标应用程序和游戏。 合理选择内存和存储。根据预算选择适当的内存和存储容量。8GB或16GB内存对于一般计算和游戏使用足够了&…

YOLOv9改进策略:IoU优化 | Wasserstein Distance Loss,助力小目标涨点

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文独家改进&#xff1a;基于Wasserstein距离的小目标检测评估方法 Wasserstein Distance Loss | 亲测在多个数据集能够实现涨点&#xff0c;对小目标、遮挡物性能提升明显 &#x1f4a1;&#x1f4a1;&#x1f4a1;MS COCO和PASC…

【深度学习】深度学习md笔记总结第2篇:TensorFlow介绍,学习目标【附代码文档】

深度学习笔记完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;深度学习课程&#xff0c;深度学习介绍要求,目标,学习目标,1.1.1 区别,学习目标,学习目标。TensorFlow介绍&#xff0c;2.4 张量学习目标,2.4.1 张量(Tensor),2.4.2 创建张量的指令,2.4.3 张量…

腾讯云服务器多少钱一年?最新价格4核8G服务器646元15个月

2024年腾讯云4核8G服务器租用优惠价格&#xff1a;轻量应用服务器4核8G12M带宽646元15个月&#xff0c;CVM云服务器S5实例优惠价格1437.24元买一年送3个月&#xff0c;腾讯云4核8G服务器活动页面 txybk.com/go/txy 活动链接打开如下图&#xff1a; 腾讯云4核8G服务器优惠价格 轻…

JavaWeb解压缩漏洞之ZipSlip与Zip炸弹

前言 前面一篇博文《Android Zip解压缩目录穿越导致文件覆盖漏洞》介绍过 Android 系统 Zip 文件解压缩场景下的目录穿越漏洞&#xff0c;近期在学习 JavaWeb 代码审计的时候从 github 看到《OpenHarmony-Java-secure-coding-guide.md》中“从 ZipInputStream 中解压文件必须进…

如何理解CDN?说说实现原理?

一、是什么 CDN (全称 Content Delivery Network)&#xff0c;即内容分发网络 构建在现有网络基础之上的智能虚拟网络&#xff0c;依靠部署在各地的边缘服务器&#xff0c;通过中心平台的负载均衡、内容分发、调度等功能模块&#xff0c;使用户就近获取所需内容&#xff0c;降…

Lua热更新(xlua)

发现错误时检查是否:冒号调用 只需要导入asset文件夹下的Plugins和Xlua这两个文件即可,别的不用导入 生成代码 和清空代码 C#调用lua using Xlua; 需要引入命名空间 解析器里面执行lua语法 lua解析器 LuaEnv 单引号是为了避免引号冲突 第二个参数是报错时显示什么提示…

pytorch常用的模块函数汇总(1)

目录 torch&#xff1a;核心库&#xff0c;包含张量操作、数学函数等基本功能 torch.nn&#xff1a;神经网络模块&#xff0c;包括各种层、损失函数和优化器等 torch.optim&#xff1a;优化算法模块&#xff0c;提供了各种优化器&#xff0c;如随机梯度下降 (SGD)、Adam、RMS…