楼主: sunbeking

postgresql入门(日文的)

[复制链接]
论坛徽章:
21
ITPUB元老
日期:2005-05-10 17:20:252012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:58马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:10:58
11#
 楼主| 发表于 2005-3-23 18:03 | 只看该作者
PostgreSQL 編11 - 問い合わせ、集計、平均、最大、最小、重複、集合、複合

■集計問い合わせ(合計値)

  ・集計問い合わせを行うには、group by 句を使用する。
    この例では、key の先頭が「a」で始まる明細を key 単位に集計(サマリー)
    し、data1 の合計が 10 以上のものを問い合わせる。
    having 句は、集計後の結果に対して抽出条件が指定できる。

select key, sum(data1) from testm
  where key like 'a%'
  group by key
  having sum(data1) >= 10
;

  ・count() を使用すると、合計件数が問い合わせられる。
    (問い合わせ件数表示、照会件数表示、抽出件数)
    この例では、key 単位に集計し、data1 の合計が 10 以上のものを
    問い合わせる。

select key, count(*), sum(data1) from testm
  group by key
;

   key    | count | sum
----------+-------+-----
a001     |     1 |   1
a011     |     1 |   1
b002     |     1 |  10
c003     |     1 | 100

  ・単純に特定の明細のレコード件数を問い合わせるときは、次のように使用す
    る。この例では、key の先頭が「a」で始まる明細の件数が得られる。

select count(*) from testm
  where key like 'a%'
;

count
-------
     2

  ・avg を使用すると平均を問い合わせることができる。
    この例では、key 毎の data1 の平均が得られる。

select key, avg(data1) from testm
  group by key
;

   key    |      avg
----------+----------------
a001     |   1.0000000000
a011     |   1.0000000000
b002     |  10.0000000000
c003     | 100.0000000000

  ・max、min を使用すると最大値と最長値を問い合わせることができる。
    この例では、key 毎の data1 の最大と最小が得られる。

select key, max(data1), min(data1) from testm
  group by key
;

   key    | max | min
----------+-----+-----
a001     |   1 |   1
a011     |   1 |   1
b002     |  10 |  10
c003     | 100 | 100

■重複レコード除去(重複レコード削除)

  ・testm のキーがユニークでないと仮定すると、同じキーのレコードが複数
    存在する事になる。
    distinct を指定すると重複レコードを取り除いて問い合わせできる。
    distinct の代わりに unique と Oracle のように指定することはできない。
    (重複データ)

select distinct key
  from testm
;

   key
----------
a001
a011
b002
c003

■集合問い合わせ

  ・union all を使用すると問い合わせ結果をマージできる。
    この例では、testm と testmsv の key の先頭が「a」で始まるものが問い
    合わされる。union all の代わりに union とだけ指定すると、重複レコード
    は含まれない。(表を合わせ、付け足す)

select * from testm
  where key like 'a%'
union all
select * from testmsv
  where key like 'a%'
;

select * from testm
  where key like 'a%'
union all
select * from testm
  where key like 'a%'
;

   key    | data1 | data2 | data3
----------+-------+-------+-------
a001     |     1 |     2 |     3
a011     |     1 |     2 |     3
a001     |     1 |     2 |     3
a011     |     1 |     2 |     3

select * from testm
  where key like 'a%'
union
select * from testm
  where key like 'a%'
;

   key    | data1 | data2 | data3
----------+-------+-------+-------
a001     |     1 |     2 |     3
a011     |     1 |     2 |     3

■集合差問い合わせ

  ・minus、minus all は、PostgreSQL では使用できない。

■集合結合問い合わせ

  ・intersect を使用すると両方の問い合わせ共通に戻されるレコードだけが
    戻る。

select * from testm
  where key like 'a%'
intersect
select * from testm
  where key = 'a001'
;

   key    | data1 | data2 | data3
----------+-------+-------+-------
a001     |     1 |     2 |     3

■複合問い合わせ

  ・in を使用すると副問い合わせの結果で、問い合わせることができる。
    この例では、test2m の code1 の先頭が「a」で始まるものから重複レコード
    を除いて、testm の key を抽出している。
    (副問合せ、サブクエリ、副参照、複問い合わせ、副 select 文)

select * from testm
  where key in
  (select distinct code1 from test2m where code1 like 'a%')
;

   key    | data1 | data2 | data3
----------+-------+-------+-------
a001     |     1 |     2 |     3
a011     |     1 |     2 |     3

  ・この例では、test2m の code1 の先頭が「a」で始まるものから重複レコード
    を除いて、その結果以外の testm の key を抽出している。

select * from testm
  where key not in
  (select distinct code1 from test2m where code1 like 'a%')
;

   key    | data1 | data2 | data3
----------+-------+-------+-------
b002     |    10 |    20 |    30
c003     |   100 |   200 |   300

  ・any は、副問い合わせのいずれかと言う条件になる。
    この例では、副問い合わせのいずれかより大きければ抽出される。
    但し、この例は悪い。現実的な使い方をして下さい。

select * from testm
  where key > any
  (select distinct code1 from test2m where code1 like 'a%')
;

   key    | data1 | data2 | data3
----------+-------+-------+-------
a011     |     1 |     2 |     3
b002     |    10 |    20 |    30
c003     |   100 |   200 |   300

  ・all は、副問い合わせの全てにと言う条件になる。
    この例では、副問い合わせの全てより大きければ抽出される。
    但し、この例は悪い。現実的な使い方をして下さい。

select * from testm
  where key > all
  (select distinct code1 from test2m where code1 like 'a%')
;

   key    | data1 | data2 | data3
