SQL-多表查询

news2024/9/16 23:58:24

多表关系

  • 一对多(多对一)
    • 在多的一方建立外键,指向一的一方的主键。
  • 多对多
    •  建立第三张中间表,中间表至少包含两个外键,分别关联两方主键。
  • 一对一
    • 在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的。(UNIQUE)

多表查询概述

笛卡尔积:在数学中,两个集合A集合和B集合的所有组合情况。

---笛卡尔积
SELECT *
FROM emp,dept;
--消除笛卡尔积
SELECT * 
FROM emp,dept 
WHERE emp.dept_id = dept.id;
--不满足连接条件,就不会查询出来

内连接

相当于查询A、B交集部分数据

  • 隐式内连接

        SELECT 字段列表 FROM 表1,表2 WHERE 条件

        表结构:emp,dept

        连接条件:emp.dept_id=dept.id

SELECT * 
FROM emp, dept
WHERE emp.dept_id = dept_id;
  • 显式内连接 

         SELECT 字段列表 FROM 表1  JOIN 表2 ON 连接条件

SELECT *
FROM emp e 
INNER JOIN dept p
ON e.dept_id = d.id;

 外连接

  • 左外连接:查询左表所有数据,以及两张表交集部分数据,

         SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 条件 ...;

        相当于查询表1的所有数据,包含表1和表2交集部分数据

  • 右外连接:查询右表所有数据,以及两张表交集部分数据

        SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 条件 ...;

-- 左
SELECT e.*, d.name 
FROM employee  e 
LEFT [OUTER] JION dept  d 
ON e.dept = d.id;

-- 右
select d.name, e.* 
from employee  e 
right outer join dept d 
on e.dept = d.id;

自连接:当前表与自身的连接查询,自连接必须使用表别名

--查询员工及其所属领导的名字
SELECT a.name, b.name
FROM emp a, emp b
WHERE a.mangerid= b.id;
--查询所有员工及其领导名字,如果员工没有领导,也需要查询出来
SELECT a.name "员工", b.name “领导”
FROM emp a
LEFT JOIN emp b
ON a.mangerid= b.id; 

联合查询

语法:

  1. SELECT 字段列表 FROM 表A ...
  2. UNION [ALL]
  3. SELECT 字段列表 FROM 表B ...
--薪资低于5000和年龄大于50的员工全部查询出来(直接合并)
SELECT * 
FROM emp
WHERE salary < 5000
UNION ALL
WHERE *
FROM emp
WHERE age > 50;
----薪资低于5000和年龄大于50的员工全部查询出来(合并后去重)
SELECT * 
FROM emp
WHERE salary < 5000
UNION 
WHERE *
FROM emp
WHERE age > 50;

对于联合查询的多张表的列表必须保持一致,字段类型也需要保持一致。

UNION ALL 会将全部的数据直接合并在一起,UNION会对合并之后的数据去重。

子查询

SQL语句中嵌套SELECT语句,称谓嵌套查询,又称子查询。

SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2);

子查询外部的语句可以是 INSERT / UPDATE / DELETE / SELECT 的任何一个

根据子查询结果可以分为:

  • 标量子查询(子查询结果为单个值)

        子查询返回的结果是单个值(日期,字符串,日期等)最简单的形式,这种子查询是标量子查询。=   <>    >   >=   <   <=

-- 查询销售部所有员工
SELECT id 
FROM dept 
WHERE name = '销售部';
-- 根据销售部部门ID,查询员工信息
SELECT * 
FROM employee 
WHERE dept = 4;
-- 合并(子查询)
SELECT * 
FROM employee 
WHERE dept = (SELECT id FROM dept WHERE name = '销售部');
-- 查询xxx入职之后的员工信息
SELECT * 
FROM employee 
WHERE entrydate > (SELECT entrydate FROM employee WHERE  name = 'xxx');
  • 列子查询(子查询结果为一列)

        子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。

        常用操作符: IN ; NOT IN ; ANY ; SOME; ALL

操作符描述
IN在指定的集合范围内,多选一
NOT IN不在指定的集合范围内
ANY子查询返回列表中,有任意一个满足即可
SOME与ANY等同,使用SOME的地方都可以使用ANY
ALL子查询返回列表的所有值都必须满足
--查询销售部和市场部的部门ID
SELECT id
FROM dept
WHERE name = '销售部' OR name = '市场部';
--根据部门ID,查询员工信息
SELECT * 
FROM emp 
WHERE dept in (2,4)
-- 查询销售部和市场部的所有员工信息
select * from employee where dept in (select id from dept where name = '销售部' or name = '市场部');


-- 查询比财务部所有人工资都高的员工信息
select * from employee where salary > all(select salary from employee where dept = (select id from dept where name = '财务部'));
-- 查询比研发部任意一人工资高的员工信息
select * from employee where salary > any (select salary from employee where dept = (select id from dept where name = '研发部'));
  • 行子查询(子查询结果为一行)

        返回的结果是一行(可以是多列)。
       常用操作符:=, <, >, IN, NOT IN

