SQL 基礎
LEFT JOIN と LEFT OUTER JOIN
INNER JOIN
(ただの JOIN は INNER JOIN の省略形)

LEFT OUTER JOIN
(LEFT JOIN は LEFT OUTER JOIN の省略形)

RIGHT OUTER JOIN
(RIGHT JOIN は RIGHT OUTER JOIN の省略形)
WITH句
with
  view01 as 
    ( select column99 from table99 where column01 = '01' )
select 
  view01.column99, table01.column77
from 
  table01, view01
where
  table01.column99 = view01.column99
WITH句 複数
with 
  view01 as 
    ( select column99, from table99 where column01 = '01' ) , 
  view02 as
    ( select column33 from table88 where table88.column01 = view01.column01 )
select 
  view02.column33, table01.column77
from 
  table01, view02
where
  table01.column33 = view02.column33
WITH句を使用しない場合
select
  a.emp_id, a.emp_name, b.dept_id, b.dept_name
from 
  emp a, (select dept_id,dept_name from dept where dept_kbn = 'B') b
where
  a.dept_id = b.dept_id;
WITH句を使用した場合
with 
  dept_view as
    (select dept_id,dept_name from dept where dept_kbn = 'B')
select
  a.emp_id, a.emp_name, b.dept_id, b.dept_name
from 
  emp a, dept_view b
where
  a.dept_id = b.dept_id;
索引を使用しないSQL文
NULL比較(IS NULL、IS NOT NULL)をWHERE句の条件に指定すると索引は使用されません NOT(!=、<>なども)を使用した場合も索引は使用されません。NOTは別の条件に変えることを検討して下さい。例えば、INやORに置き換えるなどです。 以下のような列の演算をしているSQL文では索引は使用されません
SELECT * FROM tab1 WHERE c1 / 10 < 10000;
SELECT * FROM tab1 WHERE SUBSTR(c2,3,4) = 'AAAA';
以下のようなファンション索引を作成することで索引が使用されます
CREATE INDEX ix_c2 ON tab1 (SUBSTR(c2,3,4));
以下のような後方一致条件(中間一致条件)のSQL文では索引は使用されません
SELECT * FROM tab1 WHERE c3 LIKE '%AA';
SELECT * FROM tab1 WHERE c3 LIKE '%A%';
INリストまたはORを使用していると、索引が使用されない場合もありますが、効率が悪い索引アクセスになる場合もあります
EXISTS
SELECT * 
FROM tab1 
WHERE 
  EXISTS 
    (
      SELECT * 
      FROM tab2 
      WHERE tab1.c1 = tab2.c1
    );  
上位100件だけ出力したい
SELECT * 
FROM 
  (
    SELECT ... FROM tab1 ORDER BY c1
  ) 
WHERE ROWNUM < 101;
(1)LEFT OUTER JOIN --(1),(2)は同じ結果
SELECT * 
FROM tab1 left outer join 
  tab2 
    ON tab1.a = tab2.a 
    AND tab2.b = 10;
(2)LEFT OUTER JOIN --(1),(2)は同じ結果
SELECT * 
FROM tab1 left outer join 
  (SELECT * FROM tab2 WHERE b = 10) B 
    ON tab1.a = B.a;