日々積み重ねろ。

何も積み重ねて来なかった私が何かを積みかねて行くブログ。主にIT系の技術・知識を書いて行きます。

【SQL】MySQLトランザクションコマンドまとめ

トランザクション(transaction)とは、関連する一連の処理をひとまとめにして実行することです。

トランザクションにおけるロックが行われた処理のことを排他処理と呼びます。処理が完了してロックが解除されると、アクセスが可能な状態になります。

複数のユーザが同時にアクセスすることを競合と呼びます。トランザクションでは、競合が起きた場合、一瞬でも早く要求を出した処理がロックを獲得し、排他処理を開始します。他のアクセスは、排他処理が完了するまで待機することになります。

トランザクションを使ってデータを更新

START TRANSACTION;

UPDATE outTbl SET number = number + 1 WHERE code = 'A101';

COMMIT;

 

ロールバックトランザクションを消す

START TRANSACTION;

UPDATE outTbl SET number = number + 1 WHERE code ='A101';

ROLLBACK;

【無料】macでExcel,Wordがストレス無く使えるソフト「LibreOffice」

macExcelファイルを編集するため、無料ソフトを探していたんですが、どれもこれも使えない感じだったのですが(Numbers,OpenOffice...)、、、

LibreOfficeさんは、さくさくストレス無しで使えたので情報共有致します。

 

LibreOfficeは、Windows以外でもOfficeファイルを使えるようにするためのフリーソフトです。

もちろんフリーソフトなので無料です。

素晴らしい。

なんとwordも使えます。

 

LibreOfficeのインストール方法

LibreOfficeの公式サイトから下記2つをインストール

LibreOffice最新版 | LibreOffice - オフィススイートのルネサンス

LibreOffice本体

・日本語化用ファイル

LibreOffice本体をインストール→日本語化用ファイルをインストールして起動→LibreOffice本体を起動

f:id:hibitumikasanero:20150420093034p:plain

 

 

【SQL】MySQLビューコマンドまとめ

■ビューの作成

CREATE VIEW v1_goods(goods_name, color) AS SELECT goods_name, color  FROM goods WHERE price >= 300;

※v1_goodsはビューの名前。goods_name,colorはビューの結果として表示する列。

■ビューの呼び出し

SELECT * FROM v1_goods;

■ビューの特定の列だけを表示

SELECT goods_name FROM v1_goods;

■ビューの作成/列名を独自の名前にする

CREATE VIEW v2_goods(g_name, g_color) AS SELECT goods_name, color FROM goods WHERE price >= 300;

■ビューの作成/列名を省略する

CREATE VIEW v3_goods AS SELECT goods_name, color FROM goods WHERE price >= 300;

※AS SELECT以下の列がビューの結果としてそのまま表示される。

■ビューの作成/対象のテーブルの列名を省略する

CREATE VIEW v4_goods AS SELECT * FROM goods WHERE price >= 300;

※テーブルの列をそのまま使用

■ビューに独自の列を作る

CREATE VIEW v5_goods(code, goods_name, color, price, tax_included) AS SELECT code, goods_name, color, price, price* 1.08 FROM goods;

※tax_includedを独自に作成。常に消費税表示。

■テーブルには列だけをビューで表示する

CREATE VIEW v6_goods(total) AS SELECT SUM(price) FROM goods;

■2つのテーブルを結合するビュー

CREATE VIEW v7_goods(code, goods_name, color, price, stock) AS SELECT goods.code, goods_name, color, price, stock FROM goods INNER JOIN stockList ON goods.code = stockList.code;

■ビューの削除

DROP VIEW ビュー名;

【SQL】MySQLサブクエリコマンドまとめ

■平均以上のデータだけを表示

SELECT * FROM fuitList WHERE price >= (SELECT AVG(price) FROM furitList);

AVGなどの集約関数をWHERE句に書くことができないため、上記のようにサブクエリを使って検索します。

■SELECT句にスカラ・サブクエリを書いて結果を表示

SELECT code, name, price, (SELECT AVG(price) FROM fruitList) AS avg_price FROM fruitList;

■スカラ・サブクエリの結果と特定の列の値とを計算する

SELECT code, name, price - (SELECT AVG(price) FROM fruitList) AS "平均価格との差" FROM fruitList;

■スカラ・サブクエリをHAVING句に書く

SELECT shop, SUM(sales) FROM orderList GROUP BY shop HAVING SUM(sales) <= (SELECT SUM(sales) FROM sales) / 3;

※shopのsales合計を全体のsales合計から3で割った値より小さい店舗を表示

■2つのテーブルで共通するデータの中から指定したデータを取り出す(相関サブクエリ)

SELECT code, shop, sales FROM orderList WHERE (SELECT name FROM fruitList WHERE orderList.code = fruitList.code) = ''マスクメロン;

※外部への山椒があるサブクエリのことを相関サブクエリと呼ぶ。相関サブクエリで抽出されたnameがマスクメロンのデータを表示。

■INをつけたサブクエリ

SELECT name From fruitList WHERE code IN (SELECT code FROM orderList);

■どの候補にも一致しないデータを取り出す

SELECT name FROM fruitList WHERE code NOT IN (SELECT code FROM orderList);

■テーブル間で共通のデータだけを取り出す(EXISTS)

SELECT code, name FROM fruitList WHERE EXISTS (SELECT * FROM orderList WHERE fruitList.code = orderList.code);

※EXISTS:サブクエリの条件に一致している行が存在していればTRUEを返す

■サブクエリの条件に一致しないデータを抽出

SELECT code, name FROM fruitList WHERE NOT EXISTS (SELECT * FROM orderList WHERE fruitList.code = orderList.code); 

【SQL】MySQL複数のテーブル操作(結合)コマンドまとめ

■交差結合を行う

