表关联查询

news2024/10/6 22:32:26

表关联查询

在这里插入图片描述

1.表别名

  当表的名字很长或者执行一些特殊查询时,为了方便操作或者需要多次使用相同的表时,可以为表指定别名,以替代表原来的名称。

  • 在为表取别名时,要保证不能与数据库中的其他表的名称冲突。

  • 对单表做简单的别名查询通常是无意义的。一般是对一个表要当作多个表来操作,或者是对多个表进行操作时,才设置表别名。

  • 当为表取别名后,列名前面最好都加上表的别名,做以区分。

SELECT p.*,v.vend_name 
FROM products p ,vendors v  
WHERE p.vend_id=v.vend_id;

  使用表别名查询,可以使 SQL 变得简洁而更易书写和阅读,尤其在 SQL 比较复杂的情况下。除了使用别名来简化 SQL 外,有些时候例如一个表做自身关联时,必须要使用别名来当作两个表进行关联操作

  
  

2.内连接

两表内联

案例

  假设现在我想查询给我们供货的供应商的名称,以及商品名称和商品价格。此时我们发现,要查询的字段不在同一张表里。供应商名称在vendors表里,而商品名称和商品价格在products表里,这时可以使用内联查询,将两张表进行关联之后进行查询。

# 这里没有使用表别名
SELECT vend_name, prod_name, prod_price
FROM products,
     vendors
WHERE vendors.vend_id = products.vend_id;

# 这种方式叫等值连接。当然也可以用表别名,来达到同样效果
SELECT v.vend_name, p.prod_name, p.prod_price
FROM products p,
     vendors v
WHERE p.vend_id = v.vend_id;
# 这种连接方式也被称为内部连接,可以用以下语法来明确指定连接类型 -- inner可以省略
SELECT vend_name, prod_name, prod_price
FROM products  INNER JOIN vendors ON vendors.vend_id = products.vend_id;

# 这两种方式都叫内连接,一种是隐式内联,一种是显示内联 

  这条语句的FROM子句列出了两个表,分别是vendors和products。它们就是这条SELECT语句联结的两个表的名字。这两个表用WHERE子句正确联结,WHERE子句指示MySQL匹配vendors表中的vend_id和products表中的vend_id。

  

笛卡尔积

  在数据库表的定义中不存在能指示MySQL如何对表进行联结的东西。我们必须自己通过SQL做这件事情。

  在联结两个表时,你实际上做的是将第一个表中的每一行与第二个表中的每一行配对。WHERE子句作为过滤条件,它只包含那些匹配给定条件(这里是联结条件)的行。没有WHERE子句,第一个表中的每个行将与第二个表中的每个行配对,而不管它们逻辑上是否可以配在一起。

  笛卡尔积(cartesian product) 由没有联结条件的表关系返回的结果为笛卡儿积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。

SELECT v.vend_name, p.prod_name, p.prod_price
FROM products p,  vendors v ORDER BY vend_name,prod_name;

  从上面的输出中可以看到,相应的笛卡尔积不是我们所想要的。这里返回的数据用每个供应商匹配了每个产品,它包括了供应商不正确的产品。实际上有的供应商根本就没有产品。所以两表联查时,一定要注意where条件。

  
  

多表内联(and)

  SQL对一条SELECT语句中可以联结的表的数目没有限制。创建联结的基本规则也相同。

案例

  假设现在要查询订单编号为20005的产品名称,产品价格、产品数量、供应商名称。该如何查询呢?

# 首先,先确认要查询的字段来自哪几张表?经分析可以得出,可以从orderitems、products、venders中获取数据
# 其次,再确定三张表的关联关系
# 然后,确定过滤条件
-- 隐式连接
SELECT prod_name, vend_name, prod_price, quantity
FROM vendors,
     products,
     orderitems
WHERE vendors.vend_id = products.vend_id
  AND products.prod_id = orderitems.prod_id
  AND order_num = 20005;
-- 显示连接
SELECT prod_name, vend_name, prod_price, quantity
FROM orderitems o
         JOIN products p ON o.prod_id = p.prod_id
         JOIN vendors v ON p.vend_id = v.vend_id
WHERE o.order_num = 20005;

  
  

3.外连接

左外连接(left outer join,outer可省略)

左表全部出现在结果集中,若右表无对应记录,则相应字段为NULL

