Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL入门:为什么以及如何使用join语句?_Sql_Mysql_Join - Fatal编程技术网

SQL入门:为什么以及如何使用join语句?

SQL入门:为什么以及如何使用join语句?,sql,mysql,join,Sql,Mysql,Join,我有一个MySQL数据库,如下所示: users ( id , name ) groups ( id , name ) group_users ( id , group_id , user_id ) select * from 'group_users' where 'user_id' = 47; SELECT groups.name, group_users.user_id FROM group_users INNER JOIN groups ON group_

我有一个MySQL数据库,如下所示:

users
    ( id , name )
groups
    ( id , name )
group_users
    ( id , group_id , user_id )
select * from 'group_users' where 'user_id' = 47;
SELECT groups.name, group_users.user_id
FROM group_users
INNER JOIN groups
  ON group_users.group_id = groups.group_id
WHERE groups.user_id = 47;
现在要查找用户所属的所有组,我将执行以下操作:

users
    ( id , name )
groups
    ( id , name )
group_users
    ( id , group_id , user_id )
select * from 'group_users' where 'user_id' = 47;
SELECT groups.name, group_users.user_id
FROM group_users
INNER JOIN groups
  ON group_users.group_id = groups.group_id
WHERE groups.user_id = 47;
这可能会返回如下结果:

( 1 , 3 , 47 ),
( 2 , 4 , 47 ),

但是当我想向用户显示它时,我想显示它们所属的组的名称,而不是
group\u id
。在一个循环中,我可以使用返回的
group\u id
获取每个组,但这样做似乎是错误的。在这种情况下是否应该使用
join
语句?我应该使用哪种类型的联接以及如何使用它?

这是内部联接的典型情况,例如:

select users.name, group.name from groups 
inner join group_users on groups.id = group_users.group_id
inner join users on group_users.user_id = users.id
where user_id = 47

这是内部联接的典型情况,例如:

select users.name, group.name from groups 
inner join group_users on groups.id = group_users.group_id
inner join users on group_users.user_id = users.id
where user_id = 47

我总是发现这些图表在进行连接时非常有用:


我总是发现这些图表在执行连接时非常有用:


通常,您希望通过使每个查询执行更多操作来减少对数据库的查询总数。这是件好事的原因有很多,但主要原因是关系数据库管理系统是专门设计的,能够快速连接表,并且比其他语言中的等效代码更擅长于连接表。另一个原因是,打开许多小查询通常比运行一个包含最终需要的所有内容的大查询要昂贵

您希望利用RDBMS的优势,因此应该尝试在几个大查询中而不是在许多小查询中将数据访问推入RDBMS

这只是一般的经验法则。有些情况下,最好在数据库之外做一些事情。重要的是,您要通过查看瓶颈(如果且仅当瓶颈发生时)来确定哪种情况适合您的情况。在发现性能问题之前,不要花时间担心性能

但是,一般来说,在数据库本身中处理连接、查找和所有其他与查询相关的任务比用通用语言处理要好

也就是说,您想要的连接类型是内部连接。您可以这样构造联接查询:

users
    ( id , name )
groups
    ( id , name )
group_users
    ( id , group_id , user_id )
select * from 'group_users' where 'user_id' = 47;
SELECT groups.name, group_users.user_id
FROM group_users
INNER JOIN groups
  ON group_users.group_id = groups.group_id
WHERE groups.user_id = 47;

通常,您希望通过使每个查询执行更多操作来减少对数据库的查询总数。这是件好事的原因有很多,但主要原因是关系数据库管理系统是专门设计的,能够快速连接表,并且比其他语言中的等效代码更擅长于连接表。另一个原因是,打开许多小查询通常比运行一个包含最终需要的所有内容的大查询要昂贵

您希望利用RDBMS的优势,因此应该尝试在几个大查询中而不是在许多小查询中将数据访问推入RDBMS

这只是一般的经验法则。有些情况下,最好在数据库之外做一些事情。重要的是,您要通过查看瓶颈(如果且仅当瓶颈发生时)来确定哪种情况适合您的情况。在发现性能问题之前,不要花时间担心性能

但是,一般来说,在数据库本身中处理连接、查找和所有其他与查询相关的任务比用通用语言处理要好

也就是说,您想要的连接类型是内部连接。您可以这样构造联接查询:

users
    ( id , name )
groups
    ( id , name )
group_users
    ( id , group_id , user_id )
select * from 'group_users' where 'user_id' = 47;
SELECT groups.name, group_users.user_id
FROM group_users
INNER JOIN groups
  ON group_users.group_id = groups.group_id
WHERE groups.user_id = 47;

谢谢我真的很喜欢那个帖子。非常适合像我这样的视觉学习者。它有忍者和海盗!那个链接对我不起作用,但我怀疑是这个页面:谢谢,更改了链接。谢谢!我真的很喜欢那个帖子。非常适合像我这样的视觉学习者。它有忍者和海盗!该链接对我不起作用,但我怀疑是这个页面:谢谢,更改了链接。加入后结果集会发生什么变化?是否添加了列?或者id值替换为名称值?我不完全确定你在问什么。只有告诉服务器添加列时,才会添加列。ID不会替换为名称。在
SELECT
查询期间,数据库中的值保持不变。只有在使用
UPDATE
语句时,才能替换内容。在这个特定的示例查询中,结果集将包含与id为47的用户关联的所有组的名称。没有添加、替换或任何偷偷摸摸的事情发生。只是一个返回结果集的常规查询。不过,我找到了问题的答案。select语句决定返回哪些列,因此,我不必说
select*from…
而是可以缩小范围,只通过说
select groups.name,groups.id from…
返回组名和id。结果集加入后会发生什么?是否添加了列?或者id值替换为名称值?我不完全确定你在问什么。只有告诉服务器添加列时,才会添加列。ID不会替换为名称。在
SELECT
查询期间,数据库中的值保持不变。只有在使用
UPDATE
语句时,才能替换内容。在这个特定的示例查询中,结果集将包含与id为47的用户关联的所有组的名称。没有添加、替换或任何偷偷摸摸的事情发生。只是一个返回结果集的常规查询。不过,我找到了问题的答案。select语句决定返回哪些列,因此我可以通过说
select groups.name,groups.id from…