-- 查询与xxx的薪资及直属领导相同的员工信息
select * from employee where (salary, manager) = (12500, 1);
select * from employee where (salary, manager) = (select salary, manager from employee where name = 'xxx');
  • 表子查询(子查询结果为多行多列)

        

-- 查询与xxx1,xxx2的职位和薪资相同的员工
select * from employee where (job, salary) in (select job, salary from employee where name = 'xxx1' or name = 'xxx2');


-- 查询入职日期是2006-01-01之后的员工,及其部门信息
--a.入职日期是“2006-01-01”之后的员工信息
SELECT *
FROM emp
WHERE entrydate > '2006-01-01';
--b.查询这部分员工,对应的部门信息
select e.*, d.* from (select * from employee where entrydate > '2006-01-01') as e left join dept as d on e.dept = d.id;

根据子查询位置可分为:

  • WHERE 之后
  • FROM 之后
  • SELECT 之后

多表查询案例

salgrade

emp

--查询所有员工的工资等级
--表 emp,salgrade
--连接条件:emp.salary >= salgrade.losal and emp.salary <= salgrade.hisal

SELECT e.*, s.grade, s.hisal 
FROM emp e, salgrade s 
WHERE e.salary >= s.losal AND e.salary <= s.hisal;

SELECT e.*, s.grade, s.hisal 
FROM emp e, salgrade s 
WHERE e.salary between s.losal AND s.hisal;

--查询研发部所有员工的信息及工资等级
--表 emp,salgrade,dept
--连接条件:emp.salary between salgrade.losal and salgrade.hisal, emp.dept_id = dept.id
--查询条件:dept.name = '研发部'
SELECT e.*,s.grade 
FROM emp e, dept d, salgrade s 
WHERE e.dept_id = d.id AND (e.salary between s.local and s.hisal) AND d.name='研发部';

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

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

相关文章

【算法 - 动态规划】找零钱问题Ⅰ

在前面的动态规划系列文章中&#xff0c;关于如何对递归进行分析的四种基本模型都介绍完了&#xff0c;再来回顾一下&#xff1a; 从左到右模型 &#xff1a;arr[index ...] 从 index 之前的不用考虑&#xff0c;只考虑后面的该如何选择 。范围尝试模型 &#xff1a;思考 [L ,…

[面试]我们常说的负载均衡是什么东西?

什么是负载均衡 如果用户量很多, 服务器的流量也随之增大, 此时出现两个问题, 软件性能下降 容易出现单点故障 为了解决这些问题, 引入了集群化架构, 也就是把一个软件同时部署在多个服务器上 集群化架构出现的问题 架构改变后又出现了两个问题 如何将请求均匀的发送到多…

代码随想录day34--动态规划的应用2 | LeetCode343.整数拆分、LeetCode96.不同的二叉搜索树

LeetCode343.整数拆分 题目描述&#xff1a; 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。…

mysql数据同步组件

# 要求&#xff1a; 支持实时同步&#xff0c; 支持增量同步&#xff0c; 不用写业务逻辑&#xff0c; 支持Mysql之间同步&#xff0c; 活跃度高。 # 可选组件&#xff1a;canal ,debezium, datax , Databus, Flinkx , Bifrost &#xff1a; Bifrost 特点&#xff1a; 1. …

Stable Diffusion 绘画入门教程(webui)-ControlNet(线稿约束)

上篇文章介绍了openpose&#xff0c;本篇文章介绍下线稿约束&#xff0c;关于线稿约束有好几个处理器都属于此类型&#xff0c;但是有一些区别。 包含&#xff1a; 1、Canny(硬边缘&#xff09;&#xff1a;识别线条比较多比较细&#xff0c;一般用于更大程度得还原照片 2、ML…

2024年西安市省级工业互联网平台申报条件材料、时间流程

一、申报条件 (一)申报单位须在西安市内登记注册,具有独立的法人资格和规范的财务管理制度,无不良信用记录,照章依法纳税。 (二)面向陕西省支持的35个工业重点产业方向内的中小企业提供服务,围绕各类型工业场景,加快企业内部信息化系统综合集成和云化改造,连接设备、软件、工…

【FPGA】线性反馈移位寄存器(LFSR)的Verilog实现

什么是移位寄存器 移位寄存器&#xff1a;是指多个寄存器并排相连&#xff0c;前一个寄存器的输出作为下一个寄存器的输入&#xff0c;寄存器中存放的数据在每个时钟周期向左或向右移动一位。 下面的右移移位寄存器因为左侧没有有效输入&#xff0c;所以在第4个时钟周期&…

转本考前如何调整心态

