数据库多表联查

一、内联查询
内联查询只有完全满足条件的数据才能出现的结果
1.1 非等值联查
笛卡尔积,查到的结果具有不一致性
示例:	select * from student,class
1.2 等值查询
-- 查询出学生表和班级信息select * from student,class where student.classid=class.classid
-- 5张表全部联查select * from student,class,course,sc,teacher where                    	      student.classid=class.classid and student.sid=sc.sidand sc.cid=course.cid and course.tid=teacher.tid
-- 查询学过张三老师课程的学生信息select student.* from student,class,course,sc,teacher where student.sid=sc.sidand sc.cid=course.cid and course.tid=teacher.tid and teacher.tname='张三'
-- 多表最终跟单表一致
-- 查询每个学生的 学生信息,班级名称,平均成绩select student.Sname,class.classid,avg(score) from student,class,sc where student.sid=sc.sid and student.classid=class.classid group by student.sid
-- 通过第一张表的结果进行on条件匹配
-- 表少 每张表的数据大,内存占用小, IO高select * from student,class where student.classid=class.classid ssex='男'
1.3 inner join on
表的个数多,每个表的数据量不大,吃内存  IO小,笛卡尔积
-- 通过第一张表的结果进行on条件匹配select * from student inner join class on student.classid=class.classid
where ssex='男'select * from student inner join class on student.classid=class.classid
inner join sc on student.sid=sc.sid -- 五表联查
select * from class inner join student on class.classid=student.classid
inner join sc on sc.sid=
-- 每门课程的平均成绩  课程名称  代课老师姓名 平均成绩select cname,tname,avg(score) from sc inner join course on sc.cid=course.cidinner join teacher on course.tid=teacher.tidgroup by course.cid
二、外联查询
找到主查表
2.1 left join on 左外联
主表在join左边
-- 所有学生的数据和对应的班级信息
-- 主表是studentselect * from student left join class on student.classid=class.classid
-- 查询出所有的学生学过多少门课程 学生姓名 课程数select sname,count(cid) from student left join sc on student.sid=sc.sid
group by student.sid-- 没有班级 的学生select * from student left join class on student.classid=class.classid
where class.classid is null-- 没有学生的班级select * from class left join student on student.classid=class.classid
where student.sid is null
2.2 right join on 右外联
主表在join右边
-- 没有学生的班级select * from student right join class on student.classid = class.classidwhere student.sid is null
2.3 union
两个结果集的并集
(1) 去除重复 distinct
(2)不同类型的字段是可以合并
(3)起别名给第一个结果集才有用
(4)不同列数量的结果集不能合并
-- 库中的所有人的名字select sname,ssex,classid from student unionselect tname,tsex,temail from teacher-- 获取没有学生的班级和没有班级的学生的数据select * from student left join class on student.classid=class.classidwhere class.classid is nullunion select * from student right join class on student.classid=class.classidwhere student.sid is null-- 获取没有班级的学生和、班级和学生都有、
-- 全连接select * from student left join class on student.classid=class.classidunion select * from student right join class on student.classid=class.classid-- 不去重的并集select * from student left join class on student.classid=class.classidunion allselect * from student right join class on student.classid=class.classid
三、子查询
子查询,又称内部查询
3.1 where 子句
--查询id最大的一个学生select * from student order by sid desc limit 1-- 查询id最大的一个学生(子查询)
-- 效率差select max(sid) from studentselect * from student where sid=(select max(sid) from student)  -- 魔数-- 查询每个班id最大的学生(子查询)select * from student left join class on student.classid=class.classidwhere sid in(select max(sid) from student group by classid)-- 查询学过张三老师课程的学生select * from student where sid in(select sid from sc where cid=(select cid from course where tid=(select tid from teacher where tname='张三'))	)-- 查询没学过张三老师课程的学生select * from student where sid not in(select sid from sc where cid=(select cid from course where tid=(select tid from teacher where tname='张三'))	)
3.2 from 子查询
查询结果将作为一张表使用
-- 查询大于5人的班级名称和人数(不使用子查询)select classname,count(*) from class left join student on       class.classid=student.classidgroup by class.classid having count(*)>5-- 查询大于5人的班级名称和人数(使用子查询)select classname,人数 from class left join (select classid,count(*) 人数from student group by classid)t1on class.classid = t1.classidwhere 人数>5
3.3 exists 子查询
子句有结果,父句执行,子句没结果,父句不执行
select * from teacher where exists(select * from student where classid=10)
3.4 any /some,all
子查询-- 查询一班成绩比二班最低分高的学生SELECT DISTINCT student.* FROM sc  LEFT JOIN student ON sc.sid=student.sid WHERE student.classid=1 AND score > ANY(SELECT score FROM scLEFT JOIN student  ON sc.sid=student.`Sid`WHERE student.classid=2)
-- allSELECT DISTINCT student.* FROM scLEFT JOIN student ON student.sid=sc.sid WHERE student.classid=1 AND score >ALL(SELECT score FROM scLEFT JOIN student ON sc.sid=student.`Sid`WHERE student.`classid`=2)
3.5 IF(expr1,expr2,expr3)
(1)expr1 条件
(2)expr2 条件成立,显示数据
(3)expr 条件不成立,显示数据
 -- 1女-- 0男SELECT *FROM teacher ;SELECT tid,tname,IF(tsex=1,'女','男')tsex,tbirthday,taddress FROM teacher;