----------+-------+-------+-------
b002     |    10 |    20 |    30
c003     |   100 |   200 |   300

  ・例えば、同じ品番の内で、最大の受注数レコードだけを得るには、
    次のように all を使用する。
    このような問い合わせを、相関問い合わせ、相関副問い合わせと呼ぶらしい。
    副問い合わせのパラメタに主問い合わせの項目が使用されるからだろうか。

select * from 受注m a
  where a.受注数 >= all
  (select 受注数 from 受注m b where b.品番 = a.品番)
;

  ・例えば、同じ品番の内で、最新の受注日のレコードだけを得るには、
    次のように all を使用する。(最新日付抽出)

select * from 受注m a
  where a.受注日 >= all
  (select 受注日 from 受注m b where b.品番 = a.品番)
;

  ・副問い合わせから、更に問い合わせることもできる。
    この例では、最初に品番の先頭が「a」で始まるものを抽出して、その結果
    に対して、受注数 が 1 以上の抽出を行っている。
    但し、この例の結果なら、もっと簡単に一度に求められる。
    from 句に副問い合わせを使うことをインラインビューと呼ぶらしい。

select * from
  (select * from testm where key like 'a%') a
  where a.data3 >= 1
;

   key    | data1 | data2 | data3
----------+-------+-------+-------
a001     |     1 |     2 |     3
a011     |     1 |     2 |     3

使用道具 举报

回复
论坛徽章:
21
ITPUB元老
日期:2005-05-10 17:20:252012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:58马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:10:58
12#
 楼主| 发表于 2005-3-23 18:04 | 只看该作者
PostgreSQL 編12 - 数値関数、余り、四捨五入、切り捨て、切り上げ、数値書式

■絶対値

  ・abs() 関数は、絶対値を返す。

select abs(-123);

abs
-----
123

select key, abs(data1) from testm;

■余り

  ・mod() 関数は、余りを返す。

select mod(123, 10);

mod
-----
   3

select key, mod(data1, 10.0) from testm;

■四捨五入

  ・round() 関数は、四捨五入結果を返す。

select round(10.345, 2);

round
-------
10.35

select key, round(data1, 2) from testm;

■切り捨て

  ・trunc() 関数は、切り捨て結果を返す。

select trunc(10.345, 2);

trunc
-------
10.34

select key, trunc(data1, 2) from testm;

■切り上げ

  ・trunc() に +9 すれば良いでしょう。

select trunc(10.345 + .9, 0);

trunc
-------
    11

select key, trunc(data1 + .9, 0) from testm;

■以上で最小の整数

  ・ceil() 関数は、引数に対して、それ以上で、最小の整数値を返す。
    マイナス値に対しては、四捨五入のように動作しないので注意のこと。

select
  ceil(10.345), ceil(-10.345),
  trunc(10.345 + .9, 0), trunc(-10.345 + .9, 0)
;

ceil | ceil | trunc | trunc
------+------+-------+-------
   11 |  -10 |    11 |    -9

■以下で最大の整数

  ・floor() 関数は、引数に対して、それ以下で、最小の整数値を返す。
    マイナス値に対しては、四捨五入のように動作しないので注意のこと。

select
  floor(10.345), floor(-10.345),
  trunc(10.345, 0), trunc(-10.345, 0)
;

floor | floor | trunc | trunc
------+-------+-------+-------
   10 |   -11 |    10 |   -10

■スクエアルート

  ・sqrt() 関数は、平方根を返す。

select sqrt(2.0);

      sqrt
-----------------
1.4142135623731

■べき乗r

  ・pow() 関数は、べき仱蚍丹埂

使用道具 举报

回复
论坛徽章:
21
ITPUB元老
日期:2005-05-10 17:20:252012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:58马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:10:58
13#
 楼主| 发表于 2005-3-23 18:04 | 只看该作者
PostgreSQL 編13 - 文字関数、連結、空白削除、置換、切出、検索、長さ、数値

■文字列連結

  ・「||」演算子で文字列の結合を行う。
    concat() 関数は、PostgreSQL では使用できない。

select 'abc' || 'def';

?column?
----------
abcdef

select key || data1 from testm;

■chr 文字変換

  ・chr() 関数は、コードに該当する ASCII 文字を返す。
    この例では、「1」と言う文字が返る。

select chr(49);

chr
-----
1

■ascii コード変換

  ・ascii() 関数は、文字に該当する ASCII コードを返す。
    この例では、「49」と言う数字が返る。

select ascii('1');

ascii
-------
    49

■小文字化

  ・lower() 関数は、英字を小文字にして返す。

select lower('ABC012');

lower
--------
abc012

■大文字化

  ・upper() 関数は、英字を大文字にして返す。

select upper('abc012');

upper
--------
ABC012

■左文字埋め

  ・lpad() 関数は、文字列の左に指定文字を埋めて指定数切り出します。
    (切り出し指定数になるまで繰り返し埋めます。)

select lpad('abc', 5, '0');

lpad
-------
00abc

select lpad('abc', 5, '012');

lpad
-------
01abc

  ・指定文字省略値は ' ' 半角スペースです。

select lpad('abc', 5);

lpad
-------
   abc

select lpad('abc', 5, ' ');

lpad
-------
   abc

■右文字埋め

  ・rpad() 関数は、文字列の右に指定文字を埋めて指定数切り出します。
    (切り出し指定数になるまで繰り返し埋めます。)

select rpad('abc', 5, '0');

rpad
-------
abc00

select rpad('abc', 5, '012');

rpad
-------
abc01

  ・指定文字省略値は ' ' 半角スペースです。

select rpad('abc', 5);

rpad
-------
abc

select rpad('abc', 5, ' ');

rpad
-------
abc

■左空白削除

  ・ltrim() 関数は、文字列の左側の空白を除去します。