SELECT * FROM goods, hop;

■交差結合を行う

SELECT * FROM goods CROSS JOIN shop;

※明示的に交差結合を行うことを示すCROSS JOINも用意されてる。

■列名指定の交差結合

SELECT goods.goods_id, shop_name FROM goods CROSS JOIN shop;

※shop_nameはshopにのみ存在するデータなのでテーブル名は不要(書いてもよい)

■内部結合を行う

SELECT goods.goods_id, goods.goods_name, shop.shop_name FROM goods INNER JOIN shop ON goods.goods_id = shop.goods_id;

※結合キーである列goods_idを使って、2つのテーブルに共通して存在するデータを取り出している。

■内部結合を行って特定のデータだけを表示する

SELECT G.goods_name, S.shop_name, S.stock FROM goods AS G INNER JOIN shop AS S ON G.goods_id = S.goods_id WHERE G.goods_id = '0001';

■外部結合を行う(LEFT OUTER JOIN)

SELECT G.goods_name, S.shop_name, S.stock FROM goods G LEFT OUTER JOIN shop S ON G.goods_id = S.goods_id;

※テーブルgoodsに存在するすべての行を結合の対象にする。結合キーのデータが双方のテーブルに存在していれば、結合して表示。共通して存在しないデータもNULLとして表示する。

■外部結合を行う(RIGHT OUTER JOIN)

SELECT G.goods_name, S.shop_name, S.stock FROM goods G RIGHT OUTER JOIN shop S ON G.goods_id = S.goods_id;

※LEFT OUTER JOINでは、左側に書いたテーブルを外部結合の対象にしますが、RIGHT OUTER JOINでは、右側に書いたテーブルを外部結合の対象にする。

※一般的にはLEFT OUTER JOINの方を多く使います。

■2つのテーブルのデータを1つにまとめて表示する集合演算(UNION ALL)

SELECT goods_id, goods_name FROM shop_aoyama UNION ALL SELECT code, name FROM shop_nogizaka;

※2つのテーブルを1つにまとめることを集合演算と呼びます。注意事項としては、演算対象の列の数が同じである事、演算対象の列のデータ型が同じである事。

■2つのテーブルの重複するデータを除いて合算する集合演算(UNION)

SELECT goods_id, goods_name FROM shop_aoyama UNION SELECT code, name FROM shop_nogizaka;

※集合演算のときに重複するデータが取り除かれて表示される。

 

【SQL】MySQL関数を使ったデータ操作コマンドまとめ

■日付を扱うテーブルdateTableを作成

CREATE TABLE dateTable (number InTEGER, date DATE);

■2013年3月10日の日付を列dateに登録

INSERT INTO dateTable VALUES(1, '2013-03-10');

■現在の日付を列dateに登録(CURRENT_DATE)

INSERT INTO dateTable VALUES(2, CURRENT_DATE);

■2013年13年3月20日以降のデータを表示

SELECT * FROM dateTable WHERE date > '2013-03-20'

 

■時刻を扱うテーブルtimeTableを作成

CREATE TABLE timeTable (number INTEGER, time TIME);

■9時15分40秒の時刻を列timeに登録

INSERT INTO timeTable VALUES(1, '09:15:40');

■現在の時刻を登録する(CURRENT_TIME)

INSERT INTO timeTable VALUES(2, CURRENT_TIME);

 

■日付と時刻を扱うテーブルを作成する

CREATE TABLE timestampTable (number INTEGER, date_time TIMESTAMP);

■日付と時刻のデータ登録

INSERT INTO timestampTable(1,'2013-03-20 09:15:40');

■現在時刻と日付の登録(CURRENT_TIMESTAMP)

INSERT INTO timestampTable(2, CURRENT_TIMESTAMP);

 

■小数点以下を切り上げる(CELING)

SELECT value, CELING(value) AS after_value FROM process;

※1.100 → 2 11.110 → 12, 111.111 → 112

 

■小数点以下を切り捨てる(FLOOR)

SELECT value, FLOOR(value) AS after_value FROM process;

※1.100 → 1 11.110 → 11 111.111 → 111

 

■バイト数を調べる(LENGTH)

SELECT name, LENGTH(name) AS "文字数" FROM foodname;

apple → 5, バナナ → 9

 

■文字数を調べる(CHAR_LENGTH)

SELECT name, CHAR_LENGTH(name) AS "文字数" FROM foodname;

apple → 5, バナナ → 3

 

■一部の文字列を取り出す(SUBSTRING)

SELECT code, SUBSTRING(code FROM 4 FOR 4) AS "下四桁" FROM foodcode;

※4番目の文字列から4文字取り出す

 

■別々の列に登録された文字データを連結する(CONCAT)

SELECT CONCAT(sei, mei) AS "フルネーム" FROM nameTable;

 

■文字列の左側の不要なスペースを取り除く(LTRIM)

SELECT name, LTRIM(name) AS "処理後" FROM vegeName1;

 

■文字列の右側の不要なスペースを取り除く(RTRIM)

SELECT name, RTRIM(name) AS "処理後" FROM vegeName2;

 

■小文字を大文字に変換する(UPPER)

SELECT name, UPPER(name) AS "処理後" FROM vegeName3;

 

■大文字を小文字に変換する(LOWER)

SELECT name, LOWER(name) AS "処理後" FROM vegeName4;

 

■文字列型のデータを数値に変換する(CAST)

SELECT num, CAST(num AS SIGNED INTEGER) AS "整数型" FROM number;

 

■文字列型のデータを数値に変換して集計する

SELECT SUM(CAST(num AS SIGNED INTEGER)) AS "合計" FROM number;

 

■文字列を日付型へ変換する

SELECT moji, CAST(moji AS DATETIME) AS "DATETIME型" FROM date;