トップページ
ひらく | たたむ | ページトップ
↓マウスで反転選択した文字を検索
MySQL
   
ページ内検索 ページ外検索
検索したい文字を入力して
ENTERを押すと移動します。
\n
[ トップページ ]
[ ____CommandPrompt ] [ ____JScript ] [ ____MySQL ] [ ____Cygwin ] [ ____Java ] [ ____Emacs ] [ ____Make ] [ ____Perl ] [ ____Python ] [ ____OpenGL ] [ ____C# ] [ ____StyleSheet ] [ ____C++ ] [ ____Winsock ] [ ____Thread ] [ ____VisualStudio ] [ ____C ] [ ____Win32API ] [ ____Lua ] [ ____PhotoShop ]
ヘッダ検索
重複. uniq カラム 一意 sql
___

■ 単語境界




  SELECT * FROM test.movie where tag regexp "[[:< :]]ega[[:>:]]";


___

■ 大文字.小文字


  大文字小文字区別
  
  MySQLは特に指定がなければ大文字小文字は区別しません。
  区別するには BINARY 属性をつける。

  単語 境界
  
  
  

  SELECT * FROM `posts` WHERE `name` = BINARY'hoge';
  SELECT * FROM `posts` WHERE `name` = BINARY 'hoge';
  SELECT * FROM `posts` WHERE `name` = BINARY 'hoge';  
  SELECT * FROM `posts` WHERE name = BINARY 'hoge';

___

■ unique


  カラムに対してユニークキー制約を設定する方法
  
  SYNTAX
    CREATE TABLE db_name.tbl_name
      (col_name1 data_type1 UNIQUE, col_name2 data_type2, ...);

    alter table UNIQUE




  既存のテーブルのカラムを後から UNIQUE キーを追加する。
  alter table テーブル add unique (フィールド);
  alter table test.art add unique (path);
___

■ Tutorial


___

■ copy

mysqlで、テーブルをコピーするには mysqlで、テーブルをそっくりそのままコピーするには、今まで、下記のようなかたちでコピーしていました。 CREATE TABLE NewTable AS SELECT * FROM OldTable use test; CREATE TABLE movie AS SELECT * FROM art; これだと、主キーやインデックスなどはコピーしてくれません。 そこで、ちょっと調べました。 ちゃんとテーブル構造すべてをコピーしてくれるコマンドがあるんですね。
    CREATE TABLE  newtable  LIKE  oldtable
    CREATE TABLE  test.cook  LIKE  test.home;
echo "CREATE TABLE test.music LIKE test.movie" CREATE TABLE test.home LIKE test.movie とりあえず. insert してみる. -> 初動をクリアすること. 1. INSERT INTO new SELECT * FROM old TRUNCATE TABLE TableName;
___

■ ファイル 読み込み

SYNTAX LOAD DATA INFILE file INTO TABLE tbl DESC ファイルから読み込むには LOAD DATA ステートメントを使う csv ファイルを読み込みもできる
    -- CREATE TABLE の順番でならべる
    -- デフォルトは tab 区切り
    name  age
    foo   10    
    bar   11    
    LOAD DATA INFILE test.txt INTO TABLE tbl
    -- 値がない場合は NULL を意味する \n を指定する
    \n   10
    bar  11
___

■ CSV 出力

DESC テーブル情報を CSV などのファイルに出力する。 ファイルはSQLサーバー側に出力される。 WARNING 既存のファイルの指定できない ( 理由は /etc/passwd などのデータベーステーブルやファイルが破壊されないようにするため )
    -- 
    --- ERROR 1086 (HY000) at line 15: File 'd:/foo.txt' already exists


  SELECT * INTO OUTFILE "/home/user/dump.txt" 

  -- 区切りは [,]
  FIELDS TERMINATED BY ',' 

  -- quot は ["]
  OPTIONALLY ENCLOSED BY '"' 

  -- 行区切り 
  LINES TERMINATED BY "\n" 

  FROM tbl;



  // 拡張子によって 区切り文字が変わる
  mysql> SELECT * INTO OUTFILE 'c:/test.txt' FROM tbl;


  // Client に出力する
  mysqldump --tab や mysql -e "SELECT ..." > outfile などのクライアントプログラムを使用する

WARNING mysqld が実行するので, root として実行するべきではない
___

■ 文字列 比較

DESC 文字列の比較は比較演算子でする。 このとき 文字コード順に比較される。
    -- 名前が E より後 ( F 以降 )のレコードを返す
    select * from member  name > "E"
___

■ 文字列 Quote

TIP "" の中でも \ が必要な文字がある Quote できないと ["] を ["] の中で指定できないから
    // Check するには 次のようにする
    select "str";
  // [\]
  select "\\";

  // ["]
  select "\"";

  // [']
  //  " の中の ' は quot は不要
  select "'";

  // ["]
  select '"'

  // [\]
  select '\\'

  // ["]
  select '\"'
  
  insert into tbl (name,age,str) values('\"aaa',32,'bbb')

  // [\"aaa]  
  select '\\"aaa';

  // [\\"aaa]  
  select '\\\\"aaa';

  // ["aaa]  
  select '\"aaa';


  // 2つ重ねることでエスケープする
  // RET  "
  select """"

  // RET  '
  select ''''
___

■ Command

DESC GUI Tool を使う人も 4 コマンドは最低限おぼえておくと便利
  // 追加
    insert into tbl (col1, col2...) values(val1, val2...)

  // クエリ
    select col from tbl where cnd 

  /// 更新
    update from tbl where cnd

  // 削除
    delete from tbl where cnd
___

■ CommandlineTool.から操作する

DESC GUI Tool もあるが CommandlineTool からも利用できる 他のプログラムから、DB の情報を得るときに便利
  //  ユーザー XXX が パスワード YYY でログイン
  shell> mysql -u XXX -pYYY
  shell> mysql --user=XXX --password=YYY


  // bye
  mysql> bye

  // DB を選択 ( Table ではない )
  use test;

  //  table を Listup
  show tables;

  // Help
  ?


  // Column を追加
  ALTER TABLE Customer ADD age int(3);

  // 終了
  quit;
  // STDIN から SQL 文を入力
  echo use test;select * from tbl where path="aaa" | mysql -u XXX -pXXX
  // script を指定して batch 処理
  mysql -u XXX -pXXX <  /dust/script.sql
WARNING command の最後に [;] を忘れないこと
___

■ backup

DESC バックアップをするには mysqldump.exe を使う。 このコマンドは DB を再作成するための sql 文を出力する
    -- xxx DB を backup.sql という名前のファイルでバックアップをとる
    mysqldump.exe xxx > backup.sql -u XXX -pYYY
バックアップを復元するには, バッチモードで実行するだけ
    mysql>  hogedb <  backup.sql -u XXX -pXXX
___

■ 実行結果をファイルに出力

    -- d:/sql.txt にログを出力
    mysql> tee d:/sql.txt

    -- 出力を停止
    mysql> notee d:/sql.txt
___

■ 文字.Code

___

■ 現在のCodeを調べる

DESC mysql> status
  // RET

  Connection id:          33
  SSL:                    Not in use
  Using delimiter:        ;
  Server version:         5.1.41-community MySQL Community Server (GPL)
  Protocol version:       10
  Connection:             localhost via TCP/IP
  Client characterset:    utf8
  Server characterset:    utf8
  TCP port:               3306
  Uptime:                 2 hours 28 min 37 sec

___

■ 変更する

でも telnet からだと 文字化けする
___

■ Reference


___

■ Literal

DESC リテラルとは 変数や定数以外の、数値や文字列など表記どおりの値の総称
___

■ string

    文字列型は ", ' で囲む
    "foo",  'bar'

  POINT
    -- 文字列に引用符を追加する場合は 2 こ続ける
    "a""a"
    'a''a'

    -- " 内に ' を入れる場合は 1 個でよい ( 逆も )
    "a'a"
___

■ NULL

データがないことを意味する 0, "" とは意味が異なる
___

■ データの操作

___

■ SELECT

SYNTAX SELECT field[, field...] from tbl [where field=val][ORDER BY field (DESC|ASC)][LIMIT [offset,] row_count] DESC テーブルからレコードを取得( 照会 )する CustomerID、CompanyName は、それぞれ列( Key )の名前を指定 「Customersテーブルから CustomerID、CompanyNameを取得しなさい」という命令になる WARNING SELECT 構文では 各節 ( where など )の順番は構文とおりの順番である必要がある
    // BAD
    select name LIMIT 1, 10  ORDER BY name 
    // OK
    select name ORDER BY name LIMIT 1, 10
    // すべての Column を指定
    SELECT * FROM Customers
    
    // 顧客 Table を表示する. 
    SELECT * FROM customer;

    // Column を指定する { name, age }
    SELECT name, age FROM Customer;

    // 複数の条件を指定する. 
    SELECT * FROM Customer where name="sato" and age=30;

    // 条件 >= , < = を利用する
    SELECT * FROM Customer where age >= 30;

    // 指定リストに一致するものを抽出
    SELECT * FROM Customer where name in ( "tanaka", "sato" );
    
    // あいまい 検索
    // %: 0 文字以上の任意の文字
    // _: 1 つの任意の文字
    SELECT * FROM Customer where name like "%田%"

    // 文字列も 順序関係 があれば 条件判定できる
    SELECT * FROM  Customer where TIMES >= "2009.11.27" order by TIMES;
___

■ Limit

SYNTAX select ... limit [ offset, ] count DESC 指定した範囲の Record をかえす 件 〜 をするときに便利
    // 10 件目 から 20 件目をかえす
    select from tbl limit 10, 20

    // 1 件目 から 30 件目をかえす
    select from tbl limit 30
___

■ ORDER BY

SYNTAX ORDER BY field [(DESC|ASC)][, ...] DESC 指定したカラムでソートする
    -- id, message の順に sort 
    select * from tbl order by id, message

    -- 各項目について ASC DESC を指定する
    -- Default は昇順( ASC )
    select * from tbl order by id ASC, message DESC

    -- where の後でなくてはならない
    select * from tbl where id = 1 order by id, message


    // 文字列でも Sort 可能 ( ASCII code 順かな ? )
    SELECT * FROM member order by age

___

■ GROUP BY

DESC 指定したカラムの値ごとにグループ化する。 POINT グループ化した後は, sum, avg などの統計関数で値をとる。
    -- 性別ごとに平均年齢をもとめる
    SELECT  sex, AVG(age) FROM  member  GROUP BY sex;
___

■ DISTINCT

DESC 重複したレコードをひとつにする
  select DISTINCT age from member order by age
___

■ alias(別名)

DESC カラム名に別名をつける。 複数テーブルで同名のカラムがある場合や、関数で処理をした結果の名前をつけたいときに使う。
    select name AS 名前 from member; 
___

■ INSERT

SYNTAX INSERT INTO テーブル名 (フィールド名 , フィールド名 ,...) VALUES(値 , 値 ,...); # Primary ID は 1 から始まる
    insert into testtbl (NAME) values("tanaka") 

  BAD
    insert into testtbl ("NAME") values("tanaka")
  OK
    insert into testtbl (NAME, AGE) values("tanaka", 32);
___

■ UPDATE

SYNTAX UPDATE [LOW_PRIORITY] [IGNORE] テーブル名 SET field=val [,field=val ...] [WHERE 条件式] [ORDER BY ...] [LIMIT 値] DESC レコードを更新します すべてのレコードを一括更新、もしくは条件式を満たす特定のレコードだけを更新できる
    // Table[mn] の ID == 30 の ガス を 3000 にする
    UPDATE mn SET ガス = 3000 WHERE ID = 30;


    // 複数を指定することもできる
    // UPDATE は左から右に 評価する
    // [商品番号(id_g)]"3"の[価格(price)] フィールドに"3200"を代入し, 1.05倍
     UPDATE goods SET price = 3200, price = price * 1.05 WHERE ID = 3;
   
    BAD
      UPDATE mn SET  ガス = 111, 水 = 222, WHERE ID =32 ;
    OK
      UPDATE mn SET  ガス = 111, 水 = 222  WHERE ID =32 ;

    // String Data は ["] が必須
    BAD
      UPDATE kabu SET 会社 = aaa WHERE id = 12;
    OK
      UPDATE kabu SET 会社 = "aaa" WHERE id = 12;
___

■ DELETE

SYNTAX DELETE from tbl DESC レコードを消す。

  // 10 才以下は削除
  DELETE FROM member WHERE age < = 10;  

  // 田中さんは削除
  DELETE FROM member WHERE name = "tanaka"  

  // 30 才より下を消す
  DELETE FROM member WHERE age < = 30  

WARNING 条件を指定しないと全部消える。
    DELETE FROM member;
___

■ WHERE

SYNTAX where condition DESC 条件を指定する。
    SELECT CustomerID, CompanyName, City
               FROM Customers WHERE City = 'London'

    select * from cmdTbl where ID>=1

    // 複数の指定
    //    20 代のみ削除
    delete from Customer where age >= 20 AND age < = 29;

    // C みたいに () もあり
    SELECT * FROM customer  WHERE (id_c >= 2 AND id_c < =4) OR sex = 1;

  BAD
    delete from testtbl where ID == 1;
  OK
    delete from testtbl where ID = 1;

  WARNING
    条件を指定しないと すべて削除することになるので注意 ( これかなり重要 ! )
    where "xxx" [quot] を忘れずに
  // あいまい検索
  select from アイドル where like "森%千里"

  // REGEXP 検索
  //    部分にのみ Match すれば OK
  // 
  select from アイドル where regexp "森.千里"

___

■ データ定義

___

■ CREATE DATABASE

SYNTAX CREATE DATABASE [IF NOT EXISTS] name DESC 指定した名前のデータベースを作成する WARNING IF NOT EXISTS を指定していないときに 既存の DB を指定するとエラーになる
___

■ CREATE TABLE

SYNTAX CREATE TABLE Customer ( -- 名前 型 属性 id INT UNSIGNED NOT NULL AUTO_INCREMENT, fullname VARCHAR(40) NOT NULL, age TINYINT UNSIGNED NOT NULL , sex TINYINT UNSIGNED NOT NULL, email VARCHAR(50), -- 制約 PRIMARY KEY (id) ); DESC Table を作成する TIP
     // NULL 値を拒否( NULL はなしよ! )
     NOT NULL           
     
     // 重複しないように 自動Increment
     AUTO_INCREMENT
// into outfile "xxx" がないとだめらしい // 単独ですると, 落ちる echo use test;select * from tbl into outfile "foo.csv" fields terminated by ',' \ | mysql -u root -pXXX


  CREATE TABLE Customer (
  -- 名前     型                  属性 
    id         INT UNSIGNED      NOT NULL AUTO_INCREMENT,
    fullname    VARCHAR(40)       NOT NULL, 
    age        TINYINT UNSIGNED   NOT NULL ,
    sex        TINYINT UNSIGNED   NOT NULL,
    email      VARCHAR(50), 

    -- 制約
    PRIMARY KEY (id)
);


    -- Column の定義

    name type [NOT NULL | NULL] [DEFAULT val] [AUTO_INCREMENT]
      [[PRIMARY] KEY] [COMMENT 'string'] [reference_definition] 

    -- 名前   型   属性
    -- name   32文字    NULL はなし   Default値   "tanaka"
    name    char(32)     NOT NULL     DEFAULT "tanaka",
___

■ DROP TABLE

SYNTAX DROP TABLE [IF EXISTS] tbl [, tbl,...] [RESTRICT | CASCADE] DESC テーブルを削除

    // IF EXISTS をつけることで ERROR 回避できる
    DROP TABLE IF EXISTS tbl;
___

■ ALTER

SYNTAX ALTER TABLE tbl ADD column type DESC Table.に.Column.を追加, 削除をする
  // 顧客情報に TEL を追加
  ALTER TABLE Customer ADD tel char(10);

  // 削除
  ALTER TABLE CardInfo DROP Column Status
TIP column を追加すると, Default 値で埋まる
  String  -> NULL
  Integer -> 1 ?
___

■ JOIN(結合)



  SYNTAX
    SELECT field FROM tblA[, ...]

  DESC
    2つ以上のテーブルをひとつに結合して結果をかえす。
    単純結合(simple join)と内部結合(inner join)は同じ



    -- こんな意味
    SELECT column FROM テーブル 結合方式  結合するテーブル  結合条件

    -- テーブルを複数指定して ON 句の後に結合条件をかく
    select column from tblA join tblB  on  ...
おおまかに3つの結合方式がある
     内部結合
       両方のテーブルに値が存在するデータを取得する

     外部結合
       両方のテーブルに値が一致しない場合もデータとして取得する。
         左側のテーブルにしかデータが無い行も含めてデータを取得する
         右側のテーブルにしかデータが無い行も含めてデータを取得する

     交差結合
       両側のテーブルのレコードのすべての組み合わせを返す。
結合方法に関係なく結合条件を2つから選べる。
     等価結合       // 両方のテーブルに等しい値が存在する場合の条件 (ON A = B) 

     非等価結合     // 両方のテーブルに等しい値が存在しないが関連する値が存在する場合の条件(ON A BETWEEN 1 AND 100) 
完全に一致した場合のみ INNER JOIN をするには次のようにする。
    select member.name,  pref.adr  from  member INNER JOIN pref ON member.idadr = adr.id;
範囲内で一致した場合に INNER JOIN する。
    select member.name,  pref.adr  from  member INNER JOIN pref ON member.idadr ;
結合条件のカラム名がテーブル間で同じなら ON の代わりに USING を使って簡単にかける。
    -- on man.name = woman.name  と同じ
    select  man.name, woman.name  from  man INNER JOIN woman USING name;
___

■ 内部結合(INNER JOIN)

SYNTAX tblref, tblref tblref [INNER ]JOIN tblref [join_condition] DESC 内部結合とは主キーと外部キーを比較して一致するカラムのみを返す結合方法のこと。 参照して組み込むから INNER JOIN という ON句, USING句でテーブルの結合条件を指定する。 POINT 次の構文はすべて結果としては同じ。
    -- INNER JOIN または [,] で 内部結合をする
    select mem.name, adr.pref from mem, adr where mem.idadr = adr.id;

    select mem.name, adr.pref from mem JOIN adr on mem.idadr = adr.id;

    -- INNER を明示しても良い
    select mem.name, adr.pref from mem INNER JOIN adr on mem.idadr = adr.id;


  WARNING 
    -- , の場合は ON は使えない。where を使うこと。
    select mem.name, adr.pref from mem, adr where mem.idadr = adr.id;

  WARNING 
    -- 結合条件を指定しないと 外部結合による外積の結果になる。
    select mem.name, adr.pref from mem, adr;
    select mem.name, adr.pref from mem INNER JOIN adr;
    // 組み込む前 ( 3 が別テーブルへの ID )
    [ A | B | 3 | D ] 

    // 参照先テーブル
    [ 3 | "あ" | "い" | "う" ]

    // 組み込み後
    [ A | B | "あ" | "い" | "う" | D ] 

    // ON のかわりに WHERE を使っても良い
    SELECT field FROM tblA  INNER JOIN tblB WHERE tblA.x = tblB.y

    // 結合した Table から
    SELECT field FROM tblA  INNER JOIN tblB WHERE tblA.x = tblB.y
    // さらに絞り込む
    and tblA.y = 10;
___

■ 外部結合(OUTER JOIN)

SYNTAX tblref LEFT [OUTER] JOIN tblref [join_condition] tblref RIGHT [OUTER] JOIN tblref [join_condition] POINT 内部結合とは異なり、カラムが一致しない場合も左( または右 )側のテーブルの 全レコードを出力する結合方式。
    -- member テーブルを左側にして, 右にアドレステーブルを結合する。
    -- 外部結合のキーワードとして LEFT をつけること。
    select mem.name, adr.pref from mem LEFT JOIN adr on mem.idadr = adr.id;

    -- LEFT キーワードを付ければ外部結合になるため OUTER キーワードは任意。
    -- 結果は同じ。
    select mem.name, adr.pref from mem LEFT OUTER JOIN adr on mem.idadr = adr.id;
POINT LEFT, RIGHT の指定は基準となるテーブルを指定する時に使う。 RIGHT は LEFT の別表現のため、覚えるのがメンドイならば LEFT だけを使えばいい。 またDBの移植性を考えると LEFT に統一すること。
    -- memer テーブルはレフト, adr テーブルはライト扱いになる。
    -- 右扱いのテーブルは一致するカラムが無い場合は NULL が埋められる。
    -- 左扱いのテーブルは必ずデータが取得される。
    select mem.name, adr.pref from mem left join adr on mem.idadr = adr.id;

    -- これは同じ結果になる。 left < -> right を変更してテーブルの指定の指定を切り替えただけ。
    -- 基準は memer テーブルのまま。
    select mem.name, adr.pref from adr right join mem on mem.idadr = adr.id;

    -- これは逆になる。
    select mem.name, adr.pref from mem right join adr on mem.idadr = adr.id;
___

■ 交差結合(CROSS JOIN)

DESC テーブル1の各レコードに対してテーブル2のすべてレコードを組み合わせた結合方式のこと。 結果は テーブル1のレコード数 * テーブル2のレコード数となる。 内部結合、外部結合のように結合条件は必要ない。
    select  member.name, adr.name from member CROSS JOIN adr
___

■ 自己結合

DESC 結合対象のテーブルが自分自身のこと。 結合方式は内部結合と外部結合と同じ。 結合対象のテーブルが同じなのでテーブルのエイリアスは必須。
    select m.name, m2.name  from member as m JOIN member as m2  on m.parent = m2.id;
___

■ STRAIGHT_JOIN

SYNTAX tblref STRAIGHT_JOIN tblref
___

■ NATURAL_JOIN

SYNTAX tblref NATURAL [LEFT [OUTER]] JOIN tblref { OJ tblref LEFT OUTER JOIN tblref ON conditional_expr } tblref NATURAL [RIGHT [OUTER]] JOIN tblref DESC 結合する両テーブルの一致カラムをすべて USING 句に指定した場合と同じ。
___

■ 単純結合

SYNTAX select field ... from tbl [, tbl...] DESC 総当たり戦 みたいなものだと 思えばOK 数学でいうと 直積 です ( めったに使いません ) 単純結合(simple join)と内部結合(inner join)はおなじ 受注m の各レコードに 品番m の全レコードが結合される 受注m のレコード数 x 品番m のレコード数の結果が問い合わされる

  select * from 受注m, 品番m;

  select * from 受注m join 品番m;

___

■ 等価結合

DESC Image でいうと 条件のあった ROW を 結合するような感じ 特定のキーで表を結合する 条件のどちらかのデータが存在しないとき、結果には含まれない ( ERROR にはならない ) 外部結合が一番使いやすい select // field 受注番号, 受注m.品番 品番, 品番m.入庫数 入庫数 // table from sak.受注m, sak.品番m // ここが 等価になるところ // 2 つの table の 品番が同じ ENTRY をひっつける where 受注m.品番 = 品番m.品番 TIP 結合テーブルに同じ Column 名があるときは, table 名をつけることで一意に指定します

  // tblA の name と tblB の name を参照する
  select tblA.name, tblB.name from tblA, tblB where ...

列の別名定義は、as( alias ) を指定できる
  select

    // Column の指定
    受注番号,
    受注m.品番   as 品番,
    品番m.入庫数 as 入庫数

  // table の指定 ( ここでは 2 つを参照する )
  from sak.受注m, sak.品番m

  // 条件 で table 間を LINK します
  where 受注m.品番 = 品番m.品番
  ;
// 名前が重複したときに, 項目名を かえるときに使えばいいだけ select tbl.NAME as tako, tbl.COMMAND, foo.nr from tbl, foo where tbly.NAME = foo.txt and foo.ID = 15;
  select

  // Column
    受注番号,
    受注m.品番   as 品番,
    品番m.入庫数 as 入庫数

  // Table
  from sak.受注m 

  // ここでは inner を明示する
  inner join sak.品番m on 受注m.品番 = 品番m.品番 ;
Table 間の条件だけではなく, Column の条件もかけます
  select tbl.NAME, tblB.nr from tbl inner join tblB on tbl.NAME = foo.txt
  select tbl.NAME, tblB.nr from tbl inner join tblB on tbl.NAME = foo.txt;
WARNING 結合カラムになっている所属IDカラムの値です 社員テーブルの所属IDカラムには「1,2,3,NULL」の4つの値があるが 所属テーブルの所属IDカラムは「1,3,4」の3つの値のみ 社員テーブルにある「2」や「NULL」は所属テーブルになく 所属テーブルにある「4」は社員テーブルにありません Join( 結合方法 ) は 2種類あります
   InnerJoin(内部結合)< - Default はこちら
   OuterJoin(外部結合)

  // Default は InnerJoin 
  // 結合先がないと SKIP されます
  select * tblA, tblB

  // InnerJoin であることを明示する
  select * tblA inner join tblB on tblA.id = tblB.id

  // 結合先がなくても, 結果をかえすなら OuterJoin をつかう


3 つ以上の結合を inner join で指定
  select
    *
  from (sak.受注m inner join sak.品番m on 受注m.品番 = 品番m.品番)
    inner join sak.得意先m on 受注m.得意先CD = 得意先m.得意先CD;
___

■ Columnを計算した結果をかえす

___

■ データ型.Type




  データ型はおおまかに分類すると次の6種類
     数値
     文字列
     日付/時刻
     BLOB
     列挙
POINT QueryBrowser で文字をうつと, 補間される( STRING といれようとすると, そんな型はないので補間されない )
___

■ BOOL

DESC 条件が真であるかどうかを表す値のこと 2 つある

  // 大文字, 個別の区別はなし
  //
   TRUE : 1
   FALSE : 0
___

■ DATETIME.DATE

DESC 日付, 時刻を保存しておく型
  DATETIME   日付と時刻        
  DATE       日付
  TIME       時刻
  TIMESTAMP  タイムスタンプ
  YEAR       年
値を指定する時の文字列の書式は以下のような指定ができる もし書式が不正と判断すると0値が設定される
    YYYY-MM-DD HH:MM:SS
    YYYY.MM.DD HH.MM.SS
    YYYY/MM/DD HH/MM/SS

    YYYYMMDDHHMMSS

  // 形式 'YYYY-MM-DD HH:MM:SS'
  insert into tbl (birthday) values('2010.05.28 10:22:22')


  // 時間を省略
  //    RET: "2010-05-05 00:00:00"
  insert into tbl (birthday) values('2010.05.05')


  -- 誕生日が 2010年5月30日 より後を指定
  select * from tbl where birthday > "2000-05-30";


  WARNING
    
  -- Strict Mode では 不正な日付はエラー
  insert into tbl (d) values('2010.04.31')

WARNING ["] いります
___

■ 整数

DESC 次の 5 つがある 各格納できる値の範囲が決まっていて 範囲を超えるとエラーになる
   TINYINT
     -128:127 (unsigned 0:255 )

   SMALLINT
     -32768:32767 (unsigned 0:65535)

   MEDIUMINT
     -8388608:8388607 (unsigned 0:16777215 )

   INT(INTEGER)
     -2147483648:2147483647 (unsigned 0:4294967295)

   BIGINT
     -9223372036854775808から9223372036854775807
     (unsigned 0:18446744073709551615)
___

■ ZEROFILL

DESC SQL Browser にもある。
    // 001 となる
    TINYINT money
___

■ 表示幅

SYNTAX typename( N ) DESC 各データ型は表示幅を設定できます Nには幅を表す数値 幅を指定すると指定した幅で数値が表示されます

    本来使用可能な桁数よりも小さい表示幅を指定すると
    表示幅よりも大きい値を指定すると設定は無視される
  

    SMALLINT(3) 
___

■ UNSIGNED

DESC 数値型に 符号なし OPTION を追加する WARNING
    // すでに マイナスがはいってる column に UNSIGNED 
    // を追加すると怒られる
    // 
    Out of range value for column 'nr' at row 1
___

■ 文字列型(string)

DESC 文字列を格納します 型によって最大 Byte 数がきまっています WARNING () 内の数値は 半角のときの 最大文字数( 2 Byte 文字は半分にへる ) まとめると 3 つ
  // 型名     最大 Byte  
  CHAR       255         固定長 半角英数字は255文字まで、2バイト文字は約127文字まで
  VARCHAR     255        可変長 半角英数字は255文字まで、2バイト文字は約127文字まで
  TEXT     65535         大量の文字列を保存したいときに利用
WARNING
    // 2 べきの値はだめです
      -- BAD
      CHAR(256)
      -- OK
      CHAR(255)
___

■ CHAR(文字数)

DESC 指定文字数(バイト数)分の文字列が保存できる「固定長」のデータ型 固定長 とは文字列を保存するときに必ず確保した文字数(バイト数)を消費する
    // 10 byte 分の箱を用意
    char(10)   

    insert into tbl moji 

    // 空白 で padding される
    // とりだすときは, space が削除される
    --------------------
    abcde[ ][ ][ ][ ][ ]
    --------------------
    
CHAR(10) [xxxxxxxxx___] CHAR(7) は超えることができない CHAR 型のカラムでは、 CHAR(4) 型と VARCHAR(4) 型から取り出した値はそれぞれの場合で変わりません まとめるとコレ

  CHAR , VCHAR の比較  ( 単位 : byte )
  値        CHAR(4) WORKSIZE VARCHAR(4)  WORKSIZE 
  ''         '    ' 4        ''           1  
  'ab'      'ab  '  4         'ab'        3 
  'abcd'    'abcd'  4         'abcd'       5
  'abcdefgh' 'abcd'  4         'abcd'       5
WARNING
    // 最大文字数をこえるとエラー

    // ERROR 1406 (22001) at line 5: Data too long for column 'str' at row 1
    insert into test.testtbl (str) values("testdayo");
___

■ VARCHAR(最大文字数)

DESC 上限つきの Variable (可変サイズ)のCHAR型 保存された文字数分の領域しか消費しません 可変 Work だから遅い 最大文字に満たないときは 文字数 + 1 byte 分を消費する

  VARCHAR(10)   // 最大10文字の可変長文字列

  // 4 byte 消費
  --------
  [abc][N]
  --------

  // 8 byte 消費
  -------------
  [abcdefgh][N]
  -------------

WARNING 文字数 というのは半角文字で書かれた場合の文字数ということ 日本語は2バイト文字を保存するとき半分の5文字になる。 想定文字数の 2 倍程度にする。
___

■ TEXT

DESC 65535 バイトの文字列が保存可能なデータ型 保存される文字列数が特定できないカラムに対して利用する。 WARNING デフォルト値は指定できない。 ( BLOB/TEXT column cant have a default value ) 改行Code は [\r\n] かも? 可変長文字列 TINYTEXT : 2^ 8-1 バイト TINYTEXT : 2^16-1 バイト MEDIUMINTTEXT : 2^24-1 バイト LONGTEXT : 2^32-1 バイト
  // SQL 文では CHAR と同じようにすればいいだけ
  insert into foo (txt) values("aaa")

___

■ BLOB(BinaryLargeObject)

DESC データをバイトコードとして格納する。 違いはソートと比較時に大文字と小文字を区別するかしないか (BLOBはする, TEXTはしない)
___

■ Enum(列挙型)

DESC あらかじめ決めた値のリストを定義する型 設定できる数は 2^16 個 設定される値があらかじめ決まっているならば利用すると便利。 ( 性別カラムの男 | 女 ) Enum 型の値は 1 から始まり 0 は空文字列が返る。
    -- 条件の指定では文字列ではなく数値でする
    select name from member where sex = 1;
___

■ set

DESC Enum型同様にあらかじめ値のセットを決めておくが セットの中から自由に組み合わせることができる。 C でのビットフラグのような扱い。 最大で64個の要素を持てる。
    -- 条件指定には & をつかう
    select  name  from  member  where family & 4;
___

■ Set

___

■ Column.属性

DESC 各 column には 属性を指定できます TIP いろんな "おせっかい" があるので STRICT mode にするとよいかも こんなおせっかいがある
  // 
   char(4)のフィールドに'12345'の文字列をinsertすると'1234'とセットされます

   制約に外れると勝手にデフォルト値を入れられるわけね

  // 自分の環境では きちんとはじいてくれる
  // Data too long for column 'str' at row 1 
my.cnf に STRICTモードにできます 以下のようにsql-modeを追記 [mysqld] sql-mode="STRICT_ALL_TABLES"
___

■ NotNULL

DESC この Colunn は not null == [ NULL はなしよ ] という意味 // もし指定しないと, 次のようにいわれる ( "test" Column は null になりえない ) // Column 'test' cannot be null insert into tbl (test, str) values( null, null ) TIP すでに null がある column を NotNULL に変更するとERROR がでます
  // 次はいれることができる -> 0 が "0" と解釈してくれる
  insert into foo (test, str) values(0, 0)

  BAD
    insert into tbl (test, str) values(0, 0aaa)
  OK
    insert into tbl (test, str) values(0, "0aaa")
-> ちなみに table 一覧を見ると, ["] はつかない. -> これは 文字列ですよ ! という意味 // [ Default Value ] が空のときは 怒られる insert into foo (test) values(0) Field 'str' doesn't have a default value
___

■ DefaultValue

DESC デフォルト値を指定する insert でカラムの指定がないときは, この値がセットされる。 QueryBrowser ではカラム型によって次のように入力する
    // BAD
    文字列型    abc

    // 文字列はクォートすること
    文字列型    "abc"
    文字列型    'abc'

    // 数値型はそのまま入力
    数値型      1

    // NULL を指定するとカラムの値の指定がなければ NULL がセットされる。
    // ただし オプションとして NotNULL をオフにする必要がある。
WARNING NotNULL を指定すると インサート時のカラムの指定がなければDefault値が設定される。 そのとき値の指定がなければエラーになる。 TEXT, BLOB はデフォルト値をもつことができない為 NotNULL オフではエラーになる。 NotNULL オンではNULLが設定される。 Field 'xxx' doesn't have a default value


  // 空文字が default
  // char(10) のときは, "def" と入力しないと ERROR になる

insert 時に 指定しなくてもよい方法は 2 つある
   Not NULL をはずす -> NULL がはいる ( だって NULL がはいってもいいっていっるから )
   Default 値をいれる -> Default の値がはいる
TIP Column を追加するときに, Default なし && NotNULL にすると その型の Default がはいるらしいです
  // Int なら 0 がはいる
  int -> [0]
TIP // null の扱いはおいておき, Defalut Value を空にすると, // == Default 値は ないとみなされて, 怒られる // ちなみに , field をつくった直後は NOT NULL が ON になるらしい -> ie. 空はなしよ ! ということになる. -> 慣れないうちはこれが望ましい // Default Value [null] とあったら 文字とおり, 空 == 指定がないということ
___

■ SYNTAX



___

■ Comment

    -- コメントです
WARNING
    --Spaceがないとだめ
___

■ 演算子

DESC 演算子とは、演算内容を指示する記号(Symbol)のこと ( 子 )というのは 記号 ( Symbol のこと ) SQLの中で使用される式は、『オペランド』と『演算子(オペレータ)』を組み合わせたもの ie. 式. == { Operand, Operator } このオペランドを[ 操.作 ]する記号が、演算子です Expression : 10 + 100 Where + : Opecode 10 : Operand
___

■ 比較演算子

SYNTAX < > < = >= == DESC Operand の型によって比較方法が変わる

  // 2つとも整数なら , 整数として比較
  where number > 3

  // 2つとも文字列なら , 文字列(文字コード順)として比較
  where str > "abc"

  // 1つでも NULL なら NULL をかえす
  where number > 3

  // 一方が TIMESTAMP || DATETIME で
   他の引数が定数のときは定数は比較前にTIMESTAMP に変換されます

  //  他の場合は全て浮動小数として比較される

___

■ 論理演算子

DESC 引数に 0, NULL といった値がひとつでもあれば 0 がかえる BETWEEN 条件 AND OR TIP NULL の意は "データが存在しない" 数値や文字と 比較も計算もできない
___

■ 算術演算子(Math)

DESC sql は DB から 値を取るだけでなく, 算術演算もできる
  mysql> select 10 - 7, 8.8 - 17.92, 4.5 - 3.5, 5.7 - 10, 3.0 - 2.0;
  // 除算の結果は float になる
  // RET: 0.3333
  mysql> select 1/3

  // div ( 商 )
  // RET: 1
  mysql> select 4 div 3

  // mod
  // RET: 0
  mysql> select 4 % 2

  // mod
  // RET: 0
  mysql> select pow(2,4)
  
___

■ 関数.Function

POINT 関数を使えば, レコードの結果を編集してから取得できる
___

■ 数学.math


  // 除算の結果は float になる
  // RET: 1
  mysql> select abs (-1)

  // round ( 四捨五入 )
  // RET: 3.14
  mysql> select round( 3.1412, 2 ) 

  // truncate ( 切捨て )
  // RET: 3.14
  mysql> select truncate( 3.1412, 2 )

  // ceil, floor
  // RET: 4
  mysql> select ceil( 3.1412 )


  // 自然対数
  select exp( 1 );

  // 自然対数
  select exp( 1 );


  // 常用対数
  select log10( 1000 );

  // 常用対数
  select log2( 1024 );

  // 円周率
  select PI()
  
  // 少数を丸める
  // 11
  CEILING( 10.3 )
  // 10
  FLOOR( 10.3 )
  // 10.4
  ROUND( 10.36, 1 )
  // 10.3
  TRUNCATE( 10.31, 1 )



  // 数値から 書式変換
  // String 型になる

  // RET: 19,800
  mysql> select format( 19800, 0 )


  // 文字列から数値に 明示的に変換
  mysql> select cast( "100" as signed )
  
  // BAD
  mysql> select cast( "100.1" as float )

___

■ 文字列操作

___

■ LPAD

DESC Left Padding 左に文字を詰める // RET // 0000000009 select LPAD( "9", 10, '0' ); select LPAD( id, 10, '0' ) from tbl; // 数値の文字列を sort する // 1 // 2 // 11 select id from tbl order by LPAD( id, 10, '0' ); // 1 // 11 // 2 select id from tbl order by id
___

■ concat

  select concat("aaa","bbb");

  select concat(myoji,namae) from member;
___

■ insert

select insert( "abcdef", 2,3, '999' );
___

■ replace

  select  replace( "abcdef", "bcd", '999' );
___

■ length

    -- バイト単位
    select length("aaa");
    -- bit単位
    select bit_length("aaa");

    -- 文字単位
    select char_length("あああ");
___

■ space

    -- 5個分のスペースを返す
    select space(5);
___

■ strcmp

DESC 大小関係を返す。 ASCII 以外のマルチバイトでも利用できるが、大文字、小文字の区別はされない。
    -- 0
    stcmp( "abc", "ABC" )

    -- 1
    stcmp( "d", "ABC" )

    -- -1
    stcmp( "あ", "い" )
___

■ network

___

■ inet_aton inet_ntoa

  select inet_aton("127.0.0.1");
___

■ 集計.count

DESC グループ内での最大、最小を求める POINT 集計、平均はグループが対象になる。 グループは GROUP BY で指定したり、カラムが対象になる。
    select  max( id ) from member
    select  min( id ) from member
合計と平均
    select  avg( id )   from member
    select  sum( id )   from member
レコード数を取得する。
    -- テーブル内の全レコード数を取得する。
    select count(*) from member;

    -- カラム idadr が重複なしで何種類あるか取得する。
    select count(DISTINCT idadr) from member;

    
    -- 条件にマッチしたレコード数を取得する。
    select count(*) from member idadr = 1;

    

    
___

■ 日付時刻

    -- 秒数 < -> 時刻
    select sec_to_time( 777 );

    -- 2011-11-26
    select CURDATE();

    -- 2011-11-26
    select CURTIME();

    -- 2011-12-01 22:47:00
    select NOW();
___

■ 情報

    show slave hosts
    -- 現在のデータベースを取得する
    select database();
    -- 利用可能な権限リストを取得する。
    show privileges;

    -- カラムのデフォルト値を取得する
    select default( idadr ) from member;  
___

USAGE >■ USAGE

___

■ MySQLを起動する

DESC すべては Program であることを忘れないこと 常駐 Program であることを意識する. ( Service > MySQL にはいっている ) Program 本体は C:\Program Files\MySQL\MySQL Server 5.1\bin\mysql.exe ↑に SQL command を送信することで DB 操作をする ( 今は jsp 経由でなげている )
___

■ DB.を作成する

DESC MySQLAdminstrator(GUI) でのつくりかた
    1. Sel [カタログ]

    2. Sel Schema(図表) RMB > Create New Table


        Schema > Table という Data 構造らしい

    3. Column を入力する

        WARNING
          名前 (TIME | DESC) は reserved かも


          
    4. Table Name をいれる
    5. 作成したものを QueryBrowser で確認する

    TIP
      Primary Key には KEY Icon が表示される
      CHAR() の方が VCHAR よりも軽いらしい

    WARNING
      CHAR(256) は too big といって怒られる -> '\0' 文字を考慮してね ! ということかな ?


          

      以下の command が生成される    
        CREATE TABLE `mytbl`.`New Table` (
          `ID` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
          `TOOL` CHAR(128) NOT NULL,
          `ARG1` CHAR(256) NOT NULL,
          `ARG2` CHAR(256) NOT NULL,
          `ARG3` CHAR(256) NOT NULL,
          `ARG4` CHAR(256) NOT NULL,
          `TIME` CHAR(128) NOT NULL,
          `DESC` CHAR(256) NOT NULL,
          PRIMARY KEY (`ID`)
        )
        ENGINE = InnoDB;
  // DB の内容を一覧する
  // RET: mysql, test ( これが DB 扱いらしい. )
  SHOW DATABASES;

  // DB を作成する
  // ということは ( App ごとに )config.xml に指定するのは, DB の名前かも
  CREATE DATABASE testDB;

  // DB を選択する
  // Window 部分に, localhost:3306/testDB 
  USE testDB;
  
  // table 一覧をみる
  show tables;

  // table 作成
  create table Customer (
     age   INT(3),
     name VARCHAR(20),
     PRIMARY KEY (PREF_CD)
  );
USAGE 起動して接続する ( ということは, winsock などを利用して, DB へ SQL command を投げているのか ) DB はひとつの Program( PS )であり, Port 3306 から起動しているのか ? MySQL > MySQL Query Browser ServerHost: DB がある場所を指定する username : Account Password : xxx Table を選択する. USE SampleDB040;
___

■ ユーザー管理




___

■ Password

  -- ユーザー xxx が DB ( db_name ) へ接続する際にパスワード認証を必要にする
  mysql -u xxx -p db_name
___

■ パスワードの初期設定

DESC インストール初期状態では、管理者用のユーザとして root が用意されている。 パスワードはないため、適切に設定する必要がある。 次のどれかで設定をする

    --  PASSWORD() 関数を使用してパスワードを指定
    shell> mysql -u root mysql
    mysql> SET PASSWORD FOR root@localhost=PASSWORD('xxx');

mysqladmin.exe を使う

    // mysqladmin コマンドを使用しても、パスワードを設定
    shell> mysqladmin -u root password xxx

パスワードテーブル( mysql DB の user テーブル )を直接編集する

    -- Password も Table にある 
    shell> mysql -u root -pOldPassword


    -- "root" user の password を "xxx" にする
    mysql> UPDATE mysql.user SET Password=PASSWORD('xxx') WHERE user='root';


    -- 反映するには FLUSH PRIVILEGES でサーバに権限テーブルを再読み込みさせる
    mysql> FLUSH PRIVILEGES;
___

■ ユーザー 追加

-- 権限テーブルを直接変更する
      INSERT INTO user (Host,User,Password) VALUES('localhost','xxx',PASSWORD('yyy') );
      FLUSH PRIVILEGES;
    -- すべての DB の操作権限をもつ ユーザ (xxx) を パスワード ( yyy ) で追加
    GRANT ALL PRIVILEGES ON *.* TO xxx@'%'  IDENTIFIED BY 'yyy' WITH GRANT OPTION;

    -- user( xxx ) を作成する。
    CREATE USER xxx;

    -- パスワード( yyy )を指定
    CREATE USER xxx IDENTIFIED BY "yyy";

    -- user( xxx ) を削除する。
    DROP USER xxx;

    -- 名前を変更する
    RENAME USER  xxx TO yyy;

    -- パスワードを変更する
    SET PASSWORD  FOR yyy = PASSWORD( "zzz" );

  POINT
    操作権限を与えるには GRANT 命令を使うこと。
    
___

■ grant

SYNTAX GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name | * | *.* | db_name.*} TO user_name [IDENTIFIED BY [PASSWORD] 'password'] [, user_name [IDENTIFIED BY [PASSWORD] 'password'] ...] [REQUIRE NONE | [{SSL| X509}] [CIPHER cipher [AND]] [ISSUER issuer [AND]] [SUBJECT subject]] [WITH [GRANT OPTION | MAX_QUERIES_PER_HOUR # | MAX_UPDATES_PER_HOUR # | MAX_CONNECTIONS_PER_HOUR #]] DESC ユーザを作成したり、ユーザーに操作権限の追加、削除をする。 MySQL ユーザ名には最大 16 文字 Unix ユーザ名は通常 8 文字まで MySQL で認証目的に使用するパスワードは Unix ユーザ名(ログイン名)や Windows ユーザ名とは関係ない MySQL クライアントはデフォルトで 現在の Unix ユーザ名を MySQL ユーザ名としてログインしようとするが これは利便性のためだけのこと MySQL で認証目的に使用するパスワードは Unix ユーザ名(ログイン名)や Windows ユーザ名とは関係なく自由に設定できる。 クライアントプログラムで -u || --user により別の名前を指定できる これは すべての MySQL ユーザ名にパスワードを設定しないと データベースを安全に保てないことを意味する WARNING パスワードを設定しないと だれでも任意の名前でサーバへの接続を試みることができ パスワードのない名前を指定すれば接続できてしまう
    -- ユーザー権限をみる
    show grants

    show grants for root@localhost

    -- ユーザー xxx へ全権限を与える
    GRANT ALL ON *.* TO xxx


    -- SELECT のみを許可する。
    GRANT ALL select *.* TO xxx

    -- すべての権限をなくす
    revoke ALL select *.* FROM xxx
___

■ 改行コード


  改行コード [\r\n] かも

          String sTmp = rs[i][j];

          // NOTE
          //    改行コード == [\r\n] らしい
          String sMerge = sTmp.replaceAll( "\r\n", "___" );
          
//           String []aTmp = sTmp.split("\r\n");
//           String sMerge = "";

//           for( int kk=0; kk< aTmp.length; kk++ ){
//             sMerge += aTmp[kk];
//             if ( kk <  (aTmp.length - 1) ) { 
//               sMerge += "___";
//             }
//           } 

___

■ System


___

■ システム変数

DESC システム変数とはSQL サーバの挙動を設定するための各種パラメータのこと。 設定は設定ファイル(my.ini)に記述することで行う。

    // 現在の設定をみる
    show variables;


    // sjis に変更する -> かわらなかったような
    SET @@character_set_results ='sjis';
    SET @@character_set_results ='sjis';
    
    
[mysql] 
default-character-set=utf8 
となっているのを、 
[mysql] 
#default-character-set=utf8 
default-character-set=sjis 

___

■ Erorr

log_error : エラーログファイルパス ( c:/ProgramData/MySQL/MySQL Server 5.5/data/ ) log_warnings : 警告ログを出すか?
___

■ 実行中のスレッド

    SHOW PROCESLIST
___

■ スレーブホストの一覧をみる

    show slave hosts;  
___

■ DB.とは

DESC 使い方ではなくて、DB の考え方の説明です
___

■ DB.から学べる.Computer.基礎知識

DESC data を記述するための data ( meta Data ) Computer とはそもそも data 処理をするための道具
___

■ DB

DESC
     // Table は Record の集合
     [Table]
        [Record]
        [Record]
        [Record]
        [Record]
        
        // Record は Column の集合
        [Record]
            [Column][Column][Column][Column][Column]
DBMS とは DB を管理する Soft( Service ) KEY は table間の relationship を向上するもの. index は data 検索を向上させるもの. Record を一意に識別可能な field を PrimaryKey という 外部KEY とは他tableの主KEY のこと ( 外部KEY によって Relationship が構成される )
___

■ DBとはデータの貯蔵庫

DESC data を一箇所に集めるることで, 検索 SPEED があがる data を蓄積するために, 伝票, 名刺に必要な情報をまとめる -> 構造体 | Record -> ここでどんな構造体がくるかわからないから, metadata が必要になります DB のわかりやすいたとえとして, [ 住所録 Application ]
___

■ relationDB.で.DRY.原則を守る

DESC 問題は 複数の [ Record が 同一のdata ]を繰り返すこと
  // 墨田区 の名前が変更されたら, すべて変更しないといけない
  //
  住所録 DB
      田中 | 墨田区   | ... 
      佐藤 | 墨田区   | ... 
      A    | 中央区   | ... 
      B    | 中央区   | ... 
      C    | 千代田区 | ... 
区Table を別管理して参照させる 墨田 -------- 田中 中央 | 千代田 ---- 佐藤
___

■ DatabaseSystem.の実態は.datafile

DESC datafile < -> DBMS < -> Application System の規模に応じて , 構成をかえる
___

■ 小規模(StandAlone)

DESC 一台のPC に datafile DBMS Application を配置
___

■ 中規模(File.共有型)

DESC 一台のPCに datafile && 複数のPCに DBMS | Application
___

■ 大規模(ClientServer.型)

DESC 一台のPCに datafile | DBMS を配置 複数PC Application
___

■ ServerとClientをWeb経由でするならばWebSystem

DESC Application も Server に配置して, Application は browser のみ.
___

■ DB.を設計してみよう

DESC 何が知りたいのかを考えて Data を洗い出してみる( ここ大事です )
___

■ 個々のData.属性を作成する

* ( data をあらわす data を作成する ) 1. Schema という.( どんな情報があるか ? を定義する. )
   --------------------------------
    酒屋 DB
   --------------------------------
    Filed name:商品 :  型 string
    Filed name:顧客 :  型 string
    Filed name:単価 :  型 数値
    Filed name:売上数 : 型 数値
___

■ データの重複をなくそう

DESC DB の中に同じ data がないかチェックする Relational DB とは table を分割して, 情報を重複を防ぐこと. ie. 参照にするだけ
    // 同じ data を繰り返し入力する必要がある. 
    -----------------------
    酒屋 DB
    -----------------------
    商品名:     単価    顧客    
    ウィスキー  2000    A     
    ウィスキー  2000    B
    日本酒      1000    A
___

■ Table.間を.LINK.するための.KEY.を.Field.に追加する

DESC Primary KEY : record を特定する uniq 値 -> XXX_ID という Field名 が一般的 * ForeignKey ( 他Table Record を特定する KEY -> だから外部 ) ポインタみたいなもの * メタファーとしては 外部 KEY の部分に 他Table Record が埋め込まれるのを想像しよう 売り上げ Table 売り上げID 商品ID 顧客ID 売り上げ数量 0 1 3 10
___

■ Dataの検索SpeedをあげるためにIndexを利用してみる

DESC 1. Tableの各 field に index つけをする. メタファーとしては 本の索引. glBegin < -> P315 1. Index Table Field値 , record 場所. -> 代表となる(_KW_: ) で情報をひくのが Point
___

■ つくる手順

DESC DB を設計する DBMS を操作する Application ( usr interface )作成する
___

■ SQL(StructuredQueryLanguage)とは.DBMS.に命令を与える言語

DESC SELECT : Refer Update Insert
    SELECT

    // 取得したい Field 
    顧客名, 住所, 電話番号, 商品名, 単価, 売上数量

    // Table 
    FROM 顧客Table, 商品Table, 売上Table

    // 条件指定 AND  == && 
    WHERE 顧客Table.顧客名 = "やまだたろう"     

    AND 売上Table.顧客ID = 顧客Table.顧客ID 

  使い道としては
    Asset ( Version ) 管理をするために, SQL Server をたてる
***** Transaction.制御も.DBMS.にまかせる DESC Transaction とは 複数の SQL 文 BEGIN_TRANSACTION SQL... COMMIT Trouble が発生した場合は Rollback 処理をする -> ここまでしてくれるから DB を使う意味がある!
___

■ FAQ

DESC 困ったときはこちら
___

■ SQL.でうまく動作しなくなったら.reset.するのがよいかも

DESC 何か 新規で file を追加しただけで, 動作しなくなった
___

■ Tomcat.のログを見る

DESC トラブルにあったときは, 以下に log がのこる Java の Program らしい ので JRE の ReInstall などで 実行できなくなると サービス開始時に落ちる


    [2010-04-06 10:01:51] [info] Error occurred during initialization of VM
    [2010-04-06 10:01:51] [info] java/lang/NoClassDefFoundError
    [2010-04-06 10:01:51] [info] : java/lang/Object
    [2010-04-06 10:10:40] [info] Procrun (2.0.4.0) started
    [2010-04-06 10:10:40] [info] Running Service...
    [2010-04-06 10:10:40] [info] Starting service...
___

■ 次のサービスを.Reboot.すると正しく動作するらしい

DESC SQL Server (SQLEXPRESS) * なんか 2 table を merge できるらしい -> しかも 更新日時 が新しい方にとか google の検索 page もこちらになるらしい mosi local におとして, parse すると perl などですると 相当負担がかかるらしい
___

■ GUITool.を使う


  DESC
    便利な GUI TOOL がある
    SQL Command を覚えなくても GUI 操作で処理できる


___

■ MySQLAdminstrator

DESC GUI で table 内容を定義できる TableOptions utf8 に統一( column ごとに変更もできるらしい. ASCII , UNICODE ) ただし日本語を扱うので utf8 がよさげ CHAR(255)
___

■ MySQLQueryBrowser

DESC MySQL のデータを GUI ベースで操作できるツール エクセルの表を扱う感覚で編集できる点がラク TIP sql は [ edit ] mode を使うとラクチン * JSP 上で問題があったときは, SQL を dump して query browser でみてみると ERROR 内容を check しやすい QueryBrowser でできること
   table 名変更
   column 削除, 編集
   row 削除
TIP // Command の再入力 m-[left|right] で history が利用できます c-z : UNDO c-y : REDO
___

■ ErrorCode




___

■ 1046

Error: 1046 SQLSTATE: 3D000 (ER_NO_DB_ERROR) Message データベースが選択されていません. DESC データベースが選択されていないと発生する。
    -- データベースを指定するか
    use xxxdb;

    -- テーブルの前に明示する。
    select  * from  xxxdb.table;
___

■ 1075

MSG there can be only one auto column and it must be defined as a key DESC Primary Key がないと言われる Message: テーブルの定義が違います; Auto increment && Primary Key OFF にすると言われるらしい [ KEY ] mark をつけるのが POINT
___

■ 1048

ERROR 1048 (23000) at line 32: Column 'name' cannot be null DESC NOT NULL 属性の Column に null をいれようとした

    CREATE TABLE tbl (
    name    char(32)       NOT NULL,
    age     INT            NOT NULL
    );

    
    -- insert tbl (name,age) values(null,20);

    insert tbl (name,age) values("suzuki",20);

___

■ 1086

SQLSTATE: HY000 (ER_FILE_EXISTS_ERROR) Message: File '%s' は既に存在します WARNING 既存のファイルを指定することはできない。 ( 理由は /etc/passwd などのデータベーステーブルやファイルが破壊されないようにするため )
    mysql> SELECT * INTO OUTFILE 'd:/test.txt' FROM tbl;
    -- 
    --- ERROR 1086 (HY000) at line 15: File 'd:/test.txt' already exists
___

■ 1142

INSERT command denied to user 'xxx'@'localhost' for table 'yyy' MESSAGE コマンド %s は ユーザー '%s'@'%s' ,テーブル '%s' に対して許可されていません DESC 指定したコマンドをする権限がないので GRANT などで権限をもらうこと。 下準備(Setup) SQL などを 使う PC は WindowsServer とかいれる Server マシンは別でも, 同じ( localhost )でも OK
___

■ 1265

MESSAGE Data truncated for column XXX at row N DESC "N 行目のレコードの カラム XXX にデータとして問題がありますよ" という意味。 レコードがある状態でテーブルの定義を変更すると発生する。
      id    name        age
       1     xxx         10
       2    NULL         20
nameのデフォルト値を NotNULL に変更しようとするとレコード 2 に問題が発生する。
___

■ API

___

■ その他


___

■ version

  select vesion();
___

■ uuid

  select uuid();
___

■ user

  select user();

















NINJAIDX 2