13 创建高级联结

13.1 使用表别名

在之前的例子中,我们用的都是用的列别名,SQL还允许给表名起别名。 

 

13.2 使用不同类型的联结

我们在上一章使用的只是称为内部联结或等值联结( equijoin的简单联结,现在来看3种其他联结,它们分别是自联结、自然联结和外部联结。

13.2.1 自联结

这里的自联结通俗来讲就是表自己与自己联结,此时表别名就发挥作用了。

我们看一个例子:

发现某物品(其IDDTNTR)存在问题,因此想知道生产该物品的供应商生产的其他物品是否也存在这些问题。此查询要求首先找到生产IDDTNTR的物品的供应商,然后找出这个供应商生产的其他物品。
一方面,我们可以用子查询来实现。

SELECT prod_id, prod_name
FROM products
WHERE vend_id = ( SELECT vend_idFROM productsWHERE prod_id = 'DTNTR' );

 

另一方面,我们可以用自联结来实现。

SELECT p1. prod_id, p1. prod_name
FROM products AS p1, products AS p2
WHERE p1.vend_id = p2.vend_id
AND p2.prod_id = 'DTNTR' );

此查询中需要的两个表实际上是相同的表,因此products表在FROM子句中出现了两次。 但对products 的引用具有二义性 。为解决此问题,使用了表别名。products的第一次出现为别名p1第二次出现为别名p2

13.2.2 自然联结

 对表进行联结,应该至少有一个列出现在不止一个表中(被联结的列)。标准的联结(内部联结)返回所有数据,甚至相同的列多次出现。 自然联结排除多次出现,使每个列只返回一次。
自然联结是这样一种联结,其中你只能选择那些唯一的列。这一般是通过对表使用通配符(SELECT *),对所有其他表的列使用明确的子集来完成的。

13.2.3 外联结

许多联结将一个表中的行与另一个表中的行相关联。但有时候会需要包含没有关联行的那些行。
看这样一个例子:
下面的SELECT语句给出一个简单的内部联结。它检索所有客户及其订单:

SELECT customers.cust_id, orders.order_num
FROM customers INNER JOIN orders
ON customers.cust_id = orders.cust_id;

但是,为了检索所有客户,包括那些没有订单的客户, 就要使用外部联结

SELECT customers.cust_id, orders.order_num
FROM customers LEFT ORTER JOIN orders
ON customers.cust_id = orders.cust_id;

与内部联结关联两个表中的行不同的是,外部联结还包括没有关联行的行。在使用OUTER JOIN语法时,必须使用RIGHT或LEFT关键字 指定包括其所有行的表(RIGHT指出的是OUTER JOIN右边的表,而LEFT 指出的是OUTER JOIN左边的表)。上面的例子使用LEFT OUTER JOINFROM子句的左边表(customers表)中选择所有行。为了从右边的表中选择所有行,应该使用RIGHT OUTER JOIN

13.3 使用带聚集函数的联结
我们来看一个COUNT()函数的例子吧

要检索所有客户及每个客户所下的订单数

SELECT customers.cust_name 
customers.cust_id, 
COUNT(orders.order_num) AS num_ord
FROM customers LINNER JOIN orders
ON customers.cust_id = orders.cust_id;

结果是这样的:

 

13.4 使用联结和联结条件 

  • 注意所使用的联结类型。一般我们使用内部联结,但使用外部联结也是有效的。
  • 保证使用正确的联结条件,否则将返回不正确的数据。
  • 应该总是提供联结条件,否则会得出笛卡儿积。
  • 在一个联结中可以包含多个表,甚至对于每个联结可以采用不同的联结类型。虽然这样做是合法的,一般也很有用,但应该在一起测试它们前,分别测试每个联结。这将使故障排除更为简单。

转载于:https://www.cnblogs.com/xlzfdddd/p/10159574.html

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

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

相关文章

JS中undefined和null的区别,以及出现原因

区别:null是一个表示无的对象,转换为数值为0; undefined表示一个无的原始值,转化为数值为NAN(与任何数字相加也为NAN) undefined出现原因:(口诀:一变量二函数一对象) 1.变量被声明了…

判断一个数是不是质数

number int(input("请输入数字&#xff1a;"))count 2while count < number -1: if number % count 0: #质数是除了1和它本身能除尽。将这个数从2开始除&#xff0c;除到number-1&#xff0c;如果有除尽的就不是质数&#xff0c;如果没有就是质数。…

Java 8:功能接口示例

为了支持Java 8中的lambda表达式&#xff0c;他们引入了Functional Interfaces。 具有单一抽象方法的接口可以称为功能接口。 Runnable&#xff0c;Comparator&#xff0c;Cloneable是功能接口的一些示例。 我们可以使用Lambda表达式实现这些功能接口。 例如&#xff1a; Th…

