MySQL在匹配特定值时加入条件

MySQL在匹配特定值时加入条件,mysql,sql,join,left-join,Mysql,Sql,Join,Left Join,我有一个MySQL数据库,其中包含表国家和汇率: mysql> SELECT * FROM countries; +----------------+----------+----------------+ | name | currency | GDP | +----------------+----------+----------------+ | Switzerland | CHF | 163000000000 | |

我有一个MySQL数据库,其中包含表
国家
汇率

mysql> SELECT * FROM countries;
+----------------+----------+----------------+
| name           | currency | GDP            |
+----------------+----------+----------------+
| Switzerland    | CHF      |   163000000000 |
| European Union | EUR      | 13900000000000 | 
| Singapore      | SGD      |   403000000000 |
| USA            | USD      | 17400000000000 |
+----------------+----------+----------------+
mysql> SELECT * FROM exchange_rates;
+----------+------+
| currency | rate |
+----------+------+
| EUR      |  0.9 |
| SGD      | 1.37 |
+----------+------+
我希望有一个附加列的联接表,以美元显示GDP

目前我有:

mysql> SELECT countries.name, GDP, countries.GDP/exchange_rates.rate AS 'GDP US$'
    -> FROM countries, exchange_rates
    -> WHERE exchange_rates.currency=countries.currency;
+----------------+----------------+----------------+
| name           | GDP            | GDP US$        |
+----------------+----------------+----------------+
| European Union | 13900000000000 | 15444444853582 |
| Singapore      |   403000000000 |   294160582917 |
+----------------+----------------+----------------+
然而,我想进一步说明:

  • 以当地货币表示的GDP,即使缺少汇率信息
  • 两列中使用当地货币“美元”的国家的GDP
所需输出为:

+----------------+----------------+----------------+
| name           | GDP            | GDP US$        |
+----------------+----------------+----------------+
| European Union | 13900000000000 | 15444444853582 |
| Singapore      |   403000000000 |   294160582917 |
| Switzerland    |   163000000000 |                |
| USA            | 17400000000000 | 17400000000000 |
+----------------+----------------+----------------+
我将非常感谢您的帮助。

为了获得#1,您只需使用
左连接
而不是内部连接:

SELECT countries.name, GDP, countries.GDP/exchange_rates.rate AS 'GDP US$'
  FROM countries LEFT JOIN exchange_rates
  ON exchange_rates.currency=countries.currency;
为了得到#2,只需在汇率表中添加汇率为1的美元记录。如果不希望在表中显示,请在查询中执行:

SELECT countries.name, GDP, countries.GDP/full_exchange_rates.rate AS 'GDP US$'
  FROM countries LEFT JOIN (
   select currency, rate from exchange_rates
    union
   select 'USD' as currency, 1 as rate 
  ) as full_exchange_rates
ON full_exchange_rates.currency=countries.currency;
要获得#1,只需使用
左联接
而不是内部联接:

SELECT countries.name, GDP, countries.GDP/exchange_rates.rate AS 'GDP US$'
  FROM countries LEFT JOIN exchange_rates
  ON exchange_rates.currency=countries.currency;
为了得到#2,只需在汇率表中添加汇率为1的美元记录。如果不希望在表中显示,请在查询中执行:

SELECT countries.name, GDP, countries.GDP/full_exchange_rates.rate AS 'GDP US$'
  FROM countries LEFT JOIN (
   select currency, rate from exchange_rates
    union
   select 'USD' as currency, 1 as rate 
  ) as full_exchange_rates
ON full_exchange_rates.currency=countries.currency;

使用
左连接
包含缺少汇率的国家,并使用大小写表达式始终将美国GDP设置为美国GDP:

SELECT 
    c.name, 
    GDP, 
    CASE WHEN c.name = 'USA' THEN c.GDP ELSE c.GDP/er.rate END AS 'GDP US$'
FROM countries c
LEFT JOIN exchange_rates er ON er.currency = c.currency;

此外,我更改为正确的联接,并为表添加了别名以缩短查询时间。

使用
左联接来包括缺少汇率的国家,并使用case表达式始终将USA GDP设置为USA GDP:

SELECT 
    c.name, 
    GDP, 
    CASE WHEN c.name = 'USA' THEN c.GDP ELSE c.GDP/er.rate END AS 'GDP US$'
FROM countries c
LEFT JOIN exchange_rates er ON er.currency = c.currency;

另外,我改为使用正确的联接,并为表添加了别名,以缩短查询时间。

其他答案很好,但我将这样写:

SELECT c.name, c.GDP, c.GDP/COALESCE(er.rate, 1.0) AS "GDP US$"
FROM countries c LEFT JOIN
     exchange_rates er
     ON er.currency = c.currency;

我认为
COALESCE()
是最简单的方法。假设唯一缺少的汇率是美元。

其他答案很好,但我会这样写:

SELECT c.name, c.GDP, c.GDP/COALESCE(er.rate, 1.0) AS "GDP US$"
FROM countries c LEFT JOIN
     exchange_rates er
     ON er.currency = c.currency;

我认为
COALESCE()
是最简单的方法。假设唯一缺少的汇率是美元。

太好了!然而,当c.currency='USD'时使用
更安全一些。
@Roman是的,如果名称可以更改,可能会更改,但我猜不会:)@Roman如果您打算始终使用美国作为基础,更好的选择可能是简单地插入一行('USD',1)的汇率,就像Nir Levy的答案一样。这样,您就不必使用case表达式或进行任何子查询。事实上,我有数据系列,因此需要插入许多行,这些行不会带来额外的信息。除此之外,还有其他国家以美元作为官方货币。太棒了!然而,当c.currency='USD'时使用
更安全一些。
@Roman是的,如果名称可以更改,可能会更改,但我猜不会:)@Roman如果您打算始终使用美国作为基础,更好的选择可能是简单地插入一行('USD',1)的汇率,就像Nir Levy的答案一样。这样,您就不必使用case表达式或进行任何子查询。事实上,我有数据系列,因此需要插入许多行,这些行不会带来额外的信息。此外,除美国以外,还有一些国家的官方货币是美元。简单规则:永远不要使用逗号连接语法。简单规则:永远不要使用逗号连接语法。正如您可能已经注意到的,美元不是唯一缺少的。不过,谢谢你的好主意。它非常适合我的另一种情况,正如你可能已经注意到的,“美元”并不是唯一缺少的。不过,谢谢你的好主意。它非常适合我的另一种情况