SystemWatanabe
本文へジャンプ
【JetとSQLServerのSQL】

Jet用のSQL と MSDEおよびSQLServer(以下SQLServerと表記)用のSQLは構文が多少異なります。
JetとSQLServerのSQL構文を比較、まとめてみました。


[基本構文]
Select/Insert/Update/Delete SQL基本構文

[Select文]
複数テーブルの結合
複数テーブルの連結

[Insert文]
他テーブルからのレコード追加

[Update文]
他テーブルの値を更新
他テーブルの集計値を更新

[関数・演算子・その他]
日付の表記方法
日付の加減算
日付型の変換
文字連結
Null値の置き換え(Nz関数/ISNULL関数)
式の評価(Iif関数/CASE関数)
整数部の切り出し(Int関数/FLOOR関数)
True(真)の値
ワイルドカード文字






[基本構文]

●Select/Insert/Update/Delete SQL基本構文
SQLの基本形はJetもSQLServerも同じ記述です。
Select文 Insert文 Update文 Delete文
Select
  項目名1,
  項目名2,
   :
  項目名n
from
  テーブル名
where
  抽出条件式
order by
  並び順
Insert into
  テーブル名
  (項目名1,
  項目名2,
   :
  項目名n
  )
values(
  値1,
  値2,
   :
  値n
  )
Update
  テーブル名
set
  項目名1 = 値1,
  項目名2 = 値2,
   :
  項目名n = 値n
where
  条件式
Delete
from
  テーブル名
where
  条件式



[Select文]

●複数テーブルの結合
どちらの記述方法でもJetとSQLServerに使用できます。
from句へ連結条件を記述 where句へ連結条件を記述
Select
  項目名1,
  項目名2,
   :
  項目名n
from
  テーブル名1 INNER JOIN テーブル名2 ON
  テーブル名1.結合項目名 = テーブル名2.結合項目名
where
  抽出条件式
Select
  項目名1,
  項目名2,
   :
  項目名n
from
  テーブル名1,テーブル名2
where
  テーブル名1.結合項目名 = テーブル名2.結合項目名 and
  抽出条件式
(参考) この記述はOracleでは使用できません この記述はOracleでも使用できます


●複数テーブルの連結
複数のテーブルを連結して、1つのテーブルのように表示します。
JetもSQLServerも同じ記述です。
UNION
Select
  項目名1,
  項目名2,
   :
  項目名n
from
  テーブル名1
where
  抽出条件式
union all
select
  項目名1,
  項目名2,
   :
  項目名n
from
  テーブル名2
where
  抽出条件式
order by
  並び順
(参考) union allと指定した場合には、すべてのレコードを抽出しますが、unionと指定した場合には、重複したレコードは返されません。




[Insert文]

●他テーブルからのレコード追加
JetもSQLServerも同じ記述です。
Select文を使用する
Insert into
  テーブル名
  (項目名1,
  項目名2,
   :
  項目名n
  )
select文




[Update文]

●他テーブルの値を更新
JetとSQLServerでは記述が異なります。
Jetの場合 SQLServerの場合
Update
  更新テーブル名 INNER JOIN 参照テーブル名 ON
  更新テーブル名.結合項目名 = 参照テーブル名.結合項目名
set
  項目名1 = 参照テーブル名.項目名1,
  項目名2 = 参照テーブル名.項目名2,
   :
  項目名n = 参照テーブル名.項目名n
where
  抽出条件式
Update
  更新テーブル名
set
  項目名1 = 参照テーブル名.項目名1,
  項目名2 = 参照テーブル名.項目名2,
   :
  項目名n = 参照テーブル名.項目名n
from
  更新テーブル名 INNER JOIN 参照テーブル名 ON
  更新テーブル名.結合項目名 = 参照テーブル名.結合項目名
where
  抽出条件式
(参考) Updateの後へ更新テーブルおよび参照テーブルを指定 Update後へ更新テーブルをfrom句へ参照テーブルを指定