正则表达式验证问题(用户名、密码、email、身份证

实现的代码如下&#xff1a; 1 <html>2 <head>3 <meta charset"UTF-8">4 </head>5 <body>6 <p>用户名正则表达式 &#xff0c;4到16位&#xff08;字母&#xff0c;数字&#xff0c;下滑线&#xff0c;减号&#xff09;</p&g…

MySQL协议分析(1)

MySQL协议分析 此阶段的协议分析是在未压缩未加密情况下的协议分析 思路&#xff1a; 结合Oracle官网和自己用wireshark抓的网络数据包进行协议分析 官网说明 mysql包共分为4段&#xff0c;格式如下&#xff1a; 第一段&#xff1a;payload&#xff08;通常是执行的SQL语句&…

linux raw socket 例子,raw socket编程例子

raw socket编程例子内容安排:1.原始套接字介绍1.1 原始套接字工作原理与规则1.2 简单应用2 FTP密码窃取器实现(简单的rootkit)2.1 设计思路2.2 实现2.3 不足与改进之处开始,嗯,喝口茶水先...........1.原始套接字(raw socket)1.1 原始套接字工作原理与规则原始套接字是一个特殊…

谨慎使用Hibernate中的本机SQL

我真的很喜欢Hibernate&#xff0c;但我也不知道同时具备强大功能和欺骗性的工具。 我可以写一本书&#xff0c;讲述仅与Hibernate相关的生产和货物崇拜编程中的意外情况。 与用户相比&#xff0c;与工具相比&#xff0c;这更多的是问题&#xff0c;但请不要让它过于保修。 所…

js 编辑数组

删除数组第一个元素使用var length arr.shift(); 删除arr的第一个元素后, 返回值是删除后的数组长度 删除数组最后一个元素使用var length arr.pop(); 删除arr的最后一个元素后, 返回值是删除后数组的长度 在数组开头添加元素使用var length arr.unshif…

tensorboard运行

终端中进入存放even文件的文件夹的上一步&#xff0c;然后&#xff0c;输入tensorboard --logdir存放even文件的文件夹 转载于:https://www.cnblogs.com/wzwi/p/10931397.html

DevExpress WPF v18.2新版亮点(五)

买 DevExpress Universal Subscription 免费赠 万元汉化资源包1套&#xff01; 限量15套&#xff01;先到先得&#xff0c;送完即止&#xff01;立即抢购>> 行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布&#xff0c;本站将以连载的形式…

JavaFX技巧3:使用回调接口

作为UI框架开发人员&#xff0c;提供自定义控件外观和行为的方法是我工作的一部分。 在许多情况下&#xff0c;这是通过允许框架用户在控件上注册工厂来完成的。 过去&#xff0c;我会为此创建一个工厂接口&#xff0c;并在框架内提供一个或多个默认实现。 这些事情在JavaFX中…

爱课程c语言函数2的作业答案,C语言程序设计

Q&#xff1a;本门课程面向的授课群体是什么&#xff1f;没有任何基础能学习本课程吗&#xff1f;A&#xff1a;本门课程的基本内容是面向零基础的学生。进阶内容是面向有一定编程基础或者大学计算机基础的学生&#xff0c;但是进阶内容不做为课程考试内容。Q&#xff1a;本课程…

旧文章搬运完毕

花了一天时间&#xff0c;把原来百度空间里200多篇文章里的70篇重要文章&#xff08;除去扯淡的&#xff09;搬了出来。 希望这些资料对初学者能够有点用&#xff0c;以后有时间还是继续多写一些有用的内容出来。转载于:https://www.cnblogs.com/achillis/p/10183787.html

voinc vue实现级联选择

需求&#xff1a; vonic中实现级联选择 <!DOCTYPE html> <html> <head><title>下拉框</title><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1"><link rel…

爬虫521错误(又是一次和可爱的前端vs的故事)

起因: 今天突然想重构一下代理池,并且想扩充一下代理,所以就想着爬点代理IP,然后就有了下面的故事 一上来先进行了一顿操作: def get_xxdaili(url):headers {User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safar…

c语言编译器怎样退出全屏,BOOX 应用软件怎样退出全屏模式?

​相信很多用BOOX阅读器的小伙伴都知道BOOX的系统是安卓系统&#xff0c;相对于Kindle的原生Linux系统&#xff0c;BOOX的安卓系统的开放性会更强&#xff0c;可以自由下载一些第三方应用软件。天弟知道很多小伙伴们喜欢在一些第三方应用软件上面看书的习惯&#xff0c;比如像多…

Java 8 Friday:不再需要ORM

在Data Geekery &#xff0c;我们喜欢Java。 而且&#xff0c;由于我们真的很喜欢jOOQ的流畅的API和查询DSL &#xff0c;我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 Java 8星期五 每个星期五&#xff0c;我们都会向您展示一些不错的教程风格的Java 8新功能&#…

Pwn相关工具安装

$apt-get update $apt-get install python2.7 python-pip python-dev git libssl-dev libffi-dev build-essential $pip install --upgrade pip $sudo pip install pwntools sudo apt-get install nasm,gcc,gdb,binutils,hexedit #32位libc库 sudo apt-get install lib…

c 语言输出指针的值,C 语言指针

C 语言指针在本教程中&#xff0c;您将学习指针。什么是指针&#xff0c;如何使用它们以及在示例的帮助下使用它们时可能遇到的常见错误。指针是 C和C 编程的强大功能。在学习指针之前&#xff0c;让我们学习一下C语言编程中的地址。C 语言地址如果程序中有变量var&#xff0c…

Rabbitmq - 配置

目录 RabbitMQ 配置简介环境变量配置文件运行时参数和策略RabbitMQ 配置 简介 默认配置&#xff0c;已经可以有效地运行RabbitMQ&#xff0c;并且在大多数情况下不需要更改配置。不过为了在生产环境中稳定、高效的运行&#xff0c;RabbitMQ提供了三种方式来定制化服务 环境变量…