不少同学还在过年的氛围中还没走出来。 担忧自己成绩不进反退&#xff0c;又不知道该如何调整心态&#xff01;这个时候小编就有几点小建议给到各位考生。 *心态*情绪 良好的考试心态是没有固定的心态&#xff0c;对不同学习情况的学生来说&#xff0c;良好的考试心态是不一…

微信小程序--怎样在小程序中创建地图并渲染数据中的点标记

效果&#xff1a; 首先--创建地图 使用官方文档中的地图组件 map <map id"mapId" class"map" longitude"{{longitude}}" latitude"{{latitude}}" markers"{{markers}}"></map> 其中的属性值&#xff1a; lon…

爬虫入门四(抽屉半自动点赞、xpath使用、动作链、打码平台、scrapy框架介绍与安装及创建项目)

文章目录 一、抽屉半自动点赞二、xpath的使用三、动作链四、打码平台介绍超级鹰打码基本测试 五、自动登录超级鹰六、scrapy框架介绍安装创建爬虫项目 一、抽屉半自动点赞 登录抽屉账号保存cookiesimport timeimport jsonfrom selenium import webdriverfrom selenium.webdrive…

使用向量数据库pinecone构建应用04:混合搜索 Hybrid Search

Building Applications with Vector Databases 下面是这门课的学习笔记&#xff1a;https://www.deeplearning.ai/short-courses/building-applications-vector-databases/ Learn to create six exciting applications of vector databases and implement them using Pinecon…

啤酒:精酿啤酒与烧烤的热烈碰撞

在夏日的傍晚&#xff0c;烧烤与啤酒总是绝配。当Fendi Club啤酒遇上烧烤&#xff0c;它们将为我们带来一场热烈的美味碰撞。 Fendi Club啤酒&#xff0c;以其醇厚的口感和淡淡的麦芽香气而著称。这款啤酒在酿造过程中采用了特别的工艺&#xff0c;使得酒体呈现出诱人的金黄色&…

【JVM】线上一次fullGC排查思路

fullGC问题背景 监控告警发现&#xff0c;今天开始我们线上应用频繁出现fullGC&#xff0c;并且每次出现后磁盘都会被占满 查看监控 查看监控发现FULLGC的机器均为同一个机房的集器&#xff0c;并且该机房有线上error报错&#xff0c;数据库监控对应的时间点也有异常&#x…

如何在Linux搭建MinIO服务并实现无公网ip远程访问内网管理界面

文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器&#xff0c;可以在各种环境中运行&#xff0c;例如本地、Docker容器、Kubernetes集群等。它兼…

Linux系统中前后端分离项目部署指南

目录 一.nginx安装以及字启动 解压nginx 一键安装4个依赖 安装nginx 启动 nginx 服务 开放端口号 并且在外部访问 设置nginx自启动 二.配置负载均衡 1.配置一个tomact 修改端口号 8081端口号 2.配置负载均衡 ​编辑 三.部署前后端分离项目 1.项目部署后端 ​编辑…

上海亚商投顾:沪指8连阳重新站上3000点 全市场逾百股涨停

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指2月23日继续反弹&#xff0c;成功收复3000点大关&#xff0c;录得8连阳走势。AI概念持续活跃&#xff0c…

springboot219基于SpringBoot的网络海鲜市场系统的设计与实现

网络海鲜市场系统的设计与实现 摘 要 计算机网络发展到现在已经好几十年了&#xff0c;在理论上面已经有了很丰富的基础&#xff0c;并且在现实生活中也到处都在使用&#xff0c;可以说&#xff0c;经过几十年的发展&#xff0c;互联网技术已经把地域信息的隔阂给消除了&…

日志系统项目(2)项目实现(实用工具类、日志等级类、日志消息类、日志格式化输出类)

前面的文章中我们讲述了日志系统项目的前置知识点&#xff0c;再本文中我们将开始日志项目的细节实现。 日志系统框架设计 本项目实现的是一个多日志器日志系统&#xff0c;主要实现的功能是让程序员能够轻松的将程序运行日志信息落地到指定的位置&#xff0c;且支持同步与异…

20240223-2092.查找所有有秘密的人

题目要求 给你一个整数 n&#xff0c;表示有 n 个人&#xff0c;编号从 0 到 n - 1。你还给你一个 0 索引的二维整数数组 meetings&#xff0c;其中 meetings[i] [xi, yi, timei] 表示 xi 和 yi 在 timei 有一个会议。一个人可以同时参加多个会议。最后&#xff0c;给你一个整…

【Flutter/Android】运行到安卓手机上一直卡在 Running Gradle task ‘assembleDebug‘... 的终极解决办法

方法步骤简要 查看你的Flutter项目需要什么版本的 Gradle 插件&#xff1a; 下载这个插件&#xff1a; 方法一&#xff1a;浏览器输入&#xff1a;https://services.gradle.org/distributions/gradle-7.6.3-all.zip 方法二&#xff1a;去Gradle官网找对应的版本&#xff1a;h…