SQLの仕様


概略

本スキンsm02ではSQL(っぽい)の構文を使ってプレイリスト作成とプレイリストの列指定ができます。
SQLについて非常に大雑把に説明すると、データベース操作を行う為のデータベース言語です。
Windows Media Playerのライブラリはデータベースみたいなものなので、SQL構文でプレイリスト作成やデータ出力機能を作ってみました。
以降、SQLと記述した場合、断り書きがない限り、本スキンの独自SQLをさします。

SQLを知らない方にとっては、やや難解な機能かもしれません。
サンプルを試してもよくわからない場合、本機能は無視してもいいと思います。
既にSQLを知っている方は容易く習得できるはずですが、本スキンには独自仕様もあります。
特にwhere句には独自仕様が多いので注意してください。
他に独自仕様としてexpand句やoption句なんてものもあります。

一応ですが、本スキンの構文解析の精度が低い上に、Windows Media Playerの制約や本スキンの仕様、不具合等により
「このSQL文は正しいはずなのにエラーになるぞ?」
「このSQL文おかしいけどエラーにならないぞ?」
「このSQL文の検索結果おかしくない?」
「エラーメッセージがわかりにくい!」
等の事は十分起こりえます。
ご了承ください。

SQLの構文と内容

select 列名[, 列名, ...]
    from テーブル名
        where 列名 [=<>][[and|or] 列名 [=<>]...]
        order by 列名 [asc|desc] [,列名 [asc|desc] ...]
        option タイプ [, ...]
 
または
select 列名[, 列名, ...]
    expand 再生リスト名または固定値[, 再生リスト名, ...]
        where 列名 [=<>][[and|or] 列名 [=<>]...]
        order by 列名 [asc|desc] [,列名 [asc|desc] ...]
        option タイプ [, ...]
 

「from テーブル名」部分

ライブラリ登録されているファイルの取得元テーブルを指定します。
指定できるテーブルは以下の通りです
audio 音楽ファイル
video 動画ファイル
photo 画像ファイル
playlist プレイリスト(再生リストの属性)
other その他(MIDI等)
※from句とexpand句は併用できません。
※expand句と異なり、テーブルは1つのみ設定可能です。

◇ 音楽ファイルを取得
select name from audio


「expand 再生リスト名または固定値」部分

ライブラリ登録されている再生リスト、再生中のプレイリスト、ブックマーク等を取得元に指定します。
指定できるパターンは以下の通りです。
'再生リスト名' 登録済の再生リスト名を''で囲ってください。
%を用いると再生リスト名の部分指定ができます。
all 固定値:登録済の全ての再生リスト
random 固定値:登録済の再生リストからランダム
current 固定値:現在再生中のプレイリスト
playlistview 固定値:SQL検索画面のプレイリストビューに設定されたプレイリスト
bookmark1~20 固定値:ブックマーク1~ブックマーク20に含まれるプレイリスト。参照:ブックマーク
stackboard 固定値:スタックボード。参照:スタックボード画面
recentfiles_mix 固定値:最近使ったファイル[混合]。取得件数は設定値(最大表示件数)に依存。参照:曲の移動と再生履歴
recentfiles_audio 固定値:最近使った音楽ファイル。取得件数は設定値(最大表示件数)に依存。参照:曲の移動と再生履歴
recentfiles_video 固定値:最近使った動画ファイル。取得件数は設定値(最大表示件数)に依存。参照:曲の移動と再生履歴
recentfiles_other 固定値:最近使ったその他ファイル。保存中の履歴全てを取得。参照:曲の移動と再生履歴
recentfiles_mix_all 固定値:最近使ったファイル[混合]。保存中の履歴全てを取得。参照:曲の移動と再生履歴
recentfiles_audio_all 固定値:最近使った音楽ファイル。保存中の履歴全てを取得。参照:曲の移動と再生履歴
recentfiles_video_all 固定値:最近使った動画ファイル。保存中の履歴全てを取得。参照:曲の移動と再生履歴
recentfiles_other_all 固定値:最近使ったその他ファイル。保存中の履歴全てを取得。参照:曲の移動と再生履歴
frequentlyfiles_mix 固定値:最近再生頻度の高いファイル[混合]。取得件数は設定値(最大表示件数)に依存。参照:曲の移動と再生履歴
frequentlyfiles_audio 固定値:最近再生頻度が高い音楽ファイル。取得件数は設定値(最大表示件数)に依存。参照:曲の移動と再生履歴
frequentlyfiles_video 固定値:最近再生頻度が高い動画ファイル。取得件数は設定値(最大表示件数)に依存。参照:曲の移動と再生履歴
frequentlyfiles_other 固定値:最近再生頻度が高いその他ファイル。取得件数は設定値(最大表示件数)に依存。参照:曲の移動と再生履歴
frequentlyfiles_mix_all 固定値:最近再生頻度の高いファイル[混合]。保存中の履歴全てを取得。参照:曲の移動と再生履歴
frequentlyfiles_audio_all 固定値:最近再生頻度が高い音楽ファイル。保存中の履歴全てを取得。参照:曲の移動と再生履歴
frequentlyfiles_video_all 固定値:最近再生頻度が高い動画ファイル。保存中の履歴全てを取得。参照:曲の移動と再生履歴
frequentlyfiles_other_all 固定値:最近再生頻度が高いその他ファイル。保存中の履歴全てを取得。参照:曲の移動と再生履歴
※from句とexpand句は併用できません。
※同じファイルが複数個所に登録されている場合、マージされ1つになります。

