vendor表:

products表:

orderitems表:

customers表:

orders表:

一.联结表:联结表是一种机制,用来在一条select语句中关联表,因此称为联结表。联结在运行的时候关联表中正确的行。

看个例子:

select vend_name,prod_name,prod_price

from vendors,products

where vendors.vend_id=products.vend_id

order by vend_name,prod_name;

其中where子句作为联结表的条件,当联结来两个表的时候,实际上是将第一个表的每一行与第二个表中的每一行配对,where作为过滤条件,它只包含哪些匹配给定条件(联结条件)的行。

假若没有where子句,则第一个表的每一行与第二个表中的每一行配对,而不管他们逻辑上是否可以匹配。即:在没有联结条件的时候返回的结果为笛卡儿积。检索出的行数是第一个表的行数乘以第二个表的行数。

如:

select vend_name,prod_name,prod_price

from vendors,products

order by vend_name,prod_name;

二.内部联结:

等值联结:基于两个表之间的相等测试,也称内部联结。联结的两个表之间的关系是from子句的组成部分,以inner join指定。联结的条件使用on指定,传给on的条件实际上与传递给where的相同。

如:select vend_name,prod_name,prod_price

from vendors inner join products

on vendors.vend_id=product.vend_id

order by vend_name,prod_name;

三.联结多个表

sql对一条select语句中可以联接的表的数目没有限制。创建联结表的基本规则也相同,首先列出所有的表,然后定义表之间的关系.如:

显示编号为2005的订单中的物品:

select prod_name,vend_name,prod_price,quantity

from orderitems,products,vendors

where products.vend_id=vendors.vend_id

and orderitems.prod_id=products.prod_id

and order_num=20005;

又如,在使用子查询检索订购产品TNT2的客户列表:

select cust_name,cust_contact from customers

where cust_id in(select cust_id from orders

where order_num in(select order_num from orderitems

where prod_id='TNT2'));

现在,我们可以使用联结表的方式来查询:

select cust_name,cust_contact from customers,orders,orderitems

where customers.cust_id=orders.cust_id

and orderitems.order_num=orders.order_num

and prod_id='TNT2';

四.高级联结

1.使用表的别名

作用:

1)缩短sql语句;

2)允许在单条select语句中多次使用相同的表。

别名除了用于列名和计算字段外,还可以给表起别名。

注意:表别名不仅仅可以用于where子句,还可以用于select的列表、order by子句以及语句的其他部分。但,表别名只在查询执行中使用,与列别名不一样,表别名不返回客户机。

如:

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';

2.使用不同类型的联结

之前我们使用了内联结,现在再来看看自联结、自然联结和外部联结。

1)自联结(同一个表相联结),如:当我们发现物品(ID为DTNTR)存在问题,因此我们想知道生产该物品的供应商的其他物品是否也存在这些问题。步骤:首先找到生产ID为DTNTR的物品的供应商,然后找出这个供应商的其他物品。

第一种,可使用子查询: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';

首先where通过匹配p1中的vend_id和p2中的vend_id来联结两个表,然后按第二个表中的prod_id过滤数据,返回所需的数据。

总结:用自联结而不用子查询。自联结通常作为外部语句用来替代从相同表中检索数据时使用的子查询语句。虽然,最终的结果是相同的,但有时候处理联结远比处理子查询要快得多。

2)标准的联结(前面所说的内部联结)返回所有数据,甚至相同的列多次出现。自然联结排除多次出现,使得每个列只返回一次。

自然联结:它是这样的一种联结,其中你只能选择那些唯一的列,一般通过对表使用通配符(select *),对所有其他表的列明确使用的子集来完成的。

如:

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';

通配符只对第一个表使用,所有其他列明确列出,所以没有重复的列被检索出来。

3)外部联结:联结包含了那些在相关表中没有关联行的行,这种类型的联结称为外部联结。

相反,只包含那些有关联行的行的联结称为内部联结。

如:一个简单的内部联结:检索所有客户及其订单。

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 outer join orders

on customers.cust_id=orders.cust_id;

关键字outer join指定联结的类型为外联结。在使用outer join语法时,必须使用right或left关键字指定其包括所有行的表(right指出的是outer join右边的表,而left则指出左边的表),即:在本例中使用left outer join从from子句的左边的表(customers表)中选择所有的行

3.使用带聚集函数的联结

如内联结:检索所有客户及其每个客户所下的订单数:

select customers.cust_name,customers.cust_id,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_name,customers.cust_id, 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;

使用左外联结来包含所有的客户,包括那些没有订单的客户。

4.使用带联结和联结条件

注意事项:

1)注意所使用的联结类型。一般使用内部联结,但使用外部联结也是有效的。

2)保证正确使用联结条件,否则将返回不正确的数据。

3)应该总是提供联结条件,否则会得出笛卡儿积;

4)在一个联结中可以包含多个表,甚至对于每个联结可以采用不同的联结类型。

