https://sites.google.com/ogiso.net/chj-bootcamp/2019

SQL(1) SELECT文の基本

関係データベースとSQL

関係データベース(リレーショナルデータベース:RDB)

用語

テーブル
列名1列名2列名3
レコード1
レコード2

SQLとは

データベース問い合わせ言語

SQLの書式など(Microsoft SQL Server の場合)

CHJデータベースの利用

SELECT文

とりあえずこれだけ!覚える

WHERE条件句

LIKE 演算子とワイルドカード

ORDER BY 句(並べ替え)

CHJBootCamp2018

SQL(2) グループ化、表の結合

グループ化と集計

グループ化: GROUP BY 句

ORDER BY 句 (復習)

COUNT():集計関数

表の結合

書誌情報テーブルと結合

短単位・長単位テーブルを結合(外部結合)

応用:構成要素として助動詞を含む長単位名詞

select s.サンプルID,s.連番,s.語彙素,l.キー,l.語彙素 from 長単位 as l
inner join 短単位 as s
 on s.サンプルID=l.サンプルID
  and s._文字開始位置>=l._文字開始位置
  and s._文字開始位置<l._文字終了位置
where s.サブコーパス名='平安'
and s.品詞 like '助動詞%' and l.品詞 like '名詞%'

【補足】

表の結合と集計

SQL(3) コーパスデータの扱い

関数のいろいろ

組み込み関数

文字列関数

KWIC生成関数(ユーザー定義関数)

select top 100 dbo.fn前文脈(サンプルID,出現書字形開始位置,20),キー,dbo.fn後文脈(サンプルID,出現書字形開始位置,20) from 短単位
select top 100 サンプルID,dbo.fn前文脈(サンプルID,出現書字形開始位置,20),キー,dbo.fn後文脈(サンプルID,出現書字形開始位置,20),語彙素,語彙素読み,品詞 from 短単位
where 語彙素 like '鰻'

BCCWJデータを使うには

use chunagon_bccwj

CASE式をつかった集計

 select 作品名, count(*) as 総語数,sum(CASE WHEN 本文種別='歌' THEN 1 ELSE 0 END) as 歌語数
 from 短単位 as S inner join 書誌情報 as B on S.サンプルID=B.サンプルID
 where S.サブコーパス名 like '平安'
 group by 作品名

連続する語の取り出し

N-gram

【追補】N語以内の指定

文数・文節数・語数

select 作品名--,S.本文種別
,sum(case when S.文境界 = 'B' then 1 else 0 end) as 文数
,sum(case when 文節='B' then 1 else 0 end) as 文節数
,count(L.語彙素) as 長単位数
,count(S.語彙素) as 短単位数
from 短単位 as S inner join 書誌情報 as B on S.サンプルID = B.サンプルID
left join 長単位 as L on S.サンプルID = L.サンプルID and S._文字開始位置 = L._文字開始位置
where B.サブコーパス名 like '平安'
group by B.作品名--,S.本文種別

文番号の利用

select s1.サンプルID,s1.出現書字形開始位置,
dbo.fn前文脈(s1.サンプルID,s1.出現書字形開始位置,30),s1.キー,dbo.fn後文脈(s1.サンプルID,s1.出現書字形開始位置,30),s1.語彙素,s1.語彙素読み,s1.原文文字列
from 短単位 as s1
inner join 短単位 as s2 on s1.サンプルID=s2.サンプルID and s1._文番号 = s2._文番号
where s1.語彙素 like '秋'  and s2.語彙素 like '夕%' 
order by s1.サンプルID,s1.出現書字形開始位置

サブクエリ

括弧でくくったSELECT文に名前を付けて、あたかもテーブルであるかのように扱える

一時テーブルの作成

応用例:記号を含まない短単位テーブルを作る

select ROW_NUMBER() OVER (PARTITION BY サンプルID ORDER BY サンプルID,連番) *10 as 新連番, *
into #記号なし短単位
from 短単位 where サブコーパス名='平安'
and 品詞 not like '%記号%' and 品詞 != '空白'
select * from #記号なし短単位 ORDER BY サンプルID,新連番

(参考)辞書データベース(unidicSQL)

辞書の階層化された見出し表を扱う

use unidicSQL

コーパスと辞書を繋ぐ


*1 「中納言」で使えるものと同じ。正規表現とは異なる
*2 DESCを付けると逆順(降順)に出力
*3 BCCWJにおけるサブコーパスは、出版/図書館/特定目的の別。

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS