MySQL — 关联

MySQL — 关联,第1张

来自MySQL的学习笔记,写的不对的地方大家多多指教哦

什么是外键?

假设有 2 个表,分别是表 A 和表 B,它们通过一个公共字段“id”发生关联关系,我们把这个关联关系叫做 R。如果“id”在表 A 中是主键,那么,表 A 就是这个关系 R 中的主表。相应的,表 B 就是这个关系中的从表,表 B 中的“id”,就是表 B 用来引用表 A 中数据的,叫外键。所以,外键就是从表中用来引用主表中数据的那个公共字段。

语法结构:

在创建表时添加外键约束:

在修改表时定义外键约束:

例子1:创建表时添加外键约束

首先创建主表:importhead

创建从表:test_mysql.importdetails

查询外键约束的相关信息:

查询结果为:

例子2:修改表时定义外键约束

修改表时定义从表test_mysql.importdetails的外键约束

删除外键约束使用DROP,语法结构为:

例子:删除从表test_mysql.importdetails的外键约束

在 MySQL 中,有 2 种类型的连接,分别是内连接(INNER JOIN)和外连接(OUTER JOIN)。

在 MySQL 里面,关键字 JOIN、INNER JOIN、CROSS JOIN 的含义是一样的,都表示内连接。我们可以通过 JOIN 把两个表关联起来,来查询两个表中的数据。

例子:有一张销售表,如下图

有一张会员信息表,如下图:

通过内连接,查询会员的销售记录:

运行语句,结果如下:

根据上面的结果,其实可以得知:内连接查询到结果集为两个表的交集部分。

跟内连接只返回符合连接条件的记录不同的是,外连接还可以返回表中的所有记录,它包括两类,分别是左连接和右连接。

例子1:左外连接

如果需要查询所有销售记录,则可以使用左外连接

运行语句,结果为:

从上面的结果可以得知,LEFT JOIN左边的表会返回全部记录,而右边的表只返回符合连接条件的记录

例子2:右外连接:

运行语句,结果为:

从上面的结果可以得知,RIGHT JOIN右边的表会返回全部记录,而左边的表只返回符合连接条件的记录

1.新建表

create table websites(id int not null, name varchar(32), url varchar(100) not null ,alexa int not null , country varchar(32))

插入数据

insert into websites values(1,'Google',' https://www.google.cm/',1,'USA' )

insert into websites values(2,'taobao',' https://www.taobao.com/',13,'CN' )

insert into websites values(3,'cainiao',' http://www.runoob.com/',4689,'CN' )

insert into websites values(4,'weibo',' http://weibo.com/',20,'CN' )

insert into websites values(5,'Facebook',' https://www.facebook.com/',3,'USA' )

insert into websites values(7,'stackoverflow',' http://stackoverflow.com/',0,'IND' )

create table access_log(aid int not null, site_id int not null, count int, date varchar(100))

insert into access_log values(1,1,45,'2016-05-10')

insert into access_log values(2,3,100,'2016-05-13')

insert into access_log values(3,1,23,'2016-05-14')

insert into access_log values(4,2,10,'2016-05-14')

insert into access_log values(5,5,205,'2016-05-14')

insert into access_log values(6,4,13,'2016-05-15')

insert into access_log values(7,3,220,'2016-05-15')

insert into access_log values(8,5,545,'2016-05-16')

insert into access_log values(9,3,201,'2016-05-17')

insert into access_log values(10,6,111,'2016-03-19')

select * from mysql.test.websites

| 1 | Google| https://www.google.cm/ | 1 | USA |

| 2 | 淘宝 | https://www.taobao.com/| 13| CN |

| 3 | 菜鸟教程 | http://www.runoob.com/ | 4689 | CN |

| 4 | 微博 | http://weibo.com/ | 20| CN |

| 5 | Facebook | https://www.facebook.com/ | 3 | USA |

| 7 | stackoverflow | http://stackoverflow.com/ | 0 | IND |

+-----+---------+-------+------------+

| aid | site_id | count | date |

+-----+---------+-------+------------+

| 1 | 1 |45 | 2016-05-10 |

| 2 | 3 | 100 | 2016-05-13 |

| 3 | 1 | 230 | 2016-05-14 |

| 4 | 2 |10 | 2016-05-14 |

| 5 | 5 | 205 | 2016-05-14 |

| 6 | 4 |13 | 2016-05-15 |

| 7 | 3 | 220 | 2016-05-15 |

| 8 | 5 | 545 | 2016-05-16 |

| 9 | 3 | 201 | 2016-05-17 |

+-----+---------+-------+------------+

2.关联查询

内连接

SELECT *

FROM Websites

INNER JOIN access_log

ON Websites.id=access_log.site_id

ORDER BY Websites.id

左连接

SELECT Websites.name, access_log.count, access_log.date

FROM Websites

LEFT JOIN access_log

ON Websites.id=access_log.site_id

ORDER BY access_log.count DESC

右连接

SELECT Websites.name, access_log.count, access_log.date

FROM Websites

RIGHT JOIN access_log

ON Websites.id=access_log.site_id

ORDER BY access_log.count DESC

全连接

SELECT websites.name, access_log.count, access_log.date

FROM websites

FULL OUTER JOIN access_log

ON access_log.site_id=websites.id

ORDER BY access_log.count DESC

方法和 *** 作步骤如下:

1、首先,创建一个测试表,如下图所示,然后进入下一步。

2、其次,插入测试数据,如下图所示,然后进入下一步。

3、接着,完成上述步骤后,查询表中的数据,“select t.* from test_tbl2 t ”,如下图所示,然后进入下一步。

4、最后,完成上述步骤后,编写sql,两个表通过pid与id关联, “select t1.*, t2.* from test_tbl1 t1 join test_tbl2 t2 on t1.p_id = t2.id”,如下图所示。这样,问题就解决了。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/7722002.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存