mysql必知必会读书笔记就——联结表、高级联结相关推荐

  1. MySQL必知必会笔记(一)基础知识和基本操作

    第一章  了解MySQL     数据库       保存有组织的数据的容器.(通常是一个文件或一组文件) 人们经常使用数据库这个术语代替他们使用的软件.这是不正确的,确切的说,数据库软件应称为DBM ...

  2. 【SQL】【读书笔记】《MySQL必知必会》

    本文为<MySQL必知必会>[1]读书笔记,用于总结知识点和框架,仅供参考和交流,如有不妥请联系.由于软件版本更新,书中的一些代码已经不再适用,本文主要从SQL基本语句进行增删减.窗口函数 ...

  3. 读书笔记系列1——MySQL必知必会

    读书笔记系列1--MySQL必知必会 文章目录 读书笔记系列1--MySQL必知必会 MySQL官方文档:https://dev.mysql.com/doc/ 第一章 数据库基础 *2021.11.2 ...

  4. mysql函桌为之一的_MYSQL必知必会读书笔记第十和十一章之使用函数处

    mysql简介 MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理. 拼接字段 存储在数据库表中的 ...

  5. mysql第四章分页显示查询出租房屋信息_MYSQL必知必会读书笔记第四章之检索数据...

    MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理. 使用Select语句返回的数据,可能会发现显 ...

  6. mysql中用完即删用什么_MySQL使用和操作总结(《MySQL必知必会》读书笔记)

    简介 MySQL是一种DBMS,即它是一种数据库软件.DBMS可分为两类:一类是基于共享文件系统的DBMS,另一类是基于客户机--服务器的DBMS.前者用于桌面用途,通常不用于高端或更关键应用. My ...

  7. MySQL必知必会读书笔记一

    这篇文章主要是自己阅读<Mysql必知必会>的时候自己写的sql,前面的一部分用的是自己的建立的一个user表,后面用的就是原书的表了 #检索 SELECT id FROM account ...

  8. asp sql ip地址排序_SQL必知必会读书笔记,30分钟入门SQL!

    点击上方SQL数据库开发,关注获取SQL视频教程 SQL专栏 SQL数据库基础知识汇总 SQL数据库高级知识汇总 来源:https://segmentfault.com/p/1210000011760 ...

  9. mysql日期维表sql文件_《MySQL必知必会》笔记(SQL练习+建表语句)

    站在巨人的肩上 Standing On Shoulders Of Giants 部分转自:https://www.jianshu.com/p/294502893128 https://blog.csd ...

  10. SQL必知必会第4版读书笔记

    SQL必知必会_4 前言 @author 鲁伟林 在读电子版<<SQL必知必会>> 第4版时,做了下笔记.供以后自己或者其他学习者参考. 电子版<<SQL必知必会& ...

最新文章

  1. python 类-python 类如何使用
  2. BinaryTreeTraversal(二叉树遍历)
  3. 从零入门 FreeRTOS 操作系统之创建任务流程
  4. 利用sqoop将hive数据导入导出数据到mysql
  5. idea 设置内存_IDEA新特性:提前知道代码怎么走!
  6. spring2.5.4+hibernate3.2.6+struts2+jbpm3.2.2
  7. java强制关闭远程桌面_elasticsearch中的java.io.IOException: 远程主机强迫关闭了一个现有的连接...
  8. Unity面试题精选(2)
  9. python以二进制读取的文件显示b'b'_python - Python读取二进制文件并解码 - 堆栈内存溢出...
  10. android p获取通话记录_Android 底层的进程间同步机制
  11. 【福利】PyTorch中文版官方教程来啦(附下载)
  12. 深度探索C++对象模型第一章第一节重点
  13. CentOS下Storm 1.0.0集群安装具体解释
  14. 一款云迁移产品的成长史
  15. 1125 Chain the Ropes
  16. 用python画圆角矩形_如何用OpenCV绘制圆角矩形(带圆角的矩形)?
  17. 树莓派做网络代理_树莓派使用Proxy代理
  18. deepin 蓝牙适配器 安装
  19. 如何给图片添加黑色边框
  20. graphpad7.04多组比较p值_手把手教你用Graphpad做单因素方差分析

热门文章

  1. syn flood攻击防范
  2. Linux 命令ps aux命令解析
  3. openGL之几何变换(绘制球体)---openGL学习笔记(六)
  4. 史上最全搭建MAVEN私服上传并使用JAR包教程
  5. 计算机定期备份用什么程序,怎么让电脑定期自动备份文件或文件夹(让你的电脑每天定时自动为你备份重要的文件)...
  6. DropWizard框架里关于异常统一处理实践
  7. 电大计算机网考攻略,上海开放大学毕业通关秘籍
  8. 2021全球与中国自动导引车市场现状及未来发展趋势
  9. scrapy源码学习 - 启动一个crawl命令
  10. 2021-2027全球与中国自然对流烤炉市场现状及未来发展趋势