◇ 「BestMusic」という再生リストからデータを取得
select name expand 'BestMusic'

◇ 「My List」という再生リストからデータを取得
select name expand 'My List'

◇ 「GoodSong」「BetterSong」という2つの再生リストからデータを取得
select name expand 'GoodSong', 'BetterSong'

◇ 「洋楽」から始まる再生リストからデータを取得
select name expand '洋楽%'

◇ 「2014」を含む再生リストからデータを取得
select name expand '%2014%'

◇ 全ての再生リストからデータを取得
select name expand all

◇ランダムな 再生リストからデータを取得
select name expand random

◇ 再生中のプレイリストからデータを取得
select name expand current

◇ SQL検索画面のプレイリストビューに設定されたプレイリストリストからデータを取得
select name expand playlistview

◇ 1番目のブックマークに含まれるプレイリストからデータを取得
select name expand bookmark1

◇ 15番目のブックマークに含まれるプレイリストからデータを取得
select name expand bookmark15

◇ スタックボードからデータを取得
select name expand stackboard


「select 列名,[, 列名, ...]」部分

プレイリストビューに表示する列を指定します。
ファイル出力の場合は出力する列となります。
列名は","区切りで複数登録できます。

◇ 全ての音楽ファイルを取得し、name, length列を表示
select name, length from audio

列名の代わりに"*"を指定できます。
"*"を指定した場合は、テーブル毎に組み込んだ列を表示します。
(※一般的なSQLでは指定テーブルの全列を表示しますが、本SQLは異なります)

◇ * を使う
select * from audio

また列にconvert関数が利用できます。※詳細はSQL関数を参照してください

他に、as句を使うと列に別名を設定できます。
別名内にスペース( )やカンマ(,)を使う場合は別名を''で囲ってください。

◇ name, lengthに別名を付ける
select name as タイトル, length as 時間 from audio
◇ name, lengthに別名を付ける(スペースやカンマを使う)
select name as 'なまえ,です', length as 'さいせい 時間', rating as '☆はあなたの評価です' from audio


「order by 列名 [asc|desc] [,列名 [asc|desc] ...]」部分

取得レコードのソート条件を指定します。
省略が可能です。
省略した場合はソートされません。
列名の後ろにascを指定すれば昇順、descを指定すれば降順にソートされます。
asc|descが未設定の場合は昇順にソートされます。
カンマ記号","で列を区切れば複数のソート条件が設定できます。

◇ nameを昇順でソート
order by name
order by name asc

◇ nameを降順でソート
order by name desc

◇ albumを昇順でソート、nameを降順でソート
order by album asc, name desc

特殊なソートとして[order by shuffle]または[order by random]、[order by reverse]があります。
[order by shuffle]を使うとプレイリストの並び順をシャッフル(重複なし)に並べ替えます。
[order by random]を使うとプレイリストの並び順をランダム(重複の可能性があり)に並び替えます。
[order by reverse]を使うとソート結果を逆順にします。