select ltrim('          abc');

ltrim
-------
abc

■右空白削除

  ・rtrim() 関数は、文字列の右側の空白を除去します。

select ltrim('abc          ');

     ltrim
---------------
abc

■左右空白削除

  ・trim() 関数は、文字列の左右の空白を除去します。

select trim('          abc          ');

btrim
-------
abc

■文字列置き換え

  ・translate() 関数は、凝った文字列の置き換えをする。

select translate('abc012', '0123456789abc', '0000000000AAA');

translate
-----------
AAA000

  ・カットもできる。この例では、「000」が返る。

select translate('abc012', '0123456789abc', '0000000000');

translate
-----------
000

■文字列切り出し

  ・substr() 関数は、文字列の切り出しをする。

select substr('abc012', 3, 2);

substr
--------
c0

  ・開始位置以降、最後まで切り出す場合は、切り出す文字数を省略できる。

select substr('abc012', 3);

substr
--------
c012

■文字列検索

  ・strpos() 関数は、文字列の検索を行う。
    開始位置や後方検索の指定は、PostgreSQL ではできない。

select strpos('abc012', 'c0');

strpos
--------
      3

■文字列の長さ

  ・length() 関数は、文字列の長さを返す。
    octet_length() 関数は、バイトで返します。

select length('abc012');

length
--------
      6

■文字列繰り返し

  ・repeat() 関数は、文字列を繰り返し返す。

select repeat('abc012', 2);

    repeat
--------------
abc012abc012

■数値から文字列へ変換 (数値フォーマット、書式変換)

  ・to_char() 関数は、数値を文字列型に変換します。
    単純な to_char(123456) は、明示的にする必要がないようです。
    「数値 || 数値」すると自動的に文字変換され結合されます。

select 123456 || 789012;

   ?column?
--------------
123456789012

  ・三桁毎に数値にカンマ「,」を入れたい場合、次のようにします。

select to_char(123456, '999,999,999,999');

     to_char
------------------
          123,456

  ・小数点以下をフォーマットする場合は、次のようにします。

select to_char(123456, '999,999,999,999.99');

       to_char
---------------------
          123,456.00

  ・ゼロ埋め(0 埋め) フォーマットする場合は、次のようにします。

select to_char(123456, '000000000000');

    to_char
---------------
  000000123456

■文字列から数値へ変換

  ・to_number() 関数は、文字列を数値に変換します。

select to_number('00123456', '000000000000');

to_number
-----------
    123456

select to_number('123,456', '999,999,999,999');

to_number
-----------
    123456

select to_number('123' || '456', '999999999999');

to_number
-----------
    123456

■型変換

  ・cast() 関数は、ANSI 規程の変換関数です。

select cast('123' || '456' as int8);

  int8
--------
123456

使用道具 举报

回复
论坛徽章:
21
ITPUB元老
日期:2005-05-10 17:20:252012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:58马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:10:58
14#
 楼主| 发表于 2005-3-23 18:05 | 只看该作者
PostgreSQL 編14 - 日付関数、システム日付、切捨、日付差、日付加算、書式

■システム日付、システム時間

  ・current_timestamp() 関数は、システム日付(サーバ日付) を返す。
    時間部分に秒以下がある。

select current_date;

    date
------------
2002-11-03

select current_time;

       timetz
--------------------
02:46:07.950125+09

select current_timestamp;

          timestamptz
-------------------------------
2002-11-03 02:46:29.970125+09

select now();

              now
-------------------------------
2002-11-03 02:53:21.060125+09

select to_char(current_timestamp, 'yyyy.mm.dd hh24:mi:ss');

       to_char
---------------------
2002.11.03 02:47:17

■日付切り捨て

  ・date_trunc() 関数は、タイムスタンプを切り捨てる。

select date_trunc('hour', current_timestamp);
                   |_ year    年
                      month   月
                      day     日
                      dow     曜日(0 日曜)
                      hour    時
                      minute  分
                      second  秒
                      week    週
                      quarter 四半期
                      doy     年間通算日(うるう年は 366 日まで)
                      epoch   1970.01.01 からの通算秒

       date_trunc
------------------------
2002-11-03 03:00:00+09

■日付の差 (日付間隔、日付範囲)

  ・PostgreSQL では、months_between() は使えない。
    単純な四則演算で変換計算されるようである。
    (日付計算、日数計算、カレンダー計算)

select current_timestamp -
  to_timestamp('2002.11.01 00:00:00', 'yyyy.mm.dd hh24:mi:ss');

        ?column?
------------------------
2 days 02:56:21.136125

■日付の加算

  ・PostgreSQL では、add_months() は使えない。
    (日付計算、日数計算、カレンダー計算)

select current_timestamp + 1;

  ?column?
------------
2002-11-04

select current_timestamp + '1 days';

■次の曜日

  ・PostgreSQL では、next_day() は使えない。
    ストアド等で計算かな。
    尚、曜日は date_part で求められる。

select date_part('dow', current_timestamp);
                  |_ 曜日(0 が日曜)

date_part
-----------
         0

■月末日

  ・PostgreSQL では、last_day() は使えない。
    ストアド等で計算かな。

■年齢、勤続

  ・age() 関数は、年齢や勤続を求めます。

select age(current_timestamp, '1958-01-26');

                  age
----------------------------------------
44 years 9 mons 8 days 03:46:33.548125

■日付型へ変換(書式変換、日付変換)

  ・to_date() 関数は、文字日付を日付型に変換します。
    to_timestamp() 関数は、時間も含みます。(to_time はない。)
    時間部分は、HH24:MI:SS 等の書式を使います。
    Oracle の 「RR」書式は使えない。

select to_date('20010712', 'YYYYMMDD');

  to_date
