ラベル MySQL の投稿を表示しています。 すべての投稿を表示
ラベル MySQL の投稿を表示しています。 すべての投稿を表示

2012年2月27日月曜日

MySQL ぜひ覚えたい 関数 式 句 などの覚書(p181~)

『基礎からのMySQL』 西沢夢路著 (ソフトバンククリエイティブ) 
から得たぜひ覚えたい個所を列挙した。 Part3




(p182) 複数の抽出結果を合わせて表示する。
 ①select * from tb1 ; ②select * from tb2 ; の結果を
一度に表示させることを union で実現している。

select * from tb1 union seleect * from tb2 ;


これを見やすくする為、


(select * from tb1) union (select * from tb2) ;


なんて事もできる。



(p184) 3つ以上のテーブルから「union」で集める。

       (select * from tb where bang = 'A102')
union
       (select * from tb where bang = 'A103'
union   
       (select * from tb where bang = 'A104'
union
       (select * from tb where bang = 'A107') ;


と発行する事で、bang で抽出された4つの結果をまとめて
表示させる事ができる。


グループ化して表示させているように見える。


また、


select * from tb where bang not in ('A101') ;


というSQL文も紹介されている。 これは

テーブル内の bang が A101 以外を表示するもの。



select * from tb where in ('A101','A103',104'A','A107') ;

は、見慣れない SQL文 で戸惑ったが、

()内にあるものをグループとみなして、

そのグループに属するレコードの中から抽出するもの

ですね。





(p185) 条件を付けて複数の抽出結果を合わせて表示する。
 
 ① tb から uria が200以上のレコード持つ bang を抽出
 ② tb1 から tosi が35以上のレコード持つ bang を抽出


(select bang from tb where uria >= 200)
union
(select bang from tb1 where tosi >= 35) ;



結果は A101 , A102 , A105 の3件が抽出される。


2つのSQL文の結果を union はつなげて表示させている。


注意したいのが、

①の抽出結果は、A101 , A102 の2件であり、
②の抽出結果は、A101 , A105 の2件である。
合計 4件 が表示されるかと思いきや、
自動的に重複表示を制限しているのである。



重複表示を許す場合(純粋な OR 抽出?)は、

(select bang from tb where uria >= 200)
union all
(select bang from tb1 where tosi >= 35) ;



と、union に続けて all とすれば良い。



大量のデータを処理する場合は、union(重複を省く)では、

処理時間が長くなり、 union all(重複を許す)とすると、


処理時間が短くなる。らしい。




(p188) 複数のテーブルを結合して表示する(内部結合)。

 いよいよリレーショナルデータベース(以降RDB)らしい
内容になってきます。RDB = 複数テーブルを関連づける
という概念ですが、直前の union のところでも、2つのテーブル
(tb と tb1)を使って結果を表示していました。
ちょっと立ち止まり概念を整理したのですが、
union のところでは、2つのテーブルからの抽出結果を
ただ単に連続表示していただけでした。

内部結合 join 句 (※ INNER を指定すると、内部結合を「明示的」に指定できる。)は、
複数テーブルが共通に持つフィールドの値でテーブルを関連
づけ、実在するテーブル(tb , tb1)が持つ情報を、非実在の
テーブル(仮想テーブル)を作成し、それを表示している。

テキストでは、
select * 
    from tb 
join tb1
    on tb.bang = tb1.bang ;  

これは、 テーブル tb の bang と テーブル tb1 の bang が
同一であった場合に、それぞれのテーブルからレコードを
抽出し、全フィールドを結合して一件のレコードとして表示
するというものですね。
 
うまい表現ではないような気もしますが、
1レコード6フィールドの ハードディスクには実在しない
テーブル(仮想テーブル)を画面上に表示します。


内部結合 という事は、 外部結合 もある訳で、その違いを
把握しておきたいところですが、

テーブル tb には bang が A101、A102、A103、A104、A107 
の5種類、計10件のレコードが存在していて、
テーブル tb1 には bang が A101、A102、A103、A104、A105 
の5種類、計5件のレコードが存在している。


先の内部結合のSQL文では、9件のレコードが表示されたが、
bang が A107(tbだけにある) と A105(tb1だけにある) の
レコードは表示されなかった。 内部結合は、片方にしかない
情報は排除し、仮想テーブルには含めないのです。

それに対して、外部結合は片方にしかない情報も
仮想テーブルに 加えます。


    左のテーブル          右のテーブル
  bang   uria  tuki     bang   nama   tosi
  A103  101  4  |   A101   佐藤    40
  A102   54 54  |   A102   高橋    28
  A104  181  4  |   A103   中川    20
  A101  184  4  |   A104   渡辺    23
  A103   17  5  |   A105   西沢    35
  A101  300  5  |
  A102  205  6  |
  A104   93  5  |
  A103   12  6  |
  A107   87  6  |


左外部結合(left join) と 右外部結合(right join)。
inner join の inner を、left または right  に置き換えると、
左(右)外部結合の結果が得られます。

左外部結合とは、左のテーブル(tb)に 右(tb1)にはない
フィールド が存在する場合、そのデータも仮想テーブルに
加えてしまいます。違う言い方をすると、
左外部結合の結果は左テーブルのレコード総てを
仮想テーブルに加えて、右テーブルからは特定のキーに
よって一致するレコードを抽出し仮想テーブルに加える。
という事ですね。


(p194) using を使って on ~ の部分を見やすくする。
 テーブルを関係づけるために、
on tb.bang = tb1.bang (bang)というフィールドの内容が
同一かを判定させる。ここでは たまたま 2つのテーブルで
bang というフィールド名でしたが、
tb では、bang、 tb1 では bangou というフィールド名で
A101 やら A107 というデータを保持させていた場合、
「 on tb.bang = tb1.bangou 」 とすれば、テーブルどうしを
結合させられる。
using 句は、仮に2つのテーブルで、A101 やら A107 の
データを同じフィールド名で管理している場合、
join tb1 on tb.bang = tb1.bang を 
join tb1 using (bang) と簡単に記述できるというもの。




(p195)  
結合したテーブルから「where」で設定した条件で抽出する。
 結合した仮想テーブルから where 条件でレコードを抽出
する際は where句の条件では フィールド名だけではダメ。
必ずテーブル名を指定して MySQL に示してやる必要が
ある。

select tb . bang , tb1 . nama , tb . uria 
         from tb
join tb1
         using(bang)
where tb . uria >= 100




(p 197) たくさんのテーブルのデータを使って抽出する。
 テーブルの結合は2つ以上可能で仮に3つのテーブルを
結合する場合は、

select
       tb.bang,tb.uria,tb1.nama,tb3.ken
from
       tb
join
       tb1
using(bang)
join
       tb3
using(bang)
;
とする。




(p200) 
複数のテーブルの総てのレコードを表示する(外部結合)。
 内部結合(p188)後半の記述を参照。




MySQL ぜひ覚えたい 関数 式 句 などの覚書(Part1)へ

MySQL ぜひ覚えたい 関数 式 句 などの覚書(Part4)へ






情報処理再チャレンジブログ ホーム

2012年2月26日日曜日

MySQL ぜひ覚えたい 関数 式 句 などの覚書(p164~)

『基礎からのMySQL』 西沢夢路著 (ソフトバンククリエイティブ) 
から得たぜひ覚えたい個所を列挙した。 Part2




(p164) UPDATEコマンド
 テーブルの特定のカラムを指定した値に変更する。書式は、
update テーブル名 set カラム名 = 設定する値 ; で、
一瞬にしてカラムの値が変更される。通常 
where句 と共に使用される為、全レコードの特定カラムを
一気に変更することは少ないらしい。

テキストでは、 tb という既存のテーブルに、
①新しく 「bikou」 というカラムを追加して、
そのカラムに②「特記なし」という文字列を設定している。

① alter table tb add bikou varchar(100) ;
② update tb set bikou = '特記なし' ;





(p167) 条件に一致したレコードだけを修正
 書式は、
update テーブル名 set カラム名 = 設定する値 where 条件 ;
テキストでは、 tb テーブルの uria が 100 以上のレコードの
bikou に 「優秀」 という文字列を設定している。
update tb set bikou = '優秀' whrer uria >= 100 ;



(p169) 売上下位3件の bikou フィールドに 「ガンバレ!」を設定
 uria フィールドの値で、下位3件を抽出はどうする?
① uria フィールドを 「order by」で並べ替える。
  ここでは小さい値から大きい値へ並べ替えられる(内部的に)。
② limit3 で最初の3件を抽出する(下位3件)。

 update tb set bikou = 'ガンバレ!' order by uria limit 3 ;



小生の感覚では、where句 で抽出したくなり、当該コマンドは
しっくりこない。経験を積むことで自然と理解が深まり、違和感が
解消されることを期待し先に進む事とする。


(p171) 特定のフィールドを削除する。
 テキストでは、tb テーブルの bikou フィールドを削除している。
書式は、 alter table テーブル名 drop フィールド名 ;
alter table tb drop bikou ; というコマンドを発行している。



(p171) 条件に一致したレコードをコピーする。
 ①条件に一致したレコードを抽出し、新しくテーブルを作成。
   create table tb_A101 select * from tb 
        where bang like 'A101' ;

 ②条件に一致したレコードを抽出し、既存のテーブルに追加。 
     insert into 既存テーブル名 select * from tb 
                 where bang like 'A101' ;

(p173) レコードを順番に並べてコピーする。
 テキストでは、
① tb テーブルのレコードを uria フィールドの値を基準にして
   降順に並べ替え(order by uria desc)、
②上位4件を抽出している(limit 4)。
③さらに、最上位のレコードを省いて、その代わりに
  uria フィールドが 5番目に大きい レコードを上位4件に
  加えている(offset 1 … 最上位レコードを1つ下のレコード
  とする)。
④手順③までで抽出したレコードを新しいテーブルとして作成。
  create table tb_2to5 select * from tb
                    order by uria desc limit 4 offset 1 ;



(p175) 全レコードを削除する(テーブルは残す)。
 「削除」 といえば DELETE! と閃いた次の瞬間、DROP でも
良いのかなぁ? と 少し ”もやもや” している事に気付く。


テキストにも書いてある通り、DROPテーブルを削除し、
DELETEレコード全部を消去しても、空のテーブルは残る。

※updateコマンドよりも慎重に発行する事が求められる。

さて、特定のレコードを削除する場合の書式は、
delete from テーブル名 where 条件 ; で、
テキストでは、
delete from tb1k where tosi < 30 ; を発行している。
(tb1 と全く同じ tb1k というテーブルをあらかじめ作成しておく)

結果は、tb1kテーブル にレコードは 2件が残る。
(tosi が 30 未満のレコードは削除される)

(p177) テーブルをソートしてから、特定のレコードを削除する。
 テキストでは、テーブル tb 同一内容のテーブル tb_copy が存在している事を前提にしているので、あらかじめ作成しておく。

以下の手順①,②で作成される 【仮想テーブル】 の内容を、
【実テーブル】である tb_copy から削除する。


① テーブル tb_copy の uria フィールドの値を基準に降順に
   ソートする。
② limit 4 で 上位4件のレコードを抽出する。


結果は、6件のレコードだけが tb_copy に残る。


(p179) 期間でレコードを抽出する。
 ここでは、【 now() - interval 5 year 】で、
現在より5年前を表している。 

now() 関数を使わずに interval の使い方を試すことにした。
 条件を 【 '2012' - interval 5 year】 としたら、エラーにはならず、Mysql は 「 Empty ○○○ 」 と返してくる。文法は正しいものと
思い、いろいろ試すも思うような結果が得られない。

結局 '2012'  を 'current_timestamp' とする事で、期待通りの
結果が得られた。

それから、「~ interval 5 years 」 とするとこれはエラーに
なってしまう。英語に精通している小生としては(うそ)。
違和感を覚える。




MySQL ぜひ覚えたい 関数 式 句 などの覚書(Part1)へ

MySQL ぜひ覚えたい 関数 式 句 などの覚書(Part3)へ




情報処理再チャレンジブログ ホーム

2012年1月15日日曜日

MySQL ぜひ覚えたい 関数 式 句 などの覚書(~p163)

『基礎からのMySQL』 西沢夢路著 (ソフトバンククリエイティブ) 
から得たぜひ覚えたい個所を列挙した。 Part 1




(p45) DESC文
 テーブルのカラム構造を確認する。describeを省略させた。


(p73) ALTER TABLE ~ CHANGE ~~~;
 テーブルのフィールド名とデータ型を変更する。
alter table tb1c CHANGE umare seinen DATE;
(umare を seinen)に変更する。DATEは(データ型)は
直感的に省略してしまう。気を付けよう。


(p79) UNIQUE句
 テーブル作成時、フィールドの重複を許さない。
フィールドが主キーではないけれど、フィールドの値を一意に
させたい時に指定する。



(p125) LIMIT句
 画面に表示させたいレコード数を指定する。

(p130) IN句
 IN句はORの役割をする



(p139) CASE式
  SELECT FROM tb; の代わりに、
 SELECT case when ~ then ~ else ~ end FROM  tb;
 とする。 他のフィールドの値を元に、フィールドの設定値を
 変えられる。(uria の値を元に 多い、少ない、等と
 フィールド値を設定。 )


(p143) ORDER BY句
 不規則に表示されるレコード表示に規則を与える。
 ASC … 昇順(省略可)
 DESC … 降順
   ※デスクと覚えた
  ※テーブル構成を表示する DESC とスペルが同一


(P146) OFFSET句
 表示の範囲を限定する。
OFFSET 3 とすると、
最初の 3レコートを消す様にセットする。


(p148) GROUP BY句
  特定のフィールドを(ex,select * from tb group by bang; の
様に)GROUP BY句に続けて指定すると、フィールド(bang)内
で重複する値(同じ値)をグループ化する(distinctみたいだ)。

グループ化することで、グループ毎に ”合計” したり、”平均”
を出したりする事が可能となる。 

(p149) count()関数
 count(x) で フィールド x に存在する個数を調べられる。
㊟nullはカウントされない。
select count(*) from tb group by bang;  で、フィールド bang
でグループ化され、グループ毎の合計値を表示する。
この場合、グループ化したフィールドに null が入っていても
null の個数を表示してくれる。 テーブルのレコード数を知る
ことができるね。 メカニズムは解らない (^^; 


(p152) HAVING句
 GROUP BY句でまとめた値(たとえば、sum(uria))に対して
条件を付加する。
select 
   bang,sum(uria) 
from tb 
  group by bang
having sum(uria) >= 200; は、

bang で グループ化 した uria の 合計値 が、
200以上の グループ のみを 表示するというもの。




複雑な条件(抽出・並べ替え・グループ化)では、


①WHERE条件
②GROUP BY
③ORDER BY ○○(DESC)

の順番となる。




MySQL ぜひ覚えたい 関数 式 句 などの覚書(Part2)へ

MySQL ぜひ覚えたい 関数 式 句 などの覚書(Part3)へ





情報処理再チャレンジブログ ホーム

2011年9月16日金曜日

net start mysql とは

MySQLの環境設定(Path)を行ったのに、

C:\>mysql -u root -pパスワード を 受け付けてくれない。

全く原因が解らず困ってしまった。



コマンドラインから net start mysql を入力すると、


mysql を起動できるとの情報を得る。






 mysql の起動は mysql -u root -p の後にパスワードを入力


するはずなのに、どういう事だろう!?




意味が理解できなかったが、とりあえず試してみた。


C:\Users\keijitkt> net start mysql  すると、




「システム エラー 5 が発生しました。




        アクセスが拒否されました。」




と表示されて情報通りに行かない。




すっきりしないのでググってみたら、


net start mysql コマンドは

管理者として実行する必要がある

らしい。



コマンドプロンプトを管理者権限で起動し、


(コマンドプロンプトを管理者権限で起動させる方法)


C:\Windows\system32> net start mysql  と入力すると、


MySQL サービスを開始します.
MySQL サービスは正常に開始されました。




と表示された。 そして、


C:\Windows\system32> mysql -u root -p を入力すると、

Enter password:  が表示されるのでパスワードを打ち込む。


無事MySQLにログオンできて、

プロンプトが mysql >  となった。








情報処理再チャレンジブログ ホー ム