3.6 IFNULL(expr1,expr2)
 -- expr1 字段-- expr2 当字段为null时,默认值
select sid,sname,ifnull(birthday,'这个学生没有生日'),ssex from student
3.7 case when then end
同时出现
select tid,tname,
case tsexwhen 0 then '男'when 1 then '女'else '保密'
end tsex,tbirthday from teacher 
select tid,tname,
case when tsex>1 then '男'when tsex=1 then '女'when tsex<1 then '未知'
end,tbirthday from teacher 
select score,sid,
case when score>=90 then 'A'when score>=80 then 'B'when score>=70 then 'C'when score>=60 then 'D'when score<60 then '不及格'
end from sc

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

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

相关文章

物联网设备的画面(摄像头)嵌入到网页中,实时视频画面解决方案

一、将物联网设备的画面嵌入到网页中&#xff0c;通常有多种常见方式和解决方案。下面是一些常用的方法和技术&#xff1a; 1. 使用RTSP流 描述&#xff1a;通过RTSP协议流传输视频&#xff0c;可以通过播放器在网页中播放实时视频。解决方案&#xff1a; VLC.js&#xff1a;…

Python:对常见报错导致的崩溃的处理

Python的注释&#xff1a; mac用cmd/即可 # 注释内容 代码正常运行会报以0退出&#xff0c;如果是1&#xff0c;则表示代码崩溃 age int(input(Age: )) print(age) 如果输入非数字&#xff0c;程序会崩溃&#xff0c;也就是破坏了程序&#xff0c;终止运行 解决方案&#xf…

ios CCUIFont.m

// // CCUIFont.h // CCFC // //#import <Foundation/Foundation.h>// 创建字体对象 #define CREATE_FONT(fontSize) [UIFont systemFontOfSize:(fontSize)]interface UIFont(cc) (void)logAllFonts;end // // CCUIFont.m // CCFC // //#import "CCUIFont.h&…

贪心算法(三) ---cmp_to_key, 力扣452,力扣179

目录 cmp_to_key 比较函数 键函数 cmp_to_key 的作用 使用 cmp_to_key 代码解释 力扣452 ---射气球 题目 分析 代码 力扣179 ---最大数 题目 分析 代码 cmp_to_key 在Python中&#xff0c;cmp_to_key 是一个函数&#xff0c;它将一个比较函数转换成一个键函数…

Problems retrieving the embeddings data form OpenAI API Batch embedding job

题意&#xff1a;从OpenAI API批量嵌入作业中检索嵌入数据时遇到问题 问题背景&#xff1a; I have to embed over 300,000 products description for a multi-classification project. I split the descriptions onto chunks of 34,337 descriptions to be under the Batch e…

Nginx优化、防盗链

目录 Nginx优化 隐藏版本信息 网站缓存 日志切割 超时时间 更改进程数 网页压缩 防盗链 在使用源码软件包安装过Nginx服务&#xff0c;具体步骤看上一篇文章 功能模块位置 在Nginx的解压目录下的auto目录内的options文件可以查看Nginx可以安装的功能模块 [rootlocal…

关于InnoDB行锁和4种锁是怎么实现的?

InnoDB 的行锁实现主要基于索引&#xff0c;并通过多种类型的锁来确保数据的一致性和并发控制。以下是InnoDB行锁实现的几个关键点&#xff1a; 记录锁&#xff08;Record Locks&#xff09;&#xff1a;这种锁直接锁定某行记录的索引记录。它通常用于唯一索引或主键索引上&…

ubuntu20.04安装终端终结者并设置为默认终端

1、安装 terminator sudo apt-get install terminator 2、Ctrl Alt T 试一下打开什么终端&#xff0c;我的默认启动的是terminator;如果想换换默认的终端&#xff0c;还需以下一步 3、安装dconf-tools&#xff0c;这个是设置默认终端的必须 sudo apt-get install dconf-tools…

数据结构初阶-单链表

