20190411のSQLに関する記事は8件です。

初心者teamlabのオンラインスキルアップ課題step1をやってみた(コード初心者向け記事)

dockerって何とか、DBとの連携でコード上で具体的にどうするのとか、初心者的にはイメージがつかないほど良くわからないので、teamlabさんのオンラインスキルアップ課題をやってみた。

こちらから課題にアクセスします。

STEP1の内容は下記のようになっています。

  1. インターネットのしくみ
  2. WEBサーバについて
  3. HTMLとCSSについて 4-a. 【Windows】Dockerと開発環境の作り方 4-b. 【Mac】Dockerと開発環境の作り方
  4. PHPを書いてみる
  5. PHPでGET/POSTをやってみる
  6. データベースについて
  7. SQLを書いてみる
  8. PHPでデータベースを操作してみる
  9. 10. GitとGitHubについて

4-b:【Mac】Dockerと開発環境の作り方

1,2,3はわかった気になってとりあえず進めて、まずは4のDockerのセットアップから入ります。

docker-compose -v

dockerがちゃんとインストールされているか上記のコマンドで確かめます。

docker-compose up -d

teamlabさんのサイトからダウンロードしたフォルダに遷移して、上のコマンドを叩くとコンテナを作成して、起動します。

※Dockerのコマンドに関してはこちら

スクリーンショット 2019-04-09 15.36.00.png
なんかいろいろエラーは起きたのですが、無事?doneになっています。
「skillup-php-step1-master」をダウンロードして解凍したフォルダに移動したいけど移動できない!っていう場合にですが、フォルダさえ探せれば、フォルダごとターミナルに落としてあげることでpathが表示されるので、あとは先頭にcdつけるだけでフォルダに移動できるはずです。

1-6:PHPでGET/POSTをやってみる

1-5は普通にコピペでコード貼って、Dockerで立ち上げたlocalhostにアクセスするだけなので、はしおります。

まず、エディターがない人は適当なエディターをインストールしてください。
(ぼくはsublimeをつかっています。)

とりあえず、課題のpostだけやってみました

index.html1

<!DOCTYPE html>
<html>
  <head>
<meta charset="UTF-8" />
<title>POSTのサンプル</title>
</head>
<body>
<p>コメントしてください。</p>
    <form method="POST" action="index.php">
      <input name="comment" />
      <input type="submit" value="送信" />
     </form>
 </body>
</html> 

php1

