#  IN And  EXISTS  Examples
__*IN*__
__*EXISTS*__
__*SEMI JOIN*__
+ Does Jupiter have moons? How many moons are there?
```
SELECT m.name, m.alias
FROM universe.moons m
WHERE EXISTS (SELECT NULL FROM universe.planets 
              WHERE id = m.planet_id
              AND name = 'Jupiter');

SELECT m.name, m.alias
FROM universe.moons m
WHERE m.planet_id IN (SELECT id FROM universe.planets
                      WHERE name = 'Jupiter');
```

------------------------------------------------------------
Reviewed the execution plan and learned that `EXISTS`  it was adopted `semi join` .
```
tidb> explain SELECT m.name, m.alias
    -> FROM universe.moons m
    -> WHERE m.planet_id IN (SELECT id FROM universe.planets
    ->                       WHERE name = 'Jupiter');
+-----------------------------+---------+-----------+---------------------------------+-----------------------------------------------------------------------+
| id                          | estRows | task      | access object                   | operator info                                                         |
+-----------------------------+---------+-----------+---------------------------------+-----------------------------------------------------------------------+
| HashJoin_26                 | 0.01    | root      |                                 | inner join, equal:[eq(universe.planets.id, universe.moons.planet_id)] |
| ├─IndexReader_30(Build)     | 0.01    | root      |                                 | index:IndexRangeScan_29                                               |
| │ └─IndexRangeScan_29       | 0.01    | cop[tikv] | table:planets, index:name(name) | range:["Jupiter","Jupiter"], keep order:false, stats:pseudo           |
| └─TableReader_28(Probe)     | 28.00   | root      |                                 | data:TableFullScan_27                                                 |
|   └─TableFullScan_27        | 28.00   | cop[tikv] | table:m                         | keep order:false, stats:pseudo                                        |
+-----------------------------+---------+-----------+---------------------------------+-----------------------------------------------------------------------+
5 rows in set (0.00 sec)

tidb> explain SELECT m.name, m.alias
    -> FROM universe.moons m
    -> WHERE EXISTS (SELECT NULL FROM universe.planets 
    ->               WHERE id = m.planet_id
    ->               AND name = 'Jupiter');
+-----------------------------+---------+-----------+---------------------------------+----------------------------------------------------------------------+
| id                          | estRows | task      | access object                   | operator info                                                        |
+-----------------------------+---------+-----------+---------------------------------+----------------------------------------------------------------------+
| HashJoin_20                 | 22.40   | root      |                                 | semi join, equal:[eq(universe.moons.planet_id, universe.planets.id)] |
| ├─IndexReader_24(Build)     | 0.01    | root      |                                 | index:IndexRangeScan_23                                              |
| │ └─IndexRangeScan_23       | 0.01    | cop[tikv] | table:planets, index:name(name) | range:["Jupiter","Jupiter"], keep order:false, stats:pseudo          |
| └─TableReader_22(Probe)     | 28.00   | root      |                                 | data:TableFullScan_21                                                |
|   └─TableFullScan_21        | 28.00   | cop[tikv] | table:m                         | keep order:false, stats:pseudo                                       |
+-----------------------------+---------+-----------+---------------------------------+----------------------------------------------------------------------+
5 rows in set (0.00 sec)
```
