深入了解关联查询和子查询

news2024/11/29 10:31:15

推荐阅读

给软件行业带来了春天——揭秘Spring究竟是何方神圣(一)
给软件行业带来了春天——揭秘Spring究竟是何方神圣(二)


文章目录

    • 推荐阅读
    • 关联查询
    • 子查询


关联查询

image.png

关联查询
从多张表中查询对应记录的信息,关联查询的重点在于这些表中的记录的对应关系,这个对应关系也称为连接条件。

select k.kname,k.sal,h.loc
from k,h
where k.depino=h.depino

image.png

表名也可以写别名.
当两张表名有同名字段时,select 子句中必须要明确指出指定该字段来自哪张表,在关联查询中,表名也可以添加别名们可以简化select 语句的复杂度。

SELECT k.name,h.name
FROM employee_K k,employee_H h
WHERE k.depino=h.depino

关联查询要添加连接条件,否则会产生笛卡尔积
笛卡尔积通常是一个无意义的结果集,它的记录数使所有参与查询的表的记录数乘积的结果。要避免出现,数据量大时极易出现内存溢出等现象。
N张表关联查询要有N-1个连接条件。

连接条件和过滤条件同时成立。

select k.kname,k.sal,h.loc
from k,h
where k.depino=h.depino and h.loc='shanghai'

内连接
**join… on… **内连接返回所有满足连接条件的记录。不满足条件的不会被查询出来。

select k.kname,sal,h.loc
from k  h 
where k.depino=h.depino and sal>2000

select k.kname,sal,h.loc
from k join h on k.depino=h.depino
where sal>2000

连接条件和过滤条件分开,层次感更好,条理更清晰。

外连接
外连接除了会将满足连接条件的记录查询出来以外,还会将不满足的连接条件的记录也查询出来。

外连接分
左外连接:以 join 左侧表作为驱动表(所有数据都会被查询出来),那么该表中某条 记录不满足连接条件时,来自右侧表中的字段全部填null。

select k.name,h.name from k left outer join h  
on k.depino=h.depino

select k.name,h.name from k join h  
on k.depino=h.depino(+)

右外连接

select k.name,h.name from k join h  
on k.depino(+)=h.depino

全外连接

select k.name,h.name from k  full outer join h  
on k.depino=h.depino

自连接
自连接:当前一张表的一条记录可以对应当前表自己的多条记录。
自连接是为了解决同类型数据但是又存在上下级关系的树状结构数据时使用。

select k.kname,kk.kname from k ,k kk where k.id=kk.pid

image.png
自连接连接多个表

select k.kname,kk.kname,h.loc
from k,k kk,h 
where k.pid=kk.id and kk.depino=h.depino and k.kname='bob'


select k.kname,kk.kname,h.loc
from k join k kk 
on k.pid=kk.id
join h
on kk.depino=h.depino
where k.kname='bob'

子查询

子查询是一条select 语句,但是他嵌套在其他SQL语句中,为的是给其他SQL语句提供数据以支持其执行操作。

SELECT kname,sal FROM K
WHERE sal>(select sal FROM k WHERE kname='ali')

image.png

在DDL中,根据子查询的结果集快速创建一张表。

创建表时如果字查询中的字段有别名则该表对应的字段就使用该别名作为其字段名,当子查询中一个字段名含有函数表达式,则必须要使用别名。

 CREATE TABLE employee
 AS
  SELECT k.kname,k.sal,k.id,h.hname,h.loc
 FROM h,k
 WHERE k.depino=h.depino

image.png

在DML中使用子查询。

SELECT*FROM K WHERE depino=(SELECT depino FROM K WHERE kname='alcie' )

子查询在查询语句中的运用
image.png

 select depino ,kname,sal from k where sal >(select avg(sal) from K)

image.png

  • 单行单列子查询:常用于过滤条件,可以配合=,<+,<,>,>=使用

  • 多行多列子查询:常用于过滤条件,由于查询出多个值,在判断=时,要用IN,

                                判断>,>=等操作,要用ALL,ANY。
    
  • 多行多列子查询:当成一张表来看。

 select kname,sal from k where sal >all(select sal from k where depino in(10,30))

image.png

exists,not exists 关键字
exists 后面跟一个子查询,当子查询可以查询出至少一条记录,则exists表达式成立并返回TRUE。