◇ シャッフルソート
order by shuffle

◇ ランダムソート
order by random

◇ 逆順に並べ替える
order by reverse


「where 列名 [=<>等] 値 [[and|or] 列名 [=<>等]値 ...]」部分

取得レコードの絞り込み条件を指定します。
where句は省略が可能です。
省略した場合、対象テーブルの全レコードが取得されます。
「name = 'hoge'」や「playcount > 10」のように条件を指定します。

「列名 演算子(=等) 値」の比較のみ対応しており、「値 = 列名」や
「列名1 = 列名2」のような比較はできません。


列ごとにデータ型と範囲を持っています。
データ型にはnumber(数値),string(文字列),date(日時),boolean(真偽)があります。
文字列型は「列名='値'」のように値を''で囲んでください。
日付型は「列名='2001/10/01'」や「列名='2001/10/01 22:00:00'」のように
値を''で囲み、かつ'yyyy/mm/dd'または'yyyy/mm/dd 24hh:mm:ss'形式で
記述してください。
真偽型は「列名=true」または「列名=false」のように記述してください。

データ型によって利用できる比較演算子が異なります。
数値(=,<>,<=,<.>=.>)
文字列(=,<>,like,notlike)
日付(=,<>,<=,<.>=.>)
真偽(=,<>)
このほかに(is,isnot)が全てのデータ型で利用できます。
(is,isnot)は後述のnullで説明します。

◇ nameがhoge
where name='hoge'

◇ playcountが10でない
where playcount<>10

◇ releasedateが'2010/01/01 13:00:00'以上
where releasedate>='2010/01/01 13:00:00'

◇ releasedateが'2010/01/01 00:00:00'より大きい
where releasedate>'2010/01/01'

◇ nameが'い'から始まる。
where name like 'い%'

◇ nameが'い'から始まらない
where name notlike 'い%'

◇ urlに'rock'が含まれている
where url like '%rock%'

特別な比較値としてnullがあります。
この値は"データが存在しない"事を表しています。
全てのデータ型で利用できますが、指定可能な比較演算子isまたはisnotだけです。

◇ データが未設定のreleasedateだけ取得
where releasedate is null

◇ データが設定されているartistだけ取得
where artist isnot null

なお文字列の場合は「column = ''」と「column is null」は同じ結果になります。

◇ 2つは同じ結果となる。
where album is null
where album = ''

where album isnot null
where album <> ''

複数の条件を設定する場合はandまたはorを使います。
論理演算子はand > orの優先順位です。
3つ以上の条件を設定する場合は優先順位に気を付けてください。
本スキンでは()が未対応です。

◇ playcountが10以上かつplaycountが20未満のレコードを検索
where playcount >= 10 and playcount < 20

◇ playcountが30以上またはratingが99のレコードを取得
where playcount >= 30 or rating = 99

◇ 「playcountが30以上」または「ratingが99かつnameが'あ'で始まる」レコードを取得
where playcount >= 30 or rating = 99 and name like 'あ%'

◇ 「ratingが0より大きく50以下かつnameが'b'で始まる」または「ratingが99かつnameが'a'で始まる」
◇ レコードを取得
where rating > 0 and rating <= 50 and name like 'b%' or rating = 99 and name like 'a%'


「option [totallength | top | limit | persent | randomselectfrom | expandplaylist] [値, ...]」部分

取得レコードに対するオプション操作を指定します。
option句は省略が可能です。

totallength
先頭レコードから合計再生時間[秒]指定による取得レコードの絞込み。
where句・order by句が設定している場合、その検索結果に対して絞り込みを行います。

◇ 取得レコードの合計再生時間を1時間(3600秒)以下に絞り込みます。
option totallength 3600
option totallength toMinute(60)
option totallength toHour(1)

top
先頭レコードから件数指定による取得レコードの絞込み。
where句・order by句が設定している場合、その検索結果に対して絞り込みを行います。

◇ 先頭レコードから20件取得します。
option top 20

limit
先頭レコードから位置指定[0始まり]、件数指定のによる取得レコードの絞込み。
where句・order by句が設定している場合、その検索結果に対して絞り込みを行います。

◇ 3件目のレコードから10件取得します。
option limit 2, 10 ※3, 10ではありません! "0,1,2"で3件目のレコード

