2011年9月27日火曜日

Rails sqliteでboolean

Shop.paginate(:page => 1,:per_page => 5,:conditions => ['ec_flag = ?',true])
■mysql では boolean は true と false ですが、sqlite3 では 1 と 0 だからということなのですね。

2011年9月26日月曜日

rails3 1つ前のURLに戻る

<input type=button value="買い物を続ける" onClick="history.go(-1)">

2011年9月22日木曜日

rails3 失敗したscaffoldを削除する

取り消したいscaffold名を*****で実行する。
$ rails destroy scaffold *****
 

Javascriptでのデバック関数

<script type="text/javascript"><!--
function print_r(obj) {
var count_obj = 0;
    function _output(str) {
       document.writeln(str + "<br/>");
    }
    function _print_r(obj, name, level) {
        var s = "";
        if (obj == undefined || level > 4) return;
        for (var i = 0; i < level; i++) { s += " | "; }
        s += " - " + name + ":" + typeof(obj) + "=" + obj;
        _output(s);
        if (name == "document" || typeof(obj) != "object") return;
        for ( key in obj ) {
        if (count_obj++ > 150) return;
            _print_r(obj[key], key, level + 1);
        }
    }
      _print_r(obj, "*", 0);
}
//-->
</script>

2011年9月21日水曜日

rails3 でsessionを情報をDBで管理

$ rake db:sessions:create
$ rake db:migrate
また、config/initializers/session_store.rbの8行目
********::Application.config.session_store :active_record_store
のコメントをはずす,
また、3行目の下記をコメントに変更
#Application.config.session_store :cookie_store, :key => '_market_session' 
でOKです。


2011年9月15日木曜日

Rails3 ネストしたコントローラへの値の渡し方

 ■たとえば下記のようrake routesがあったとすると、
new_shop_shop_article GET    /shops/:shop_id/shop_articles/new(.:format){:action=>"new",:controller=>"shop_articles"}
のように値をわたせばよ、

new_shop_shop_article_path(@shop)


■また、下記のような場合だと

edit_shop_shop_article GET    /shops/:shop_id/shop_articles/:id/edit(.:format){:action=>"edit", :controller=>"shop_articles"}


edit_shop_shop_article(@shop,@shop_articles)やedit_shop_shop_article()でOKです。たぶん

redirect_toアクション指定

■下記はrake routes の表示
 shop_admin_relay GET    /shop_admin_relays/:id(.:format){:action=>"show",:controller=>"shop_admin_relays"}


■redirect_toでshop_admin_relay_pathを記述せず@shop_admin_aelay.shop_adminだけを渡すと、


