MariaDB SQL INNER JOIN

基本理念



关系表和关系型数据库设计的基本理念。

接下来的内容并未覆盖以上所有主题,但足够让你进入后面的学习。

假设你有一个包含产品类别的数据库表,每行包含一个类别项。各个类别可以存储的信息包括产品介绍和价格,以及生产产品的公司的供应商信息。

由同一个供应商提供的许多不同类别的产品,应该把供应商的信息存储在哪里?因为如下理由,你不会把供应商信息和产品信息存储在一起。

  1. 因为对于每个产品,供应商的信息是相同的,对每个产品重复同样的信息是在浪费时间和存储空间。
  2. 如果供应商的信息改变,你不得不更新每一个存储的供应商信息。
  3. 当数据重复时(即供应商信息和产品信息混合在一起),每次都以完全相同的方式输入数据的概率很低。在报表中无法使用不一致的数据。

设计关系表时,将信息分割到多个表中,每个表包含一种数据类型,表与表之间通过相同值联系起来 (即关系设计当中“关系”)

以上的??例子可以创建两个表,一个用来存放供应商信息vendors,另一个用来存放产品信息products。

vendors表包含供应商的所有信息,表中每行代表一个供应商,并且有一个标识供应商的唯一标志符。这个值叫做主键(primary key),可以称为供应商id,或者其他唯一值。

products表仅存储产品信息,并且除了供应商id之外,没有供应商其他的信息。供应商id称为外键,通过它,关联venders表盒products表,并且这个供应商id能够让你通过vendor表找到合适供应商的详细信息。

外键(Foreign Key)在表的一列中包含来自其他表的主键值,这样就定义了表与表之间的关系。

这样做的优点就是:

  • 供应商的信息永远不会重复,因此不会浪费时间和空间
  • 如果供应商信息改变了,可以更新vendors表中的但个记录。相应表中的数据不会改变
  • 由于没有重复数据,使用的数据显然是一致的,这使得数据报表和操作更加简单

扩展性(Scale)能够随着数据量的增长进行处理,而不会失败。一个设计良好的关系型数据库或者应用程序被称作扩展性好。

创建连接



创建连接非常简单,必须包含所有指定的表,并且说明它们是如何关联起来的。

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

例子(以下是在不同库里面的两张不同表):

mysql> select appKeyInfo.appKey, businessId,appName, infoType, appKeyInfo.remark
from appKeyInfo,crowdRewards.businessInfo
where appKeyInfo.appKey=businessInfo.appKey and infoType=4
order by appKeyInfo.id desc
limit 10;
+------------+------------+---------+----------+-----------------------------------------+
| appKey     | businessId | appName | infoType | remark                                  |
+------------+------------+---------+----------+-----------------------------------------+
| 1194641763 | 133        |         | 4        | zhiyonginfom                            |
| 3217703708 | 132        |         | 4        | 测试使用                                |
| 1029667166 | 0          |         | 4        | sichuanyinyue                 |
| 3927050004 | 130        |         | 4        | 546546546                               |
| 1966753355 | 129        |         | 4        | king                                    |
| 2740425196 | 128        |         | 4        | 666663321                               |
| 2496853641 | 127        |         | 4        | 6666633                                 |
| 751377797  | 126        |         | 4        | 66666                                   |
| 1031297745 | 125        |         | 4        | qqqaaa                                  |
| 2061454479 | 124        |         | 4        | qqq                                     |
+------------+------------+---------+----------+-----------------------------------------+
10 rows in set (0.08 sec)

其中,

desc appKeyInfo;
+-----------------+---------------------+------+-----+---------+----------------+
| Field           | Type                | Null | Key | Default | Extra          |
+-----------------+---------------------+------+-----+---------+----------------+
| id              | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
| appKey          | int(10) unsigned    | NO   | UNI | 0       |                |
| appName         | varchar(32)         | NO   |     |         |                |
| remark          | varchar(32)         | NO   |     |         |                |
| infoType        | tinyint(4) unsigned | NO   |     | 0       |                |
| appLogo         | varchar(128)        | NO   |     |         |                |
+-----------------+---------------------+------+-----+---------+----------------+
6 rows in set (0.06 sec)
desc businessDemo;
+-------------------+------------------------+------+-----+---------+----------------+
| Field             | Type                   | Null | Key | Default | Extra          |
+-------------------+------------------------+------+-----+---------+----------------+
| id                | int(10) unsigned       | NO   | PRI | NULL    | auto_increment |
| name              | varchar(64)            | NO   |     |         |                |
| appKey            | int(10) unsigned       | NO   |     | 0       |                |
| businessID        | int(10) unsigned       | NO   |     | 0       |                |
| remark            | varchar(128)           | NO   |     |         |                |
+-------------------+------------------------+------+-----+---------+----------------+
5 rows in set (0.04 sec)

使用WHERE来设置连接关系看起来有些奇怪,不过事实上有一个很好的理由支持这种做法。记住,当表通过SELECT语句连接起来时,关系的组织是动态。...事实上,你将第一个表中的每一行同第二个表中的每一行进行对比,WHERE事实上就是一个过滤器,使其仅仅包含匹配制定过滤器条件(连接条件)的行。没有WHERE子句,第一个表的每一行将匹配第二个表中的每一行,无论它们是否符合逻辑。