链表的结构非常多样&#xff0c;以下情况组合起来就有8种&#xff08;2 x 2 x 2&#xff09;链表结构&#xff1a; 而我们主要要熟悉的单链表与双向链表的全称分别为&#xff1a;不带头单向不循环链表&#xff0c;带头双向循环链表&#xff0c;当我们对这两种链表熟悉后&#x…

重生之我们在ES顶端相遇第5章-常用字段类型

思维导图 前置 在第4章&#xff0c;我们提到了 keyword&#xff08;一笔带过&#xff09;。在本章&#xff0c;我们将介绍 ES 的字段类型。全面的带大家了解 ES 各个字段类型的使用场景。 字段类型 ES 支持以下字段类型&#xff08;仅介绍开发中常用&#xff0c;更多内容请自…

大模型之RAG-关键字检索的认识与实战(混合检索进阶储备)

前言 按照我们之前的分享&#xff08;大模型应用RAG系列3-1从0搭建一个RAG&#xff1a;做好文档切分&#xff09;&#xff1a; RAG系统搭建的基本流程 准备对应的垂域资料文档的读取解析&#xff0c;进行文档切分将分割好的文本灌入检索引擎&#xff08;向量数据库&#xff…

AI App Store-AI用户评价-多维度打分对比pk-AI社区

C端用户、创作者、AI达人们在选择众多国内外AI厂商的服务时候往往感到一头雾水&#xff0c;那么多功能接近的AI应用(智能对话类、文档总结类、文生图、AI搜索引擎) 究竟在不同用户需求场景下表现怎么样。大部分人如果有需求都会所有平台都尝试一遍&#xff0c;比如一个博主生成…

Linux内网离线用rsync和inotify-tools实现文件夹文件单向同步和双向同步

lsyncd实现方式可参考&#xff1a;https://www.jianshu.com/p/c075ccf89516 安装文件下载&#xff1a;相关文件下载 rsync默认都有&#xff0c;所以没有提供。 服务端和客户端均操作 服务端&#xff1a;双向同步其实都是服务端&#xff0c;只是单向同步时稍有区别 客户端&am…

C++自定义字典树结构

代码 #include <iostream> using namespace std;class TrieNode { public:char data;TrieNode* children[26];bool isTerminal;TrieNode(char ch){data ch;for (int i 0; i < 26; i){children[i] NULL;}isTerminal false;} }; class Trie { public:TrieNode* ro…

Android、Java反编译工具JADX

目录 介绍 主要特点: jadx-gui特性: 下载地址 使用 介绍 jadx - Dex to Java反编译器 用于从Android Dex和Apk文件生成Java源代码的命令行和GUI工具 请注意,在大多数情况下,jadx不能100%反编译所有的代码,所以会出现错误。 有关变通方法,请参阅故障排除指南。 目前…

返回倒数第 k 个节点 - 力扣(LeetCode)

面试题 02.02. 返回倒数第 k 个节点 - 力扣&#xff08;LeetCode&#xff09; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/int kthToLast(struct ListNode* head, int k) {struct ListNode* fastnode head…

git面面观,面试题,常见问题

1. 简述什么是Git &#xff1f; Git是一款分布式源代码管理工具(版本控制工具) 。 Git得其数据更像是一系列微型文件系统的快照。使用Git&#xff0c;每次提交或保存项目状态时&#xff0c;Git基本上都会记录当时所有文件的外观&#xff0c;并存储对该快照的引用。为了提高效…

Prompt工程:与AI聊天机器人更好地交流

Prompt工程:与AI聊天机器人更好地交流 1. 清楚地说明你想要什么2. 告诉AI它现在是谁3. 一步一步来4. 给AI一些例子5. 让AI检查自己的回答6. 把AI当作你的小助手7. 让AI帮你想主意8. 让AI告诉你它需要知道什么9. 教AI一步一步思考结语 大家好!今天我们来聊聊如何跟AI聊天机器人更…

互三群危害?如何才能正确上热榜。

前言 攀登热门榜单之巅&#xff0c;历来是才华与智慧较量的舞台&#xff0c;策略与努力的结晶。然而&#xff0c;在这片看似光鲜的网络世界里&#xff0c;也潜藏着不为人知的暗流——“互三群”的歪风邪气。揭露其真面目&#xff0c;以正网络风气&#xff0c;是每一位网络创作…

基于区块链技术的中药饮片代煎配送服务与监管平台

业务背景 近年来&#xff0c;随着公众对中医药青睐有加&#xff0c;中药代煎服务作为中医药现代化的重要一环&#xff0c;在全国各地蓬勃兴起。鉴于传统煎煮方式的繁琐耗时&#xff0c;医疗机构纷纷转向与第三方中药饮片企业合作&#xff0c;采用集中代煎模式。这些第三方煎药中…