<?php
  //commentがPOSTされているなら
  if(isset($_POST["comment"])){
    //エスケープしてから表示
    $comment = htmlspecialchars($_POST["comment"]);
    print("あなたのコメントは「 ${comment} 」です。");
  } else {
?>

最後にこの課題があります。

[課題]送信する内容を変更してみよう
掲示板に必要な情報としては少なくとも名前と本文が必要です。名前も送信し、受け取るように変更してみましょう。余力のある人はタイトル・文字色・メールアドレスなども追加してみましょう。

なんかとりえあえず複数のデータを送ってみてほしいとのことだったので、僕は次のようにしました。

index.html2

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>POSTのサンプル</title>
  </head>
  <body>

<style> 
.cell{ 
  padding: 1px 15px; 
  margin: 1px 30px; 
  line-height: 0.1; 
} </style> 

    <h1>「同窓会の参加有無」</h1>
    <div class=cell> 
      <form method="POST" action="index.php">
        <ol>
         <li><p>氏名:<input name="name"  /></p></li>
          <li><p>メール:<input name="mail" /></p></li>
          <li><p>参加可否:<input name="comment" /></p></li>
      <input type="submit" value="送信" style=         "width:150px;,height:100px;"/>
    </div> 
    </form>
  </body>
</html>

php 2

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>POSTのサンプル</title>
  </head>
  <body>
    <?php
      //commentがPOSTされているなら
          if(isset($_POST["mail"],$_POST["name"],$_POST["comment"])){
        //エスケープしてから表示
        $mails = htmlspecialchars($_POST["mail"]);
        $names = htmlspecialchars($_POST["name"]);
        $comments = htmlspecialchars($_POST["comment"]);
        print("あなたの入力した情報は以下になります。<br/>");
        print("名前:${mails}<br/>");
        print("メール:${names}<br/>");
        print("参加有無:${comments}<br/>");
      }else{
        print("情報の入力が正しくありません。");
        }
    ?>
  </body>
</html>

震えるくらいクソコードであることはなんとなくですが、自覚してます....

STEP1-9.PHPでデータベースを操作してみる

これやってみたのですが、すごい勉強になりました。
phpでデータベースをこうやっていじるんだ!みたいなのがなんとなくですが理解できます。

こちらも特に説明を読んでいけば問題なく進めました。

唯一初心者目線でひっかかりそうなのが、データベースにアクセスするときに自分でつけたデータベースの名前じゃないと、エラーになるので注意が必要。
僕の場合はdbname=「TEST」ではなくて「text」でしたので最初はエラってました。

実行結果1

スクリーンショット 2019-04-09 19.22.48.png

先程はDBのname,textを全て表示したが今度はJohnにしぼったものだけを表示させます。

実行コード

<?php
$dsn = 'pgsql:dbname=test;host=pgsql;port=5432';
$user = 'postgres';
$pass = 'example';

try {
  // DBに接続する
  $dbh = new PDO($dsn, $user, $pass);
//$query_result = $dbh->query('SELECT * FROM test_comments');
  $sth_select = $dbh->prepare('SELECT * FROM test_comments WHERE name = ?');
// prepareメソッド(INSERT)最下部でinsertするname/textを定義
  $sth = $dbh->prepare('INSERT INTO test_comments (name, text) VALUES (?, ?)');
 // DBを切断する
  $dbh = null;
} catch (PDOException $e) {
    // 接続にエラーが発生した場合ここに入る
    print "DB ERROR: " . $e->getMessage() . "<br/>";
    die();
}
?>
<?php
//これでdbのnameとtextに新たに文字列が加わる
  $name = "John";
  $text = "Power to the People";
  $sth->execute(array($name, $text));
?>
<?php
  $name = "John";
  $sth_select->execute(array($name));
  //実行したクエリから実行結果を取得している
  $prepare_result = $sth_select->fetchAll();
  foreach($prepare_result as $row) {
    print $row["name"] . ": " . $row["text"] . "<br/>";
  }
  $sth_select->execute(array($name));
?>

実行結果2

スクリーンショット 2019-04-09 20.34.46.png

とりあえず、無事表示されました。

次は気が向いたらSTEP2をやります。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初心者がteamlabのオンラインスキルアップ課題step1をやってみた(コード初心者向け記事)

dockerって何とか、DBとの連携でコード上で具体的にどうするのとか、初心者的にはイメージがつかないほど良くわからないので、teamlabさんのオンラインスキルアップ課題をやってみた。

こちらから課題にアクセスします。

STEP1の内容は下記のようになっています。

  1. インターネットのしくみ
  2. WEBサーバについて
  3. HTMLとCSSについて 4-a. 【Windows】Dockerと開発環境の作り方 4-b. 【Mac】Dockerと開発環境の作り方
  4. PHPを書いてみる
  5. PHPでGET/POSTをやってみる
  6. データベースについて
  7. SQLを書いてみる
  8. PHPでデータベースを操作してみる
  9. 10. GitとGitHubについて

4-b:【Mac】Dockerと開発環境の作り方

1,2,3はわかった気になってとりあえず進めて、まずは4のDockerのセットアップから入ります。

docker-compose -v

dockerがちゃんとインストールされているか上記のコマンドで確かめます。

docker-compose up -d

teamlabさんのサイトからダウンロードしたフォルダに遷移して、上のコマンドを叩くとコンテナを作成して、起動します。

※Dockerのコマンドに関してはこちら

スクリーンショット 2019-04-09 15.36.00.png
なんかいろいろエラーは起きたのですが、無事?doneになっています。
「skillup-php-step1-master」をダウンロードして解凍したフォルダに移動したいけど移動できない!っていう場合にですが、フォルダさえ探せれば、フォルダごとターミナルに落としてあげることでpathが表示されるので、あとは先頭にcdつけるだけでフォルダに移動できるはずです。

1-6:PHPでGET/POSTをやってみる

1-5は普通にコピペでコード貼って、Dockerで立ち上げたlocalhostにアクセスするだけなので、はしおります。

まず、エディターがない人は適当なエディターをインストールしてください。
(ぼくはsublimeをつかっています。)

とりあえず、課題のpostだけやってみました

index.html1

<!DOCTYPE html>
<html>
  <head>
<meta charset="UTF-8" />
<title>POSTのサンプル</title>
</head>
<body>
<p>コメントしてください。</p>
    <form method="POST" action="index.php">
      <input name="comment" />
      <input type="submit" value="送信" />
     </form>
 </body>
</html> 

php1

<?php
  //commentがPOSTされているなら
  if(isset($_POST["comment"])){
    //エスケープしてから表示
    $comment = htmlspecialchars($_POST["comment"]);
    print("あなたのコメントは「 ${comment} 」です。");
  } else {
?>

最後にこの課題があります。

[課題]送信する内容を変更してみよう
掲示板に必要な情報としては少なくとも名前と本文が必要です。名前も送信し、受け取るように変更してみましょう。余力のある人はタイトル・文字色・メールアドレスなども追加してみましょう。

なんかとりえあえず複数のデータを送ってみてほしいとのことだったので、僕は次のようにしました。

index.html2

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>POSTのサンプル</title>
  </head>
  <body>

<style> 
.cell{ 
  padding: 1px 15px; 
  margin: 1px 30px; 
  line-height: 0.1; 
} </style> 

    <h1>「同窓会の参加有無」</h1>
    <div class=cell> 
      <form method="POST" action="index.php">
        <ol>
         <li><p>氏名:<input name="name"  /></p></li>
          <li><p>メール:<input name="mail" /></p></li>
          <li><p>参加可否:<input name="comment" /></p></li>
      <input type="submit" value="送信" style=         "width:150px;,height:100px;"/>
    </div> 
    </form>
  </body>
</html>

php 2

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>POSTのサンプル</title>
  </head>
  <body>
    <?php
      //commentがPOSTされているなら
          if(isset($_POST["mail"],$_POST["name"],$_POST["comment"])){
        //エスケープしてから表示
        $mails = htmlspecialchars($_POST["mail"]);
        $names = htmlspecialchars($_POST["name"]);
        $comments = htmlspecialchars($_POST["comment"]);
        print("あなたの入力した情報は以下になります。<br/>");
        print("名前:${mails}<br/>");
        print("メール:${names}<br/>");
        print("参加有無:${comments}<br/>");
      }else{
        print("情報の入力が正しくありません。");
        }
    ?>
  </body>
</html>

震えるくらいクソコードであることはなんとなくですが、自覚してます....

STEP1-9.PHPでデータベースを操作してみる

これやってみたのですが、すごい勉強になりました。
phpでデータベースをこうやっていじるんだ!みたいなのがなんとなくですが理解できます。

こちらも特に説明を読んでいけば問題なく進めました。

唯一初心者目線でひっかかりそうなのが、データベースにアクセスするときに自分でつけたデータベースの名前じゃないと、エラーになるので注意が必要。
僕の場合はdbname=「TEST」ではなくて「text」でしたので最初はエラってました。

実行結果1

スクリーンショット 2019-04-09 19.22.48.png

先程はDBのname,textを全て表示したが今度はJohnにしぼったものだけを表示させます。

実行コード

<?php
$dsn = 'pgsql:dbname=test;host=pgsql;port=5432';
$user = 'postgres';
$pass = 'example';

try {
  // DBに接続する
  $dbh = new PDO($dsn, $user, $pass);
//$query_result = $dbh->query('SELECT * FROM test_comments');
  $sth_select = $dbh->prepare('SELECT * FROM test_comments WHERE name = ?');
// prepareメソッド(INSERT)最下部でinsertするname/textを定義
  $sth = $dbh->prepare('INSERT INTO test_comments (name, text) VALUES (?, ?)');
 // DBを切断する
  $dbh = null;
} catch (PDOException $e) {
    // 接続にエラーが発生した場合ここに入る
    print "DB ERROR: " . $e->getMessage() . "<br/>";
    die();
}
?>
<?php
//これでdbのnameとtextに新たに文字列が加わる
  $name = "John";
  $text = "Power to the People";
  $sth->execute(array($name, $text));
?>
<?php
  $name = "John";
  $sth_select->execute(array($name));
  //実行したクエリから実行結果を取得している
  $prepare_result = $sth_select->fetchAll();
  foreach($prepare_result as $row) {
    print $row["name"] . ": " . $row["text"] . "<br/>";
  }
  $sth_select->execute(array($name));
?>

実行結果2

スクリーンショット 2019-04-09 20.34.46.png

とりあえず、無事表示されました。

次は気が向いたらSTEP2をやります。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

D-Oceanで遊ぶ

はじめに

こんにちは。
現在、東京大学で主にシステムデザインを学んでいる学生です。
今回は授業で簡単なデータの解析を行いましたので、備忘録もかねてその過程を記したいと思います。

D-Oceanとは

株式会社ディーオーシャンが提供しているソーシャルデータプラットフォームで、誰でも無料でデータを利用することができる。2019年2月14日よりサービスが提供されている。

D-Oceanのホームページはこちら

D-Oceanの使い方

1. 画面右上の「ログイン」へ進む

image.png

2. 持っているアカウントでログイン

image.png

3. データを選択する

image.png

4. 「Query」を選択

image.png

5.「Execute」を選択

とりあえずデフォルトで書かれているSQLを実行します。

image.png

6. 結果

無事テーブルを見ることができました!
image.png

次回

実際に欲しいデータをD-Oceanから取得してみたいと思います!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelのクエリビルダを使い回す際の注意

はじめに

  • Laravel初心者向け
  • 自分がハマったので他の人がハマらないように残す

該当ソース

        $company_where = Company::where(['is_valid' => '1']);
        $company1 = $company_where->where(['id' => '1'])->toSql();
        var_dump($company1);
        // "select * from `companies` where (`is_valid` = ?) and (`id` = ?)"
        $company2 = $company_where->where(['id' => '2'])->toSql();
        var_dump($company2);
        // "select * from `companies` where (`is_valid` = ?) and (`id` = ?) and (`id` = ?)"

やりたいことはis_validが1の企業(有効な企業)の中でid=1のもの、2のものを取得したい
is_validの条件は共通なので変数に持ち、それを使いまわそうと思って書いたコードなのですが見事にハマりました
id=1は無事に取れるが、id=2が何故かとれない…レコードはあるしis_valid=1なのに何故…

解説

もうソースにコメントで書いてありますがtoSqlで発行されるクエリに注目です

-- 1つ目
select * from `companies` where (`is_valid` = ?) and (`id` = ?)
-- 2つめ
select * from `companies` where (`is_valid` = ?) and (`id` = ?) and (`id` = ?)

2番目のクエリにidの検索条件がANDで2つついているのが分かるかと思います
1つ目のクエリのwhereでid=1の検索条件がつき、2つ目のクエリで上書きされるかと思いきや同じカラムでもAND検索で追加される仕様のようでした
(まぁメソッドチェーンでAND検索になるんだから当然っちゃ当然なんですが。。。)

解決策

大人しくインスタンスを分けましょう

        $company_where1 = Company::where(['is_valid' => '1']);
        $company1 = $company_where1->where(['id' => '1'])->toSql();
        var_dump($company1);
        // "select * from `companies` where (`is_valid` = ?) and (`id` = ?)"
        $company_where2 = Company::where(['is_valid' => '1']);
        $company2 = $company_where2->where(['id' => '2'])->toSql();
        var_dump($company2);
        // "select * from `companies` where (`is_valid` = ?) and (`id` = ?)"

もしくはクエリを分けなくても良い方法を考えましょう

        $companies = Company::where(['is_valid' => '1'])
            ->whereIn('id', ['1', '2'])
            ->toSql();
        var_dump($companies);
        // "select * from `companies` where (`is_valid` = ?) and `id` in (?, ?)"

おわりに

自分と同じ状況でハマっている人が解決したなら良かったです

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

データベースプラットフォームD-Oceanを使ってみた

こんにちは

初投稿です。まっつんと言います。東京大学工学部システム創成学科システムデザインアンドマネジメントコースに在籍してます。
この記事では、今学科でやっている基礎プロジェクト(大規模データ分析)という授業で学んだことを書いていきます。

データベースとは

データベースについては、僕自身詳しくはわかっていませんが、こちらの記事などに詳しく書いてあります。

D-0cean

D-OceanはGoogleが作ったデータベース、BigQueryを操作するためのプラットフォームです。2019年2月に出来たばかりのようです。

D-Oceanのページ↓
スクリーンショット 2019-04-11 15.09.38.png

どれかのデータをクリックすると、SQLを入れるボックスが出てきます。SQLはデータベースの操作をするための言語です。後々、SQLのメモ記事もあげる予定です。

実際にSQLを入れてクエリを投げた結果↓
スクリーンショット 2019-04-11 15.10.25.png

出来たばかりということと、僕が他のデータベースプラットフォームを使ったことがないというのもあり、D-Oceanが使いやすいのかはわかりませんが、見た目はかっこいいと思います。機会があったら積極的に使っていこうと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

D-Oceanを一から!

D-Oceanのログインから

D-Oceanはデータプラットフォームであり、いろいろな種類のデータを使うことができる。右上のログインボタンを押して、Google アカウントなどでログインしよう。

ログインするとこんな感じのページにくる。
屏幕快照 2019-04-11 下午4.50.16.png

【注意】
GROUP内のデータを使う場合、GROUP をそのまま押してはいけない。
屏幕快照 2019-04-11 下午4.48.05.png

GROUPを押してプルダウンメニューが出たグループをクリックしないと、グループ内に共有されたデータは見ることができない。
なんというシステムでしょう。。。

これでグループ内で共有されたデータは見れるはずなので、ひとつクリックしてみよう。
クリックすると以下のようなウィンドウになる
屏幕快照 2019-04-11 下午4.51.52.png

下にcomment、queryがあるので、queryを押してみよう!
ここからはqueryでsql文を書くことになる。

CSVデータの読み込みと分析

CSVのデータはQueryからCSVをプルダウンで選んだ後、ダウンロードできる。
今回は1000行だけダウンロードする。
屏幕快照 2019-04-11 下午4.55.38.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

D-Oceanで取得したデータをpythonで料理する!

ここではD-Oceanを使ってデータを取得し、pythonのpandasを使って処理することを考えます。

目次
・D-Oceanのログインから
・BigQueryとは何か
・BigQueryにおけるSQL文
・csvデータの読み込みと分析

D-Oceanのログインから

D-Oceanはデータプラットフォームであり、いろいろな種類のデータを使うことができる。データ処理の練習したい人にはおすすめかも。右上のログインボタンを押して、Google アカウントなどでログインしよう。

ログインするとこんな感じのページにくる。
屏幕快照 2019-04-11 下午4.50.16.png

【注意】
授業などでGROUPでデータが共有されることもある。
GROUP内のデータを使う場合、GROUP をそのまま押してはいけない。
屏幕快照 2019-04-11 下午4.48.05.png

GROUPを押してプルダウンメニューが出たグループをクリックしないと、グループ内に共有されたデータは見ることができない。
なんというシステムでしょう。。。

これでグループ内で共有されたデータは見れるはずなので、ひとつクリックしてみよう。
クリックすると以下のようなウィンドウになる
屏幕快照 2019-04-11 下午4.51.52.png

下にcomment、queryがあるので、queryを押してみよう!
ここからはqueryでsql文を書くことになる。

BigQueryとは何か

BigQueryに興味がある人は以下のリンクからみてみるのが一番早いと思われる。
https://thinkit.co.jp/story/2015/08/27/6346

BigQueryにおけるSQL文

SQL文はあんまり詳しくないので、以下の基本的な文法構造だけのせておきます。

SELECT column FROM table_name

が基本構造で、*はすべての列、LIMITは何行か指定して選ぶことができる。
SQLはムズイです!

csvデータの読み込みと分析

csvのデータはQueryからcsvをプルダウンで選んだ後、ダウンロードできる。
今回は1000行だけダウンロードする。
屏幕快照 2019-04-11 下午4.55.38.png

csvファイルをダウンロードしたらここからはpythonの出番。
このcsvファイルをダウンロードしたら、テキストエディタをなにか開いてpythonファイルをつくろう。

import.py
import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_csv('downloads/data/file_name.csv')

data.tail()
#下から5行取得可能

pandasはpythonで使えるめっちゃはやいエクセル、だと勝手に考えている。
pd.read_csv()という関数でcsvファイルをpandasのdataframe(エクセルの表みたいな)に落とし込むことができる。
これでdataを料理する準備はできました!

ちなみに上から5行抽出したい場合は以下のhead()を使って確認することができる。

head.py
data.head()
Name_ location latitude longitude phone
0 関子ども家庭支援センター 練馬区関町北1-21-15 35.726719 139.578657
1 練馬子ども家庭支援センター(児童福祉担当係石神井) 練馬区石神井町3-30-26 石神井庁舎4階 35.743405 139.602759
2 練馬子ども家庭支援センター練馬駅南分室 練馬区豊玉北5-18-12 35.737083 139.654433
3 光が丘子ども家庭支援センター 練馬区光が丘2-9-6 光が丘区民センター6階 35.759233 139.629303
4 練馬子ども家庭支援センター 練馬区豊玉北6-12-1 東庁舎4階 35.735650 139.652422
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

データベース(SQL)の概要

データベースとは

・大量の情報を保存し、コンピュータから効率よくアクセスできるように加工したデータの集まりのこと
・データベースを管理するコンピュータシステムのことを「データベース管理システム(RDBS)」という
・SQLを使って操作する

なぜデータベースが必要なのか

データを管理するなら、Excelのような表計算ソフトでもいいと思います。しかしデメリットもあります。
・データの共有に向かない
・大量のデータを扱えない
・万が一の事故に対応できない
など

代表的なデータベース

・リレーショナルデータベース(RDBMS)
image.png

関係データベースとも呼ばれる。代表的なRDBMSは次の5つ
・Oracle Database (Oracle社)
・SQL Server (Microsoft社)
・DB2 (IBM社)
・PostgreSQL (オープンソース)
・MySQL (オープンソース)

データベース構成

・クライアント/サーバー型のシステム
・データベースを読み書きするにはサーバーにクライアントからSQL文を送信
・テーブルと呼ばれる表でデータを管理
・テーブルはデータ項目を表すカラム(列)、1件のデータを表すレコード(行)からなる
・1つのマス目をセルといい、1つセルには1つのデータしか入れられない

SQLの概要

SQLの文には種類がある

・DDL(データ定義言語) データを格納する入れもの
・DML(データ操作言語) テーブルのレコードを検索・変更
・DCL(データ制御言語) データベースに対して操作の制御設定や、変更を確定したり取り消したりする

実際に使われるSQL文のうち90%がDMLです。

記述ルール

・SQL文はセミコロンで終わる(;)
・キーワードの大文字・小文字は区別されない SELECTはselectと書いても同じ(ただし、テーブルに登録されているデータは別)
・文字列・日付・数値などはシングルクォーテーションで囲む(')
・単語と単語の間は半角スペース 例)CREATE DATABASE shop;

参考文献

・SQL 第2版 ゼロからはじめるデータベース操作

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む