笛卡尔乘积(Cartesian product)没有使用连接条件的表关系的返回结果。返回的行数时第一个表的行数乘以第二个表的行数。

不要忘记WHERE子句,确保所有的连接都包含WHERE子句,否则MariaDB将返回超出你所需的数据。类似的,确保正确使用WHERE子句,错误的过滤条件将会导致MariaDB返回错误数据。

交叉连接(Cross Joins)这种就是笛卡尔乘积的连接类型。

SELECT vend_name, prod_name, prod_price
FROM vendors, products
ORDER BY vend_name, prod_name;

内连接


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

另外,跨库的连接

select dataBaseName1.appKey,dataBaseName2.tableName2.appKey from tableName1 inner join dataBaseName2.tableName2on appKeyInfo.appKey=dataBaseName2.tableName2.appKey;

等值连接(equiljoin)一个基于测试两表相等的连接。这种连接也被称作内连接。

这里的两个表关系被指定为INNER JOIN.当使用这个语法的时候,连接条件使用on来代替where子句,传递给on的条件和传递给where子句的条件相同。

连接多个表



sql没有明确限制select语句中表连接的数量。

创建连接的基本规则仍然相同,首先列出所有的表,然后定义表的关系。

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;
时间: 2024-12-08 21:35:47

MariaDB SQL INNER JOIN的相关文章

Spark SQL 之 Join 实现

原文地址:Spark SQL 之 Join 实现 Spark SQL 之 Join 实现 涂小刚 2017-07-19 217标签: spark , 数据库 Join作为SQL中一个重要语法特性,几乎所有稍微复杂一点的数据分析场景都离不开Join,如今Spark SQL(Dataset/DataFrame)已经成为Spark应用程序开发的主流,作为开发者,我们有必要了解Join在Spark中是如何组织运行的. SparkSQL总体流程介绍 在阐述Join实现之前,我们首先简单介绍SparkSQL

SQL LEFT JOIN 关键字

SQL LEFT JOIN 关键字 LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行. LEFT JOIN 关键字语法 SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name 注释:在某些数据库中, LEFT JOIN 称为 LEFT OUTE

SQL FULL JOIN 关键字

SQL FULL JOIN 关键字 只要其中某个表存在匹配,FULL JOIN 关键字就会返回行. FULL JOIN 关键字语法 SELECT column_name(s) FROM table_name1 FULL JOIN table_name2 ON table_name1.column_name=table_name2.column_name 注释:在某些数据库中, FULL JOIN 称为 FULL OUTER JOIN. 原始的表 (用在例子中的): "Persons"

SQL INNER JOIN 关键字

SQL INNER JOIN 关键字 在表中存在至少一个匹配时,INNER JOIN 关键字返回行. INNER JOIN 关键字语法 SELECT column_name(s) FROM table_name1 INNER JOIN table_name2 ON table_name1.column_name=table_name2.column_name 注释:INNER JOIN 与 JOIN 是相同的. 原始的表 (用在例子中的): "Persons" 表: Id_P Last

SQL的join使用图解

转自:http://blog.csdn.net/koudaidai/article/details/7901058 —————————————————————————————————————— 对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Coding Horror上有一篇文章(实在不清楚为什么Coding Horror也被墙)通过 文氏图 Venn d

SQL JOIN\SQL INNER JOIN 关键字\SQL LEFT JOIN 关键字\SQL RIGHT JOIN 关键字\SQL FULL JOIN 关键字

SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据. Join 和 Key 有时为了得到完整的结果,我们需要从两个或更多的表中获取结果.我们就需要执行 join. 数据库中的表可通过键将彼此联系起来.主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的.在表中,每个主键的值都是唯一的.这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起. 请看 "Persons" 表: Id_P LastName FirstName

Sql inner join

SQL INNER JOIN关键字表示在表中存在至少一个匹配时,INNER JOIN 关键字返回行. 1.连接两个数据表的用法: FROM Member INNER JOIN MemberSort ON Member.MemberSort=MemberSort.MemberSort 语法格式可以概括为: FROM 表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号 2.连接三个数据表的用法: FROM (Member INNER JOIN MemberSort ON Member

图解SQL的Join(转)

http://blog.csdn.net/xiao2004/article/details/6562435 原文地址:http://coolshell.cn/articles/3463.html 对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Coding Horror上有一篇文章(实在不清楚为什么Coding Horror也被墙)通过 文氏图 Venn

MariaDB SQL 管理事物处理

表单 customers表:客户. orders表:客户的订单. orderitems:存储订单订购的各种物品. 情景(没有使用事务) 检查客户是否在数据库(即在customers表中).如果没有,添加该客户. 检索客户id. 添加一行到orders表中.将它关联到客户ID. 检索orders表中新订单的ID. 对每个订购的物品,添加一行到orderitems表中,通过检索到的ID将其关联到orders表. 问题 假设产生了一些数据库故障或者其他原因导致数据库故障,让这个完整的步骤无法完成. 故