在这里插入图片描述

举例说明:

客户表:

在这里插入图片描述

订单表:

在这里插入图片描述

select first_name, last_name, order_date, order_amount
from customers c
left join orders o 
on c.customer_id = o.customer_id

  结果:右表(order)只选取customer_id在左表出现过的结果(符合条件的order_date, order_amount,所以最后两行中date和amount都有NULL值)

在这里插入图片描述

  

  

右外连接(right outer join,outer可省略)

右表全部出现在结果集中,若左表无对应记录,则相应字段为NULL

在这里插入图片描述

举例说明:

select first_name, last_name, order_date, order_amount
from customers c
right join orders o
on c.customer_id = o.customer_id

  结果:左表(customer)只选取customer_id在右表出现过的结果(符合条件的first_name和last_name,所以最后两行中first_name和last_name都有NULL值)

在这里插入图片描述

  

  

4.自连接

  假设你发现商品id为60001的商品存在质量缺陷,现在需要查找,60001供应商所提供的所有商品的名称和商品id。请问如何编写SQL语句?

# 1.使用现有的知识储备,子查询
SELECT vend_id FROM products WHERE prod_id=60001;
SELECT prod_id,prod_name FROM products WHERE vend_id=1001;

SELECT prod_id,prod_name FROM products WHERE vend_id=(SELECT vend_id FROM products WHERE prod_id=60001);

# 2.采用自连接
SELECT p1.prod_id, p1.prod_name, p1.vend_id
FROM products p1,
     products p2
WHERE p1.vend_id = p2.vend_id
  AND p2.prod_id = 60001;

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

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

相关文章

能否通过手机号查询他人位置及技术实现(省流:不能)

前言 🍀作者简介:被吉师散养、喜欢前端、学过后端、练过CTF、玩过DOS、不喜欢java的不知名学生。 🍁个人主页:红中 🫒每日emo:纪念我死去的爱情 🍂灵感来源:艺术源于生活&#xff0c…

SpringBoot SpringBoot 开发实用篇 5 整合第三方技术 5.2 Spring 缓存使用方式

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇5 整合第三方技术5.2 Spring 缓存使用方式5.2.1 Spring 缓存使用5.2.…

数字集成电路设计(五、仿真验证与 Testbench 编写)(二)

文章目录4. 信号时间赋值语句4.1 时间延迟的语法说明4.2 时间延迟的描述形式4.3 边沿触发事件4.3.1 事件表达式4.3.2 边沿触发语法格式4.4 电平敏感事件4. 信号时间赋值语句 !!信号赋值语句是硬件描述语言非常重要的一条语句,是对于任意信号…

Zookeeper:Zookeeper的主从选举机制

ZAB 协议,全称 Zookeeper Atomic Broadcast(Zookeeper 原子广播协议),是为分布式协调服务 ZooKeeper 专门设计的一种支持崩溃恢复的一致性协议。基于该协议,ZooKeeper 实现了一种主从模式的系统架构来保持集群中各个副…

业务定制型异地多活架构设计

1个原理 大道至简-异地多活核心原理 异地多活本质上是 CAP 中的AP 大道至深-CAP 粒度 CAP 关注的粒度是数据,而不是系统,需要根据不同业务的数据特点来设计异地多活 延迟 CAP 是忽略网络延迟的 ,但工程落地不可能做到零延迟 分区容忍…

【Linux】linux中你不得不爱的命令集(上)

Linux命令集 我们将要介绍的命令并不是linux中所有的命令,是我们常见的和经常要使用的命令。 我们所用的linux版本是centos7,我们的linux搭建是在腾讯云服务器上搭建的,借助Xshell登录服务器,在root下进行命令行的操作。 目录 L…

[附源码]java毕业设计社区生鲜仓库管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

异地多活架构的3种模式

业务定制型异地多活 按照业务的优先级进行排序,优先保证核心业务异地多活 基于核心业务的流程和数据,设计定制化的异地多活架构 优点 对基础设施无强要求,例如机房部署、存储系统、时延等,一般部署在远距离的两个城市&#xff…

经济师报考专业选择及难度分析!这三个专业每年报考人数超10万!

经济师 经济师考试报考专业设有10个专业,含工商管理、农业经济、财政税收、金融、保险、运输经济、人力资源管理、旅游经济、建筑与房地产经济、知识产权。那么,哪些专业是经济师报考的热门专业?哪些专业前景较好?哪个又更好考呢…