------------
2001-07-12

select to_timestamp('04:16:00', 'HH24:MI:SS');

    to_timestamp
---------------------
0001-01-01 04:16 BC

select to_date('2001.07.12', 'YYYY.MM.DD');

select to_timestamp('2002.11.03 04:16:00', 'YYYY.MM.DD HH24:MI:SS');

      to_timestamp
------------------------
2002-11-03 04:16:00+09

  ・5 日後を計算するなら、次のようにします。

select to_date('2001.07.12', 'YYYY.MM.DD') + 5;

  ?column?
------------
2001-07-17

  ・5 日後を計算して文字型にするなら、次のようにします。

select to_char(to_date('20010712', 'YYYYMMDD') + 5, 'yyyy/mm/dd');

  to_char
------------
2001/07/17

select to_char(to_date('2001.07.12', 'YYYY.MM.DD') + 5, 'yyyy.mm.dd');

  to_char
------------
2001.07.17

select to_char(to_date('01/07/12', 'RR/MM/DD') + 5, 'yy/mm/dd');

to_char
----------
00/07/17

  ・元もとが日付型なら、次のようになります。

select to_char(now() + 5, 'yyyy/mm/dd');

  to_char
------------
2002/11/08

  ・曜日書式は、次のようになります。

select to_char(now(), 'yyyy.mm.dd Dy hh24:mi:ss');

         to_char
-------------------------
2002.11.03 Sun 04:26:01

■型変換

  ・cast() 関数は、ANSI 規程の変換関数です。

select cast('99-01-01' as date);

    date
------------
1999-01-01

使用道具 举报

回复
论坛徽章:
21
ITPUB元老
日期:2005-05-10 17:20:252012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:58马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:10:58
15#
 楼主| 发表于 2005-3-23 18:06 | 只看该作者
PostgreSQL 編15 - 特殊関数、多重判定、ヌル判定、ヌル比較、case、nullif

■多重判定

  ・Oracle と同じように case が使えるので非常に強力である。
    尚、Oracle で言う decode は PostgreSQL では encode とセットの別の
    関数になっているので注意する。

select key,
  case
    when key = 'a001' then 'aaa'
    when key = 'b002' then 'bbb'
    when key = 'c003' then 'ccc'
    else 'xxx'
  end
  from testm
;

   key    | case
----------+------
a001     | aaa
a011     | xxx
b002     | bbb
c003     | ccc

select key,
  case key
    when 'a001' then 'aaa'
    when 'b002' then 'bbb'
    when 'c003' then 'ccc'
    else 'xxx'
  end
  from testm
;

select key,
  case key
    when 'a001' then (select b.key from test2m b where b.code1 = a.key)
    when 'b002' then 'bbb'
    when 'c003' then 'ccc'
    else 'xxx'
  end
  from testm a
;

   key    |   case
----------+----------
a001     | abc01
a011     | xxx
b002     | bbb
c003     | ccc

■ヌル判定

  ・coalesce() 関数は、最初の null でないデータを返す。

select coalesce(null, 'abc', 'def');

case
------
abc

■ヌル比較

  ・nullif() 関数は、等しければ null が、等しくなければデータ1 が返る。
    次の例は、null が返る。

select nullif('abc', 'abc');

case
------

  ・次の例は、'abc' が返る。

select nullif('abc', 'def') ;

case
------
abc

使用道具 举报

回复
论坛徽章:
21
ITPUB元老
日期:2005-05-10 17:20:252012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:58马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:10:58
16#
 楼主| 发表于 2005-3-23 18:06 | 只看该作者
PostgreSQL 編16 - 日付計算、曜日、月末日、時間計算、期間計算、日付抽出

■年の演算(年加算、年減算)

  ・年の演算を行うには、次のようにする。

select current_timestamp + '1 years';

          ?column?
-----------------------------
2003-11-03 17:26:35.4905+09

select current_timestamp + '-1 years';

          ?column?
-----------------------------
2001-11-03 17:27:12.8085+09

■月の演算(月加算、月減算)

  ・月の演算を行うには、次のようにする。

select current_timestamp + '1 months';

          ?column?
-----------------------------
2002-12-03 17:28:15.5505+09

select current_timestamp + '-1 months';

          ?column?
-----------------------------
2002-10-03 17:28:29.1925+09

■曜日の演算(曜日計算)

  ・次の週を計算するには、、次のようにする。
    前の週を計算するには、更に -7 すれば良い。
    これは、もっとシンプルな数式で実現できるかも。
    3 が求める曜日(ここでは 3 水曜日) である。

select
  case
    when 3 - date_part('dow', current_timestamp) < 0 then current_timestamp + 3 + 7 - date_part('dow', current_timestamp)
    else current_timestamp + 3 - date_part('dow', current_timestamp)
  end
;

    case
------------
2002-11-06

■週の演算(週加算、週減算)

  ・週の演算を行うには、次のようにする。

select current_timestamp + '1 weeks';

          ?column?
-----------------------------
2002-11-10 18:19:03.7065+09

select current_timestamp + '-1 weeks';

          ?column?
-----------------------------
2002-10-27 18:19:13.7865+09

■月末日の演算

  ・月末日を求めるには、次のようにする。
    これも、もっとシンプルな方法がありそうである。

select
  case date_part('month', current_timestamp)
    when 1 then 31
    when 2 then
      case date_part('doy', to_date(to_char(current_timestamp, 'yyyy-12-31'), 'yyyy-mm-dd'))
        when 365 then 28
        else 29
      end
    when 3 then 31
    when 4 then 30
    when 5 then 31
    when 6 then 30
    when 7 then 31
    when 8 then 31
    when 9 then 30
    when 10 then 31
    when 11 then 30
    when 12 then 31
  end