persent
先頭レコードから%範囲指定による取得レコードの絞込み。
where句・order by句が設定している場合、その検索結果に対して絞り込みを行います。

◇ 再生回数が多い曲の上位25%のレコード(正確には0%~25%のレコード)を取得します。
order by playcount desc option persent 0, 25

◇ 評価の高い曲の上位5%~20%のレコードを取得します。
order by rating desc option persent 5, 20

randomselectfrom 列名
指定列名のランダムな値を使った取得レコードの絞込み。
where句・order by句が設定している場合、その検索結果に対して絞り込みを行います。
SQL関数のRandomValue()の説明も参照してください。

◇ album列に存在するランダムな値を基に、取得レコードを絞り込む
option randomselectfrom album

◇ artist列に存在するランダムな値を基に、取得レコードを絞り込む
option randomselectfrom artist

expandplaylist
from playlistを指定したとき限定。
selectを実行すると通常はメディアファイルが取得されますが、
from playlistの場合は、プレイリストビュー上にツリー構造にメディアファイルが表示されています。
このプレイリストを通常のselectと同じようにフラットな状態に展開します

+プレイリスト1
+--メディア1-1
+プレイリスト2
+--メディア2-1
+--メディア2-2
 ↓
メディア1-1
メディア2-1
メディア2-2

◇ from playlistで全ての再生リストを取得し、プレイリストビュー上にフラットに展開します。
select * from playlist option expandplaylist

◇ from playlistで全ての再生リストを取得(option expandplaylistを使わない場合)
◇ ※↑のSQLと実行結果を比較してみてください。
select * from playlist


レコードの抽出条件の注意点や制約


条件式の記述順

  • [列名][比較演算子][値]の順で記述してください。
  • 一般的なSQLでは、[値][比較演算子][列名]や[列名][比較演算子][列名]などの可能ですが、本スキンは未対応です。

○ where name = 'aaa'
× where 'aaa' = name
× where name = album

複数条件設定について

現機能では()に未対応です。
論理演算子はand > orの優先順位です。
○ where name='aaa'
○ where name='aaa' and playcount>10
○ where name='aaa' or name='bbb'
○ where name='aaa' or name='bbb' and playcount>10
× where (name='aaa' or name='bbb') and playcount>10 ◇ ()に未対応

null比較

一般的なSQLではnullでない場合、[is not]と記述しますが本SQLでは[isnot]と記述します。
○ where name isnot null
× where name is not null

文字列

文字列データの比較で'を値に含めたいときは''と記述してください。
○ where name = 'I''m a student.'
× where name = 'I'm a student.'

検索時に大文字・小文字の区別はしません
name = 'you'
name = 'You'
name = 'YOU'
上記の検索結果の場合、大文字・小文字関係なくyouというnameを検索します。
なお文字列のデータ比較の詳細は後述しています。

後方一致(name like '%xyz')はサポートしていません。

一般的なSQLでは部分一致しない場合、[not like]と記述しますが、
本SQLでは[notlike]と記述します。
○ name notlike 'あ%'
× name not like 'あ%'

WHERE句利用時の補足


length 秒単位
◇ 10秒以上
length >= 10
◇ 2分以上
length >= 120
length >= toMinute(2)
◇ 1時間以上
length >= 3600
length >= toHour(1)
※to~関数についての詳細は、SQL関数を参照してください

freamrate fps単位
◇ 20fps以上
freamrate >= 20

filesize バイト単位
◇ 1KB以上
filesize >= 1024
filesize >= toKB(1)
◇ 1MB以上(1024*1024 = 1048576 byte)
filesize >= 1048576
filesize >= toMB(1)
◇ 1GB以上(1024*1024*1024 = 1073741824 byte)
filesize >= 1073741824
filesize >= toGB(1)
※to~関数についての詳細は、SQL関数を参照してください

rating 特殊設定(ratingautoも()内の数値以外は同じ)
☆0 0(0)
☆1 1-12(1)
☆2 13-37(25)
☆3 38-62(50)
☆4 63-86(75)
☆5 87-99(99)
◇ ☆2つを指定(確実に取得したい場合)
rating >= 13 and rating <= 37
◇ ☆2つを指定(ratingの場合データ不整合なければこちらでもOK。ratingautoの場合は70などの場合もある)
rating = 25
◇ toStar関数で☆4以上を指定
rating >= toStar(4)
※to~関数についての詳細は、SQL関数を参照してください

