SQLのJOINでrows(レコード)のカウントが減ってしまう問題について考えてみました。
SQLはあまり詳しくないのでなんて説明すればいいのかわからないのですけど、joinするとjoinしたテーブルと同じカラムを元のテーブル上にも持っていないと、持っていない列は削除された状態で出力されてしまう。よって、出力されるrowsの数が減ってしまうので、例えばselect元のテーブル全ての情報に加えてjoinしたテーブルのxxカラムを含めてwhereでregex検索したいよーなんて場合に不便があります。
…まじで説明できない。
そういうときは、leftを使うと解決できますよという話。
SELECT u.id, u.url, u.visit_count, u.title FROM urls AS u
36254 rows returned

SELECT u.id, u.url, u.visit_count, u.title, kw.term FROM urls AS u
JOIN keyword_search_terms AS kw ON kw.url_id = u.id
JOIN visits AS v ON v.url = u.id
18520 rows returned

SELECT u.id, u.url, u.visit_count, u.title, kw.term FROM urls AS u
left JOIN keyword_search_terms AS kw ON kw.url_id = u.id
left JOIN visits AS v ON v.url = u.id
74926 rows returned

joinの前にleftを宣言するだけです。
sql join keep all records - Google Search sql join decreased rows - Google Search SQL Server : left join results in fewer rows than in left table - Stack Overflow
せっかくなのでもう少し深掘り。
joinには4種類あるようです。
以下グラフがわかりやすい。(INNER) JOIN: Returns records that have matching values in both tables LEFT (OUTER) JOIN: Return all records from the left table, and the matched records from the right table RIGHT (OUTER) JOIN: Return all records from the right table, and the matched records from the left table FULL (OUTER) JOIN: Return all records when there is a match in either left or right table

一番使い勝手が良さそうなのはやはりLEFTですかね。
rightをsqliteで実行してみたら対応していないと言われてしまった。
RIGHT and FULL OUTER JOINs are not currently supported