;

case
------
   30

■日の演算(日加算、日減算)

  ・うるう年や大の月、小の月も考えなくて良い。

select current_timestamp + '1 days';

          ?column?
-----------------------------
2002-11-04 18:40:37.4885+09

select current_timestamp + '-1 days';

          ?column?
-----------------------------
2002-11-02 18:40:48.1375+09

■日の 0 時

  ・0 時に切り捨てるには、次のようにする。

select date_trunc('day', current_timestamp);

       date_trunc
------------------------
2002-11-03 00:00:00+09


■時間の演算(時間加算、時間減算)

  ・date 型、小数部で時間を管理している。

select current_timestamp + '1 hours';

          ?column?
-----------------------------
2002-11-03 19:42:31.8685+09

select current_timestamp + '-1 hours';

          ?column?
-----------------------------
2002-11-03 17:42:41.8175+09

■分の演算(分加算、分減算)

  ・date 型、小数部で時間を管理しているので、24 * 60 = 1440 が分の単位と
    なる。

select current_timestamp + '60 minutes';

          ?column?
-----------------------------
2002-11-03 19:43:29.5455+09

select current_timestamp + '-60 minutes';

          ?column?
-----------------------------
2002-11-03 17:43:40.3245+09

■秒の演算(秒加算、秒減算)

  ・date 型、小数部で時間を管理しているので、1440 * 60 = 86400 が秒の
    単位となる。

select current_timestamp + '3600 seconds';

          ?column?
-----------------------------
2002-11-03 19:44:17.7585+09

select current_timestamp + '-3600 seconds';

          ?column?
-----------------------------
2002-11-03 17:44:28.1725+09

■日付間隔、時間間隔、期間計算、時間計算、経過日数、期間内日数

  ・日付や時間の間隔を計算するには、次のようにする。

select current_timestamp - date '2001-01-01';

           ?column?
------------------------------
671 days 18:45:51.3175000027

  ・経過年数計算、勤続年数計算、年齢計算は、age を使用する。

select age(current_timestamp, date '2001-01-01');

                 age
-------------------------------------
1 year 10 mons 2 days 18:47:03.1305

■日付抽出、日付比較、日付判定、時間抽出、時間比較、時間判定

  ・日付の範囲や時間の範囲でレコードを抽出するには、次のようにする。
    日付に索引が付けてあるかにもよるが、一般的にも like より、日付として
    の抽出の方が高速と思う。
    (Date 型比較、日付型比較、日付大小比較、日付範囲指定)
    (日付データ抽出、日付検索、期間指定、期間範囲、期間集計、期間検索)

create table test3m (
  key   char(8),
  data1 int8,
  jcdt  timestamp
);

insert into test3m values ('a001', 1, '2001-01-01');
insert into test3m values ('a001', 1, '2002-01-01');
insert into test3m values ('a001', 1, '2002-06-01');
insert into test3m values ('a001', 1, '2002-12-01');
insert into test3m values ('a001', 1, '2003-01-01');

select * from test3m
  where jcdt between date '2002-01-01' and date '2002-12-31';

select * from test3m
  where jcdt between '2002-01-01' and '2002-12-31';

   key    | data1 |          jcdt
----------+-------+------------------------
a001     |     1 | 2002-01-01 00:00:00+09
a001     |     1 | 2002-06-01 00:00:00+09
a001     |     1 | 2002-12-01 00:00:00+09

select * from test3m
  where jcdt >= '2002-01-01';

   key    | data1 |          jcdt
----------+-------+------------------------
a001     |     1 | 2002-01-01 00:00:00+09
a001     |     1 | 2002-06-01 00:00:00+09
a001     |     1 | 2002-12-01 00:00:00+09
a001     |     1 | 2003-01-01 00:00:00+09


select * from test3m
  where date_trunc('month', jcdt) = '2002-06-01';

   key    | data1 |          jcdt
----------+-------+------------------------
a001     |     1 | 2002-06-01 00:00:00+09

select * from test3m
  where to_char(jcdt, 'yyyy.mm.dd hh24:mi:ss') like '2001%';

   key    | data1 |          jcdt
----------+-------+------------------------
a001     |     1 | 2001-01-01 00:00:00+09

使用道具 举报

回复
论坛徽章:
21
ITPUB元老
日期:2005-05-10 17:20:252012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:58马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:10:58
17#
 楼主| 发表于 2005-3-23 18:07 | 只看该作者
PostgreSQL 編17 - 問い合わせ、テーブルリスト、ユーザリスト、テーブル構造

■テーブルリスト

  ・テーブル一覧などを問い合わせることができる。
    (すべてのテーブル、全てのテーブル、登録されているテーブル、表一覧、テーブル名表示)
    (すべてのビュー、全てのビュー、登録されているビュー、ビュー一覧)
    (すべてのパッケージ、全てのパッケージ、登録されているパッケージ、パッケージ一覧)
    (すべてのストアドプロシジャ、全てのストアドプロシジャ)
    (登録されているストアドプロシジャ、ストアドプロシジャ一覧)

select * from pg_tables where not tablename like 'pg%' order by tablename;

tablename | tableowner | hasindexes | hasrules | hastriggers
-----------+------------+------------+----------+-------------
test2m    | sak        | f          | f        | f
test3m    | sak        | f          | f        | f
testm     | sak        | f          | f        | f

select * from pg_tables where tableowner = 'sak' order by tablename;

  ・目的に合わせて次のカタログが利用できる。

pg_indexes
pg_rules
pg_tables
pg_user
pg_views

select * from pg_tables where tablename like 'pg%' order by tablename;

