20200817のMySQLに関する記事は10件です。

【PHPでECサイト】

はじめに

これまでに独学してきた知識の整理のために、ECサイトを作成します。

バージョン

PHP:7.4.5
phpMyAdmin:5.0.2
MySQL:5.7.30

実装する機能


Now Writing....

  • デザイン(Bootstrap)
  • 検索機能
  • ページネーション
  • セキュリティ
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【MySQL5.7】MySQLが、思うように立ち上がらない。。。

環境

$ mysql --version
mysql  Ver 14.14 Distrib 5.7.29, for osx10.15 (x86_64) using  EditLine wrapper

PIDファイルに関してのエラー

$ mysql.server start

ERROR! The server quit without updating PID file (/usr/local/var/mysql/hogehogenoMacBook-Pro.local.pid).

マシンのホスト名を確認

$ uname -n
hogehogenoMacBook-Pro.local

pidファイルを作成し、アクセス権限を付与

$ sudo touch /usr/local/var/mysql/hogehogenoMacBook-Pro.local.pid

# /usr/local/var/mysql/配下のファイルにアクセス権限を付与する
$ sudo chown -R _mysql:_mysql /usr/local/var/mysql/

もう一度、MySQLを起動する

$ mysql.server start

Starting MySQL
. SUCCESS! 

それでも、エラーになる場合

ERROR! The server quit without updating PID file (/usr/local/var/mysql/hogehogenoMacBook-Pro.local.pid).

プロセス関連のエラー

mysqldのプロセスが既に起動していたら、プロセスIDを指定してkillする

$ ps -ef | grep mysql

    0  1435     1   0  3:46PM ??         0:00.02 /bin/sh/usr/local/Cellar/mysql@5.7/5.7.29/bin/mysqld_safe

   74  1531     1   0  3:46PM ??         0:08.23 /usr/local/Cellar/mysql@5.7/5.7.29/bin/mysqld

$ sudo kill -9 1435
$ sudo kill -9 1531

もう一度、pidファイルを作成し権限を与え、起動する

$ sudo touch /usr/local/var/mysql/hogehogenoMacBook-Pro.local.pid
$ sudo chown -R _mysql:_mysql /usr/local/var/mysql/

$ mysql.server start
Starting MySQL
. SUCCESS! 
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

FuelPHP・SQL で where句 と or_where句 を同時に使うとき

はじめに

selectするときに、whereとor_whereを同時に使うときは注意しないと思っているようなクエリが発行されません。これは、論理演算子に優先順位が設定されているためです。(orよりandの方が優先順位が高いため)
https://dev.mysql.com/doc/refman/5.6/ja/operator-precedence.html

どういったクエリが発行されるか見ていきたいと思います。
また、whereはand_whereと書くこともありますが、今回はwhere、or_whereで統一します。

環境

PHP 5.3.29
FuelPHP 1.7.3
MySQL 5.5.61

本題

まずはor_whereから。

sample1.php
  public static function sample1()
  {
    $query = \DB::select()
    ->from('table_name')
    ->or_where('column1', '=', 0)//条件1
    ->or_where('column2', '=', 0)//条件2
    ->execute()
    return $query;
  }

この場合はおそらくイメージ通り条件1または条件2となります。
ではここにwhere句を入れるとどうなるか。

sample2.php
  public static function sample2()
  {
    $query = \DB::select()
    ->from('table_name')
    ->or_where('column1', '=', 0)//条件1
    ->or_where('column2', '=', 0)//条件2
    ->where('column3', '=', 0)//条件3
    ->execute()
    return $query;
  }

こうすると発行されるクエリは、条件1または(条件2かつ条件3)となり、後半に書かれたwhere句の処理が優先されます。
(条件1または条件2)かつ条件3としたい場合は、

sample3.php
  public static function sample3()
  {
    $query = \DB::select()
    ->from('table_name')
    ->where_open()
      ->or_where('column1', '=', 0)//条件1
      ->or_where('column2', '=', 0)//条件2
    ->where_close()
    ->where('column3', '=', 0)//条件3
    ->execute()
    return $query;
  }

という書き方をする必要があります。同様に、またはのくくりを大きくしたい場合はor_where_open(),close()というものが使えます。

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

MySQL⑦ 使用できる値を制限する

使用できる値を制限する

1つだけ選択できる enum

カラムを作成する カラム名 enum(値①, 値②, 値③)

