Mysql 是否从多个没有联接的表中进行选择?

Mysql 是否从多个没有联接的表中进行选择?,mysql,Mysql,从两个表中选择数据而不是将它们连接起来的最简单方法是什么,让它们显示为单独的行。这两个表都有相似或匹配的字段,我想对它们运行一些聚合函数,例如从这两个表中对同一个月内发生的所有行进行平均 例如,我有两个表,一个显示来自一个系统的事务,另一个显示来自不同系统的事务。是否有办法将两个表中的所有事务作为单独的行抓取?如果表1有20条记录,而表2有30条记录,我希望返回表上有50行。您可以尝试以下方法: SELECT ... FROM ( SELECT f1,f2,f3 FROM table1

从两个表中选择数据而不是将它们连接起来的最简单方法是什么,让它们显示为单独的行。这两个表都有相似或匹配的字段,我想对它们运行一些聚合函数,例如从这两个表中对同一个月内发生的所有行进行平均


例如,我有两个表,一个显示来自一个系统的事务,另一个显示来自不同系统的事务。是否有办法将两个表中的所有事务作为单独的行抓取?如果表1有20条记录,而表2有30条记录,我希望返回表上有50行。

您可以尝试以下方法:

SELECT ...
FROM (
    SELECT f1,f2,f3 FROM table1
    UNION
    SELECT f1,f2,f3 FROM table2
)
WHERE ...

您可以尝试以下注意事项:

SELECT * from table1,table2 
更复杂的一点是:

SELECT table1.field1,table1.field2, table2.field3,table2.field8 from table1,table2 where table1.field2 = something and table2.field3 = somethingelse
UNION ALL运算符可能就是您要查找的

使用此运算符,可以将多个查询的结果集连接在一起,从而保留每个查询的所有行。请注意,不带ALL关键字的UNION运算符将消除结果集中存在的任何重复行。UNION ALL运算符保留每个查询中的所有行,并且可能会执行得更好,因为它没有执行重复检查和删除操作的开销

在每个查询中,列数和每列的数据类型必须匹配。如果其中一个查询的列比另一个多,我们有时会在另一个查询中包含伪表达式,以使列和数据类型匹配。通常,在每个查询的SELECT列表中包含一个表达式和一个额外的列(该列返回一个文本),以显示哪一个查询是行的源,这会很有帮助

SELECT 'q1' AS source, a, b, c, d FROM t1 WHERE ...
UNION ALL
SELECT 'q2', t2.fee, t2.fi, t2.fo, 'fum' FROM t2 JOIN t3 ON ...
UNION ALL
SELECT 'q3', '1', '2', buckle, my_shoe FROM t4
您可以将这样的查询包装在一组括号中,并使用MySQL行话将其用作内联视图或派生表,以便可以对所有行执行聚合操作

SELECT t.a
     , SUM(t.b)
     , AVG(t.c)
  FROM (
         SELECT 'q1' AS source, a, b, c, d FROM t1
          UNION ALL
         SELECT 'q2', t2.fee, t2.fi, t2.fo, 'fum' FROM t2
       ) t
 GROUP BY t.a
 ORDER BY t.a

在这种情况下,我们假设有两个表: 具有公共列serviceid的SMPPMSGLOG和SMSSSERVICE:


如果您的问题是这样的-从emp中选择ename,dname,dept,而不使用联接

然后,我会这样做

SELECT ename, (SELECT dname 
FROM dept
WHERE dept.deptno=emp.deptno)dname
FROM EMP
输出:

ENAME      DNAME
---------- --------------
SMITH      RESEARCH
ALLEN      SALES
WARD       SALES
JONES      RESEARCH
MARTIN     SALES
BLAKE      SALES
CLARK      ACCOUNTING
SCOTT      RESEARCH
KING       ACCOUNTING
TURNER     SALES
ADAMS      RESEARCH

ENAME      DNAME
---------- --------------
JAMES      SALES
FORD       RESEARCH
MILLER     ACCOUNTING

14 rows selected.
你应该试试这个

 SELECT t1.*,t2.* FROM t1,t2

Union将按行而不是按列获取数据,因此,如果您像我一样,正在寻找从两个不同的表中获取列数据,而这两个表没有关联,也没有联接。 在我的例子中,我通过id获取州名和国家名。您可以这样做,而不是编写两个查询

select 
   (
   select s.state_name from state s where s.state_id=3
   ) statename,
   (
   select c.description from country c where c.id=5
   ) countryname
   from dual;   


其中dual是一个具有单列的虚拟表,任何只需要表查看的内容都选择“测试”,选择id=1的员工姓名作为名称,选择id=2的地址中的姓名作为地址

答案在一个下面column@AdarshMPallickal:我不明白你的评论,对不起。。。你是什么意思?当我使用union时,所有结果都归一个column@AdarshMPallickal:如果您的情况不同,那么发布一个显示您的情况和需求的问题…您可能希望使用UNION ALL,以防两个表在列方面具有相同的数据。OP似乎希望显示两个表中的所有记录。如果table1为空,则他将无法从table2Downvoted中获得结果,因为@user846226的注释为true。这个答案通常是有用的,但不能正确回答问题。除非我弄错了,我认为逗号分隔的表与ANSI-92不兼容。这种表示法有特别的名称吗?我相信它叫隐式连接。两个表引用之间的逗号运算符指定了一个连接操作。这是唯一对我有效的答案,因为我目前正试图将一个数据库迁移到Azure,它包含旧样式Azure中不允许的联接语法。大多数联接的语法很容易更改,但是,如果它们不共享要联接的列,则从[tab1]、[tab2]、[tab1]、[col1]中选择[tab1]、[tab2]、[col1]并不容易。这是一种联接。您刚刚使用了较旧的语法。由于我没有任何可连接的内容,所以对我有效。我只需要外部信息,不需要对一个数据点进行第二次查询。这是一个隐式连接。正如你7年前的类似回答所表明的,这并没有回答这个问题。它没有出现预期的结果。这对我来说已经足够好了。请接受答案并关闭帖子。
select 
   (
   select s.state_name from state s where s.state_id=3
   ) statename,
   (
   select c.description from country c where c.id=5
   ) countryname
   from dual;