SAP 物料分类账配置详解Part 2( 基于SAP S/4HANA1909 版本)

1.12 检查物料会计科目的结算 1.13 激活在制品实际成本计算 1.14 定义并分配评估策略 1.15 定义实际成本核算/物料分类帐的访问 1.16 分配成本核算码到物料类型 1.17 将评估范围设置为生产 1.12 检查物料会计科目的结算 1.12.1 概念说明 为物料分类账的结账配置自动…

C++模拟OpenGL库——图片处理及纹理系统(二):图片Alpha值混合操作

目录 Alpha值混合操作 更改一些类接口设置,实现Alpha值设定 Alpha值混合操作 先上图,其实原理和ColorLerp的原理一样,一种线性插值的方法来实现Alpha通道的混合。 Alpha通道就是对RGB三个值的一种表现约束,比如Alpha0.5&#x…

使用keytool生成Tomcat证书

一、HTTPS原理 1、HTTP、HTTPS、SSL、TLS介绍与相互关系 (1)HTTP:平时浏览网页时候使用的一种协议。HTTP协议传输的数据都是未加密的(明文),因此使用HTTP协议传输隐私信息非常不安全。 (2&am…

人工智能学习相关笔记

文章目录留出法(hold-out)Artifact (error)理解交叉熵损失函数(CrossEntropy Loss)信息量信息熵相对熵(KL散度)交叉熵交叉熵在单分类问题中的应用回顾知识蒸馏公式对抗学习随机投影(Random Projection)概述基本实现sklearn中的随机投影独立成分分析(ICA)ICA算法ICA 应用sklearn…

tslib库编译与移植

tslib库编译与移植 1.tslib库简介 tslib 是电阻式触摸屏用于校准的一个软件库,是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。 2…

数据结构——顺序表

目录 一.简介 线性表 顺序表 二.结构体与初始化 1.创建 2.初始化 三.功能实现 1.打印 2.销毁 3.扩容 4.尾插 5.尾删 6.头插 7.头删 8.查找元素 9.下标位置的插入与某一数据前的插入 10.下标位置的删除与某一数据的删除 11.头插、头删、尾插、尾删的常态化 一.简…

模块电路选型(1)----电源模块

系列文章目录 1.电源模块 2.主控模块 3.传感器模块 4.通信模块 5.电机驱动模块 6.存储模块 7.人机交互模块 文章目录前言一、DCDC电源模块1、LM2596 DCDC降压模块设计二、LDO电源模块1、1117芯片前言 送给大学毕业后找不到奋斗方向的你(每周不定时更新&#x…

Spring Data JPA之Spring boot整合JPA进行CRUD

Spring boot整合JPA进行CRUD前言系列博客本博客的实现demo环境配置1.POM依赖2.application.yml文件完整的项目结构代码实现实体类启动类创建数据访问层使用Spring Data JPA 创建带条件的CRUD编写业务层创建UserController类运行测试插入用户数据删除用户数据修改数据查询数据根…

kubernetes(K8S)学习笔记P2:搭建K8s集群2种方式

搭建K8s集群:2种方式2.搭建K8s集群--->kubeadm2.1环境准备2.1.1关闭防火墙2.1.2关闭seliux2.1.3关闭swap分区2.1.4设置主机名称2.1.5将桥接的IPv4流量传递到iptables的链2.1.6时间同步2.2三台虚拟机都安装Docker2.3添加阿里云YUM软件源2.4安装/kubeadm/kubelet2.…

dubbo:从零理解及搭建dubbo微服务框架(一)【附带源码】

0.引言 dubbo作为阿里巴巴开源的微服务框架,提供了高性能的RPC调用。同时因为有阿里的背书,在国内市场得到了广泛应用,dubbo的开源工作在2018年2月阿里将项目捐献给apache基金会后,得到了更加广大的发展。 之前我们讲解了spring…

【图像分割】2021-Swin-Unet CVPR

【图像分割】2021-Swin-Unet CVPR 论文题目:Swin-Unet: Unet-like Pure Transformer for Medical Image Segmentation 论文链接:https://arxiv.org/abs/2105.05537 论文代码:https://github.com/HuCaoFighting/Swin-Unet 发表时间&#xff1a…