select kname,sal from k where exists(select *from k,h where k.depino=h.depino)

select kname,sal from k where not exists (select *from h where k.depino=h.depino)

image.png

子查询语句在having子句中的使用。

  select min(sal),depino
  from k
  GROUP BY depino
  having min(sal)>(select min(sal) from k where depino=30)

image.png

子查询在FROM子句中的运用
当一个子查询是多列子查询,通常将该子查询的结果集当做一张表看待并基于它进行二次查询。

select AVG(sal),depino from k group bu depino

select kname,k.sal,depino from k,(select AVG(sal) avg_sal,depino from k group by depino) A where k.depino=A.depino and k.sal>A.avg_sal

image.png
子查询在select 子句中的使用。
可以将查询的结果当做外层查询记录中的一个字段值显示。

select kname,k.sal,(select hname from h where k.depino=h.ddepino) from k

image.png

在这里插入图片描述

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

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

相关文章

C++参悟:扩展资源

有用的资源 一、概述二、模式、手法、提示和技巧1. cpppatterns2. C Core Guidelines3. MSDN 三、第三方库 一、概述 在 cppreference 中我发现了很多比较有趣的扩展资源。我是从其官网下载的离线 chm 版本以便查看 https://zh.cppreference.com/w/%E9%A6%96%E9%A1%B5 在我下…

一款轻量级、高性能、功能强大的内网穿透代理服务器

简介 nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发&#xff0c;可支持任何tcp、udp上层协议&#xff08;访问内网网站、本地支付接口调试、ssh访问、远程桌面&#xff0c;内网dns解析等等……&#xff09;&#xff0c;此外还支持内网htt…

Python学习(15)|切片slice操作

38-切片 slice 操作类似字符串的切片操作&#xff0c;对于列表的切片操作和字符串类似。 切片操作&#xff1a; 切片是Python序列及其重要的操作&#xff0c;适用于列表、元组、字符串等。 切片slice操作可以让我们快速提取子列表或者修改。标准格式为&#xff1a; [起始偏移…

QT6调用音频输入输出(超详细)

目录 一、QT6音频调用与QT5的区别 1.QAudioSource代替QAudioInput类 2.QAudioSink代替QAudioOutput类 二、音频操作中Push和Pull的区别 三、依托于Websocket实现实时对讲机 1.AudioIputDevices类 2.AudioOutputDevices类 3.实现的AudioHandler类完整内容 本人实际是要完…

深度神经网络如何启用卤化物后端以提高效率

介绍 本教程指导如何使用 Halide 语言后端在 OpenCV 深度学习模块中运行模型。Halide 是一个开源项目&#xff0c;它让我们以可读性强的格式编写图像处理算法&#xff0c;根据特定设备安排计算并以相当高的效率对其进行评估。 卤化物项目的官方网站&#xff1a;Halide。 最新…

Maven工程的配置及使用

一、Maven章节 Maven 是 Apache 软件基金会组织维护的一款专门为 Java 项目提供构建和依赖管理支持的工具 1.1、maven的作用 1&#xff09;依赖管理&#xff1a; 方便快捷的管理项目依赖的资源包&#xff08;jar包&#xff09;避免版本冲突 2&#xff09;统一项目结构&…

WebSocket学习笔记以及用户与客服聊天案例简单实现(springboot+vue)

一&#xff1a;介绍&#xff1a; 二&#xff1a;http协议与websocket对比&#xff1a; 三&#xff1a;websocket协议&#xff1a; 四&#xff1a;实现&#xff1a; 4.1客户端&#xff1a; 4.2服务端&#xff1a; 五&#xff1a;案例&#xff1a; 环境&#xff1a;做一个书店…

从0到1学Binder-环境准备

前言 终于要开始啃 binder 了&#xff0c;其实还没准备好&#xff0c;但是先走出去吧&#xff0c;目标是 2024 年一个整年能把 binder 学完。 我的微信公众号“ZZH的Android”&#xff0c;还有更多 Android 系统源码解析的干货文章等着你。 1 环境配置 Ubuntu 22.04 Cuttl…

计算机网络——03网络核心