●他テーブルの集計値を更新
JetとSQLServerでは記述が異なります。
(例題)請求データの当月売上額へ売上データから売上額を集計し更新します。
Jetの場合 SQLServerの場合
Update
  請求テーブル INNER JOIN 売上テーブル ON
  請求テーブル.得意先コード = 売上テーブル.得意先コード
set
  当月売上額 = 請求テーブル.当月売上額 + 売上テーブル.売上額
where
  期間条件式
Update
  請求テーブル
set
  当月売上額 =
  (select
     sum(売上額)
  from
    売上テーブル INNER JOIN 請求テーブル ON
    売上テーブル.得意先コード = 請求テーブル.得意先コード
  where
    期間条件式
  )
(参考) 1レコードに複数回の更新が可能であるため、集計したい項目へ売上毎に加算する。サブクエリの値を更新することはできない。 1レコードに1回の更新しかできない。
サブクエリで集計を行いその結果を集計したい項目へ更新する。




[関数・演算子・その他]

●日付の表記方法
Jetの場合 SQLServerの場合
 #2002/08/31#  '2002/08/31'
(参考) 日付は#で囲む 日付は'で囲む


●日付の加減算
Jetの場合 SQLServerの場合
DateAdd("加減算単位",加減算数,#日付#)
・1日を加算
 DateAdd("d",1,#2002/08/31#)
・1ヶ月を加算
 DateAdd("m",1,#2002/08/31#)
・1年を加算
 DateAdd("yyyy",1,#2002/08/31#)
・1年を減算
 DateAdd("yyyy",-1,#2002/08/31#)
DATEADD(加減算単位,加減算数,'日付')
・1日を加算
 DATEADD(d,1,'2002/08/31')
・1ヶ月を加算
 DATEADD(m,1,'2002/08/31')
・1年を加算
 DATEADD(yyyy,1,'2002/08/31')
・1年を減算
 DATEADD(yyyy,-1,'2002/08/31')
(参考) 加減算単位を"もしくは'で囲む 加減算単位を"などで囲む必要はない


●日付型の変換
Jetの場合 SQLServerの場合
・指定した日付を日付型のデータとして値を返します。
 cDate(#2002/08/31#)

・日付型データを指定した書式の文字列として値を返します。
 format(日付,"yyyy/mm/dd")  →"2002/08/31"
 format(日付,"yy/mm/dd")   →"02/08/31"
・指定した日付を日付型のデータとして値を返します。
 CAST('2002/08/31' AS datetime)

・日付型データを指定した書式の文字列として値を返します。
 CONVERT(char,日付,111)  →"2002/08/31"
 CONVERT(char,日付,11)   →"02/08/31"


●文字連結
文字列の連結演算子
(例題)文字列 "AAAAA" と "BBBBB" を連結して"AAAAABBBBB"の値を返します。
Jetの場合 SQLServerの場合
 "AAAAA" & "BBBBB"  "AAAAA" + "BBBBB"


●Null値の置き換え(Nz関数/ISNULL関数)
値がNull値の時、指定した値に置き換えます。
(例題)変数wAtaiがNullの時には、0に置き換えます。
Jetの場合 SQLServerの場合
 Nz(wAtai,0)  ISNULL(wAtai,0)


●式の評価(Iif関数/CASE関数)
式の評価結果により値を返します。
(例題)変数wAtaiが0の時には100を、0でない場合には200を返します。
Jetの場合 SQLServerの場合
 Iif(wAtai=0,100,200)  CASE wAtai WHEN 0 THEN 100 ELSE 200 END


●整数部の切り出し(Int関数/FLOOR関数)
指定した数値の整数部分を返します。
下記の例ではどちらも 123 を返します。
Jetの場合 SQLServerの場合
 Int(123.45)  FLOOR(123.45)


●True(真)の値
評価の結果値であるTrue(真)の値は、JetとSQLServerでは異なります。 ( False(偽)の値は、どちらも 0 )
Jetの場合 SQLServerの場合
 -1  1


●ワイルドカード文字
Like演算子で使用するワイルドカード文字は、JetとSQLServerでは異なります。
Jetの場合 SQLServerの場合
 名前項目 Like "*山田*"  名前項目 LIKE "%山田%"







>>Home