第十六章创建高级联结

mumulin99 mumulin99     2023-01-10     210

关键词:

学习目的:
了解另外一些联结类型,包括它们的含义和使用方法,如何对被联结的表使用别名和聚集函数。
 
使用表别名:
别名除了用于列名和计算字段外,SQL还允许给表名起别名。这样做主要有两个理由:
  • 缩短SQL语句
  • 允许在单个SELECT语句中多次使用相同的表
 
Q:  对表使用别名
SELECT cust_name, cust_contact
FROM customers AS c, orders AS o, orderitems AS oi
WHERE  c.cust_id = o.cust_id
AND oi.order_num = o. order_num
AND prod_id = ‘TNT2‘;
 
应该注意,表别名只在查询执行中使用。与列别名不一样,表别名不返回客户机。
 
使用不同类型的联结:
 
自联结:
字联结通常作为外部语句来替代从相同表中检索数据时使用的子查询语句。虽然最终的结果是相同的,但有时候处理联结远比处理子查询要快的多。
 
Q找出供应商(其ID为DTNTR,这里的ID为prod_id )生产的其他物品。
 
问题分析:
(1)找出prod_id = ‘DTNTR‘的vend_id products表
(2)通过vend_id 找到其生产的其他产品。vendoes表
 
##用子查询的方式
SELECT prod_id, prod_name
FROM products
WHERE vend_id = (SELECT `vend_id`
                 FROM products
                 WHERE 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‘;
 
自然联结:
无论何时对表进行联结,应该至少有一个列出现在不知一个表中(被联结的列)。标准的联结(前一章介绍的内部联结)返回所有数据,甚至相同的列多次出现。自然联结排除多次出现,使每个列只返回一次。
 
自然联结是这样一种联结,其中你只能选择那些唯一的列。这一般是通过对表使用通配符(SELECT *),对所有其他表的列使用明确的子集来完成的。
 
#自热联结(不太明白)返回产品ID为FB的客户信息和订单信息。
SELECT c.*, o.order_num, o.order_date, oi.prod_id, oi.quantity, oi.item_price
FROM customers AS c, orders AS o, orderitems AS oi
WHERE c.cust_id = o.cust_id
AND oi.order_num = o.order_num
AND prod_id = ‘FB‘;
 
外部联结:
许多联结将一个表中的行与另一个表中的行相关联。但有时候会需要包含没有关联行的那些行。例如,可能需要使用联结来完成以下工作:
  • 对每个客户下了多少订单进行计数,包括那些至今尚未下订单的客户;
  • 列出所有产品以及订购数量,包括没有人订购的产品;
  • 计算平均销售规模,包括那些至今尚未下订单的客户。
在上述例子中,联结包含了那些在相关表中没有关联行的行。这种类型的联结称为外部联结。
Q:检索所有客户,包括那些没有订单的客户。
SELECT customers.cust_id, orders.order_num
FROM customers LEFT OUTER JOIN orders
ON customers.cust_id = orders.cust_id;
 
在使用OUTER JOIN语法时,必须使用RIGHT 或LEFT关键字,指定包括其所有行的表(RIGHT 指出的是OUTER JOIN 右边的表,而LEFT指定的是OUTER JOIN左边的表)
 
没有*=操作符,MySQL不支持简化字符*=和=*的使用,这两种操作符在其他DBMS中是很流行的。
 
使用带聚集函数的联结:
 
Q:  检索所有客户及每个客户所下的订单。
SELECT customers.cust_id,customers.cust_name,COUNT(orders.order_num) AS num_ord
FROM customers INNER JOIN orders
ON customers.cust_id = orders.cust_id
GROUP BY customers.cust_id;
 
##检索出所有客户,甚至是没有下订单的客户。
SELECT customers.cust_id,customers.cust_name,COUNT(orders.order_num) AS num_ord
FROM customers LEFT OUTER JOIN orders
ON customers.cust_id = orders.cust_id
GROUP BY customers.cust_id;
 
使用联结和联结条件:
  • 注意使用的联结类型。一般我们使用内部联结,但使用外部联结也是有效的。
  • 保证使用正确的联结条件,否则将返回不正确的数据。
  • 应该总是提供联结条件,否则得出笛卡尔积。
  • 在一个联结中可以包含多个表,甚至对于每个联结可以采用不同的联结类型。虽然这样做是合法的,一般也很有用,但应该在一起测试它们前,分别测试每个联结。这样做将使故障排除更为简单。
 
 
 
 
 
 

第十六章函数基础

#1.#A:python的def语句实际上是一个可执行语句,当他运行的时候,它创建一个新的函数对象并将其赋值给一个变量名#B:因为def语句是一个语句,所以一个def可以出现在任一语句可以出现的地方,比如说嵌套在其他的语句中#C:函数除... 查看详情

第十六章标准函数库

1.整数函数:函数分为三类:算术,随机数和字符串转换。返回值为整型值。 2.intrand(void);voidsrand(unsingnedintseed);两个函数一起会产生伪随机数。(rand返回一个范围在0和RAND_MAX(至少是32767)之间的随机数) srand((unsignedint)t... 查看详情

第十六章-进程和线程

对于操作系统来说,一个任务就是一个进程(Process)进程内的这些“子任务”称为线程(Thread)真正的并行执行多任务只能在多核CPU上实现多任务的实现有3种方式:  多进程模式;  多线程模式;  多进程+多线程模... 查看详情

c++primer第十六章

//1.模板定义以关键字template开始,后跟一个模板参数列表,此列表不能为空。编译器用推断出的模板参数来实例化一个特定版本的函数。类型参数前必须使用class或者typename(推荐使用typename)。template<typenameT>boolcomp(Tt0,Tt1){return... 查看详情

c和指针第十六章习题

16.8计算平均年龄#include<stdlib.h>#include<stdio.h>#defineMAX_LEN512intmain(){intage;inttotalAge;floatavgAge;intpeopleNum;FILE*file;charinfo[MAX_LEN];char*infoPtr;file=fopen("D:/family.txt","r") 查看详情

《构建之法》第十六章读后感更正

第十六章IT行业的创新1.关于灵感。灵光闪现固然重要,很多伟大的发明依靠的就是灵光一现的基础,但是灵光闪现的前提是个人的思考,长时间的思考。完成这一灵光的基础是不断的尝试,提高自己的技术。这样才会将自己的... 查看详情

算法导论第十六章(代码片段)

16.116.1-1intc[n+1][n+1];intb[n+1][n+1];for(inti=0;i<=n;i++)for(intj=0;j<=n;j++)c[i][j]=-1;b[i][j]=0;voidACTIVITY_SELECTOR(int*s,int*f,int*c,int*b,inti,intj)if(c[i][j]!=-1)return;intflag=0; 查看详情

构建之法第十六章(代码片段)

《构建之法》第一、二、十六章疑问我通过阅读发现这是一本十分有趣的书。不同于别的书的晦涩难懂,《构建之法》利用浅显易懂的语言,贴近生活的例子向我们讲述了软件工程的内容。第一章 概论软件=程序+软件工程扩... 查看详情

“全栈2019”java第十六章:下划线在数字中的意义

...开发环境JDKv11IntelliJIDEAv2018.3文章原文链接“全栈2019”Java第十六章:下划线在数字中的意义下一章“全栈2019”Java第十七章:赋值运算符和算术运算符学习小组加入同步学习小组,共同交流与进步。方式一:关注头条号Gorhaf,私... 查看详情

第十六章:大型超市选址综合

一、超市选址的综合和依据  1.商业企业布局原则(简易)  根据经济地理学原理,商业企业区位分布有它自己明显的指向性原则,主要考虑以下因素:    ①市场条件对商业布局起决定性作用    ②商业企业在一... 查看详情

《构建之法》第十六章阅读笔记

       第一章 问题一:1.2.4软件工程的目标--创造"足够好"的软件 什么是好软件? 原文1.一些同学认为,所谓好软件,就是软件没有Bug,所谓软件工程,就是把软件中的Bug都消灭掉的过程。 软... 查看详情

第十六章springboot+okhttp+string.format

模拟浏览器向服务器发送请求四种方式:jdk原生的Http包下的一些类httpclient(比较原始,不怎么用了):第一章HttpClient的使用Okhttp(好用,推荐)retrofit(好用,推荐),用法:第七章springboot+retrofit看本章之前可以先看看第七章... 查看详情

我的学习之路_第十六章_xml

【XML】可扩展的标记语言作用:存放数据、配置文件【XML的语法】xml的文件扩展名必须为:xmlxml的内容必须满足以下要求:1.固定的文档声明 2.合格的元素和属性 3.正确的注释 4.符合要求的特殊字符编写规则●文档声明(<?xmlversion="1... 查看详情

第十二课连接和高级连接(代码片段)

一、创建联结join:分成innerjoinleftjoinrightjoin 后面跟着on作为联结条件select*fromproducts;select*fromvendors;select*fromproductsinnerjoinvendorsonproducts.vend_id=vendors.vend_id 其中innerjoin是内连接,left左连接,right 查看详情

第十六章模板与泛型编程

16.1知识点:当我们调用一个模板函数时,即向一个模板传递实参,编译器用此函数实参来推断模板实参,并将该模板实参(即实参的类型)绑定到模板参数(即T)。实例化:编译器用模板实参代替对应的模板参数来创建出一个... 查看详情

《构建之法》第十六章阅读与思考

第一章  概论  市面上有很多种赚钱的方式:有的交钱买断有的“先试用再交钱”,有些软件也提供试用版、免费版和正式版,还有的类似期刊订阅,每年交钱。有的不但免费,连源代码也一并奉送,但是要求获得... 查看详情

第十六章例行性工作排程(crontab)

1.什么是例行性工作排程   1.1Linux工作排程的种类:at,crontab   1.2Linux上常见的例行性工作 2.仅运行一次的工作排程   2.1atd的启动与at运行的方式:/etc/at.deny   2.2实际运行单一工作排程:at, atq&atrm,batch 3.循环运行的... 查看详情

算法导论笔记——第十六章贪心算法

通常用于最优化问题,我们做出一组选择来达到最优解。每步都追求局部最优。对很多问题都能求得最优解,而且速度比动态规划方法快得多。 16.1活动选择问题按结束时间排序,然后选择兼容活动。定理16.1考虑任意非空子... 查看详情