首页 > 数据库 >MySQL联结表

MySQL联结表

时间:2022-11-21 10:55:16浏览次数:42  
标签:Customers cust 表中 联结 MySQL id SELECT

简介

保存数据时往往不会将所有数据保存在一个表中,而是在多个表中存储。

联结表就是从多个表查询数据,其实就是多表操作。

联结(JOIN)是一种机制,用来在一条SELECT 语句中关联表。


优点

  1. 数据信息不重复,从而不浪费时间和空间。
  2. 如果某个数据信息变动,可以只更新该表中的某个记录,相关表数据不用变更。
  3. 更有效的存储和方便的处理,伸缩性强,就是能够适应不断增加的工作量而不失败。

WHERE子句的重要性

在联结两个表时,实际上是将第一个表中的每一行与第二个表中的每一行配对。

where子句作为过滤条件,它只包含那些匹配给定条件(这里是联结条件)的行。

由没有联结条件的表关系返回的结果为笛卡儿积。


笛卡尔积

由没有联结条件的表关系返回的结果为笛卡儿积。

检索出的行的数目 将是第一个表中的行数乘以第二个表中的行数。



表联结

叉联结

有时,返回笛卡儿积的联结,也称叉联结(cross join)

img


内联结

基于两个表之间的相等测试的等值联接,这种联结也称为内联结(inner join)。

SELECT * FROM Vendors INNER JOIN Products
ON Vendors.vend_id = Products.vend_id;

自联结

通常作为外部语句,用来代替从相同表中检索数据的子查询语句

SELECT cust_id, cust_name, cust_contact 
FROM Customers WHERE cust_name =
(SELECT cust_name FROM Customers WHERE cust_contact = 'Jim Jones');

联结多个表

SQL 不限制一条SELECT 语句中可以联结的表的数目

SELECT * FROM OrderItems, Products, Vendors
WHERE Products.vend_id = Vendors.vend_id
AND OrderItems.prod_id = Products.prod_id
AND order_num = 20007;

自然联结

排除相同列多次出现,使每一列只返回一次

事实上,目前为止所用到的每个内联结都是自然联结

SELECT C.*, O.order_num, O.order_date
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';

外联结

外联结包含了那些在相关表中没有关联的行

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

使用带聚集函数的联结

聚集函数可以与联结一起使用

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

性能考虑

DBMS 在运行时关联指定的每个表,以处理联结

这种处理可能非常耗费资源,因此应该注意,不要联结不必要的表

联结的表越多,性能下降越厉害


使用联结和联结条件

  • 注意联结类型,虽然一般情况下都是用内联结
  • 不同的DBMS对联结语法的定义不同
  • 确保并提供正确的联结条件,否则会返回不正确的数据或笛卡尔积
  • 测试包含多个联结的语句前,应该分别测试每个联结

标签:Customers,cust,表中,联结,MySQL,id,SELECT
From: https://www.cnblogs.com/KeFeng/p/16910686.html

相关文章

  • mysql5.7以上的启停命令
    1、启动mysqlserversystemctlstartmysqld#启动程序systemctlenablemysqld#开机自运行systemctlstatusmysqld#查看状态2、查看初始密码......
  • 原来用 MySQL 也可以做全文检索
    我是风筝,公众号「古时的风筝」,专注于Java技术及周边生态。文章会收录在JavaNewBee中,更有Java后端知识图谱,从小白到大牛要走的路都在里面。有朋友聊到他们的系统......
  • 基于Docker 部署 MySQL 主从复制
    Docker的安装可参考这篇文章:Linux安装Docker;这里的主从复制是基于GTID(GlbalTransationIdentifier)全局事务标识符的。GTID是MySQL5.6新加入的一项技术,GTID是......
  • MYSQL创建与root一样权限用户
    1.创建账号createuserbackupdb@'localhost'identifiedby'123456';#或createuserbackupdb@'%'identifiedby'123456';2.设置权限grantusageon*.*to......
  • Linux自动备份MySql数据库
    1.创建备份数据库文件的根目录:#mysql备份文件目录cd/data/db/mysql2.创建各个数据库的备份文件目录  3.编写shell脚本3.1 在usr/sbin目录下分别创建数据......
  • MySQL数据库系统(十四章)
    目录第14章:MySQL数据库系统MySQL简介安装与使用MySQL第14章:MySQL数据库系统知识点归纳总结:本章讨论了MySQL关系数据库系统;介绍了MySQL并指出了它的重要性;MySQL简介......
  • MySQL进阶实战1,数据类型与三范式
    一、选择优化的数据类型MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要。1、更小的一般情况下,应该尽量使用较小的数据类型,更小的数据类型通常更快,因为......
  • mysql-备忘录
    mysql基础注入知识参考资料:https://pureqh.top/?p=1882bypass安全狗常用函数ascii()length()substr()#左闭右闭hex()isnull()......
  • mysql this is incompatible with sql_mode=only_full_group_by
    MySQL分组查询时报错mysqlthisisincompatiblewithsql_mode=only_full_group_bymysql5.7[mysqld]sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGIN......
  • MySQL、Oracle、SQL Server时间类型字段
    关系型数据库时间类型字段MySQL(以及对应格式)SQLServer(以及对应格式)Oracletime(HH-MM-SS)time(12:35:29.1234567)date(YYYY-MM-DDHH:MM:SS)date(YYYY-MM-DD......