pg_aggregate
pg_am
pg_amop
pg_amproc
pg_attrdef
pg_attribute
pg_class
pg_database
pg_description
pg_group
pg_index
pg_inherits
pg_language
pg_largeobject
pg_listener
pg_opclass
pg_operator
pg_proc
pg_relcheck
pg_rewrite
pg_shadow
pg_statistic
pg_trigger
pg_type
pg_xactlock

■データベースリスト

  ・データベースリストを問い合わせることができる。

select datname from pg_database order by datname;

  datname
-----------
sak
template0
template1

■ユーザリスト

  ・ユーザリストを問い合わせることができる。

select usename from pg_user order by usename;

    usename
---------------
administrator

■テーブル構造リスト、テーブルレイアウト

  ・特定のテーブルの定義構造を問い合わせることができる。
    (テーブル構造取得、表構造取得)

select attname, atttypid, attlen
  from pg_attribute
  where attnum > 0
    and attrelid = (select relfilenode from pg_class where relname = 'testm')
  order by attnum
;

attname | atttypid | attlen
---------+----------+--------
key     |     1042 |     -1
data1   |       20 |      8
data2   |       20 |      8
data3   |       20 |      8

■項目定義サーチ、テーブル列名参照(含まれる文字検索)

  ・同じ項目名に対する不揃いな定義をなくするには、項目でテーブル構造を
    検索して、既存の項目定義を調べると良い。
    この例では、「受注数」と言う文字列が含まれる項目定義の一覧が全て
    小文字で得られる。

select attname, atttypid, attlen,
  (select relname from pg_class where relfilenode = a.attrelid)
  from pg_attribute a
  where attnum > 0
    and attname like 'key%'
  order by attnum
;

attname | atttypid | attlen | ?column?
---------+----------+--------+----------
key     |     1042 |     -1 | testm
key     |     1042 |     -1 | test2m
key     |     1042 |     -1 | test3m

使用道具 举报

回复
论坛徽章:
21
ITPUB元老
日期:2005-05-10 17:20:252012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:58马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:10:58
18#
 楼主| 发表于 2005-3-23 18:07 | 只看该作者
PostgreSQL 編18 - テーブルコピー、レコード追加、修正、削除、表切り捨て

■テーブルコピー

  ・問い合わせ結果で、新たにテーブルを作成することができる。
    別テーブルへ移動するには、テーブルコピー後にオリジナルを delete、
    新テーブルに整合性規則を追加するか、作成済みテーブルに insert で
    select 追加すると良い。(下記のレコード追加も参照のこと。)
    (表コピー)

create table workw as
  select
    *
  from testm
  where key like 'a%'
;

select * from workw;

   key    | data1 | data2 | data3
----------+-------+-------+-------
a001     |     1 |     2 |     3
a011     |     1 |     2 |     3

  ・集合問い合わせ結果で、新たにテーブルを作成することもできる。

create table work2w as
  select
    *
  from testm
  where key like 'a%'
union all
  select
    *
  from testm
  where key like 'a%'
;

select * from work2w;

   key    | data1 | data2 | data3
----------+-------+-------+-------
a001     |     1 |     2 |     3
a011     |     1 |     2 |     3
a001     |     1 |     2 |     3
a011     |     1 |     2 |     3

  ・空のテーブルをコピーしたい場合は、ありえないキーで抽出する。

create table work3w as
  select
    *
  from testm
  where key = '@'
;

select * from work3w;

key | data1 | data2 | data3
-----+-------+-------+-------

■レコード追加(レコード更新、インサート)

  ・テーブルやビューにレコードを追加する。
    ビューについては、基本的に単純ビューでない一切の更新はできない。

insert into testm (
  key,
  data1,
  data2,
  data3
)
values (
  'a001',
  100,
  200,
  300
);

  ・追加データの並びがテーブル定義と同一であるなら、項目名を省略できる。

insert into testm values (
  'a001',
  100,
  200,
  300
);

  ・default が指定されていれば、省略で default 追加することができる。
    但し、Oracle のようにデータ値として、default と書くことはできない。
    (update でも default 指定が可能。)

create table test4m (
  key char(8),
  data1 int8,
  data2 int8,
  data3 int8 default 123
);

insert into test4m values (
  'a001',
  100,
  200
);

select * from test4m;

   key    | data1 | data2 | data3
----------+-------+-------+-------
a001     |   100 |   200 |   123

  ・入力が必須でない項目は、省略して追加も可能である。
    default 指定や not null 制約がない場合、NULL が割り当てられる。

insert into test4m values (
  'a001',
  100
);

select * from test4m;

   key    | data1 | data2 | data3
----------+-------+-------+-------
a001     |   100 |   200 |   123
a001     |   100 |       |   123

  ・問い合わせ結果を別テーブルへレコード追加することも可能である。
    別テーブルへレコード移動するには、別テーブルへレコード追加後にオリジ
    ナルを delete すると良い。(上記のテーブルコピーも参照のこと。)
    (副問い合わせ、レコードコピー)

insert into workw
  select
    key,
    data1,
    data2,
    data3
  from testm where key like 'a%'
;

  ・特定の項目を固定値にしたりもできる。

insert into workw
  select
    key,
    data1,
    data2,
    111
  from testm where key like 'a%'
;

  ・特定の項目だけをセットすることもできる。

insert into workw
  select
    key,
    data2
  from testm where key like 'a%'
;

  ・NULL を項目にセットすることもできる。
    もちろん、not null 制約があれば、NULL をセットすることはできない。

insert into testm (
  key,
  data1,
  data2,
  data3
)
values (
  'a001',
  100,
  200,
  NULL
);

  ・データ中にシングルコーテーション「'」を含める場合は、「''」と 2 個
    続けて書くと 1 個の「'」が文字として入る。

