SQL必知必会 笔记 第十三章 创建高级联结

13.1使用表别名

别名除了用于列名和计算字段外,SQL还允许给表明起别名。这样做有两个主要理由:

(1)缩短SQL语句

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

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 = ‘RGAN01‘;

Oracle中没有AS:Oracle不支持AS关键字,为在Oracle中使用别名,可以不用AS,简单地指定列名即可。

13.2使用不同类型的联结

13.2.1自联结

SELECT c1.cust_id,c1.cust_name,c1.cust_contact
FROM Customers AS c1,Customers AS c2
WHERE c1.cust_name = c2.cust_name
     AND c2.cust_contact = ‘Jim Jones‘;

使用自联结而不用子查询

13.2.2自然联结

无论何时对表进行联结,应该至少有一个列出现在不止一个表中(被联结的列)。标准的联结返回所有数据,甚至相同的列多次出现。自然联结排除多次出现,使每个列只返回一次。

SELECT C.*,O.order_num,O.order_date,OI.prod_id,OI.quantity,OI.item_price
FROM Customers AS C,Order AS O,OrderItems AS OI
WHERE C.cust.id = O.cust.id
     AND OI.order_num = O.order_num
     AND prod_id = ‘RGAN01‘;

13.2.3外部联结

许多联结将一个表中的行与另一个表中的行相关联。但有时候会需要包含没有关联行的那些行。联结包含了那些在相关表中没有关联行的行。这种类型的联结称为外部联结。

检索所有用户及其订单

内链接

SELECT Customers.cust_id,Orders.order_num
FROM Customers INNER JOIN Orders
     ON Customer.cust_id = Orders.order_id;

外联结,包括那些没有订单的客户

SELECT Customers.cust_id,Orders.order_num
FROM Customers LEFT OUTER JOIN Orders
     ON Customer.cust_id = Orders.order_id;

在使用OUTER JOIN语法时必须使用RIGHT或LEFT关键字指定包括其所有行的表(RIGHT指出的是OUTER JOIN右边的表,而LEFT指出的是OUTER JOIN左边的表)。

SQL服务器额外支持一种简化的外部联结语法。

SELECT Customers.cust_id,Orders.order_num
FROM Customers ,Orders
     ON Customer.cust_id *= Orders.order_id;

*=左联结 ,=*右联结

OUTER JOIN语法还有另一种形式(仅由Oracle使用),它需要在表明后使用(+)操作符

SELECT Customers.cust_id,Orders.order_num
FROM Customers ,Orders
     ON Customer.cust_id (+) = Orders.order_id;

全外联结(full outer join),他检索两个表中的所有行并关联那些可以关联的行。与左外部联结或右外部联结不一样(他们包含来自一个表的不关联的行),全外部联结包含来自两个表的不关联的行。

SELECT Customers.cust_id,Orders.order_num
FROM Customers FULL OUTER JOIN Orders
     ON Customer.cust_id = Orders.order_id;

13.3使用带聚集函数的联结

内联结

SELECT Customers.cust_id,COUNT(Orders.order_num) AS num_ord
FROM Customers INNER JOIN Orders
     ON Customer.cust_id = Orders.order_id
GROUP BY Customers.cust_id;

外联结

SELECT Customers.cust_id,COUNT(Orders.order_num) AS num_ord
FROM Customers LEFT OUTER JOIN Orders
     ON Customer.cust_id = Orders.order_id
GROUP BY Customers.cust_id;

13.4使用联结和联结条件

关于联结及使用的某些要点:

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

(2)关于确切的联结语法,应该查看具体的文档。

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

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

(5)在一个联结中可以包含多个表,甚至对于每个联结可以采用不同的联结类型。虽然这样做是合法的,一般也很有用,但应该在一起测试他们前,分别测试每个链接。这将使故障排除更为简单。

时间: 2024-10-17 23:08:25

SQL必知必会 笔记 第十三章 创建高级联结的相关文章

【MySQL必知必会】第十六章 创建高级联结

1.使用表别名 好处: a.缩短SQL语句. b.允许在单条SELECT语句中多次使用相同的表. 输入: SELECT cust_name,cust_contact FROM customers AS c,orders AS o,orderitems AS io WHERE c.cust_id = o.cust_id AND io.order_num = o.order_num AND prod_id = 'TNT2'; 注: a.表别名不仅能用在WHERE子句,还可以用在SELECT的列表.O

《SQL必知必会》阅读进度

