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

2023-12-28 18:32

本文主要是介绍mysql必知必会读书笔记就——联结表、高级联结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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必知必会读书笔记就——联结表、高级联结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/546879

相关文章

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

mysql重置root密码的完整步骤(适用于5.7和8.0)

《mysql重置root密码的完整步骤(适用于5.7和8.0)》:本文主要介绍mysql重置root密码的完整步骤,文中描述了如何停止MySQL服务、以管理员身份打开命令行、替换配置文件路径、修改... 目录第一步:先停止mysql服务,一定要停止!方式一:通过命令行关闭mysql服务方式二:通过服务项关闭

SQL Server数据库磁盘满了的解决办法

《SQLServer数据库磁盘满了的解决办法》系统再正常运行,我还在操作中,突然发现接口报错,后续所有接口都报错了,一查日志发现说是数据库磁盘满了,所以本文记录了SQLServer数据库磁盘满了的解... 目录问题解决方法删除数据库日志设置数据库日志大小问题今http://www.chinasem.cn天发

mysql主从及遇到的问题解决

《mysql主从及遇到的问题解决》本文详细介绍了如何使用Docker配置MySQL主从复制,首先创建了两个文件夹并分别配置了`my.cnf`文件,通过执行脚本启动容器并配置好主从关系,文中还提到了一些... 目录mysql主从及遇到问题解决遇到的问题说明总结mysql主从及遇到问题解决1.基于mysql

Python中列表的高级索引技巧分享

《Python中列表的高级索引技巧分享》列表是Python中最常用的数据结构之一,它允许你存储多个元素,并且可以通过索引来访问这些元素,本文将带你深入了解Python列表的高级索引技巧,希望对... 目录1.基本索引2.切片3.负数索引切片4.步长5.多维列表6.列表解析7.切片赋值8.删除元素9.反转列表

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

MySQL的索引失效的原因实例及解决方案

《MySQL的索引失效的原因实例及解决方案》这篇文章主要讨论了MySQL索引失效的常见原因及其解决方案,它涵盖了数据类型不匹配、隐式转换、函数或表达式、范围查询、LIKE查询、OR条件、全表扫描、索引... 目录1. 数据类型不匹配2. 隐式转换3. 函数或表达式4. 范围查询之后的列5. like 查询6

Linux下MySQL8.0.26安装教程

《Linux下MySQL8.0.26安装教程》文章详细介绍了如何在Linux系统上安装和配置MySQL,包括下载、解压、安装依赖、启动服务、获取默认密码、设置密码、支持远程登录以及创建表,感兴趣的朋友... 目录1.找到官网下载位置1.访问mysql存档2.下载社区版3.百度网盘中2.linux安装配置1.

PostgreSQL如何用psql运行SQL文件

《PostgreSQL如何用psql运行SQL文件》文章介绍了两种运行预写好的SQL文件的方式:首先连接数据库后执行,或者直接通过psql命令执行,需要注意的是,文件路径在Linux系统中应使用斜杠/... 目录PostgreSQ编程L用psql运行SQL文件方式一方式二总结PostgreSQL用psql运

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示