MySQL 構文・文法などのまとめ

こんにちは、ヒロアキです。 今回は、MySQLの構文・文法のまとめ記事を書いていきます。 引き続き、ただの自分用メモでもありますので、記法が統一されていないのでご了承ください。笑


mysql 操作まとめ

・実行順序と構文
実行
FROM → WHERE → GROUPBY → HAVING → SELECT → ORDERBY
構文
SELECT → FROM → WHERE → GROUPBY → HAVING → ORDERBY

・サーバー接続方法
(rootユーザー)mysql -u root -p

・ユーザー確認
use mysql;
→select user , host from user;  登録されているユーザーの確認
→show grants for ‘user_name’@’host’;  ワイルドカードは%

・文字化けの防止
SET NAMES utf8;

・データベース作成
create database db_name;

・データベース作成
drop database db_name;
→テーブルなら、databaseをtableに変更する

・テーブル作成

use *db_name*;
create table *table_name* (
id int not null auto_increment primary key,
title varchar(255) not null,
price int not null
);

※カラムの型などは別途調べる

・テーブル変更

-- カラムの追加
alter table *table_name* add *追加するカラム* *データ型* after *columns*;

-- カラム名変更
alter table *table_name* change *old_name* *new_name* *データ型*;

-- カラム削除
alter table *table_name* drop *columns*;

・データ登録(この例では2件)
INSERT INTO ‘table_name’ (columnA, columnB, columnC) VALUES (A1, B1, C1), (A2, B2, C2);

・データ更新

update
'table_name'
set 'columns_name' = update_thing 
where 更新対象のレコードの絞り込み;
-- where句を複数使いたい時は、andを使う
-- Ex. where ~ and ~ and ~;
-- サブクエリも使用可

・データ削除
delete from table_name where 削除対象のレコードの絞り込み

・ファイルからSQLを読み込む
source file_name

・database確認方法
show databases;

・データベース選択
use database_name;

・バージョン確認
select version();

・テーブル確認
show tables from database_name;

・インデックス確認
show INDEX from table_name;
 →EXPLAIN をselect文の先頭につけると、インデックスが機能しているか確認できる

・カラムの確認
show columns from table_name;
  →データベース名から指定もあり
  show columns from table_name from database_name;

・カラムに別名をつける
select columns as 別名 from table_name;
 →asで別名をつけた場合、その別名でクエリを書かないとエラーになる

・指定した値が含まれているかどうか

-- 含まれている
select *columns* from *table_name* where 調べたい値のあるカラム in(*int*);

-- 含まれていない
select *columns* from *table_name* where 調べたい値のあるカラム not in(*int*);

・特定文字列を調べたい時
select columns from tables where 調べたいカラム like ‘文字列’;
  →「’文字列’」の部分は、「%」、「」というワイルドカードが使用可能
  →’%’は0文字以上の任意の文字列、’
’は1文字の任意の文字列

・取得件数を制限する
select columns from tables limit int;

・集約関数いろいろ

-- 合計値
select sum(*columns*) from *tables* where 合計値を知りたいレコードの絞り込み;

-- 平均
select avg(*columns*) from *tables* where 平均値を知りたいレコードの絞り込み;

-- 最小値、最大値
select min(*columns*) from *tables* where 最小値を知りたいレコードの絞り込み;
select max(*columns*) from *tables* where 最大値を知りたいレコードの絞り込み;

集約関数では、基本的にnullは無視される

・文字列検索 ある文字数以上(以下)のレコードを知りたい
select columns from tables where char_length(columns) >= 文字数;
 char_length()の中のカラム名にはクォーテーションをつけない

・対象レコードの数を調べる
select count(columns) from tables where 調べたいレコードを絞り込む;

-- 重複を排除する(下記は1000円以下の商品が何種類あるか、最高料金はいくらか)
Ex. select count(distinct price), max(price) from products where price < 1000;

・データの集計をグループ毎におこなう
select columns from tables group by グループにしたいカラム;
  →例えば
   select organization_id, sum(login_num) from user group by organization_id;
   とするとorganization_id毎のlogin_numが表示される。

・集計したグループに条件式を使う
select columns from tables group by グループにしたいカラム having 条件式;
 →whereとの違いは、グループにしたカラムに対してのみ条件式を指定できる

-- OK
select A, B from db where C > 100 group by D;
select A, B from db group by D having B > 10;

-- NG
select A, B from db group by D having C > 10;

・逆順で表示(カラム1を降順にしたい)
select columns_1,columns_2 from tables order by columns_1 desc;
 →昇順だと以下の通り
  select columns_1,columns_2 from tables order by columns_1 asc;

・unionによる和結合
 →inner joinなどは、テーブルを結合させて自テーブルには無いレコードも出力できるようにする方法。unionは、テーブルを結合させて出力結果を増やす(=データソースを増やす)。
  重複分を表示させるには、union allとする
例:admin_usersとusersテーブルをunionする

select name, email from admin_users
union
select name, email from users;

