Forgotten rows

From SQLZoo

In this example you are shown how to include the rows your JOIN function automatically leaves out as it does not perform the join when one of the values is 0.

This is done by adding a either a LEFT JOIN or a UNION making the join also to reveal the rows with a count of 0.

Table 1 shows the results without a LEFT JOIN and table 2 shows the results we obtain with the LEFT JOIN

Table 1
nameCOUNT(custid)
Betty2
Janette1
Table 2
nameCOUNT(custid)
Betty2
Janette1
Robert0
schema:scott
DROP TABLE customer;
DROP TABLE invoice;
 CREATE TABLE customer(
  id INTEGER,
  name VARCHAR(20));
INSERT INTO customer VALUES (1,'Betty');
INSERT INTO customer VALUES (2,'Robert');
INSERT INTO customer VALUES (3,'Janette');
CREATE TABLE invoice(
  invoiceno INTEGER,
  whn DATE,
  custid INTEGER,
  cost INTEGER );
INSERT INTO invoice VALUES (1,'2006-11-01',1,100);
INSERT INTO invoice VALUES (2,'2006-11-05',1,500);
INSERT INTO invoice VALUES (3,'2006-11-11',3,200);

The following query will only give two rows as the JOIN function automatically does not include rows with a count of 0.

SELECT name, COUNT(custid)
  FROM customer JOIN invoice ON (id=custid)
  GROUP BY name

In order to obtain the rows where the count from the query is 0 a LEFT JOIN or a UNION can be used.

 
SELECT name, COUNT(custid)
  FROM customer LEFT JOIN invoice ON (id=custid)
  GROUP BY name