0 阅读计划 [0] 2015/01/04 ch01~10 [1] 2015/01/05 ch10~22 又,补充了这个基础知识后要尽快切换到PostgreSQL (9.4)的基础SQL部分,极早练习实际数据库的操作. ---------------------------------------- 目录 第1章 了解SQL第2章 检索数据第3章 排序检索数据第4章 过滤数据第5章 高级数据过滤第6章 用通配符进行过滤第7章 创建计算字段第8章 使用数据处理函数第9章 汇总数据第10章 分组数据

MySQL必知必会 pdf完整版

需要学习的朋友可以通过网盘下载: http://tadown.com/fs/8yi6be9nsehu9e921/内容简介  · · · · · · <MySQL必知必会>MySQL是世界上最受欢迎的数据库管理系统之一.书中从介绍简单的数据检索开始,逐步深入一些复杂的内容,包括联结的使用.子查询.正则表达式和基于全文本的搜索.存储过程.游标.触发器.表约束,等等.通过重点突出的章节,条理清晰.系统而扼要地讲述了读者应该掌握的知识,使他们不经意间立刻功力大增. 读者评论: 飞林沙  2013-11

SQLServer:《SQL必知必会》一书的读书笔记(五)

第5课 高级数据过滤 5.1 组合 WHERE 子句 第4课介绍的 WHERE 子句在过滤数据时都是用单一的条件. 5.1.1 AND 操作符 检索由供应商 DLL01 制造且价格小于等于 4 美元的所有产品的名称和价格: SELECT prod_id, prod_price, prod_name FROM Products WHERE vend_id = 'DLL01' AND prod_price <= 4; 5.1.2 OR 操作符 检索任一个指定供应商制造的所有产品的名称和价格: SEL

SQLServer:《SQL必知必会》一书的读书笔记(八)

第8课 使用函数处理数据 8.1 函数 [名词]可移植:所编写的代码可以在多个系统上运行 8.2 使用函数 8.2.1 文本处理函数 例1:使用 UPPER() 函数--将文本转换为大写 SELECT vend_name, UPPER(vend_name) AS vend_name_upcase FROM Vendors ORDER BY vend_name; 常用的文本处理函数: LEFT():返回字符串左边的字符 DATALENGTH():返回字符串的长度 LOWER():将字符串转换为小写

《SQL必知必会》学习笔记(一)

<SQL必知必会>学习笔记(一) 下面变列出我新学到的知识. 这个是数据库的全部记录 1.order by   语句: select * from Scores order by name , Score desc 执行结果: ①order by在执行排序功能时,会先对排序字段按abcd这样的顺序进行,汉字的话是按拼音的首字母,默认是正序. ②例子中先按name字段进行正序排序,当name相同时,又按score倒叙排,例如拜仁两条数据,胜的开头字母是s,负的是f,因为是倒叙,所以胜的那条数据排

《SQL必知必会》学习笔记二)

<SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语句,但是实际应用中的业务逻辑往往会非常复杂,所以会用到一些比较复杂的查询,如子查询,联合查询. 1.子查询 当一个查询是另一个查询的条件时,称为子查询.但是说到子查询又不的不说它与嵌套查询两者的区别,下面一张图来说明 下面再用一条sql语句来说明他们的关系. 其中在查询中又分为嵌套子查询和相关子查询,他们之间

SQLServer:《SQL必知必会》一书的读书笔记(四)

第4课 过滤数据 4.1 使用 WHERE 子句:过滤 只检索所需数据需要指定搜索条件(即过滤条件). WHERE 子句在表名(FROM 子句)后给出,根据 WHERE 子句中指定的条件过滤. SELECT prod_name, prod_price FROM Products WHERE prod_price = 3.49; -- 分析:从 Products 表中检索两个列,只返回 prod_price 值为 3.49 的行 [提示]SQL 过滤与应用过滤: 数据也可以在应用层过滤.但是在优化

MySQL必知必会 学习笔记(一)

第一章  了解SQL 模式:   关于数据库和表的布局以及特性的信息.[描述表可以存储什么样的数据,数据如何分解,各部分信息如何命名等等,可以用来描述数据库中特定的表以及整个数据库(和其中表的关系)]. 第二章 MySQL简介 MySQL是一种DBMS,即它是一种数据库软件.基于客户机----服务器的数据库. MySQL工具: 1.mysql 命令行实用程序 2.MySQL Administrator 3.MySQL query Browser 第四章 检索数据 LIMIT 5 表示MySQL返