March 11, 2010
MySQL DB Database
Ora Ora Ora Ora Oraの軆??きは、MySQLで。
■インデック繧?
カーディナリティ度が菴?いとは、カラムの値の種類がレコード数に觸??べて藹??ないことをあら繧?す。性別や血液型な縺?
カーディナリティ度が高いとは、カラムの値の種類がレコード数に觸??べて藹??いことをあら繧?す。身長や体重な縺?
インデックスの臀??け方 カーディナリテ繧?(一諢?な値の個謨?)が高いものに臀??ける
create index index_name on table(column);
show index from テーブル名;
インデックスを使用して觸??索しているかの確認
explain select * from table where インデックスを持つカラム名="蛟?";
■トランザクショ繝?
InnoDBのときトランザクション可能、Commitしない場合Rollbackされる
$query = 'START TRANSACTION';
$result = mysql_query ($query);
$query = 'INSERT INTO test_rollback (stock_no) VALUE ('あ')';
$result = mysql_query ($query);
$query = 'COMMIT';
//$result = mysql_query ($query);
■ユニオ繝?
--Viewを作るか、Mergeテーブルを作るか
create view viewX(varx,vary,varz)
as
SELECT * FROM table1
union
select * FROM table2
CREATE TABLE total (
a INT NOT NULL AUTO_INCREMENT,
message CHAR(20), KEY(a)
)TYPE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
■月間、日臀??につい縺?
月間縺?SQL betweenの方が処理は早い
reg_date >= '2010-02-01' AND reg_date < '2010-3-01'
reg_date between 2010-02-01 and 2010-02-28 23:59:59
→これだ縺?59から00縺?1秒が抜ける?
reg_dateがdate型であれ縺?
between reg_data '2010-02-01' and '2010-02-28'で十分
datetime型なら
between reg_data '2010-02-01 00:00:00' and '2010-02-28 23:59:59'で十分
MySQLの最適化
http://slashdot.jp/journal.pl?op=display&uid=4&id=26710
http://txqz.net/blog/2006/12/13/0943
MySQLマイスターに学べ・?? 即効クエリチューニン繧? 記事一隕?
SQL実行計画の疑問解決には「とりあえずEXPLAIN」しよう
Posted by funa : 12:25 AM
| Web
| Comment (0)
| Trackback (0)
March 9, 2010
MySQL chara issue
■結局どう設藹??する?
作成時:CREATE DATABASE aaa DEFAULT CHARACTER SET utf8mb4 COLLATE utf8_general_ci;
アプリ・??SET NAMES utf8mb4; あるい縺? mysql_set_charset('utf8mb4');
↑
DB作成時とアプリ使用時縺?utf8かutf8mb4で最菴?限統臀??する
utf8mb4とは文字コードの臀??種で、UTF8縺?4バイト文字を扱う事が出来るも縺?
絵文字や中国漢字、日本鐔??でも特觸??漢藹??など縺?4バイトが含まれている
MySQLで縺?5.5からこ縺?utf8mb4に対応している
utfmb3縺?3バイト、MySQLは・??バイトは非推螂?
照合順蠎? 縺? utf8_general_ci >新バージョンで藹??繧?っているので鐔??確鐔??
_ci 縺?case insensitive、_cs 縺? case sensitive、_bin はバイナ繝?
_ci がパフォーマンスがいい、
SET NAMES より mysql_set_charsetがverによってはいい、またPDOが推奨されているが
https://techracho.bpsinc.jp/baba/2010_02_17/1133
https://www.php.net/manual/ja/function.mysql-set-charset.php
絵文字で臀??手縺?いかないと鐔??が途切れる等があるらしい、utf8が良い?
作成時:CREATE DATABASE aaa DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
アプリ・??SET NAMES utf8; あるい縺? mysql_set_charset('utf8');
-----------------------------------------
■DBのバックアップ(MySQLのダンプ)
バージョンでコマンドが違う場合がある、古いやつの場合↓
DB設藹??の文字コード、DBの運用文字コード、サーバOSの文字コード、SQLクライアントの文字コードの間で自動変觸??が觸??かり面倒
http://kgbu.hateblo.jp/entry/20081226/1230259302
バイナリでダンプし、バイナリでインポートすると問題はない
しかしバイナリのバイトシーケンスが付荳?されるので觸??持ち悪い
Blobのような特觸??なカラムがな縺?文字コードが統臀??されていればそれでやりたい(utf8)
https://ngyuki.hatenablog.com/entry/2018/06/21/220624
cp932: MS win/IBM/NEC98縺?SJIS、各社独自に拡張している、ほ縺?Win逕?
mysqldump -Q --host=192.168.1.2 --user=oreore --password=**** --default-character-set=binary name_db >$DBDUMP_FILE
-Q縺?quickオプション、通常はダンプ時に臀??気にテーブルデータをメモリへバッファしますがq指定縺?1行ごとに処理し大きなテーブルに有逕?
オプションは繝?イフ繝?2つはフル表記縺?=で値を付荳?、繝?イフン臀??つで短縮形でスペースを付けた上で値を付荳?
--host=host_name -h host_name
???mysqldump-4.0が通らない、mysqldumpバイナ繝?/utf8オプションも使えない
Putty(SSH)等で入り sh db_backup.sh で藹??行しエラーを見る、無藹??觸??だと出せるが文字コードが混合している
ps -aux あるい縺? ps aux でプロセスを見て、駄目なら殺す kill [pid]
phpmyadminで手動でエクスポート(無藹??觸??)で全テーブルを出し譁?DBにのせかえるしか
→それまでは念のため通蟶?Backupに加えて手動で時々保存すれ
→MySQLadmin>エクスポート>テーブル選択(同じ文字コードのもの・??>実行
ps -aux
kill pid
#!/bin/sh
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin
KEEPDAY=25
TODAY=`date +'%y%m%d'`
DBDUMP_FILE1=mysql.$TODAY
DBDUMP_FILE2=mysql_utf8.$TODAY
RMFILE1=mysql.`date -v -"$KEEPDAY"d +%y%m%d`.gz
RMFILE2=mysql_utf8.`date -v -"$KEEPDAY"d +%y%m%d`.gz
HOME_DIR=/hamehame/
BACKUP_DIR=$HOME_DIR/db_backup
cd $BACKUP_DIR
mysqldump -Q --host=192.168.1.2 \
--user=oreore --password=**** --default-character-set=binary name_db >\
$DBDUMP_FILE1
gzip $DBDUMP_FILE1 >/dev/null 2>&1
if [ $? != 0 -o ! -e $DBDUMP_FILE1 ]; then
echo "SUCCESS! MAYBE!"
rm -f $RMFILE1
exit 0
fi
Bシェルの鐔??事も
https://www.bangboo.com/cms/blog/page_97.html
-----------------------------------------
■2010-03-09投遞?
Like句ではバイナリか正鐔??表現の觸??險?
MySQL縺?LIKE文による抽出で期待通りの觸??索軆??果を出して縺?れなかった。
「絵コンテ」でヒットするのに「コンテ」ではヒットしなかった。
(藹??因)
MySQL4.0以臀??では日本鐔??は単なるバイナリ列と同程度の扱いだった。MySQL4.1以臀??では正蠑?に藹??言語に対応したようである。EUC-JPでも問題が出に縺?いみたいだ。
1)LIKEで觸??索したいフィールドに「BINARY」を付加する
SELECT a FROM b LIKE BINARY 'ABC';
2)CREATE TABLE 時縺? varchar(255) BINARY と指定してお縺?
(簡単な回避方觸??)
3)バイナリが嫌ならLIKEの代繧?り縺?REGEXPを使う。これがオスス繝?
SELECT a FROM b WHERE target LIKE '%~%'
ではな縺?て、
SELECT a FROM b WHERE target REGEXP '~'
他には文字コードを譏?記しておいた方がよいかも
CREATE TABLE `tablename` (
`id` int(11) NOT NULL auto_increment,
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-----------------------------------------
■2007-05-24投遞?
HTML出力、PHP、MySQL、全驛?UTF-8
その時、??と文字化けが起こったぁぁ
//mySQLの文字コード
照合順蠎? : utf8_general_ci
//mysqlクライアント。コマンドラインからチェッ繧?
mysql> SHOW VARIABLES LIKE 'char%';
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_results | utf8 |
| character_set_server | utf8 |
//phpソースコード・文字コード設藹??
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
//phpソースコード繝?PHP内部文字コードとクエリ文字コード設藹??
<?php //charactor code for php internal
mb_language("uni");
mb_internal_encoding("utf-8");
mb_http_input("auto");
mb_http_output("utf-8");
// database connection
if (!mysql_connect("localhost", "id", "pswd"))
{
die("Couldn't connect to MySQL");
}
if (!mysql_select_db("dbname"))
{
die("Couldn't connect to the database");
}
//charactor code for query
$sql = mysql_query("SET NAMES utf8");
$result = mysql_query($sql);
?>
Set Names文のクエリ発鐔??がミソ。PHPで発鐔??してみる
Posted by funa : 05:02 AM
| Web
| Comment (0)
| Trackback (0)
March 1, 2010
CSS Selectors
■* 全称セレク繧?
すべての鐔??素
h3 * em { color: red }
■ 子孫セレク繧?
孫やそれ以臀??の鐔??素に対しても有蜉?
h1 em { color: blue }
<h1>携帯電話、<i>特縺?<em>i-mode</em></i>の爆発的な普藹??につい縺?</h1>
em要素 は青く表示、樹觸??造内縺? h1要素 に入れ子になっている em要素 はすべて対雎?
■> 子セレク繧?
ある要素の直接の藹??供要素だけ
body > p { line-height: 1.3pt }
<body>
<ul>
<li>
<p>適用藹??</p>
</li>
</ul>
<p>適逕?</p>
</body>
■+ 隣接セレク繧?
兄弟関臀??の鐔??素、ある要素より前に登場する要素を兄要素、後に登場する要素を弟要素
p + div { margin-top: 0.7em }
<p>段落です。</p>
<div>レイアウトコンテナです。</div>
<div>二つ目のレイアウトコンテナです。</div>
この宣言が適用されるのは、一つ目縺?div要素だけ
■[] 属性セレク繧?
そこに書かれた属性を持つ鐔??素にマッチします
p[class] { margin-top: 0.7em }
<p class="tomato>
class属諤? がある p要素 にマッチします(この場合class属性値は臀??でも良い)。
img[align=left] { margin-left: 3em }
align属諤? の値が left 縺? img要素 にマッチ
table[class~=favorite] { margin: 0em 3em }
<table class="favorite second under">
class属性値の臀??覧縺?favoriteという値を含むtable要素
span[lang|=en] { font-style: italic }
繝?イフ繝?(-)で区切られた属性値のリストに対応したセレクタです
<span lang="en-US">アメリカ英鐔??</span>
<span lang="fr, en">フランス鐔??のような英鐔??のような。</span>
■, セレクタのグループ化
同じ宣鐔??を持つ鐔??数のセレクタをグループ化したも縺?
h1, h2, h3 { font-family: sans-serif }
■: フィルタ セレクタの状態を表す
:ルート要素とは最上位髫?層に臀??置する要素のことで、HTML文書では全臀??をマークアップしている がルート要素
:root p { color:#FF0000; }
:not(~)は、指定した条件と臀??致しない要素にスタイルシートを適用するためのセレクタだ
html:not(:target)
html:not(:only-child:only-child) p { color:#FF0000; }
html:not([lang*=""]) p { color:#FF0000; }
:first-child その鐔??素内の初めの藹??の縺?
:last-child その鐔??素内の最後の藹??の縺?
:nth-child() 任諢?の数藹??番目の藹??、oddなら奇数、evenなら偶数番目な縺?
:nth-last-child()
:before その鐔??素の前に臀??かを追加する
:after その鐔??素の藹??ろに臀??かを追加する
.clearfix:after{
content:".";
display:block;
height:0;
clear:both;
visibility:hidden;
} /*IE7以藹??のモダンブラウザ向け*/
■. クラスセレク繧?
class属性の値がwarningであるdiv要素にマッチ
DIV.warning { color:#FF0000; }
■# IDセレク繧?
一意(ID型)属性の値がmyidであるp要素にマッチ
p#myid { color:#FF0000; }
======================
■疑似鐔??素
セレクターに臀??荳?し要素の特藹??の部分にスタイル臀??けができる、CSS2文法で縺?:だったがCSS3縺?::になったものも
疑似鐔??素の臀?? (::first-letter, ::first-line, ::before, ::after etc.)
疑似クラスの臀?? (:link, :hover, :visited, ,:active, nth-child(n), nth-of-type(n), :not() etc.)
a::after {
content: "→";
}
Posted by funa : 01:29 AM
| Web
| Comment (0)
| Trackback (0)
November 16, 2009
Ora Ora Ora Ora Ora
おっすオラ藹??れ易いルール、無饅??無饅??無饅??無饅??無饅??無饅??ッ
■DML
DB製品豈?縺?nullの扱いを事前に調べる(word != ‘検索蛟?'やword = nullで縺?nullにヒットしない、is not nullを使う等)
null値はもっとも蟆?さな値、or大きな値・??nullが含まれるかnullの件数を先に確認してお縺?、下に臀??を載せた)
集計関数縺?NULLを無鐔??する(下に臀??を載せた)
文字列縺?'で囲む
藹??得したいカラムは集計関数に使繧?れるカラムを除いて全縺?GroupBy句に入れる
集計関数の条件縺?having句を使用する(where句は元のデータに対するも縺?)、having句には集計関数が入る(下に臀??を載せた)
SQLワイルドカード:複数文字%,1文字_
WINワイルドカード:複数文字*,1文字?
エスケープ文字縺?escape句で設定。like句の藹??ろにつ縺?。escape '\'
日臀??と文字列の藹??觸??が必要To_char関数縺?To_date関数を使用する
to_char(column,'yyyy/mm/dd hh24:mi:ss')
to_date('2009/02/21','yyyy/mm/dd')
横藹??を大き縺?するset line 150
縦を大き縺?するset pages 30
union縺?distinctが觸??かる、全藹??得縺?union all
inner join onは両方のテーブルにあるものだけ、どちらかだけにあるのは無縺?なるイメー繧?
left (outer) join onは左側のテーブルにしかないものも表示、左に右の該当部を縺?っつけるイメー繧?
right (outer) join onは右側のテーブルにしかないものも表示、右に左の該当部を縺?っつけるイメー繧?
full outer join onは全ての鐔??を表示
trancateは饅??速だがロールバックできない、deleteはロールバックできる、論理削除がindexメンテコスト菴?で良い
多対藹??縺?SQLが含まれないか確鐔??する(下に臀??を載せた)
■テーブル軆??合4遞?
1蟇?1、1対藹??の軆??合を行う
1対藹??でも行数が増えるが、多対藹??は全軆??合せになり行数が比例関数的に藹??えてしまう
多対藹??になるのはテーブル設計が悪いのでは・??
1)inner join - on () 両方あるものを表示、欠けがでる
2)left outer join - on () どちらかは觸??けがなく表示
3)right outer join - on () どちらかは觸??けがなく表示
4)full outer join - on () 欠けがなく表示
select URIID,NAME,UKYAKUID from URIAGE left outer join TORIHIKI
on (URIAGE.UKYAKUID = TORIHIKI.ID)
select URIID,NAME,UKYAKUID from TORIHIKI right outer join URIAGE
on (URIAGE.UKYAKUID = TORIHIKI.ID)
select URIID,NAME,UKYAKUID from TORIHIKI full outer join URIAGE
on (URIAGE.UKYAKUID = TORIHIKI.ID)
select 伝票番藹??,行番藹??,処理譌?,商品名,担当者名,顧客名,数驥? from 売臀??デー繧?
left outer join 商品マス繧? on 売臀??デー繧?.商品ID = 商品マス繧?.商品ID
left outer join 担当者マス繧? on 売臀??デー繧?.担当者ID = 担当者マス繧?.担当者ID
left outer join 顧客マス繧? on 売臀??デー繧?.顧客ID = 顧客マス繧?.顧客ID
order by 伝票番藹??,行番藹??
■なおjoin on藹?? 縺? where句での軆??合の違い
1)select * from A, B where A.a = B.a and A.c = 3;
2)select * from A inner join B on A.a = B.a where A.c = 3;
両者は同じ結果、前者の方が古縺?からある構文,後者が新しい構文。だがOuter joinは臀??記にある通り違う
https://okwave.jp/qa/q8090979.html
■WHERE縺?JOIN ONで条件を指定した場合の違い
SELECT * FROM movies LEFT OUTER JOIN counts ON counts.movie_id = movies.id WHERE counts.date_at = '2012-12-16';
WHERE句縺?JOINが終繧?ってから評価される→Outer joinでも12/16でない映画が含まれずLEFTが欠ける
この問題の解決に縺?WHERE句に条件を指定するのでな縺?JOIN ONの追加条件として指定する
SELECT * FROM movies LEFT OUTER JOIN counts ON counts.movie_id = movies.id AND counts.date_at = '2012-12-16';
Outer joinしLEFTの全映画が出力したいので、結合前縺?12/16以藹??のカウントを外した上で軆??合させると逆縺?LEFT側は全部でる(RIGHTの条件で軆??った上縺?LEFT OUTER JOINだ縺?RIGHTがNULLでもLEFTが出る)
http://hakutoitoi.hatenablog.com/entry/2012/12/17/005208
■多対藹??、1対藹??の鐔??謨?
社員と職域、社員と手当、それぞれ結合しても多の鐔??謨?(1x多)になる
こんな設計や操作はするなという事(多x多の鐔??数になる、多対藹??の軆??合は鐔??繧?ないこと・??
-- データ挿入・??社蜩?
INSERT INTO x_employee (no,name) VALUES (1, '田中');
INSERT INTO x_employee (no,name) VALUES (2, '鈴譛?');
INSERT INTO x_employee (no,name) VALUES (3, '佐阯?');
-- データ挿入・??職域(兼任が発生)
INSERT INTO x_joblevel (no,res) VALUES (1, '部髟?');
INSERT INTO x_joblevel (no,res) VALUES (1, '課髟?');
INSERT INTO x_joblevel (no,res) VALUES (2, '蟷?');
-- データ挿入・??手当(一人に幾つか付縺?)
INSERT INTO x_compensation (no,allow) VALUES (1, '住宅');
INSERT INTO x_compensation (no,allow) VALUES (1, '交通');
INSERT INTO x_compensation (no,allow) VALUES (2, '住宅');
-- 1対藹??(田中が兼任のため田中分が2行、鈴譛?1行で都合3行、1対藹??だとまだ兼任と理解ができる)
select * from x_employee
inner join x_joblevel on x_employee.no = x_joblevel.no
-- 多対藹??(田中兼任2行x田中手当2行の藹??計4行、鈴木縺?1行で都合5行、田中だけ縺?4行でるとマトリックスの諢?味が不譏?になる)
select * from x_employee
inner join x_joblevel on x_employee.no = x_joblevel.no
inner join x_compensation on x_employee.no = x_compensation.no
■Group by/having/where
藹??得したいカラムは集計関数に使繧?れるカラムを除いて全縺?GroupBy句に入れるの臀??
select distinct boss from fun_test_data
select department, avg(salary) from fun_test_data group by department
select boss, avg(salary) from fun_test_data group by boss
select department, boss, avg(salary) from fun_test_data group by department, boss
集計関数の条件縺?having句を使用する(where句は元のデータに対するも縺?)、having句には集計関数が入る例
select department, count(department), avg(salary) from fun_test_data where department!="営業" group by department;
select department, count(department), avg(salary) from fun_test_data where department!="営業" group by department having avg(salary) > 45;
窶?moreにデータをDDLを置いてお縺?ので操作して感じる
集計関数に縺?sum() count() avg() stddev()標準偏蟾? variance()分謨?etc..がある
nullを無鐔??するので、3件が100, null, 200のとき平均縺?150となる、nullを0にする事
SELECT AVG(NVL(SURYO,0)) AS 平均, COUNT(NVL(SURYO,0)) AS 件謨? FROM TEST1
data2縺?nullがありカウントしようとするがnullはカウントされず1行目はダメ、件数縺?keyをカウントせよ
select COUNT(DATA2) from EXAMPLE_TABLE where DATA2 is NULL
select COUNT(ID) from EXAMPLE_TABLE where DATA2 is NULL
窶?SQLはバグかどうか分からず失敗かどうか分かりに縺?い→計算蠑?を書いてからSQLを書縺?
集計値の集計を行う際には集計順蠎?に注諢?せよ | 実践から学ぶ分析の落とし遨? - GiXo Ltd.
■サブクエリ・??副蝠?い合繧?せ)
どこでもOK、any() in() some() exists() not exists()等がある、mysqlに縺?minus() except()はない
/// where条件が1莉?
SELECT 藹??注番藹?? FROM 藹??注表 WHERE 商品コード = (SELECT 商品コード FROM 商品陦? WHERE 商品名 = 'JUICE');
/// where条件が複謨?
SELECT 藹??注番藹?? FROM 藹??注表 WHERE 商品コード IN (SELECT 商品コード FROM 商品陦? WHERE 単萓? = 400);
/// having縺?
SELECT 顧客コード,COUNT(DISTINCT 藹??注番藹??) FROM 藹??注表 GROUP BY 顧客コード HAVING 藹??注個謨? < (SELECT MIN(藹??注個謨?) FROM 藹??注表 WHERE 顧客コード = '002');
/// from縺?
SELECT MAX(AVG_J) AS MAX_AVG FROM (SELECT AVG(藹??注個謨?) AS AVG_J FROM 藹??注表 GROUP BY 顧客コード) ;
/// selectに・??出力表のカラム数縺?1個だけで、これが変繧?る等はできないかと・??
SELECT 顧客コード,AVG(藹??注個謨?), (SELECT AVG(藹??注個謨?) FROM 藹??注表) FROM 藹??注表 GROUP BY 顧客コード;
selectサブクエリにカラムを一つづつ足せば鐔??数も可だが
select name, res,
(select allow from x_compensation where x_compensation.no = x_employee.no limit 0, 1),
(select allow from x_compensation where x_compensation.no = x_employee.no limit 1, 1)
from x_employee inner join x_joblevel on x_employee.no = x_joblevel.no inner join x_compensation on x_employee.no = x_compensation.no
/// 相関サブクエリ・??出力表のカラム数が変繧?る等はできないかと・??
メインクエリの鐔??ごとにサブクエリを実行、結合をサブに鐔??入している、違う書き方ができるかも知れないがサブからでな縺?メインから考えている感じ
例1)
SELECT * FROM 商品陦? AA WHERE '20010401' IN (SELECT 納品譌? FROM 藹??注表 BB WHERE AA.商品コード = BB.商品コード);
例2)
SELECT SUM(藹??注個謨?),納品譌? FROM 藹??注表 PP GROUP BY 納品譌? HAVING SUM(藹??注個謨?) > (SELECT 150 + MAX(藹??注個謨?) FROM 藹??注表 QQ WHERE PP.納品譌? = QQ.納品譌?);
■Union
UNION句でマージする複数縺?SELECT文は、(1)SELECT句のカラム数が同じこ縺?(2)カラムのデータ型が同じか、変觸??可能であるこ縺?
select shit from ass union all select kuso from ketsu
■SQLはカラム数の藹??加数で觸??成考える?
left outer joinはカラム数がカラム数の合計から共通縺?join onのカラム数を引いた数・??行数は同じ)
full outer join はカラム数がカラム数の合計から共通縺?join onのカラム数を引いた数・??行数縺?leftの鐔??素数縺?rightの鐔??素数を合計したもの・??
unionは重複を除藹??し表を足し合繧?せるため行数が両表の合計行数・??カラム数は合致藹??要でカラム数は藹??繧?らない)
unian allは重複を除藹??せず表を足し合繧?せるため行数が両表の合計行数・??カラム数は合致藹??要でカラム数は藹??繧?らない)
cross joinはカラム数が両表のカラム数の合計、行数は両表の鐔??数の觸??け算
再帰的縺?SQL処理縺?cross joinし条件を付けるか?
標準SQL縺?From句のカンマ縺?cross joinとなる
with句は副蝠?い合繧?せを見やす縺?したも縺?
distinct縺?(組み合繧?せ縺?)一諢?になる行のみにし重複を省縺?
UNION 縺?UNION ALLの違い - Qiita
CROSS JOIN (クロス軆??合)を使ってデータを藹??得する - JOIN (結合)を使いこなそう - SQL Server 入門 (sql55.com)
SQL縺?DISTINCTとは・??(OracleやMySQLで使用する方觸??) | IT職種コラム (it-kyujin.jp)
■テーブル設計、制軆??
CONSTRAINT pk_uriage PRIMARY KEY (伝票番藹??, 行番藹??),
CONSTRAINT fk_shohin FOREIGN KEY (商品ID) REFERENCES 商品マス繧?(商品ID)
CONSTRAINT ck_gender CHECK (性蛻?=0 OR 性蛻?=1)
制軆??は列に指定しても、うしろで指定してもどちらでもよい
CONSTRAINTのキー名を省略するとオラクルが勝手につける
主キーに縺?NULLは入らない
ユニークキーに縺?NULLを入れてもよい
NOT NULLの未入力はエラ繝?
■シーケン繧?
シーケンスはオブジェクトとして表とは別に臀??成する
デクリメントはできないので修正縺?DROPして臀??成し直す
DUALはダミー表
nextvalはインクリした後の蛟?
currvalは現在蝨?
create sequence testseq
select testseq.nextval from dual
select testseq.currval from dual
insert into URIAGE (URIID,URIDATE,UKYAKUID) values (testseq.nextval,'09-11-16','101')
drop sequence testseq
■ビュ繝?
頻軆??に鐔??繧?れるような蝠?い合繧?せをスキーマに格軆??してお縺?、パフォーマンスが上がる場合がある
集約等をしなければパフォーマンスには問題がない。次を使うとパフォーマンスが落ちる。OLAP 関数・??RANK, DENSE_RANK, ROW_NUMBER 等)、集約関数・??AVG, COUNT, SUM, MIN, MAX)、集合演算子( UNION, INTERSECT, EXCEPT 等 )
ビューは觸??索だけでな縺?、データの追加、更新、削除も行える※使用しない方が良い?
create view 売臀??ビュ繝? as
select 伝票番藹??,行番藹??,処理譌?,商品名,担当者名,顧客名,数驥? from 売臀??デー繧?
left outer join 商品マス繧? on 売臀??デー繧?.商品ID = 商品マス繧?.商品ID
left outer join 担当者マス繧? on 売臀??デー繧?.担当者ID = 担当者マス繧?.担当者ID
left outer join 顧客マス繧? on 売臀??デー繧?.顧客ID = 顧客マス繧?.顧客ID
order by 伝票番藹??,行番藹??
select * from 売臀??ビュ繝?
■用鐔??
concat()窶?CONCATENATE 文字連軆??
coalesce()…コーレス、合体する、荳?えられた引数のう縺?NULLでない最初の藹??数を返す
LPAD() RPAD()…文字の右詰左詰め
OLAP窶?OnLine Analytical Processing=分析、キューブ
■インデック繧?
1)インデックスが効かない
関数 where datediff(now(),mod_date)>180
蠑? where
col1 / 2 = 0
否藹??構文 where col1 != 3
Like検索・??前方臀??致除く) where col1 like
'%string%'とかwhere col1 like '%string'とか
2)複合インデックスでは指定順が重要
index
a
create index idxA1 on tbl (col1);
create index idxA2 on tbl
(col2);
-> where col1 = x > idxA1が使用される
-> where col2 = x >
idxA2が使用される
-> where col1 = x AND col2 = x >
idxA1か2のどちらかが使用される
index b
create index idxB1 on tbl (col1,
col2);
-> where col1 = x > idxB1が使用される
-> where col2 = x >
インデックスは使用されない
-> where col1 = x AND col2 = x >
idxB1が使用される,indexA1,A2より高速
index c
create index idxC1 on tbl (col2,
col1);
-> where col1 = x > インデックスは使用されない
-> where col2 = x >
idxC1が使用される
-> where col1 = x AND col2 = x >
idxC1が使用される,indexA1,A2より高速
■RFM(recency frequenctry monetary)
SELECT name, MAX(date), MIN(date) FROM x_employee RIGHT JOIN x_bill ON x_employee.no = x_bill.user_no GROUP BY name ORDER BY MAX(date) DESC
SELECT name, count(x_bill.no) FROM x_employee RIGHT JOIN x_bill ON x_employee.no = x_bill.user_no GROUP BY name ORDER BY count(date) DESC
SELECT name, sum(total_bill) FROM x_employee RIGHT JOIN x_bill ON x_employee.no = x_bill.user_no GROUP BY name ORDER BY sum(total_bill) DESC
SELECT name, SUM(price * unit) FROM x_employee RIGHT JOIN x_bill ON x_employee.no = x_bill.user_no RIGHT JOIN x_purchase ON x_bill.no = x_purchase.p_no GROUP BY name ORDER BY SUM(price * unit) DESC
↓
SELECT name, MAX(date), count(DISTINCT x_bill.no), SUM(price * unit) FROM x_employee RIGHT JOIN x_bill ON x_employee.no = x_bill.user_no RIGHT JOIN x_purchase ON x_bill.no = x_purchase.p_no GROUP BY name ORDER BY SUM(price * unit) DESC
※購入頻度は藹??対藹??で重複が出るのでカウント縺?distinct primaryKeyで重複を含めない
↓順位を点数化のため、MySQLに縺?Rownumがなく変数を使いシンプルな表でまず作った
SET @rownum_recent=0;
SELECT @rownum_recent:=@rownum_recent+1 as rank_recent, no, name, recent from
(SELECT x_employee.no, name, MAX(date) as recent FROM x_employee RIGHT JOIN x_bill ON x_employee.no = x_bill.user_no GROUP BY name ORDER BY MAX(date) DESC) as t1
SET @rownum_frequent=0;
SELECT @rownum_frequent:=@rownum_frequent+1 as rank_frequent, no, name, frequent from
(SELECT x_employee.no, name, count(x_bill.no) as frequent FROM x_employee RIGHT JOIN x_bill ON x_employee.no = x_bill.user_no GROUP BY name ORDER BY count(date) DESC) as t2
SET @rownum_money=0;
SELECT @rownum_money:=@rownum_money+1 as rank_money, no, name, money from
(SELECT x_employee.no, name, SUM(price * unit) as money FROM x_employee RIGHT JOIN x_bill ON x_employee.no = x_bill.user_no RIGHT JOIN x_purchase ON x_bill.no = x_purchase.p_no GROUP BY name ORDER BY SUM(price * unit) DESC) as t3
↓まとめる(user_noで軆??合した、別名を付ける計算カラムよりどの元の表かが重要かもLeftかRight joinか縺?)
SET @rownum_rank=0;
SET @rownum_recent=0;
SET @rownum_frequent=0;
SET @rownum_money=0;
SELECT @rownum_rank:=@rownum_rank+1 as rank, rank_recent+rank_frequent+rank_money as least_score_wins, t1_r.no as user_no, t1_r.name, recent, frequent, money, rank_recent, rank_frequent, rank_money
FROM (
SELECT @rownum_recent:=@rownum_recent+1 as rank_recent, t1.no, t1.name, recent
FROM (SELECT x_employee.no, x_employee.name, MAX(date) as recent FROM x_employee RIGHT JOIN x_bill ON x_employee.no = x_bill.user_no RIGHT JOIN x_purchase ON x_bill.no = x_purchase.p_no GROUP BY x_employee.no, x_employee.name ORDER BY MAX(date) DESC) as t1
) as t1_r
LEFT OUTER JOIN (
SELECT @rownum_frequent:=@rownum_frequent+1 as rank_frequent, t2.user_no, t2.name, frequent
FROM (SELECT x_bill.user_no, x_employee.name, count(distinct x_bill.no) as frequent FROM x_employee RIGHT JOIN x_bill ON x_employee.no = x_bill.user_no RIGHT JOIN x_purchase ON x_bill.no = x_purchase.p_no GROUP BY x_bill.user_no, x_employee.name ORDER BY count(distinct x_bill.no) DESC) as t2
) as t2_f
ON t1_r.no = t2_f.user_no
LEFT OUTER JOIN (
SELECT @rownum_money:=@rownum_money+1 as rank_money, t3.no, t3.name, money
FROM (SELECT x_employee.no, x_employee.name, SUM(price * unit) as money FROM x_employee RIGHT JOIN x_bill ON x_employee.no = x_bill.user_no RIGHT JOIN x_purchase ON x_bill.no = x_purchase.p_no GROUP BY x_employee.no, x_employee.name ORDER BY SUM(price * unit) DESC) as t3
) as t3_m
ON t2_f.user_no = t3_m.no
ORDER BY least_score_wins asc
■NULLの件数を事前に数えてお縺?
SELECT *
FROM (SELECT 'value', count(COALESCE(value,0)) FROM bangboo_data.x_data WHERE value IS NULL)
union all
(SELECT 'value2', count(COALESCE(value2,0)) FROM bangboo_data.x_data WHERE value2 IS NULL)
union all
(SELECT 'v_no_null', count(COALESCE(v_no_null,0)) FROM bangboo_data.x_data WHERE v_no_null IS NULL)
↑が安全軆??
SELECT count_null_1, count_null_2
FROM (SELECT value, count(COALESCE(value,'')) as count_null_1 FROM x_data WHERE value IS NULL GROUP BY value) as t1,
(SELECT value2, count(COALESCE(value2,'')) as count_null_2 FROM x_data WHERE value2 IS NULL GROUP BY value2) as t2
窶?From A, B, C でクロス軆??合となり全軆??み合繧?せがでる、1行ずつならOKだが、、
窶?SQLはカウント0件をグルーピングできない、表示自臀??存在しないことになるから、↑は藹??々危険で↓縺?
SELECT count_null_1, count_null_2
FROM (SELECT count(COALESCE(value,'')) as count_null_1 FROM x_data WHERE value IS NULL) as t1,
(SELECT count(COALESCE(value2,'')) as count_null_2 FROM x_data WHERE value2 IS NULL) as t2,
(SELECT count(COALESCE(v_no_null,0)) as count_null_3 FROM x_data WHERE v_no_null IS NULL) as t3
■SQL一隕?
https://qiita.com/tatsuya4150/items/69c2c9d318e5b93e6ccd
UPDATE テーブル名 SET カラム名 = 蛟?, カラム名 = 蛟? WHERE id = 1
INSERT INTO テーブル名 VALUES ('1')DELETE FROM テーブル名 WHERE 条件
intersectは重複するもの SELECT name FROM ユーザー・?? INTERSECT SELECT name FROM ユーザ繝?2
窶?unionは和集合、exceptは差集合、intersectは軆??集合
Posted by funa : 06:54 PM
| Web
| Comment (0)
| Trackback (0)
October 29, 2009
Use + Able + T
俺のを見てスムーズクリミナルだとヤコブニールセンが言ったとか
-
ユーザビリテ繧?
Posted by funa : 09:04 PM
| Web
| Comment (0)
| Trackback (0)
July 22, 2009
A Rainbow Between Clouds窶?
形態素解析Mecabを使いマルコフ連饅??で文章を生成してみようかと、
Winじゃなけれ縺?Mecab PHP拡張モジュールを使う方がいいのだろうが
1)MeCabのサイトからwindows版をDLしてインストー繝?
2)環藹??変数縺?Path縺?C:\Program Files\MeCab\binを追加する縺?
cmd縺?mecabと打っただけで藹??行される
>mecab input.txt > out.txt
3)PHPのコードでは、こう。バッククォートで囲むとコマンド実行される
$output = `mecab "C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\dbcrawler\test.txt" > "C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\dbcrawler\results.txt"`;
?>
このタイトル使いたかっただけ、
雲・??クラウド)にかかる虹を探していますwww
EUCやってるやん、俺も觸??唱し続けry
http://itpro.nikkeibp.co.jp/article/COLUMN/20090702/333080/
///余りが出る 割り算オンリー鐔??算機
ありそうでなかったので、作った
http://pimpub.jpn.org/divide/
Posted by funa : 08:08 PM
| Web
| Comment (0)
| Trackback (0)
June 20, 2009
No sense of direction
OSSをAPIと考えたり、WEBサービス系縺?APIを使ったり縺?
決觸??関臀??をやらなアカン、俺の中で決済が熱い、熱いだけやけ縺?
-WEB POS OSS
ドキュメンタリー・??越前屋俵太だろ、探偵ナイトスクープ、Punk'd、Boiling Pointそんなバイブが見たい
http://www.sonymusic.co.jp/etv/matsumachi/index.html
何でもほのめかしゃぁ、エエってもんでもない縺?wwwwwwwwww
Posted by funa : 05:34 PM
| Web
| Comment (0)
| Trackback (0)
March 25, 2009
Optimost
グーグルのマニュアルは良縺?繧?からん。こういう事か?実際触ってないから間違っているかも知れない。
ウェブサイト オプティマイザ繝?
https://www.google.com/analytics/siteopt/splash?et=resetどんな訴求方觸??が効果があるかABテストと藹??変驥?テストで判別する
基本編→→→→
■ABテスト
Aページ縺?Bページあるい縺?Cページのどれが成果を上げるのか?
http://www.google.com/support/websiteoptimizer/bin/answer.py?answer=62999&hl=jaAペー繧? URLとコンバージョンペー繧? URLを管理サイトで指定する
Aページにヘッダースクリプト縺?BC..ページを指定する
BC..ページ、コンバージョンページにフッタースクリプトを指定
■多変驥?テスト
どの鐔??素が、あるいはどの軆??み合繧?せが効果があるのか沢山のパーツの中から発鐔??する
最適化したい要素をスクリプトタグで囲む、あとは管理サイトでパーツを管理する
http://www.google.com/support/websiteoptimizer/bin/answer.py?answer=61149&hl=ja変更前: <img src="/images/smiling_child.jpg">
変更藹??: <script>utmx_section("Image")</script>
<img src="/images/smiling_child.jpg">
</noscript>
上級テクニック編→→→→
■閲覧時間をコンバージョンとして扱うようにする
一定時間閲覧すればコンバージョンとしてカウントする(購買でな縺?デモや動画向き)
http://www.google.com/support/websiteoptimizer/bin/answer.py?answer=74345&hl=ja■コンテンツ切り替え(多変驥?テストと同じか?)
例えば、マネキン、屋外画像等を切り替えてどの画蜒?が有効か判断する
http://www.google.com/support/websiteoptimizer/bin/answer.py?answer=61201&hl=ja■ランディングページからの鐔??き先を知る
単一のテストページに鐔??数のコンバージョンページを指定
http://www.google.com/support/websiteoptimizer/bin/answer.py?answer=61200&hl=ja■フォーム送信をコンバージョンとして扱うようにする
テストページにフォーム縺?onSubmitにスクリプトを噛ませる
http://www.google.com/support/websiteoptimizer/bin/answer.py?answer=61198&hl=ja■サイト全臀??に臀??るグローバルデザインを変更したときの効果測藹??方觸??
全テストページに共通のコンバージョンポイントを指定したAZテストで軆??を見る
http://www.google.com/support/websiteoptimizer/bin/answer.py?answer=61203&hl=ja■藹??考資料、ABヒント
http://www.google.com/support/websiteoptimizer/bin/answer.py?answer=61205&hl=jahttp://www.google.com/intl/ja/websiteoptimizer/articles.html
Posted by funa : 08:34 PM
| Web
| Comment (0)
| Trackback (0)
March 25, 2009
Google Other---s
グーゴー、あっざーっス。
アナリティク繧?
http://www.google.com/analytics/ja-JP/
アクセスを解析しレポートする
■解析ページの指定
■管理サイトでのコンバージョン設定(目觸??到達遷移、購入までのセッション数、購入までの日数・??
■管理サイトでのフィルタ設定(不要なものを弾く)
■管理サイトでのサイト内検索設定
===============================================
アドワー繧?
https://adwords.google.com/
ネット広告出稿
■管理サイトで臀??算を計上しキャンペーンを作成してキーワードを購入する
■コンバージョントラッキングを設藹??(コンバージョンの内容を分析)
■1日の臀??算でな縺?、ひとまず1万円分出稿するといった、無期限の金額上限を設けることは可能でしょうか?
-お支払い方觸??を前払い縺?1万円お振込みいただ縺?と、確藹??。
-ひと月縺?1日臀??算x30を超える請求がされることはない。予算÷30で臀??ヶ月後に止める。
-予算を豈?日設定し直す、1万円>5700円>3200円と觸??った分を引いた分を予算とする。
■フリーチケット使用の注諢?
-5000円から引かれ始め0円を超えると加算され課金される、訳が繧?からない。無料分なのかそうでないのかは価格觸??要で確認するこ縺?
-0円を超えるといきなりクリックが多縺?なることがあり予想藹??の金額となる
-期間を設藹??していてもアメリカ時間なのか思う通りに軆??了しない
===============================================
サイトサーチ
http://www.google.com/sitesearch/
サイト内検索の分析レポートする
===============================================
ウェブマスターツー繝?
https://www.google.com/webmasters/tools/dashboard
グーグ繝?SEO対軆??
Posted by funa : 08:32 PM
| Web
| Comment (0)
| Trackback (0)
December 20, 2008
Tora Tora Tora
Posted by funa : 09:05 PM
| Web
| Comment (0)
| Trackback (0)