create table users (
id int unsigned primary key auto_increment,
name varchar(20),
score float,
rank enum('gold', 'silver', 'bronze')
);

値を入力

insert into users (name, score, rank) values ('taguchi', 5.8, 'silver');
insert into users (name, score, rank) values ('fkoji', 8.2, 'gold');
insert into users (name, score, rank) values ('dotinstall', 6.1, 'red');  <- これはrankの値は保存されない

内部的に値に1番スタートの連番が振られている

enum(①, ②, ③)

select * from users where rank = 'silver';
select * from users where rank = 2;

上記は同じ意味になる

複数選択できる set

カラムを作成する カラム名 set(値①, 値②, 値③)

create table users (
id int unsigned primary key auto_increment,
name varchar(20),
score float,
rank set('gold', 'silver', 'bronze')
);

値を入力

insert into users (name, score, rank) values ('taguchi', 5.8, 'silver, gold');
insert into users (name, score, rank) values ('fkoji', 8.2, 'gold, bronze');
insert into users (name, score, rank) values ('dotinstall', 6.1, 'red');  <- これはrankの値は保存されない

内部的に値に番号が振られている

enum(2の0条, 2の1条, 2の4条)

select * from users where rank = 'gold,silver';
select * from users where rank = 3;  <- これは、2の0条の1 と 2の1条の2 を足した数

上記は同じ意味になる

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

sqlで直接DBを更新をしないといけない時はトランザクションをかける

mysqlの場合

BEGIN;

# 何かしらの更新処理
update users set password = "hogehoge" where id = xx;

COMMIT;
# or rollback
  • 更新処理を流した時に更新された件数が意図した件数かを確認してから COMMITする
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
  • 処理を取りやめたい(戻したい時は)rollbackで戻せる
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHPでECサイト③】カート機能

はじめに

今回は、カート機能を実装していきます。
※当ページは、【PHPでECサイト】で作られたものを前提にしています。

バージョン

PHP:7.4.5
phpMyAdmin:5.0.2
MySQL:5.7.30

今回作成するファイル

html
- index.php
- index_add_cart.php
- cart.php
- cart_delete.php
- finish.php

model
- carts.php

view
- index_view.php
- cart_view.php
- finish_view.php

テーブルの作成