insert into testm (
  key,
  data1,
  data2,
  data3
)
values (
  'a0''1',
  100,
  200,
  300
);

■レコード修正(レコード更新、アップデート)

  ・テーブルやビューのレコードを修正する。
    ビューについては、基本的に単純ビューでない一切の更新はできない。
    where 句には select と同様に複雑な指定が可能である。

update testm set
  data1 = 111,
  data2 = 222,
  data3 = 333
where key = 'a001'
;

  ・PostgerSQL では、データ値としての default が指定できないので、
    insert は、省略することによって default 値で追加することができるが、
    update では指定のしようがなかった。

update test4m set
  data1 = 111,
  data2 = 222,
  data3 = default -- data3 = でもエラー
where key = 'a001'
;

  ・一項目だけの修正も可能である。

update testm set
  data3 = 333
where key = 'a001'
;

  ・副問い合わせの結果を項目にセットすることもできる。
    尚、update testm a set の別名指定はエラーとなる。

update testm set
  data1 = 111,
  data2 = (select count(*) from test2m b where b.code1 = testm.key),
  data3 = 333
where key like 'a%'
;

  ・副問い合わせの結果を複数項目にセットすることは、PostgreSQL では、
    できないようである。工夫してみたが構文エラーとなる。

update testm set
  (data1, data2) = (select count(*), count(*) from test2m b where b.code1 = testm.key)
where key like 'a%'
;

  ・NULL を項目にセットすることもできる。
    もちろん、not null 制約があれば、NULL をセットすることはできない。

update testm set
  data1 = 111,
  data2 = 222,
  data3 = NULL
where key = 'a001'
;

■レコード削除(レコード更新、デリート)

  ・テーブルやビューのレコードを削除する。
    ビューについては、基本的に単純ビューでない一切の更新はできない。
    where 句には select と同様に複雑な指定が可能である。

delete from testm
  where key = 'a001'
;

  ・この例では、testm の key の先頭が「a」で始まるレコードを全て削除して
    いる。

delete from testm
  where key like 'a%'
;

  ・この例では、testm の全レコードを削除している。
    件数が多いとレスポンスに問題がある。
    テーブルを空にするのが目的なら、表切り捨て truncate を使う方が高速で
    現実的である。

delete from testm;

■トランザクション

  ・PostgreSQL のトランザクションは、標準は自動コミットとなっている。
    ADO - ODBC では、cn.BeginTrans で手動コミットになる。
    JDBC では、cn.setAutoCommit(false); でオートコミットを解除して、
    手動コミットにする。

■排他制御(レコードロック)

  ・レコード追加、修正、削除では、レコードレベルの排他制御が働く。
    デッドロック回避の考え方は、他のファイルシンテムと同様である。
    テーブルロック(表ロック) として lock table もある。

  ・問い合わせで行ロックする方法として、for update 句がある。
    for update nowait は、ロック解除を待たずにエラーを返す。
    次の例は、ロックされていたら待って問い合わせる。

select * from testm where key = 'a001'
  for update
;

  ・nowait はエラー構文となった。

select * from testm where key = 'a001'
  for update nowait
;

■表切り捨て

  ・truncate は、表を切り捨ててクリアする。
    (テーブル切り捨て、テーブルクリア、表クリア、テーブル内データ消去)

truncate table testm;

使用道具 举报

回复
论坛徽章:
21
ITPUB元老
日期:2005-05-10 17:20:252012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:58马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:10:58
19#
 楼主| 发表于 2005-3-23 18:08 | 只看该作者
PostgreSQL 編19 - ストアドファンクション、function、PL/pgSQL、トリガー

■ストアドファンクション (ストアドプロシジャ)

  ・SQL の組み込み関数以外にユーザが独自の関数を作ることができる。
    language 'sql' では、単純なものしか作成できない。
    Oracle の PL/SQL と同等のものは、以下で説明する PL/pgSQL で作成する。

drop function gettest1(char);
create function gettest1(char) returns int8 as
  'select count(*) from testm where key = $1'
  language 'sql'
;

select gettest1('a001');

gettest1
----------
        1

drop function gettest1(char);
create function gettest1(char) returns int8 as
  'select count(*) from testm where key like $1 || ''%'''
  language 'sql'
;

select gettest1('a');

gettest1
----------
        2

■PL/pgSQL

  ・language 'plpgsql' では、PL/pgSQL の制御構造を持ったストアドファンク
    ションが作成できる。構文は Pascal 言語に似ている。

  ・PL/SQL とは違い PL/pgSQL 内ではトランザクションコマンドは使えない。
    しかし、ADO - ODBC や JDBC でのトランザクション配下から、呼ばれた
    ストアドやトリガーは、ちゃんとロールバック可能である。
    実用システムとしては、まったく問題ないと考える。

  ・標準インストール状態では、PL/pgSQL は使用できないようである。
    create function の language 'plpgsql' で、次のエラーが出るときは、
    createlang されていない可能性がある。

Unrecognized language specified in a CREATE FUNCTION: 'plpgsql'.
Pre-installed languages are SQL, C, and internal.
Additional languages may be installed using 'createlang'.

  ・PL/pgSQL が使用可能かは、次のように調べる。

select * from pg_language;

lanname  | lanispl | lanpltrusted | lanplcallfoid | lancompiler
----------+---------+--------------+---------------+-------------
internal | f       | f            |             0 | n/a
C        | f       | f            |             0 | /bin/cc
sql      | f       | f            |             0 | postgres

  ・plpgsql がなければ、Cygwin のコマンドで、次のように入力する。
    エラーなしで終了すれば、OK である。

