MySQL必知必会读书笔记-5(表的联结)

联结(join)操作是SQL语言最强大的功能之一。这个操作是建立在关系表的基础之上的

1--关系表

何谓关系表?

假设有一个产品表,每一个产品都有自己的属性和供应商,一个供应商可能有多种产品。

那么在何处存储供应商的信息呢?如果直接在产品表里面存储,假设某个供应商有一千种产品,

在产品表里,该供应商的信息就会被存储1000次,供应商要改个名字就要到表里改1000次,

这样不仅速度慢,还容易出错。

关键是,相同数据在表中多次出现不是什么好事(至少很浪费空间)。这时,关系表的作用

就显现出来了。我们可以建立两个表,供应商表和产品表。每个供应商都有一个独一无二的ID,

产品表每个产品里面存储一个供应商ID,两个表就能通过一个ID联系起来,即每个产品都能通过

其供应商ID找到对应的供应商。

供应商的ID就是主键,同时它也是产品表的外键,这个外键将产品表和供应商表关联起来。

这样做的好处有很多:不会产生重复的信息,如果供应商信息变动,只需要修改供应商表里的一条

信息即可。

2--联结(内联结)

以上面的例子说,当我们需要检索出一个产品的属性和它的供应商的属性时,需要两个表的信息

对应联结起来,这时候就用到了联结。

创建联结

SELECT vend_name, prod_name, prod_price
FROM vendors, products
WHERE vendors.vend_id = products.vend_id

如果没有where子句(即没有联结条件),输出的结果将是两个表的笛卡尔积。输出结果的数目将是第一个

表的行数乘以第二个表的行数。

内部联结

上面例子使用等值联结,也称为内部联结。

SELECT vend_name, prod_name, prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id

3--引用完整性

4--联结多个表

显示编号为20005的订单中的物品的基本信息和供应商信息

SELECT prod_name, prod_price, vend_name, quantity
FROM orderitems, products, vendors
WHERE order_num = 20005
      AND orderitems.prod_id = products.prod_id
      AND products.vend_id = vendors.vend_id

返回订购了TNT2的客户的信息

SELECT customers.cust_name, customers.cust_contact, orderitems.quantity
FROM customers, orders, orderitems
WHERE orderitems.prod_id = ‘TNT2‘
      AND orders.order_num = orderitems.order_num
      AND customers.cust_id = orders.cust_id

5--使用表的别名

对上一个例子使用别名,可以缩短代码长度,结果相同

SELECT c.cust_name, c.cust_contact, oi.quantity
FROM customers AS c, orders AS o, orderitems AS oi
WHERE oi.prod_id = ‘TNT2‘
      AND o.order_num = oi.order_num
      AND c.cust_id = o.cust_id

6--自联结

找出某个产品的供应商生产的其他产品

1.使用子查询

SELECT prod_id, prod_name
FROM products
WHERE vend_id = (
                 SELECT vend_id
                 FROM products
                 WHERE prod_id = ‘DTNTR‘
                )

2.使用自联结

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‘

7--外部联结

上述例子中,联结包含了那些在相关表中没有关联行的行,这种类型的联结称为外部联结。

检索所有客户及其订单

1.使用内联结

SELECT cust_name, order_num
FROM customers AS c INNER JOIN orders AS o
ON c.cust_id = o.cust_id

未列出没有订单的顾客

2.使用外联结

SELECT cust_name, order_num
FROM customers AS c LEFT OUTER JOIN orders AS o
ON c.cust_id = o.cust_id

列出了没有订单的顾客

使用OUTER JOIN语法时,必须指定RIGHT或LEFT关键字

这里LEFT表示列出左边customer表中的所有行

8--使用带聚集函数的联结

检索所有客户和每个客户所下的订单数。

SELECT c.cust_name, c.cust_id, COUNT(o.order_num) AS num_ord
FROM customers AS c LEFT OUTER JOIN orders AS o
ON c.cust_id = o.cust_id
GROUP BY c.cust_id

9--总结

时间: 2024-10-25 04:47:14

MySQL必知必会读书笔记-5(表的联结)的相关文章

《MySQL必知必会》读书笔记_4

PS:一个实际的存储过程案例 CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_delete_article_by_id`(IN `id` int) BEGIN #Routine body goes here... DECLARE temp INT; SET @aid = id; SELECT COUNT(*) FROM gk_reply_article WHERE a_id = @aid INTO temp; IF(temp <> 0) THEN

《MySQL必知必会》读书笔记_3

PS:这次的信息量有点大. 聚集不同值 SELECT AVG(DISTINCT prod_price) AS avg_price FROM products WHERE vend_id = 1003 #相同的值不会被计算 组合聚集函数 SELECT COUNT(*) AS num_items, MIN(prod_price) AS price_min, MAX(prod_price) AS price_max, AVG(prod_price) AS price_avg FROM products

《mysql必知必会》读书笔记--存储过程的使用

以前对mysql的认识与应用只是停留在增删改查的阶段,最近正好在学习mysql相关内容,看了一本书叫做<MySQL必知必会>,看了之后对MySQL的高级用法有了一定的了解.以下内容只当读书笔记. 如有转载请注明出处~ 存储过程的使用 执行存储过程 CALL productpricing() 执行名为productpricing的存储过程 创建存储过程 CREATE PROCEDURE productpricing() BEGIN SELECT avg(prod_price) AS pricea

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

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

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

《MySQL 必知必会》读书总结

这是 <MySQL 必知必会> 的读书总结.也是自己整理的常用操作的参考手册. ? ? 使用 MySQL 连接到 MySQL shell>mysql -u root -p Enter password:****** 显示数据库 mysql>SHOW DATABASES; 选择数据库 mysql>USE mytest; 显示数据库中的表 mysql>SHOW TABLES; 显示表列 mysql>SHOW COLUMNS FROM tmall_user; mysql

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():将字符串转换为小写

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必知必会》学习笔记_1

#选择数据库 USE mysql #返回可用数据库列表 SHOW DATABASES #返回当前数据库中可用表 SHOW TABLES #返回表列 SHOW COLUMNS FROM db #显示特定数据库的创建语句 SHOW CREATE DATABASE mysql #显示广泛的服务器状态信息 SHOW STATUS #显示授权用户的安全权限 SHOW GRANTS 多条SQL语句必须以分号分隔. SQL语句不区分大小写,习惯性大写. 检索不同的行用DISTINCT,只返回不同的值. 限制结