网络核心 网络核心 网络核心&#xff1a;路由器的网络状态基本问题&#xff1a;数据怎样通过网络进行传输 电路交换&#xff1a;为每个呼叫预留一条专有电路分组交换 将要传送的数据分成一个个单位&#xff1a;分组将分组从一个路由器传到相邻路由器&#xff08;hop&#xff…

Jenkins(本地Windows上搭建)上传 Pipeline构建前端项目并将生成dist文件夹上传至指定服务器

下载安装jdk https://www.oracle.com/cn/java/technologies/downloads/#jdk21-windows 下载jenkins window版 双击安装 https://www.jenkins.io/download/thank-you-downloading-windows-installer-stable/ 网页输入 http://localhost:8088/ 输入密码、设置账号、安装推…

张维迎《博弈与社会》威胁与承诺(3)承诺行为

承诺的作用 上一节&#xff0c;我们探讨了如何在求解博弈时把不可置信的威胁或许诺排除出去&#xff0c;从而对参与人的行为做出合理的预测。如前所述&#xff0c;其中一个隐含的前提条件是&#xff0c;参与人要具有理性共识。而理性共识是一个要求很高的条件&#xff0c;现实生…

Zoho Projects与Jira:中国市场的理想替代品之争?

在软件开发生命周期中&#xff0c;项目管理一直是一个非常重要的环节。为了更好地协作、追踪项目的进程和管理任务&#xff0c;许多公司选择了Jira这款著名的项目管理工具&#xff0c;它是个非常强大的工具&#xff0c;但是作为一款纯国外产品&#xff0c;他可能不适合中国市场…

Leetcode—535. TinyURL 的加密与解密【中等】

2024每日刷题&#xff08;110&#xff09; Leetcode—535. TinyURL 的加密与解密 实现代码 class Solution { public:// Encodes a URL to a shortened URL.string encode(string longUrl) {while(!urlToCode.count(longUrl)) {string code;for(int i 0; i < 6; i) {code…

Day3.

1.信号 #include <head.h> //定义自定义信号处理函数 void handler(int signo) {if(signo SIGINT){printf("按下ctrl c键\n");}return; }int main(int argc,const char *argv[]) {if(signal(SIGINT, handler) SIG_ERR){perror("error\n");return…

Codeforces Beta Round 11 D. A Simple Task 【状压DP + 环计数】

D. A Simple Task 题意 给定一个简单图&#xff08;无重边无自环&#xff09;&#xff0c;求出其中的环的数量&#xff08;一个环除了起点和终点一样以外&#xff0c;没有另外的两个相同的点&#xff09; 思路 为了区分不同的环&#xff0c;我们可以统一地用环内编号最小来区…

论文阅读-CARD:一种针对复制元数据服务器集群的拥塞感知请求调度方案

论文名称&#xff1a;CARD: A Congestion-Aware Request Dispatching Scheme for Replicated Metadata Server Cluster 摘要 复制元数据服务器集群&#xff08;RMSC&#xff09;在分布式文件系统中非常高效&#xff0c;同时面对数据驱动的场景&#xff08;例如&#xff0c;大…

oracle主库增加redo组数

redo log&#xff08;重做日志&#xff09;&#xff1a; 重做日志&#xff1a;简单来说就是&#xff0c;将oracle数据库的DML、DDL&#xff08;数据库操作语言&#xff0c;数据库定义i语言&#xff09;操作记录在日志中&#xff0c;方便恢复及备库使用&#xff0c;以组的方式管…

【消息队列】kafka整理

kafka整理 整理kafka基本知识供回顾。

yo!这里是单例模式相关介绍

目录 前言 特殊类设计 只能在堆上创建对象的类 1.方法一&#xff08;构造函数下手&#xff09; 2.方法二&#xff08;析构函数下手&#xff09; 只能在栈上创建对象的类 单例模式 饿汉模式实现 懒汉模式实现 后记 前言 在面向找工作学习c的过程中&#xff0c;除了基本…

简易计算器的制作(函数指针数组的实践)

个人主页&#xff08;找往期文章&#xff09;&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 前期思路&#xff08;菜单的制作等&#xff09;&#xff1a;利用C语言的分支循环少量的函数知识写一个猜数字的小游戏-CSDN博客 计算器的制作其实与游戏没有很大的区别。 #include <st…