sample_carts
CREATE TABLE `sample_carts` (
  `cart_id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `item_id` int(11) NOT NULL,
  `amount` int(11) NOT NULL,
  `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `sample_carts`
  MODIFY `cart_id` int(11) NOT NULL AUTO_INCREMENT,
  ADD PRIMARY KEY (`cart_id`),
  ADD KEY `item_id` (`item_id`),
  ADD KEY `user_id` (`user_id`);

定義

const.php
define('INDEX_URL', '/index.php');
define('CART_URL', '/cart.php');
define('FINISH_URL', '/finish.php');

Viewの作成

index_view.php
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta chartset="UTF-8">
    <title>商品一覧</title>
  </head>

  <body>
  <h1>商品一覧</h1>

  <p>ようこそ、<?php print($user['user_name']); ?>さん。</p>
  <a href="<?php print(ADMIN_URL);?>">商品管理</a>
  <a href="<?php print(CART_URL);?>">カート</a>
  <a href="<?php print(LOGOUT_URL);?>">ログアウト</a>

  <!-- メッセージ・エラーメッセージ -->
  <?php include VIEW_PATH . 'templates/messages.php'; ?>

  <!-- 商品一覧 -->
  <?php foreach($items as $item){ ?>
  <div>
    <?php print($item['name']); ?>
    <?php print($item['price']); ?>
    <!-- 売り切れの場合は、formを置換 -->
    <?php if($item['stock'] > 0){ ?>
      <form method="post" action="index_add_cart.php">
        <input type="submit" value="カートに追加">
        <input type="hidden" name="item_id" value="<?php print($item['item_id']) ?>">
      </form>
    <?php }else{ ?>
     <p>現在、売り切れです。</p>
    <?php } ?>
  </div>
  <?php } ?>

  </body>
</html>
cart_view.php
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>カート</title>
  </head>

  <body>
  <h1>商品一覧</h1>

  <p>ようこそ、<?php print($user['user_name']); ?>さん。</p>
  <a href="<?php print(ADMIN_URL);?>">商品管理</a>
  <a href="<?php print(INDEX_URL);?>">商品一覧</a>
  <a href="<?php print(LOGOUT_URL);?>">ログアウト</a>

  <!-- メッセージ・エラーメッセージ -->
  <?php include VIEW_PATH . 'templates/messages.php'; ?>

  <!-- カート一覧 -->
  <?php if(count($carts) > 0){ ?>
    <table>
      <thead>
        <tr>
          <th>商品名</th>
          <th>価格</th>
          <th>数量</th>
          <th>小計</th>
          <th>操作</th>
        </tr>
      </thead>  
      <tbody>
        <?php foreach($carts as $cart){ ?>
        <tr>
          <td><?php print($cart['name']); ?></td>
          <td><?php print($cart['price']); ?></td>
          <td><?php print($cart['amount']); ?></td>
          <td><?php print($cart['price'] * $cart['amount']); ?></td>
          <td>
            <form method="post" action="cart_delete.php">
              <input type="submit" value="削除">
              <input type="hidden" name="cart_id" value="<?php print($cart['cart_id']); ?>">
            </form>
          </td>
        </tr>
        <?php } ?>
      </tbody>
    </table>

    <p>合計金額:<?php print($total_price); ?></p>
    <form method="post" action="finish.php">
      <input type="submit" value="購入する">
    </form>
  <?php }else{ ?>
    <p>カートに商品はありません。</p>
  <?php } ?>
  </body>

</html>
finish_view.php
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>ご購入ありがとうございました!</title>
  </head>

  <body>
  <h1>ご購入ありがとうございました!</h1>

  <!-- メッセージ・エラーメッセージ -->
  <?php include VIEW_PATH . 'templates/messages.php'; ?>

  <!-- 購入した商品 -->
  <?php if(count($carts) > 0){ ?>
    <table>
      <thead>
        <tr>
          <th>商品名</th>
          <th>価格</th>
          <th>購入数</th>
          <th>小計</th>
        </tr>
      </thead>  
      <tbody>
        <?php foreach($carts as $cart){ ?>
        <tr>
          <td><?php print($cart['name']); ?></td>
          <td><?php print($cart['price']); ?></td>
          <td><?php print($cart['amount']); ?></td>
          <td><?php print($cart['price'] * $cart['amount']); ?></td>
        </tr>
        <?php } ?>
      </tbody>
    </table>

    <p>合計金額:<?php print($total_price); ?></p>
  <?php }else{ ?>
    <p>カートに商品はありません。</p>
  <?php } ?>

  </body>

</html>

カートに追加

Model

carts.php
<?php 
require_once MODEL_PATH . 'functions.php';
require_once MODEL_PATH . 'db.php';

// カートに追加するために必要なデータ
function get_user_cart($db, $user_id, $item_id){
  $sql = "
    SELECT
      sample_items.item_id,
      sample_items.name,
      sample_items.price,
      sample_items.stock,
      sample_carts.cart_id,
      sample_carts.user_id,
      sample_carts.amount
    FROM
      sample_carts
    JOIN
      sample_items
    ON
      sample_carts.item_id = sample_items.item_id
    WHERE
      sample_carts.user_id = ?
    AND
      sample_items.item_id = ?
  ";
  return fetch_query($db, $sql, array($user_id, $item_id));
}

// カートに追加(既に同じ商品があれば、個数のみUpdate)
function add_cart($db, $user_id, $item_id ) {
  $cart = get_user_cart($db, $user_id, $item_id);
  if($cart === false){
    return insert_cart($db, $user_id, $item_id);
  }
  return update_cart_amount($db, $cart['cart_id'], $cart['amount'] + 1);
}

function insert_cart($db, $user_id, $item_id, $amount = 1){
  $sql = "
    INSERT INTO
      sample_carts(
        item_id,
        user_id,
        amount
      )
    VALUES(?,?,?)
  ";
  return execute_query($db, $sql, array($item_id, $user_id, $amount));
}

function update_cart_amount($db, $cart_id, $amount){
  $sql = "
    UPDATE
      sample_carts
    SET
      amount = ?
    WHERE
      cart_id = ?
    LIMIT 1
  ";
  return execute_query($db, $sql, array($amount, $cart_id));
}

Controller

index.php
<?php
require_once '../conf/const.php';
require_once MODEL_PATH. 'functions.php';
require_once MODEL_PATH. 'users.php';
require_once MODEL_PATH. 'items.php';

session_start();

if(is_logined() === false){
    redirect_to(LOGIN_URL);
}

$db = get_db_connect();
$user = get_login_user($db);
$items = get_items($db);

include_once VIEW_PATH. 'index_view.php';
index_add_cart.php
<?php
require_once '../conf/const.php';
require_once MODEL_PATH. 'functions.php';
require_once MODEL_PATH. 'users.php';
require_once MODEL_PATH. 'items.php';
require_once MODEL_PATH. 'cart.php';

session_start();

if(is_logined() === false){
    redirect_to(LOGIN_URL);
}

$db = get_db_connect();
$user = get_login_user($db);

$item_id = get_post('item_id');

// カートに追加
if(add_cart($db, $user['user_id'], $item_id)){
    set_message('カートに商品を追加しました。');
} else{
    set_error('カートの更新に失敗しました。');
}

redirect_to(INDEX_URL);

カートの商品を購入

Model

functions.php
function has_error(){
  return isset($_SESSION['__errors']) && count($_SESSION['__errors']) !== 0;
}
carts.php
// カートの商品データ
function get_user_carts($db, $user_id){
  $sql = "
    SELECT
      sample_items.item_id,
      sample_items.name,
      sample_items.price,
      sample_items.stock,
      sample_carts.cart_id,
      sample_carts.user_id,
      sample_carts.amount
    FROM
      sample_carts
    JOIN
      sample_items
    ON
      sample_carts.item_id = sample_items.item_id
    WHERE
      sample_carts.user_id = ?
  ";
  return fetch_all_query($db, $sql, array($user_id));
}

// カートの商品の合計額
function sum_carts($carts){
    $total_price = 0;
    foreach($carts as $cart){
        $total_price += $cart['price'] * $cart['amount'];
    }
    return $total_price;
}

// 購入処理
function purchase_carts($db, $carts){
  if(validate_cart_purchase($carts) === false){
    return false;
  }
  // 購入後、カートの中身削除&在庫変動
  $db->beginTransaction();
  try {
    foreach($carts as $cart){    
      if(update_stock($db, $cart['item_id'], $cart['stock'] - $cart['amount']) === false){
          set_error($cart['name'] . 'の購入に失敗しました。');
        }
      }
      delete_user_carts($db, $carts[0]['user_id']);
      $db->commit();
  }catch(PDOException $e){
    $db->rollback();
    throw $e;
  }
}

function delete_user_carts($db, $user_id){
  $sql = "
    DELETE FROM
      sample_carts
    WHERE
      user_id = ?
  ";
  execute_query($db, $sql, array($user_id));
}

// バリデーション
function validate_cart_purchase($carts){
  if(count($carts) === 0){
    set_error('カートに商品が入っていません。');
    return false;
  }
  foreach($carts as $cart){
    if($cart['stock'] - $cart['amount'] < 0){
      set_error($cart['name'] . 'は在庫が足りません。購入可能数:' . $cart['stock']);
    }
  }
  if(has_error() === true){
    return false;
  }
  return true;
}

Controller

cart.php
<?php
require_once '../conf/const.php';
require_once MODEL_PATH . 'functions.php';
require_once MODEL_PATH . 'users.php';
require_once MODEL_PATH . 'items.php';
require_once MODEL_PATH . 'carts.php';

session_start();

if(is_logined() === false){
    redirect_to(LOGIN_URL);
}

$db = get_db_connect();
$user = get_login_user($db);
$carts = get_user_carts($db, $user['user_id']);

$total_price = sum_carts($carts);

require_once VIEW_PATH. 'cart_view.php';
finish.php
<?php
require_once '../conf/const.php';
require_once MODEL_PATH . 'functions.php';
require_once MODEL_PATH . 'users.php';
require_once MODEL_PATH . 'items.php';
require_once MODEL_PATH . 'carts.php';

session_start();

if(is_logined() === false){
  redirect_to(LOGIN_URL);
}

$db = get_db_connect();
$user = get_login_user($db);
$carts = get_user_carts($db, $user['user_id']);

$total_price = sum_carts($carts);

// 購入処理
if(purchase_carts($db, $carts) === false){
    set_error('商品が購入できませんでした。');
    redirect_to(CART_URL);
} 

include_once VIEW_PATH. 'finish_view.php';

カートの商品を削除

Model

carts.php
// カートの商品の削除
function delete_cart($db, $cart_id){
  $sql = "
    DELETE FROM
      sample_carts
    WHERE
      cart_id = ?
    LIMIT 1
  ";
  return execute_query($db, $sql, array($cart_id));
}

Controller

cart_delete.php
<?php
require_once '../conf/const.php';
require_once MODEL_PATH . 'functions.php';
require_once MODEL_PATH . 'users.php';
require_once MODEL_PATH . 'items.php';
require_once MODEL_PATH . 'carts.php';

session_start();

if(is_logined() === false){
  redirect_to(LOGIN_URL);
}

$db = get_db_connect();
$user = get_login_user($db);

$cart_id = get_post('cart_id');

if(delete_cart($db, $cart_id)){
    set_message('カートの商品を削除しました。');
  } else {
    set_error('カートの商品の削除に失敗しました。');
  }

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

MySQL⑥ レコードの更新、文字列の扱い

レコードの更新、削除

全てのレコードのカラムを更新する update テーブル名 set 更新するカラム名 = 更新する値;

update users set score = 5.9;

特定のレコードだけ更新する update テーブル名 set 更新するカラム名 = 更新する値 where 条件にするカラム名 = 条件にする値;

update users set score = 5.9 where id = 1;

複数のカラムを更新する

update users set name = 'sasaki', score = 2.9 where name = 'tanaka';

レコードの全件削除

delete from users;

条件を指定して削除

delete from users where score < 5.0;

数値の演算

+ - * / %

カラムの値を計算して更新する

id が偶数の人のスコアを 1.2倍する。
update users set score = score * 1.2 where id % 2 = 0;

数値の丸め(四捨五入)

select round(5.355);  -> 5

小数点 1 桁目で丸める

select round(5.355, 1);  -> 5.4

小数点以下の切り捨て

select floor(5.833);  -> 5

小数点以下の切り上げ

select ceil(5.238);  -> 6

ランダムで抽出する

select rand();
*rand() を使うと 0 以上 1 未満のランダムな数値を返す。

rand()で抽選1名

select * from users order by rand() limit 1;

文字列の演算

文字数の表示

select length('Hello');  --> 5

何文字目以降を表示

select substr('Hello', 2); -->ello
select substr('Hello', 2, 3); -->ell

大文字にする

select upper('Hello'); --> HELLO

小文字にする

select lower('HELLO'); -->hello

連結する

select concat('hello', 'world'); --> helloworld

文字数でならべかえる

elect length(name), name from users order by length(name);

カラムに別名をつける as

select length(name) as len, name from users order by len;

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

AWS EC2のMySQL起動できない!Buffer poolのメモリが足りない!

業務中にいつも使っているMySQLの障害が発生しまして、それを解決するため行った対応をメモしました。

問題

EC2上にMySQLのDBを作成して運用していて、最初は異常なく使ってきましたが、最近よく週一回の頻度で意図しないMySQL停止が起こされて、MySQLの再起動を行っても直らない現象がありました。

結論

InnoDBのBuffer poolのメモリが足りないことでした。
そのため、Swap領域を作ってあげて、MySQLを再起動して解決しました。

エラー調査

1. statusを確認する。

systemctl status mysqld.service

下記のようなメッセージが出てきましたので、MySQLサービスは動いてないことを確定しました。

● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: failed (Result: start-limit) since Mon 2020-08-17 09:07:45 JST; 2s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 3726 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=1/FAILURE)
  Process: 3704 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 24323 (code=killed, signal=KILL)