・内部結合(ベン図で言う両方の要素をもつ部分)
例:productsテーブルとstoresテーブルを結合させて、「店舗名・商品名・1000円以上の価格」の情報を取得
 →productsテーブルにとって、store_idは外部キー。
  storesテーブルにとってはそれが主キー。

select
s.name,
p.product_name,
p.price
from
products as p
inner join
stores as s
on 
p.store_id = s.id
where
p.price > 1000;

・外部結合(ベン図で言う片方の円のこと。もう片方と合わさらない箇所はNULL)
 参考:https://qiita.com/devopsCoordinator/items/3ba154429973a4ddc9e0 など
例:ordersテーブルとcustomersテーブルを結合させて、「顧客名(1, 2)・配達日・顧客Eメール」の情報を取得

select
c.id,
c.name1,
c.name2,
o.customer_id,
o.delivery_date,
o.customer_email
FROM
orders as o
right outer join -- left outer joinとすると、ordersテーブルがマスタテーブル
customers as c
on o.customer_id = c.id
group by c.id;

内部結合も外部結合も、3つ以上結合する時は、on〜の後にinner join〜などと続ける。

・もしも値がNULLなら〜に変更する
例:company_idがNULLなら0にする

select  
c.id,
case
    when c.company_id is NULL then 0
    else c.company_id
end company_id
from
customers as c;

・case文(条件分岐)
出力結果を条件分岐させたい時に使用する
例:2017年以降に注文してくれた顧客を優良顧客に、2017年〜2016年に注文してくれた顧客をメルマガ送付対象に、それ以外をノーアクティブに分けたい。

select
c.id as customerID,
c.name1,
c.name2,
case
    when o.delivery_date > '2016-12-31' then '優良顧客'
    when o.delivery_date > '2015-12-31' then 'メルマガ送付対象'
    else 'ノーアクティブ'
end as '顧客ランク' -- このendは忘れやすい。名前を付与しないとカラム名は「case」になる
from
orders as o
inner join
customers as c
on
o.customer_id = c.id
group by
c.id
order by c.id asc;

・サブクエリ
ある問い合わせに基づいて、異なる問い合わせをおこなう
例:最も高額な商品の「店舗ID・商品名」を出力する

select
store_id,
product_name
from
products
where
price in(
    select
    max(price)
    from
    products
    );

※max(price)は通常where句に使用できない
※サブクエリ内のカラムやテーブル名に別名をつける際は、別途指定する必要がある

mysqlサーバーの確認
sudo service mysqld status

mysqlサーバーの自動起動
sudo chkconfig mysqld on

mysqlサーバーの起動
sudo service mysqld start

mysqlサーバーの自動起動の確認(2〜5がon)
sudo chkconfig --list mysqld

・エクスポート、インポート(CSV含む)
こちらを参照 → https://normalblog.net/system/mysql_matome/

・正規化
DBで保持するデータの冗長性を排除し、一貫性と効率性を保持するデータ形式にすること

・主キー
プライマリーキー。1つの行を特定できる列のこと。

・外部キー
フォーリンキー。他テーブルとの関連づけに使う列のこと。 関連づけられた先のテーブルでは主キーになる。

・リレーションシップ
一対多
ユーザー : 注文
ブログ主 : 投稿記事
注文 : 注文明細
部署 : 従業員

多対多(中間テーブルがあることを想像すると分かりやすい)
商品 : 商品カテゴリー
投稿記事 : 記事カテゴリー
ユーザー : 操作権限

一対一(操作権限がある人しか見れないようにする際などに使用)
ユーザー : 電話番号

「GET、POST、キャッシュ、クッキー、セッションとは?」という人(自分)のためのメモ

表題の件、調べて理解できるものの、しばらくすると忘れてしまうのでメモとして残しておきます。 と言っても、他ブログからの引用(コピペ)オンリーです。 ブログ主様には感謝です。

キャッシュ、クッキー、セッション


Webブラウザ(パソコン)に保存されるもの

キャッシュ( Cache )⇒

何度も見るWebページがある場合に、2回目以降の閲覧時の表示スピードを上げるため、ページ内の画像やアイコンといったデータをパソコン内に保存する仕組み(またはその保存されたデータ自体)。

Webページまるごとの情報。

2回目以降はファイルのダウンロードをせずに、パソコン内にキャッシュ(貯蔵)されたデータでWebページを再現するため、表示スピードが早くなります。

クッキー( Cookie )⇒

Webブラウザ利用者の情報記録のこと。

記録される履歴情報は、ユーザーが入力したID、パスワード、そのWebページを訪れた日時、訪問回数など。

クッキーを使用しているサイトにアクセスすると、サイトの情報と一緒にクッキーファイルも利用者のパソコンにサイトから送信され、特定のフォルダに保存されます。

セッションクッキー( Session Cookie )⇒

Webブラウザのメモリーに保存されるもの。

Webブラウザを閉じれば破棄するようにできます。

履歴 ⇒

自分が閲覧したWebページのURL。

Webサーバーに保存されるもの

セッション( Session )⇒

パソコンに保存させておきたくない情報( Session )で、サーバーに保存されるもの。