format.html { redirect_to(@shop_admin_aelay.shop_admin 。。。。
のように渡すとshopコントローラのshowメソッドが存在する場合,
shopのshowにアクションが移ってしまうが、
*下記にように指定shop_admin_relay_pathするとrake routesの記載どうりアクションが移動する
format.html { redirect_to(shop_admin_relay_path(@shop_admin_aelay.shop_admin)

2011年9月14日水曜日

findメソッドでActiveRecord::RecordNotFoundの対処

find_by_idを使いましょう、
こちらはnilが帰ってきます。

rails 多対多

rails generate scaffold group name:string

rails generate scaffold menber name:string

rails generate migration group_and_menber







class GroupAndMenber < ActiveRecord::Migration
  def self.up
    create_table :group_and_menbers do |t|
      t.integer :menber_id
      t.integer :group_id
    end
  end

  def self.down
    drop_table :group_and_menbers
  end
end

class GroupAndMenber < ActiveRecord::Base
  belongs_to :menber
  belongs_to :group
end


class Group < ActiveRecord::Base
  has_many :group_and_menbers
  has_many :menbers, :through => :group_and_menbers
end

class Menber < ActiveRecord::Base
  has_many :group_and_menbers
  has_many :groups, :through => :group_and_menbers
end



menber = Menber.new(:name => 'menber1')
menber.save
group = Group.new(:name => 'group1')
group.save  

menber.groups << group

で多対多が成立します







2011年9月13日火曜日

rails3 fields_forでcontrollerに配列渡し



    <%= fields_for :パラメータ名 do |field| %>
        <% @mise_admins.each do |mise_admin| %> 
              <%= field.check_box %><%= mise_admin.name %>
          <% end %>   
    <% end %> 


解説:fields_for :パラメータ名 の部分がparams[:パラメータ名]になり、
{"1"=>"0", "2"=>"1", "3"=>"1"}に受け取ることができます。1と0で判別します

rails3 多対多

rails generate scaffold man name:string

rails generate scaffold woman name:string

rails generate migration create_to_man_woman


class Woman < ActiveRecord::Base
  has_and_belongs_to_many :mans
end


class Man < ActiveRecord::Base
  has_and_belongs_to_many :womans
end

class CreateToManWoman < ActiveRecord::Migration
  def self.up
    create_table :men_women, :id => false do |t|
      t.integer :man_id
      t.integer :woman_id
    end
  end

  def self.down
    drop_table :man_woman
  end
end





m = Man.create(:name => 'man1')
w = Woman.create(:name => 'woman1')
m.womans << w


m = Man.create(:name => 'man3')
m.womans << w

rails3では<%= check_box_tag の引数

<%= check_box_tag '第1引数','第2引数' %>
第1引数はidとnameになります。
第2引数はvalueになります。

2011年9月2日金曜日

link_to タグでアクション指定

<% @shops.each do |shop| %>
  <tr>
    <td><font size="1"><%= shop.name %></font></td>
    <td><font size="1"><%= shop.address %></font></td>
     <td><%= link_to("確認",  :action => "show", :id => shop) %>
  </tr>
<% end %>

2011年8月23日火曜日

Feforaでユーザ作成とshh接続

「Fedoreでの設定」
①$ su -
でrootに変更

②$ useradd ユーザ名
でユーザを登録
③$ passwd ユーザ名
でパスワードを作成
④gpasswd -a ユーザ名 グループ名
でユーザをグループに追加
⑤$vi  /etc/pam.d/su
で#auth  required  pam_wheel.so user_uid
のをコメントからはずす
⑥/etc/sudoers visudo
で安全にファイルを開く、そのなかの
#wheel ALL=(ALL)  ALL
のコメントをはずす。これでユーザがroot権限の実行が可能になる
⑦$sudo yum install vim
でvimをインストール

⑧$ service sshd start
でsshdの起動

「Puttyでの作業」
①puttyの文字コードをUTF-8(CJK)に設定
②サーバに接続し「$ ssh-keygen -t rsa」
でデフォルトのまま保存(/.ssh/id_rsa)
で秘密鍵のパスフレーズを聞いてくるので入力,
③$cat id_rsa.pub > .ssh/authorized_keys
でサーバに公開鍵をとうろく,authorized_keysのパーミッションをchmod 600で書き込み可能にする
④puttryで接続しカギをダウンロードし「puttygen.exe」で秘密カギを登録、接続でいいはず。

2011年8月11日木曜日

Rails3でfrom_forの引数していの内容

<%= form_for :test, :url => "tests/show" do |f| %>
<%= f.select  :id, @tests.collect {|m| [m.name, m.id] }  %>
<%= f.submit    %>

上記の記述では
第一引数がパラメータ名、第2引数がコントローラとメソッドの指定になります。
また、f.selectの第一引数がパラメータ名、第2引数を配列で渡した場合、でオプションタグのvalueとテキストになります。

コントローラでパラメータを受け取る場合は、
params[:test][:id]で受け取る事ができます。

Rails3 のroutes.rbでpostでパラメータを受け取る

routes.rbの記述
post  "tests/show", :via => :post
を記述すると
$ rake routes
コマンドを実行すると、
tests_show POST   /tests/show(.:format)       {:controller=>"tests", :action=>"show"}
が生成されパラメータを受け取る事ができます。


2011年7月13日水曜日

WindowsでRuby on Railsをインスト

■■■■Rails 3.0.9バージョンのインスト■■■■
>gem update --system
>gem install rails sqlite3

■■■■SQLITEのドライバインスト■■■■■
 http://www.sqlite.org/sqlitedll-3_7_3.zip
よりsqliteのドライバをインストしパスの通っている・Rubyのbin等にコピーしてください


■■■■Rails3のアプリの作成■■■■■

>rails new demo

create
create  README
create  Rakefile
create  config.ru
create  .gitignore
create  Gemfile
create  app
create  app/controllers/application_controller.rb
create  app/helpers/application_helper.rb
create  app/mailers
create  app/models
create  app/views/layouts/application.html.erb
create  config
create  config/routes.rb
create  config/application.rb
create  config/environment.rb
create  config/environments
create  config/environments/development.rb
create  config/environments/production.rb
create  config/environments/test.rb
create  config/initializers
create  config/initializers/backtrace_silencers.rb
create  config/initializers/inflections.rb
create  config/initializers/mime_types.rb
create  config/initializers/secret_token.rb
create  config/initializers/session_store.rb
create  config/locales
create  config/locales/en.yml
create  config/boot.rb
create  config/database.yml
create  db
create  db/seeds.rb
create  doc
create  doc/README_FOR_APP
create  lib
create  lib/tasks
create  lib/tasks/.gitkeep
create  log
create  log/server.log
create  log/production.log
create  log/development.log
create  log/test.log
create  public
create  public/404.html
create  public/422.html
create  public/500.html
create  public/favicon.ico
create  public/index.html
create  public/robots.txt
create  public/images
create  public/images/rails.png
create  public/stylesheets
create  public/stylesheets/.gitkeep
create  public/javascripts
create  public/javascripts/application.js
create  public/javascripts/controls.js
create  public/javascripts/dragdrop.js
create  public/javascripts/effects.js
create  public/javascripts/prototype.js
create  public/javascripts/rails.js
create  script
create  script/rails
create  test
create  test/fixtures
create  test/functional
create  test/integration
create  test/performance/browsing_test.rb
create  test/test_helper.rb
create  test/unit
create  tmp
create  tmp/sessions
create  tmp/sockets
create  tmp/cache
create  tmp/pids
create  vendor/plugins
create  vendor/plugins/.gitkeep

が作成されます。


■■■■Railsのwebサーバの起動■■■■■
>rails server
で起動、このときセキュリティの警告がでますが解除してください。

次に「http://localhost:3000/」にアクセスしてみてください、
WEBrickサーバが立ち上がり「welcome aboard」と表示されるはずです。


■■■■say/indexを表示■■■■■
>rails generate controller say index
上記のコマンドは「say」がコントローラ名で、
「index」がアクションになります。


下記がはきだされるはずです。
create  app/controllers/say_controller.rb
 route  get "say/index"
invoke  erb
create    app/views/say
create    app/views/say/index.html.erb
invoke  test_unit
create    test/functional/say_controller_test.rb
invoke  helper
create    app/helpers/say_helper.rb
invoke    test_unit
create      test/unit/helpers/say_helper_test.rb


それでは「http://localhost:3000/say/index」にアクセスしてみましょう。
「Say#index
Find me in app/views/say/index.html.erb」と表示されているはずです。

コントローラの中身は
class SayController < ApplicationController
  def index
  end
end
となっているはずです。http://localhost:3000/say/indexのindexがメソッドになります。

■■■■say/helloを作成しを表示■■■■■
class SayController < ApplicationController
  def index
  end
  def hello
  end
end
を追加、demo/config/routes.brに
get "say/hello"を追加し、
また、demo\app\viwe\say\hello.html.erbを作成し、<h1>hello</h1>
「http://localhost:3000/say/hello」を表示するとhelloと表示されるはずです。

2011年6月6日月曜日

MySQLをphpmyadminで操作

①xamppをインストール後、アパッチとmysqlを起動し、
C:\xampp\phpMyAdmin\config.inc.php
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['user'] = '';
$cfg['Servers'][$i]['password'] = '';
と変更し、
②http://localhost/phpmyadmin/をブラウザーで表示、
変更が成功しているなら、IDとPSを求められるので入力しphpmyadminをしようします。



2011年6月2日木曜日

ありがちな受注管理システムのmysql文 2

#初回にrootユーザのパスワード設定コマンド
mysqladmin -u root password mysql

#rootユーザでmysqlにログイン
mysql -u root -p

★★★★#P476 データベースの作成
CREATE DATABASE 受注管理;

#MySQLのコマンド。カレントデータベースを変更する。
use 受注管理;

★★★★#P476 テーブルの作成
CREATE TABLE 顧客 (
顧客番号 CHAR(4) PRIMARY KEY,
顧客名 VARCHAR(20),
住所 VARCHAR(50),
電話番号 CHAR(15));

CREATE TABLE 受注 (
受注番号 CHAR(5) PRIMARY KEY,
受注年月日 DATE NOT NULL,
顧客番号 CHAR(4),
受注合計 DECIMAL,
FOREIGN KEY(顧客番号) REFERENCES 顧客(顧客番号));
##################
#FOREIGN KEYは指定した
#親テーブルに存在しない値を指定してデータを追加
#するとエラーとなります。
#################


CREATE TABLE 商品 (
商品番号 CHAR(3) PRIMARY KEY,
商品名 VARCHAR(20),
単価 DECIMAL );

CREATE TABLE 受注明細 (
受注番号 CHAR(5),
商品番号 CHAR(3),
数量 INTEGER,
受注小計 DECIMAL,
PRIMARY KEY(受注番号,商品番号),
FOREIGN KEY(受注番号) REFERENCES 受注(受注番号),
FOREIGN KEY(商品番号) REFERENCES 商品(商品番号));

★★★★#P496 レコードの挿入(1件のみ)
INSERT INTO 顧客 (顧客番号,顧客名,住所,電話番号)
VALUES ('1001','株式会社冨田貿易','東京都港区芝浦1-XX-XX','03-3256-XXXX');

#カラムを指定せずに複数行を挿入
INSERT INTO 顧客 VALUES
('1003','宇宙商事株式会社','東京都足立区神明22-XX','03-5126-XXXX'),
('1006','有限会社吉野物産','大阪府大阪市中央区城見23-XX','06-6112-XXXX');

INSERT INTO 商品 VALUES
('A01','テレビ(液晶大型)','200000'),
('A11','テレビ(液晶小型)','50000'),
('G02','DVDレコーダー','80000'),
('S05','ラジオ','3000');

INSERT INTO 受注 VALUES
('00001','2010/04/01','1001','640000'),
('00002','2010/04/02','1006','518000'),
('00003','2010/04/02','1003','600000'),
('00004','2010/04/05','1001','3000');

INSERT INTO 受注明細 VALUES
('00001','A01','2','400000'),
('00001','G02','3','240000'),
('00002','S05','6','18000'),
('00002','A11','10','500000'),
('00003','A01','3','600000'),
('00004','S05','1','3000');

★★★★P497 挿入(INSERT文)★★★★★
INSERT INTO 顧客 (顧客番号,顧客名)
VALUES ('2001','株式会社こあら百貨店');
■■■■■■■■■結果■■■■■■■■■■■
+----------+----------------------+-----------------------------+--------------+

| 顧客番号 | 顧客名 | 住所 | 電話番号 |

+----------+----------------------+-----------------------------+--------------+

| 1001 | 株式会社冨田貿易 | 東京都港区芝浦1-XX-XX | 03-3256-XXXX |

| 1003 | 宇宙商事株式会社 | 東京都足立区神明22-XX | 03-5126-XXXX |

| 1006 | 有限会社吉野物産 | 大阪府大阪市中央区城見23-XX | 06-6112-XXXX |

| 2001 | 株式会社こあら百貨店 | NULL | NULL |

+----------+----------------------+-----------------------------+--------------+


★★★★★★★★#P497 更新(UPDATE文)★★★★
UPDATE 顧客 SET 住所='埼玉県入間市東町1-XX' WHERE 顧客番号='2001';
■■■■■■■■■結果■■■■■■■■■■■
+----------+----------------------+-----------------------------+--------------+

| 顧客番号 | 顧客名 | 住所 | 電話番号 |

+----------+----------------------+-----------------------------+--------------+

| 1001 | 株式会社冨田貿易 | 東京都港区芝浦1-XX-XX | 03-3256-XXXX |

| 1003 | 宇宙商事株式会社 | 東京都足立区神明22-XX | 03-5126-XXXX |

| 1006 | 有限会社吉野物産 | 大阪府大阪市中央区城見23-XX | 06-6112-XXXX |

| 2001 | 株式会社こあら百貨店 | 埼玉県入間市東町1-XX | NULL |

+----------+----------------------+-----------------------------+--------------+


★★★★★★★★#P498 削除(DELETE文)★★★★
DELETE FROM 顧客 WHERE 顧客番号='2001';
■■■■■■■■■結果■■■■■■■■■■■
+----------+------------------+-----------------------------+--------------+
| 顧客番号 | 顧客名 | 住所 | 電話番号 |
+----------+------------------+-----------------------------+--------------+
| 1001 | 株式会社冨田貿易 | 東京都港区芝浦1-XX-XX | 03-3256-XXXX |
| 1003 | 宇宙商事株式会社 | 東京都足立区神明22-XX | 03-5126-XXXX |
| 1006 | 有限会社吉野物産 | 大阪府大阪市中央区城見23-XX | 06-6112-XXXX |
+----------+------------------+-----------------------------+--------------+


★★★★★★★★#P479 ビューの定義★★★★
CREATE VIEW 顧客名簿 AS SELECT 顧客番号,顧客名 FROM 顧客;
■■■■■■■■■結果■■■■■■■■■■■
+----------+------------------+
| 顧客番号 | 顧客名 |
+----------+------------------+
| 1001 | 株式会社冨田貿易 |
| 1003 | 宇宙商事株式会社 |
| 1006 | 有限会社吉野物産 |
+----------+------------------+

★★★★★★★★#P480 検索系のデータ操作(SELECT文)★★★★
★★★★#P481 全ての項目の検索
SELECT * FROM 受注;
■■■■■■■■■結果■■■■■■■■■■■
+----------+------------+----------+----------+
| 受注番号 | 受注年月日 | 顧客番号 | 受注合計 |
+----------+------------+----------+----------+
| 00001 | 2010-04-01 | 1001 | 640000 |
| 00002 | 2010-04-02 | 1006 | 518000 |
| 00003 | 2010-04-02 | 1003 | 600000 |
| 00004 | 2010-04-05 | 1001 | 3000 |
+----------+------------+----------+----------+


★★★★★★★★#P481 特定の項目の検索★★★★
SELECT 受注番号,受注合計 FROM 受注;
■■■■■■■■■結果■■■■■■■■■■■
+----------+----------+
| 受注番号 | 受注合計 |
+----------+----------+
| 00001 | 640000 |
| 00002 | 518000 |
| 00003 | 600000 |
| 00004 | 3000 |
+----------+----------+

★★★★★★★★#P481 計算結果の表示★★★★
SELECT 受注番号,受注合計,受注合計*1.05-受注合計 AS 消費税 FROM 受注
■■■■■■■■■結果■■■■■■■■■■■
+----------+----------+----------+
| 受注番号 | 受注合計 | 消費税 |
+----------+----------+----------+
| 00001 | 640000 | 32000.00 |
| 00002 | 518000 | 25900.00 |
| 00003 | 600000 | 30000.00 |
| 00004 | 3000 | 150.00 |
+----------+----------+----------+


★★★★★★★★#P482 ひとつの項目で重複するデータを除いた検索★★★★
SELECT DISTINCT 受注年月日 FROM 受注;
■■■■■■■■■結果■■■■■■■■■■■
+------------+
| 受注年月日 |
+------------+
| 2010-04-01 |
| 2010-04-02 |
| 2010-04-05 |
+------------+

★★★★★★★★#P482 複数の項目で重複するデータを除いた検索★★★★
SELECT DISTINCT 受注年月日,顧客番号 FROM 受注;
■■■■■■■■■結果■■■■■■■■■■■
+------------+----------+
| 受注年月日 | 顧客番号 |
+------------+----------+
| 2010-04-01 | 1001 |
| 2010-04-02 | 1006 |
| 2010-04-02 | 1003 |
| 2010-04-05 | 1001 |
+------------+----------+


★★★★★★★★#P482 条件を指定したデータの検索★★★★
#前準備
INSERT INTO 受注 (受注番号,受注年月日,顧客番号) VALUES ('00005','2010/04/05','1001');
■■■■■■■■■結果■■■■■■■■■■■
+----------+------------+----------+----------+
| 受注番号 | 受注年月日 | 顧客番号 | 受注合計 |
+----------+------------+----------+----------+
| 00001 | 2010-04-01 | 1001 | 640000 |
| 00002 | 2010-04-02 | 1006 | 518000 |
| 00003 | 2010-04-02 | 1003 | 600000 |
| 00004 | 2010-04-05 | 1001 | 3000 |
| 00005 | 2010-04-05 | 1001 | NULL |
+----------+------------+----------+----------+


★★★★#P484 条件を満たすデータの検索★★★★
SELECT * FROM 受注 WHERE 顧客番号='1001';
■■■■■■■■■結果■■■■■■■■■■■
+----------+------------+----------+----------+
| 受注番号 | 受注年月日 | 顧客番号 | 受注合計 |
+----------+------------+----------+----------+
| 00001 | 2010-04-01 | 1001 | 640000 |
| 00004 | 2010-04-05 | 1001 | 3000 |
| 00005 | 2010-04-05 | 1001 | NULL |
+----------+------------+----------+----------+

★★★★#P484 すべての条件を満たすデータの検索★★★★
SELECT * FROM 受注 WHERE 顧客番号='1001' AND 受注合計>=600000;
■■■■■■■■■結果■■■■■■■■■■■
+----------+------------+----------+----------+
| 受注番号 | 受注年月日 | 顧客番号 | 受注合計 |
+----------+------------+----------+----------+
| 00001 | 2010-04-01 | 1001 | 640000 |
+----------+------------+----------+----------+

★★★★#P484 いずれかの条件を満たすデータの検索★★★★
SELECT * FROM 受注 WHERE 顧客番号='1001' OR 受注合計>=600000;
■■■■■■■■■結果■■■■■■■■■■■
+----------+------------+----------+----------+
| 受注番号 | 受注年月日 | 顧客番号 | 受注合計 |
+----------+------------+----------+----------+
| 00001 | 2010-04-01 | 1001 | 640000 |
| 00003 | 2010-04-02 | 1003 | 600000 |
| 00004 | 2010-04-05 | 1001 | 3000 |
| 00005 | 2010-04-05 | 1001 | NULL |
+----------+------------+----------+----------+

★★★★#P485 条件を満たさないデータの検索★★★★
SELECT * FROM 受注 WHERE NOT 顧客番号='1001';
■■■■■■■■■結果■■■■■■■■■■■
+----------+------------+----------+----------+
| 受注番号 | 受注年月日 | 顧客番号 | 受注合計 |
+----------+------------+----------+----------+
| 00002 | 2010-04-02 | 1006 | 518000 |
| 00003 | 2010-04-02 | 1003 | 600000 |
+----------+------------+----------+----------+

★★★★#P485 NULLを含むレコードの検索★★★★
SELECT 受注番号,受注合計 FROM 受注 WHERE 受注合計 IS NULL;
■■■■■■■■■結果■■■■■■■■■■■
+----------+----------+
| 受注番号 | 受注合計 |
+----------+----------+
| 00005 | NULL |
+----------+----------+

★★★★#P485 NULLを含まないレコードの検索★★★★
SELECT 受注番号,受注合計 FROM 受注 WHERE 受注合計 IS NOT NULL;
■■■■■■■■■結果■■■■■■■■■■■
+----------+----------+
| 受注番号 | 受注合計 |
+----------+----------+
| 00001 | 640000 |
| 00002 | 518000 |
| 00003 | 600000 |
| 00004 | 3000 |
+----------+----------+

★★★★#P486 2つの値の間にあるデータを含むレコードの検索★★★★
SELECT 受注番号,受注合計 FROM 受注
WHERE 受注合計 BETWEEN 600000 AND 1000000;
■■■■■■■■■結果■■■■■■■■■■■
+----------+------------+----------+----------+
| 受注番号 | 受注年月日 | 顧客番号 | 受注合計 |
+----------+------------+----------+----------+
| 00001 | 2010-04-01 | 1001 | 640000 |
| 00003 | 2010-04-02 | 1003 | 600000 |
+----------+------------+----------+----------+

★★★★#P486 リストの値と一致するデータを含むレコードの検索★★★★
SELECT 受注番号,受注合計 FROM 受注 WHERE 受注番号 IN ('00001','00004');
■■■■■■■■■結果■■■■■■■■■■■
+----------+------------+----------+----------+
| 受注番号 | 受注年月日 | 顧客番号 | 受注合計 |
+----------+------------+----------+----------+
| 00001 | 2010-04-01 | 1001 | 640000 |
| 00004 | 2010-04-05 | 1001 | 3000 |
+----------+------------+----------+----------+

★★★★#P486 リストの値のすべてと一致しないデータを含むレコードの検索★★★★
SELECT 受注番号,受注合計 FROM 受注
WHERE 受注番号 NOT IN ('00001','00004');
■■■■■■■■■結果■■■■■■■■■■■
+----------+----------+
| 受注番号 | 受注合計 |
+----------+----------+
| 00002 | 518000 |
| 00003 | 600000 |
| 00005 | NULL |
+----------+----------+

★★★★#P487 文字列の一部を条件とした検索★★★★
SELECT 商品番号,商品名 FROM 商品 WHERE 商品名 LIKE 'ラ__';
+----------+--------+
| 商品番号 | 商品名 |
+----------+--------+
| S05 | ラジオ |
+----------+--------+
SELECT 商品番号,商品名 FROM 商品 WHERE 商品名 LIKE '%液晶%';
■■■■■■■■■結果■■■■■■■■■■■
+----------+--------------------+
| 商品番号 | 商品名 |
+----------+--------------------+
| A01 | テレビ(液晶大型) |
| A11 | テレビ(液晶小型) |
+----------+--------------------+

★★★★#P487 表の結合★★★★
#下準備
DELETE FROM 受注 WHERE 受注番号='00005';
■■■■■■■■■結果■■■■■■■■■■■


★★★★#P488 2つの表の結合★★★★
SELECT 受注番号,受注.顧客番号,顧客名 FROM 受注,顧客
WHERE 受注.顧客番号=顧客.顧客番号;

******INNER JOINを使った場合*****
SELECT 受注番号,受注.顧客番号,顧客名 FROM 受注
INNER JOIN 顧客
WHERE 受注.顧客番号=顧客.顧客番号;

■■■■■■■■■結果■■■■■■■■■■■
:::::::::受注テーブル::::::::
+----------+------------+----------+----------+
| 受注番号 | 受注年月日 | 顧客番号 | 受注合計 |
+----------+------------+----------+----------+
| 00001 | 2010-04-01 | 1001 | 640000 |
| 00002 | 2010-04-02 | 1006 | 518000 |
| 00003 | 2010-04-02 | 1003 | 600000 |
| 00004 | 2010-04-05 | 1001 | 3000 |
| 00005 | 2010-04-05 | 1001 | NULL |
+----------+------------+----------+----------+
:::::::::顧客テーブル:::::::::
+----------+------------------+-----------------------------+--------
| 顧客番号 | 顧客名 | 住所 | 電話番号
+----------+------------------+-----------------------------+--------
| 1001 | 株式会社冨田貿易 | 東京都港区芝浦1-XX-XX | 03-3256
| 1003 | 宇宙商事株式会社 | 東京都足立区神明22-XX | 03-5126
| 1006 | 有限会社吉野物産 | 大阪府大阪市中央区城見23-XX | 06-6112
+----------+------------------+-----------------------------+--------
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
+----------+----------+------------------+
| 受注番号 | 顧客番号 | 顧客名 |
+----------+----------+------------------+
| 00001 | 1001 | 株式会社冨田貿易 |
| 00004 | 1001 | 株式会社冨田貿易 |
| 00005 | 1001 | 株式会社冨田貿易 |
| 00003 | 1003 | 宇宙商事株式会社 |
| 00002 | 1006 | 有限会社吉野物産 |
+----------+----------+------------------+
★★★★#P488 3つ以上の表の結合★★★★
SELECT 受注.受注番号,受注.顧客番号,顧客名,受注明細.商品番号,商品名,単価,数量,受注小計
FROM 受注,顧客,受注明細,商品
WHERE 受注.顧客番号=顧客.顧客番号 AND 受注.受注番号=受注明細.受注番号 AND 受注明細.商品番号=商品.商品番号;
*********下記のテーブルを結合してSQLを実行します。*********
:::::::::::::::受注:::::::::::::::
+----------+------------+----------+----------+
| 受注番号 | 受注年月日 | 顧客番号 | 受注合計 |
+----------+------------+----------+----------+
| 00001 | 2010-04-01 | 1001 | 640000 |
| 00002 | 2010-04-02 | 1006 | 518000 |
| 00003 | 2010-04-02 | 1003 | 600000 |
| 00004 | 2010-04-05 | 1001 | 3000 |
| 00005 | 2010-04-05 | 1001 | NULL |
+----------+------------+----------+----------+
::::::::::::::顧客:::::::::::::
+----------+------------------+-----------------------------+--------------+
| 顧客番号 | 顧客名 | 住所 | 電話番号 |
+----------+------------------+-----------------------------+--------------+
| 1001 | 株式会社冨田貿易 | 東京都港区芝浦1-XX-XX | 03-3256-XXXX |
| 1003 | 宇宙商事株式会社 | 東京都足立区神明22-XX | 03-5126-XXXX |
| 1006 | 有限会社吉野物産 | 大阪府大阪市中央区城見23-XX | 06-6112-XXXX |
+----------+------------------+-----------------------------+--------------+
::::::::受注明細::::::::::::
+----------+----------+------+----------+
| 受注番号 | 商品番号 | 数量 | 受注小計 |
+----------+----------+------+----------+
| 00001 | A01 | 2 | 400000 |
| 00001 | G02 | 3 | 240000 |
| 00002 | A11 | 10 | 500000 |
| 00002 | S05 | 6 | 18000 |
| 00003 | A01 | 3 | 600000 |
| 00004 | S05 | 1 | 3000 |
+----------+----------+------+----------+
::::::::商品:::::::::::
+----------+--------------------+--------+
| 商品番号 | 商品名 | 単価 |
+----------+--------------------+--------+
| A01 | テレビ(液晶大型) | 200000 |
| A11 | テレビ(液晶小型) | 50000 |
| G02 | DVDレコーダー | 80000 |
| S05 | ラジオ | 3000 |
+----------+--------------------+--------+
↓↓↓↓上記のテーブルを結合して実行するSQL文↓↓↓↓
SELECT 受注.受注番号,受注.顧客番号,顧客名,受注明細.商品番号,商品名,単価,数量,受注小計
FROM 受注,顧客,受注明細,商品
WHERE 受注.顧客番号=顧客.顧客番号 AND 受注.受注番号=受注明細.受注番号 AND 受注明細.商品番号=商品.商品番号;
■■■■■■■■■結果■■■■■■■■■■■
+----------+----------+------------------+----------+--------------------+--------+------+----------+
| 受注番号 | 顧客番号 | 顧客名 | 商品番号 | 商品名 | 単価 | 数量 | 受注小計 |
+----------+----------+------------------+----------+--------------------+--------+------+----------+
| 00001 | 1001 | 株式会社冨田貿易 | A01 | テレビ(液晶大型) | 200000 | 2 | 400000 |
| 00003 | 1003 | 宇宙商事株式会社 | A01 | テレビ(液晶大型) | 200000 | 3 | 600000 |
| 00002 | 1006 | 有限会社吉野物産 | A11 | テレビ(液晶小型) | 50000 | 10 | 500000 |
| 00001 | 1001 | 株式会社冨田貿易 | G02 | DVDレコーダー | 80000 | 3 | 240000 |
| 00004 | 1001 | 株式会社冨田貿易 | S05 | ラジオ | 3000 | 1 | 3000 |
| 00002 | 1006 | 有限会社吉野物産 | S05 | ラジオ | 3000 | 6 | 18000 |
+----------+----------+------------------+----------+--------------------+--------+------+----------+



★★★★#P489 データの集計★★★★
★★★★#P489 レコード数の表示★★★★
SELECT COUNT(*) FROM 受注;
■■■■■■■■■結果■■■■■■■■■■■
+----------+
| COUNT(*) |
+----------+
| 5 |
+----------+

★★★★P#490 指定した項目の合計値の表示★★★★
SELECT SUM(受注合計) FROM 受注;
■■■■■■■■■結果■■■■■■■■■■■
+---------------+
| SUM(受注合計) |
+---------------+
| 1761000 |
+---------------+


★★★★#P490 指定した項目の平均値の表示★★★★
SELECT AVG(受注合計) FROM 受注;
■■■■■■■■■結果■■■■■■■■■■■
+---------------+
| AVG(受注合計) |
+---------------+
| 440250.0000 |
+---------------+

★★★★#P490 指定した項目の最大値の表示★★★★
SELECT MAX(受注合計) FROM 受注;
■■■■■■■■■結果■■■■■■■■■■■
+---------------+
| MAX(受注合計) |
+---------------+
| 640000 |
+---------------+


★★★★#P490 指定した項目の最小値の表示★★★★
SELECT MIN(受注合計) FROM 受注;
■■■■■■■■■結果■■■■■■■■■■■
+---------------+
| MIN(受注合計) |
+---------------+
| 3000 |
+---------------+

★★★★#P491 データのグループ化★★★★
★★★★#P491 項目ごとにグループ化して表示★★★★
SELECT 受注年月日,COUNT(*),SUM(受注合計) FROM 受注 GROUP BY 受注年月日;
■■■■■■■■■結果■■■■■■■■■■■
+------------+----------+---------------+
| 受注年月日 | COUNT(*) | SUM(受注合計) |
+------------+----------+---------------+
| 2010-04-01 | 1 | 640000 |
| 2010-04-02 | 2 | 1118000 |
| 2010-04-05 | 2 | 3000 |
+------------+----------+---------------+
★★★★#P491 データのグループ化★★★★
★★★★#P491 項目ごとにグループ化して表示★★★★
SELECT 顧客番号,COUNT(*),SUM(受注合計) FROM 受注 GROUP BY 顧客番号;
+----------+----------+---------------+
| 顧客番号 | COUNT(*) | SUM(受注合計) |
+----------+----------+---------------+
| 1001 | 3 | 643000 |
| 1003 | 1 | 600000 |
| 1006 | 1 | 518000 |
+----------+----------+---------------+

★★★★#P492 項目ごとにグループ化して条件を絞り込んで表示★★★★
SELECT 受注年月日,COUNT(*),SUM(受注合計)
FROM 受注
GROUP BY 受注年月日
HAVING SUM(受注合計)>1000000;
■■■■■■■■■結果■■■■■■■■■■■
+------------+----------+---------------+
| 受注年月日 | COUNT(*) | SUM(受注合計) |
+------------+----------+---------------+
| 2010-04-02 | 2 | 1118000 |
+------------+----------+---------------+

★★★★#P492 データの並べ替え★★★★
★★★★#P493 ひとつの項目による並べ替え★★★★
SELECT 受注番号,顧客番号,受注合計
FROM 受注
ORDER BY 受注合計;
■■■■■■■■■結果■■■■■■■■■■■
+----------+----------+----------+
| 受注番号 | 顧客番号 | 受注合計 |
+----------+----------+----------+
| 00005 | 1001 | NULL |
| 00004 | 1001 | 3000 |
| 00002 | 1006 | 518000 |
| 00003 | 1003 | 600000 |
| 00001 | 1001 | 640000 |
+----------+----------+----------+

★★★★#P492 複数の項目による並べ替え★★★★
SELECT 受注番号,顧客番号,受注合計
FROM 受注
ORDER BY 顧客番号
ASC,受注合計 DESC;
■■■■■■■■■解説■■■■■■■■■
顧客番号順に並べ受注合計が多い多い順に表示
■■■■■■■■■結果■■■■■■■■■■■
+----------+----------+----------+
| 受注番号 | 顧客番号 | 受注合計 |
+----------+----------+----------+
| 00001 | 1001 | 640000 |
| 00004 | 1001 | 3000 |
| 00005 | 1001 | NULL |
| 00003 | 1003 | 600000 |
| 00002 | 1006 | 518000 |
+----------+----------+----------+


★★★★#P492 副問い合わせ★★★★
★★★★#P493 単一行問い合わせ★★★★
SELECT * FROM 顧客
WHERE 顧客番号=
(SELECT 顧客番号 FROM 受注 WHERE 受注番号='00001');
■■■■■■■■■結果■■■■■■■■■■■
+----------+------------------+-----------------------+--------------+
| 顧客番号 | 顧客名 | 住所 | 電話番号 |
+----------+------------------+-----------------------+--------------+
| 1001 | 株式会社冨田貿易 | 東京都港区芝浦1-XX-XX | 03-3256-XXXX |
+----------+------------------+-----------------------+--------------+

★★★★#P493 複数行問い合わせ★★★★
SELECT * FROM 顧客 WHERE 顧客番号 IN
(SELECT 顧客番号 FROM 受注 WHERE 受注合計>=600000);
■■■■■■■■■結果■■■■■■■■■■■
+----------+------------------+-----------------------+--------------+
| 顧客番号 | 顧客名 | 住所 | 電話番号 |
+----------+------------------+-----------------------+--------------+
| 1001 | 株式会社冨田貿易 | 東京都港区芝浦1-XX-XX | 03-3256-XXXX |
| 1003 | 宇宙商事株式会社 | 東京都足立区神明22-XX | 03-5126-XXXX |
+----------+------------------+-----------------------+--------------+

★★★★#P495 相関副問い合わせ★★★★
#下準備
INSERT INTO 商品 VALUES ('Z01','冷蔵庫','150000'),('Z11','エアコン','98000');
■■■■■■■■■結果■■■■■■■■■■■
+----------+--------------------+--------+
| 商品番号 | 商品名 | 単価 |
+----------+--------------------+--------+
| A01 | テレビ(液晶大型) | 200000 |
| A11 | テレビ(液晶小型) | 50000 |
| G02 | DVDレコーダー | 80000 |
| S05 | ラジオ | 3000 |
| Z01 | 冷蔵庫 | 150000 |
| Z11 | エアコン | 98000 |
+----------+--------------------+--------+


★★★★#P495 複数の表で一致するレコードの検索★★★★
SELECT 商品番号,商品名 FROM 商品 WHERE EXISTS
(SELECT * FROM 受注明細 WHERE 商品.商品番号=受注明細.商品番号);

********解説********
EXISTS は TRUE になり、NOT EXISTS は FALSE になります。

■■■■■■■■■結果■■■■■■■■■■■
+----------+--------------------+
| 商品番号 | 商品名 |
+----------+--------------------+
| A01 | テレビ(液晶大型) |
| A11 | テレビ(液晶小型) |
| G02 | DVDレコーダー |
| S05 | ラジオ |
+----------+--------------------+


★★★★#P496 複数の表で一致しないレコードの検索★★★★
SELECT 商品番号,商品名 FROM 商品 WHERE NOT EXISTS
(SELECT * FROM 受注明細 WHERE 商品.商品番号=受注明細.商品番号);
■■■■■■■■■結果■■■■■■■■■■■
::::::商品テーブル::::::::
+----------+--------------------+--------+
| A01 | テレビ(液晶大型) | 200000 |
| A11 | テレビ(液晶小型) | 50000 |
| G02 | DVDレコーダー | 80000 |
| S05 | ラジオ | 3000 |
| Z01 | 冷蔵庫 | 150000 |
| Z11 | エアコン | 98000 |
+----------+--------------------+--------+

::::::受注明細テーブル::::::::
+----------+----------+------+----------+
| 受注番号 | 商品番号 | 数量 | 受注小計 |
+----------+----------+------+----------+
| 00001 | A01 | 2 | 400000 |
| 00001 | G02 | 3 | 240000 |
| 00002 | A11 | 10 | 500000 |
| 00002 | S05 | 6 | 18000 |
| 00003 | A01 | 3 | 600000 |
| 00004 | S05 | 1 | 3000 |
+----------+----------+------+----------+
↓↓↓↓↓結果↓↓↓↓↓
+----------+----------+
| 商品番号 | 商品名 |
+----------+----------+
| Z01 | 冷蔵庫 |
| Z11 | エアコン |
+----------+----------+

2011年6月1日水曜日

ありがちな受注管理システムのmysql文

*********************************************
ありがちな受注管理システムのmysql文です。
今回xamppのmysqlを使いました。

#初回にrootユーザのパスワード設定コマンド
mysqladmin -u root password mysql

#rootユーザでmysqlにログイン
mysql -u root -p

#P476 データベースの作成
CREATE DATABASE 受注管理;

#MySQLのコマンド。カレントデータベースを変更する。
use 受注管理;

#P476 テーブルの作成
CREATE TABLE 顧客 (
顧客番号 CHAR(4) PRIMARY KEY,
顧客名 VARCHAR(20),
住所 VARCHAR(50),
電話番号 CHAR(15));

CREATE TABLE 受注 (
受注番号 CHAR(5) PRIMARY KEY,
受注年月日 DATE NOT NULL,
顧客番号 CHAR(4),
受注合計 DECIMAL,
FOREIGN KEY(顧客番号) REFERENCES 顧客(顧客番号));



CREATE TABLE 商品 (
商品番号 CHAR(3) PRIMARY KEY,
商品名 VARCHAR(20),
単価 DECIMAL );

CREATE TABLE 受注明細 (
受注番号 CHAR(5),
商品番号 CHAR(3),
数量 INTEGER,
受注小計 DECIMAL,
PRIMARY KEY(受注番号,商品番号),
FOREIGN KEY(受注番号) REFERENCES 受注(受注番号),
FOREIGN KEY(商品番号) REFERENCES 商品(商品番号));

#P496 レコードの挿入(1件のみ)
INSERT INTO 顧客 (顧客番号,顧客名,住所,電話番号)
VALUES ('1001','株式会社冨田貿易','東京都港区芝浦1-XX-XX','03-3256-XXXX');

#カラムを指定せずに複数行を挿入
INSERT INTO 顧客 VALUES
('1003','宇宙商事株式会社','東京都足立区神明22-XX','03-5126-XXXX'),
('1006','有限会社吉野物産','大阪府大阪市中央区城見23-XX','06-6112-XXXX');

INSERT INTO 商品 VALUES
('A01','テレビ(液晶大型)','200000'),
('A11','テレビ(液晶小型)','50000'),
('G02','DVDレコーダー','80000'),
('S05','ラジオ','3000');

INSERT INTO 受注 VALUES
('00001','2010/04/01','1001','640000'),
('00002','2010/04/02','1006','518000'),
('00003','2010/04/02','1003','600000'),
('00004','2010/04/05','1001','3000');

INSERT INTO 受注明細 VALUES
('00001','A01','2','400000'),
('00001','G02','3','240000'),
('00002','S05','6','18000'),
('00002','A11','10','500000'),
('00003','A01','3','600000'),
('00004','S05','1','3000');

#P497 挿入(INSERT文)
INSERT INTO 顧客 (顧客番号,顧客名)
VALUES ('2001','株式会社こあら百貨店');

#P497 更新(UPDATE文)
UPDATE 顧客 SET 住所='埼玉県入間市東町1-XX' WHERE 顧客番号='2001';

#P498 削除(DELETE文)
DELETE FROM 顧客 WHERE 顧客番号='2001';

#P479 ビューの定義
CREATE VIEW 顧客名簿 AS SELECT 顧客番号,顧客名 FROM 顧客;

#P480 検索系のデータ操作(SELECT文)
#P481 全ての項目の検索
SELECT * FROM 受注;

#P481 特定の項目の検索
SELECT 受注番号,受注合計 FROM 受注;

#P481 計算結果の表示
SELECT 受注番号,受注合計*1.05 FROM 受注;

#P482 ひとつの項目で重複するデータを除いた検索
SELECT DISTINCT 受注年月日 FROM 受注;

#P482 複数の項目で重複するデータを除いた検索
SELECT DISTINCT 受注年月日,顧客番号 FROM 受注;

#P482 条件を指定したデータの検索
#前準備
INSERT INTO 受注 (受注番号,受注年月日,顧客番号) VALUES ('00005','2010/04/05','1001');

#P484 条件を満たすデータの検索
SELECT * FROM 受注 WHERE 顧客番号='1001';

#P484 すべての条件を満たすデータの検索
SELECT * FROM 受注 WHERE 顧客番号='1001' AND 受注合計>=600000;

#P484 いずれかの条件を満たすデータの検索
SELECT * FROM 受注 WHERE 顧客番号='1001' OR 受注合計>=600000;

#P485 条件を満たさないデータの検索
SELECT * FROM 受注 WHERE NOT 顧客番号='1001';

#P485 NULLを含むレコードの検索
SELECT 受注番号,受注合計 FROM 受注 WHERE 受注合計 IS NULL;

#P485 NULLを含まないレコードの検索
SELECT 受注番号,受注合計 FROM 受注 WHERE 受注合計 IS NOT NULL;

#P486 2つの値の間にあるデータを含むレコードの検索
SELECT 受注番号,受注合計 FROM 受注
WHERE 受注合計 BETWEEN 600000 AND 1000000;

#P486 リストの値と一致するデータを含むレコードの検索
SELECT 受注番号,受注合計 FROM 受注
WHERE 受注番号 IN ('00001','00004');

#P486 リストの値のすべてと一致しないデータを含むレコードの検索
SELECT 受注番号,受注合計 FROM 受注
WHERE 受注番号 NOT IN ('00001','00004');

#P487 文字列の一部を条件とした検索
SELECT 商品番号,商品名 FROM 商品 WHERE 商品名 LIKE 'ラ__';

SELECT 商品番号,商品名 FROM 商品 WHERE 商品名 LIKE '%液晶%';

#P487 表の結合
#下準備
DELETE FROM 受注 WHERE 受注番号='00005';

#P488 2つの表の結合
SELECT 受注番号,受注.顧客番号,顧客名 FROM 受注,顧客
WHERE 受注.顧客番号=顧客.顧客番号;

#P488 3つ以上の表の結合
SELECT 受注.受注番号,受注.顧客番号,顧客名,受注明細.商品番号,商品名,単価,数量,受注小計
FROM 受注,顧客,受注明細,商品
WHERE 受注.顧客番号=顧客.顧客番号 AND 受注.受注番号=受注明細.受注番号 AND 受注明細.商品番号=商品.商品番号;

#P489 データの集計
#P489 レコード数の表示
SELECT COUNT(*) FROM 受注;

#490 指定した項目の合計値の表示
SELECT SUM(受注合計) FROM 受注;

#P490 指定した項目の平均値の表示
SELECT AVG(受注合計) FROM 受注;

#P490 指定した項目の最大値の表示
SELECT MAX(受注合計) FROM 受注;

#P490 指定した項目の最小値の表示
SELECT MIN(受注合計) FROM 受注;

#P491 データのグループ化
#P491 項目ごとにグループ化して表示
SELECT 受注年月日,COUNT(*),SUM(受注合計) FROM 受注 GROUP BY 受注年月日;

#P492 項目ごとにグループ化して条件を絞り込んで表示
SELECT 受注年月日,COUNT(*),SUM(受注合計) FROM 受注 GROUP BY 受注年月日
HAVING SUM(受注合計)>1000000;

#P492 データの並べ替え
#P493 ひとつの項目による並べ替え
SELECT 受注番号,顧客番号,受注合計 FROM 受注 ORDER BY 受注合計;

#P492 複数の項目による並べ替え
SELECT 受注番号,顧客番号,受注合計 FROM 受注 ORDER BY 顧客番号 ASC,受注合計 DESC;

#P492 副問い合わせ
#P493 単一行問い合わせ
SELECT * FROM 顧客 WHERE 顧客番号=
(SELECT 顧客番号 FROM 受注 WHERE 受注番号='00001');

#P493 複数行問い合わせ
SELECT * FROM 顧客 WHERE 顧客番号 IN
(SELECT 顧客番号 FROM 受注 WHERE 受注合計>=600000);

#P495 相関副問い合わせ
#下準備
INSERT INTO 商品 VALUES ('Z01','冷蔵庫','150000'),('Z11','エアコン','98000');

#P495 複数の表で一致するレコードの検索
SELECT 商品番号,商品名 FROM 商品 WHERE EXISTS
(SELECT * FROM 受注明細 WHERE 商品.商品番号=受注明細.商品番号);

#P496 複数の表で一致しないレコードの検索
SELECT 商品番号,商品名 FROM 商品 WHERE NOT EXISTS
(SELECT * FROM 受注明細 WHERE 商品.商品番号=受注明細.商品番号);