createlang -h 127.0.0.1 -d sak -U administrator plpgsql
                           |      |             |_ 言語 plpgsql
                           |      |_ 管理者ユーザ
                           |_ データベース

  ・再度 psql で、インストールされたか確認する。

select * from pg_language;

lanname  | lanispl | lanpltrusted | lanplcallfoid | lancompiler
----------+---------+--------------+---------------+-------------
internal | f       | f            |             0 | n/a
C        | f       | f            |             0 | /bin/cc
sql      | f       | f            |             0 | postgres
plpgsql  | t       | t            |         16577 |

  ・これで、PL/pgSQL が作成できる。

drop function gettest1(char);
create function gettest1(char) returns int8 as
'
declare
  p1  alias for $1;
  ret int8;
begin
  select count(*) into ret from testm where key = p1;
  return ret;
end;
'
language 'plpgsql'
;

select gettest1('a001');

gettest1
----------
        1

drop function gettest1(char);
create function gettest1(char) returns int8 as
'
declare
  p1  alias for $1;
  ret int8;
begin
  select count(*) into ret from testm where key like p1 || ''%'';
  return ret;
end;
'
language 'plpgsql'
;

select gettest1('a');

gettest1
----------
        2

■データベーストリガー

  ・実行のタイミングは、before、after から選べる。
    PostgreSQL のトリガは、trigger から function を呼び出す形になる。
    new、old は、新と旧のデータを示す。
    tg_op は、'INSERT'、'UPDATE'、'DELETE' を示す。

drop function trifunc1();
create function trifunc1() returns opaque as
'
declare
  s     varchar(20);
begin
    if tg_op = ''INSERT'' then
      s := ''triins'';
      insert into test2m values(new.key, s);
    else
      if tg_op = ''UPDATE'' then
        s := ''triups'';
        insert into test2m values(new.key, s);
      else
        s := ''tridlt'';
        insert into test2m values(new.key, s);
      end if;
    end if;
    return new;
end;
'
language 'plpgsql'
;

drop trigger tritest1 on testm;
create trigger tritest1
  before insert or update or delete on testm for each row
  execute procedure trifunc1()
;

select * from testm;

   key    | data1 | data2 | data3
----------+-------+-------+-------
a001     |     1 |     2 |     3
a011     |     1 |     2 |     3
b002     |    10 |    20 |    30
c003     |   100 |   200 |   300

select * from test2m;

key | code1
-----+-------

insert into testm values ('t001', 11, 22, 33);

select * from testm;

   key    | data1 | data2 | data3
----------+-------+-------+-------
a001     |     1 |     2 |     3
a011     |     1 |     2 |     3
b002     |    10 |    20 |    30
c003     |   100 |   200 |   300
t001     |    11 |    22 |    33

select * from test2m;

   key    |  code1
----------+----------
t001     | triins

使用道具 举报

回复
论坛徽章:
21
ITPUB元老
日期:2005-05-10 17:20:252012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:58马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:10:58
20#
 楼主| 发表于 2005-3-23 18:08 | 只看该作者
PostgreSQL 編20 - VB ストアド呼び出し、トリガー、トランザクションロールバック

■VB ストアドファンクション呼び出し

  ・VB6 ADO - ODBC での PostgreSQL のストアドの呼び出しをテストする。
    testm には、トリガーも作成してあるので、同時にトリガーのテストもする。

drop function instest1();
create function instest1() returns int as
'
declare
  rcd int := -1;
begin
  insert into test2m values (''ins001'', ''aaa'');
  insert into test2m values (''ins002'', ''bbb'');
  insert into test2m values (''ins003'', ''ccc'');
  rcd := 0;
  return rcd;
end;
'
language 'plpgsql'
;

  ・VB6 ADO では、次のようにストアドを呼び出す。

  Dim cn as Variant
  Dim cd as Variant
  Dim p0 as Variant

'** ODBC 接続
  set cn = CreateObject ("ADODB.Connection"
  cn.Open "dsn=PostgreSQL;uid=sak;pwd=sak"
  cn.CursorLocation = 3

'** ストアドコマンド
  set cd = CreateObject ("ADODB.Command"
  cd.ActiveConnection = cn
  cd.commandtext = "instest1()"
  cd.commandtype = 4
  set p0 = cd.createParameter("rcd", 200, 4, 9)
  cd.Parameters.Append p0

'** トランザクション開始
  cn.BeginTrans

'** レコード処理
  cn.Execute "insert into testm values ('x001', 1, 2, 3)"

'** ストアド呼び出し
  cd.execute
  msgbox p0.value

'** トランザクション終了
  'cn.rollbackTrans
  cn.CommitTrans

'** ODBC 接続解除
  cn.Close

  ・実行後の結果は、次のとおりである。

select * from testm;

   key    | data1 | data2 | data3
----------+-------+-------+-------
x001     |     1 |     2 |     3

select * from test2m;

   key    |  code1
----------+----------
x001     | triins
ins001   | aaa
ins002   | bbb
ins003   | ccc

■PL/pgSQL、ストアド、トリガ、トランザクションロールバック

  ・PL/SQL とは違い PL/pgSQL 内ではトランザクションコマンドは使えない。
    しかし、ADO - ODBC や JDBC でのトランザクション配下から、呼ばれた
    ストアドやトリガーは、ちゃんとロールバック可能である。
    実用システムとしては、まったく問題ないと考える。

  ・実際の検証は、上記 VB コードの「トランザクション終了」部分を次のよう
    に修正して行った。

'** トランザクション終了
  cn.rollbackTrans
  'cn.CommitTrans

■その他 SQL

  ・「\h 命令」を発見したので、とりあえずは困りそうにない。
    尚、タイトルは、MySQL ですが、『PHP + MySQL 編』の資料中にも
    PostgreSQL の資料があります。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表