Sessionの流れ

ユーザーが、Webページにアクセス( WebサーバーにHTTPリクエストを送る。)。

Webサーバーは、

『セッションID』と 『セッション・オブジェクト( セッションを管理するデータを書き込むためのもの )』 を作り、Webページの情報(データファイル)と共にセッションIDをユーザーに返す。( HTTPレスポンス )。

この時にセッションIDをユーザーに渡す方法は3つあります。

Cookieに書き込んで リンクのURLに埋め込む Webページのフォーム・データに埋め込む ⇩

パソコンにセッションIDという値が保存され、これを基に次からのアクセス( HTTPリクエスト )はサーバー側に保存された情報( セッション・オブジェクト )を参照したやりとりを可能にします。

・「セッション管理」のすべて-ステップ1 [基本のしくみ] Webブラウザに情報を預けて,アクセス時に送信させる:ITpro

HTTPの仕組みとセッション

HTTPはステートレスなプロトコル( 通信手順 )です。

・セッション管理の周辺知識まとめ | PAYFORWARD

・yohei-y:weblog:ステートレスとは何か

ステートレス( stateless )

サーバーはクライアントのセッション情報を保持しません。

◯ メリット

クライアントのリクエストは状態に依存せず、常にリソースに対する操作に必要十分な情報となります よってサーバーが増えてもそのままのリクエストでいつも同じリソースに対する操作ができます このためスケールアウトに向いています また処理がクライアントの状態に依らないので処理がシンプルになります

☓ デメリット

やり取りが冗長になりがちです またリソースへの操作が必要になる度にそのやり取りを繰り返す必要があります これによりネットワークの帯域を消費し、処理も遅くなります サーバーが状態を保持していないのでエラーが起きたときのハンドリングが複雑になりがちです

ステートフル( stateful )

サーバーはクライアントのセッション状態を保持しています。

◯ メリット

やり取りが完結に済みます それによりネットワークの帯域を節約できます

☓ デメリット

クライアントの状態を都度把握しておかなければいけないのでクライアントが増えると負荷も増えます サーバーを複数台設置する場合にはそれぞれのサーバー間でクライアントの状態を同期しなければいけません これらの理由によりスケールアウトには向いてません

参考文献: キャッシュ(Cache)とクッキー(Cookie)とセッション(Session)など ~愛しさと切なさと心強さと~とは全く関係ない - ts0818のブログ


GET、POST


GETもPOSTも、サーバへのリクエスト方法という共通点はありますが、、、

GETとは

URLにパラメータが付加される。
文字数制限がある。
パラメータつきのURLを保存・共有できる。
→これによりブックマークも共有できる

POSTとは

パラメータが見えづらい。
文字数制限がない

どう使い分ける???

GETは情報を取得するとき、POSTは情報を登録するときの利用が適しています
例:
GET→検索フォーム
POST→ログインフォーム

参考文献: GETとPOSTの使い分け方法 | PHP Junkie


入社して2週間で参考にしたWebページまとめ

今の会社に入社して2週間

こんにちは、ヒロアキです。
今の会社に入社して2週間たちました。
自分の実力の低さを痛感した2週間でした。
今回は、業務中に参考にしたサイトなどを残していきたいと思います。
自身の記録という意味での記事なので、バリバリのキャリアの人には役立ちませんが、エンジニアを目指す人には参考になるかも……しれません。

業務中にメモした事まとめ

MySQL

・mysqldump
そもそもdumpとは →  https://wa3.i-3-i.info/word1569.html
mysqldumpコマンド →  mysqldumpまとめ

・GRANTコマンド
権限の設定(GRANT文) - ユーザーの作成 - MySQLの使い方

SQLモード(SQLの動作指定)
MySQLのSQLモードをstrictモードで設定する。

Linuxコマンドなど

・PATHを通す
PATHを通すとは? (Mac OS X)

・デーモン
https://wa3.i-3-i.info/word11000.html

・lnコマンド
【 ln 】コマンド――ファイルのハードリンクとシンボリックリンクを作る:Linux基本コマンドTips(16) - @IT

wgetコマンド
【 wget 】コマンド――URLを指定してファイルをダウンロードする:Linux基本コマンドTips(24) - @IT

・pemファイル
[OpenSSL] pem ファイルとは?SSL証明書の中身を確認する方法|てくめも@ecoop.net

・scpコマンド
scpコマンド チートシート

Apache

・基本事項
WEB系の新人が困らないように基本を復習〜Apacheのインストール - 爬虫類嫌いのPython日記

便利な操作

macを使う人はmacの、windowsを使う人はwindowsのショートカットキーを調べて使えるようにしておく
 →マウスを使うと生産性が落ちる場合があります。特にコピペ関連。

・ターミナルで履歴を調べたい時は「history | grep 調べたいコト」
 →だいたいの見当がついていれば「ctl+r」の方がそのまま実行できて楽

・/etc以下のファイルをいじくる時は、不安であれば、cpコマンドでバックアップをとる
 →最後に「.org」をつけるなど