systemd[1]: Failed to start MySQL Server.
systemd[1]: Unit mysqld.service entered failed state.
systemd[1]: mysqld.service failed.
systemd[1]: mysqld.service holdoff time over, scheduling restart.
systemd[1]: start request repeated too quickly for mysqld.service
systemd[1]: Failed to start MySQL Server.
systemd[1]: Unit mysqld.service entered failed state.
systemd[1]: mysqld.service failed.

2. mysqld.logの内容を確認する。

my.cnfにログの保存場所を記載しています。my.cnfの場所を忘れた場合、下記のコマンドで可能な場所を探してください。

mysql --help | grep my.cnf
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf

my.cnfの中に、log-error=/var/log/mysqld.logという記述がありましたので、ログの場所を確認できます。

mysqld.log
[Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M
[ERROR] InnoDB: mmap(137428992 bytes) failed; errno 12
[ERROR] InnoDB: Cannot allocate memory for the buffer pool
[ERROR] InnoDB: Plugin initialization aborted with error Generic error

buffer poolのメモリの問題でして、容量が足りないではないかと思い、一旦容量を増やす方向で対応します。

解決方法

// 空ファイルの作成
# dd if=/dev/zero of=/swapfile bs=1M count=1024

// 作成したファイルをswap領域に設定
# mkswap /swapfile

// swap領域を有効にする
# swapon /swapfile

// メモリの確認
# free -m
      total        used        free      shared  buff/cache   available
Mem:    479         167          11           3         300         296
Swap   1023           0        1023

// MySQL再起動
# systemctl restart mysqld.service

// MySQL status確認
# systemctl status mysqld.service

他の方法

試してないですが、一応別の方法も記載しておきます。

MySQLの設定でbuffer_pool_sizeの変更は可能みたいですので、設定値を編集してみるのも良いかもしれません。
my.cnfに下記の記述を追加or編集してから、再起動します。

innodb_buffer_pool_size = 256M

MySQLにアクセスできる場合、下記のコマンドで設定値の確認ができます。

> SHOW VARIABLES LIKE 'innodb_buffer_pool_size'

Variable_name            Value
innodb_buffer_pool_size  134217728

最後

MySQLを再起動したら、innodb_buffer_pool_sizeを確認しました。

Variable_name            Value
innodb_buffer_pool_size  134217728

先ほどのエラログの内容

mysqld.log
[ERROR] InnoDB: mmap(137428992 bytes) failed; errno 12

両方を再度確認してみたら、やはり容量が足りないことがわかりました。
swap領域を作成してあげましたので、これで一旦解決できていると思います。

作業メモは以上でした。

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

MySQL⑤ 抽出

データを抽出する

全てのデータを抽出する

select * from users;

カラムを指定して抽出する

select id, name from users;

条件をつける

< > <= >= = <> !=
is null, is not null
and or not

float型の様な小数についてはうまく表すことができず多くのデータベースは小数を「それに最も近い数値」として保存するようになっています。

数値を整数に変換してから保存する。

scoreが6.0以上

select * from users where score >= 6.0;

score が3.0以上6.0以下

select * from users where score >= 3.0 and score <= 6.0;
select * from users where score between 3.0 and 6.0;

name が AAA か BBB

select * from users where name = 'taguchi' or name = 'fkoji';
select * from users where name in ('taguchi', 'fkoji');

文字列が一致

select * from users where name = 'taguchi';

特定の1文字から始まる like '文字%'

select * from users where name like 't%';

特定の1文字で終わる like '%文字'

select * from users where name like '%a';

特定の1文字を含む like '%文字%'

select * from users where name like '%a%';

大文字と小文字を区別する ike binary '文字%';

select * from users where name like binary 'T%';

文字数を指定する like '______';

6文字
select * from users where name like '______';

何文字目に特定の文字を含む like '__文字%';

2文字目にaを含む
+select * from users where name like '_a%';

並び替え、抽出件数の制限

小さい順に並び替える。 select * from テーブル名 order by カラム名;

select * from users order by score;

大きい順に並び替える。 select * from テーブル名 order by カラム名 desc;

select * from users where score is not null order by score desc;

件数を制限する limit 件数;

select * from users limit 3;

次の 数件を表示したい limit 飛ばす件数 offset 表示する件数;

select * from users limit 3 offset 3;

組み合わせると

select * from users order by score desc limit 3;

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

MySQL④

後から一意制約を付ける alter table テーブル名 add unique unique_name(カラム);

例えば、usersテーブルのnameフィールドをuniqueにしたい、という場合には以下のようにしてあげるといいでしょう(unique_nameはインデックスの名前なので適当につけてあげればOKです)。

mysql> alter table users add unique unique_name(name);

後から一位制約を外す alter table テーブル名 drop index unique_name;

またこのunique制約を外したい場合は、うえで付けたインデックスの名前を使って次のようにしてあげればOKです。

alter table users drop index unique_name;

テーブルの構造を変える

カラムを追加する  alter table テーブル名 add column カラム名 データ型;

alter table users add column email varchar(255);

追加する場所を指定する

nameカラム のあとに追加したかった場合には

alter table users add column email varchar(255) after name;

カラムを削除する alter table テーブル名 drop column カラム名;

alter table users drop column score;

カラムを変更する alter table テーブル名 change 元カラム名 新カラム名 データ型 オプション;

alter table users change name user_name varchar(80) default 'nobody';

テーブルの構造を確認する

desc users

テーブル名を変える alter table 元テーブル名 rename 新テーブル名;

alter table users rename persons;

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