pan*_*ish 15 mysql union merge join
在给出这两个表的情况下,我需要实现以下结果的mysql是什么:
表格1:
+----+-------+
| id | name |
+----+-------+
| 1 | alan |
| 2 | bob |
| 3 | dave |
+----+-------+
Run Code Online (Sandbox Code Playgroud)
表2:
+----+---------+
| id | state |
+----+---------+
| 2 | MI |
| 3 | WV |
| 4 | FL |
+----+---------+
Run Code Online (Sandbox Code Playgroud)
我想创建一个看起来像这样的临时视图
期望的结果:
+----+---------+---------+
| id | name | state |
+----+---------+---------+
| 1 | alan | |
| 2 | bob | MI |
| 3 | dave | WV |
| 4 | | FL |
+----+---------+---------+
Run Code Online (Sandbox Code Playgroud)
我尝试了一个mysql联盟,但以下结果不是我想要的.
create view table3 as
(select id,name,"" as state from table1)
union
(select id,"" as name,state from table2)
Run Code Online (Sandbox Code Playgroud)
table3联合结果:
+----+---------+---------+
| id | name | state |
+----+---------+---------+
| 1 | alan | |
| 2 | bob | |
| 3 | dave | |
| 2 | | MI |
| 3 | | WV |
| 4 | | FL |
+----+---------+---------+
Run Code Online (Sandbox Code Playgroud)
您需要使用名为JOIN的SQL运算符来获得所需的内容.
JOIN是SQL语言的基本组成部分,而while循环则适用于其他编程语言.
从这里开始: SQL连接的可视化解释
另一种思考JOIN与UNION的方法是:
例如:
SELECT *
FROM table1
JOIN table2 USING (id);
Run Code Online (Sandbox Code Playgroud)
这是一种连接样式,仅返回两个表中存在匹配id的行.但是你想要所有那些在至少一个表或另一个表中存在行的id.
SELECT *
FROM table1
LEFT OUTER JOIN table2 USING (id);
Run Code Online (Sandbox Code Playgroud)
这将获取table1中的所有行,以及table2中的匹配行.但要反过来,我们需要:
SELECT *
FROM table1
RIGHT OUTER JOIN table2 USING (id);
Run Code Online (Sandbox Code Playgroud)
SQL还定义了一个FULL OUTER JOIN,它可以同时执行两个操作,但遗憾的是MySQL还没有实现SQL标准的那部分.但是我们可以UNION用来组合两种类型的连接.Union默认会消除重复的行.
更新: 我麻烦了,并让它工作.事实证明,您必须明确命名列,以确保它们位于两个联合查询的相同列中.这是从我的终端窗口复制的有效查询:
SELECT id, name, state
FROM table1
LEFT OUTER JOIN table2 USING (id)
UNION
SELECT id, name, state
FROM table1
RIGHT OUTER JOIN table2 USING (id);
Run Code Online (Sandbox Code Playgroud)
一般来说,避免使用是一个好习惯SELECT *,而这只是一个好主意的案例.
另外,我之前在查询示例中留下了多余的分号.那只是我的一个错字.
此查询生成以下输出,从我的终端窗口复制:
+----+------+-------+
| id | name | state |
+----+------+-------+
| 1 | alan | NULL |
| 2 | bob | MI |
| 3 | dave | WV |
| 4 | NULL | FL |
+----+------+-------+
Run Code Online (Sandbox Code Playgroud)
PS:谢谢你这么清楚地提问!