日付型(lastplayeddate, adddateなど)

◇ 日付指定
lastplayeddate >= '2011/01/01'
◇ 日時指定
lastplayeddate >= '2011/01/01 15:01:09'
◇ today系関数で指定 ※詳細はSQL関数を参照してください
lastplayeddate >= TodayFirst()

現在再生中のメディアの該当する属性値を利用する

◇ 現在再生中のメディアのアーティストの属性値を指定
artist = CurrentValue()
◇ 現在再生中のメディアの再生時間よりも長い曲を指定
length >= CurrentValue()

ランダムな値を利用する

◇ artistにランダムな値を設定する
artist = RandomValue()


四則演算・()・in・between・not・サブクエリ・count(*)・max()・group by等について

未対応です。


データ比較について(where句)

  • データ比較は「大文字・小文字は区別しない」「全角・半角は区別する」「ひらがな、カタカナは区別する」という仕様になっています。
  • order by句(後述)とデータ比較方法が異なるので注意してください。
  • where句は、MS提供コンポーネント(Queryオブジェクト)を使ってデータ取得を行っている為、MS仕様に準じています。
  • Windows8-Windows Media Player 12で確認した結果なので例えばWindows Media Player 11では異なる仕様となるかもしれません。

◇ 上と下は同じ結果になる
where name = 'abcd'
where name = 'ABcD'

◇ 上と下は別の結果になる
where name = 'Aあ'
where name = 'Aア'


ソート順について(order by句)

  • 数値型データは数値として判定
  • 真偽型データは文字として判定
  • 日付型データは1970年からの経過時間を基に判定
  • 文字列型データはエクスプローラに近いソート
    • 大文字・小文字を区別しない
    • 全角・半角を区別しない
    • ひらがな、カタカナを区別しない
    • ハイフン(-)は無視。
    • 文字列内の数値は数値として扱う。
    • SJISコードでソート。
    • etc.

where句(前述)とデータ比較方法が異なるので注意してください。

◇audioのname列(文字列)に下のようなレコードがある時に...
AbcdE
bgm10
ABCD
BGM01
bgm2
あまい
abefg
かたち
イス
王国
影(音読み:エイ、訓読み:かげ)

◇ nameを昇順ソート検索を行うと...
select name from audio order by name asc

◇こんな感じにソートされます。
ABCD
AbcdE
abefg
BGM01
bgm2
bgm10
あまい
イス
かたち
影(音読み:エイ、訓読み:かげ)
王国


その他の制約

  • Windows Media Player 11以降に提供されている組込み関数を内部で使用している為、Windows Media Player 11以降でなければ動作しません。
    ※本スキンはWindows Media Player 11以降にのみ対応しています。
    ※動作確認は主にWindows8-Windows Media Player 12で行っています。
    OSとWindows Media Playerとの組合せによって使用不可の列があるようです。
  • selectの列数が多い場合、プレイリストビューに表示しきれず、指定列の一部が表示されない可能性があります。(Windows Media Playerの仕様?)
    初めての検索時や全件出力等の重たい処理により数分間、Windows Media Playerが固まる事があります。
    歌詞・コメントなど幾つかの列はWindows Media Playerの組込み関数内でwhere句の処理ができない為、スキン側で代替処理を行っています。これら列のwhere句による条件指定は、他の列と比べて著しく処理が遅くなる場合があります。
  • 結果タブへ検索結果を出力する場合はプレイリストビューへの出力に比べて、処理が重くなります。取得レコード件数や表示列数が多い場合は、非常に時間がかかります。特に「タブ区切り」の場合、Windows Media Playerが数分~数十分固まる程、処理時間がかかります。
  • expand句による再生リスト指定は非常に重くなることがあります。
  • 実行履歴は本スキンの終了またはWindows Media Playerの終了により消去されます。
  • システム的な制約があるため、実行したSQLを保存する機能は作らない事にしました。SQL文を残したい場合、メモ帳などを使い手動でバックアップを取ってください。
最終更新:2016年12月30日 12:35