$time_start = microtime(true); $dsn = "mysql:dbname=equity;host=localhost"; $user = "hoge"; $password = "hogehoge"; try { $dbh = new PDO($dsn, $user, $password); } catch (PDOException $e){ print('connection failed:'.$e->getMessage()); } $code= '2338'; $sql = "create table equity.code".$code."( id int unsigned auto_increment primary key, date int, close int )ENGINE = MYISAM;"; $stmt = $dbh->query($sql); $time = microtime(true) - $time_start; echo "{$time}秒";
Category: sqlite / MySql / psql
mysql 重複を除いた値の一覧抽出
以下で取得可能です。
SELECT DISTINCT colname FROM tablename;
mysql> select distinct sector from lists;
+————————–+
| sector |
+————————–+
| 水産・農林業 |
| 卸売業 |
| 建設業 |
| 非鉄金属 |
| 鉱業 |
| 機械 |
| サービス業 |
| 金属製品 |
| 情報・通信 |
| 食料品 |
| 医薬品 |
| 不動産業 |
| 陸運業 |
| その他金融業 |
| 小売業 |
| その他製品 |
| 繊維製品 |
| 電気機器 |
| ガラス・土石製品 |
| 証券業 |
| 輸送用機器 |
| REIT銘柄一覧 |
| 石油・石炭製品 |
| 化学 |
| パルプ・紙 |
| 精密機器 |
| ゴム製品 |
| 鉄鋼 |
| 銀行業 |
| 保険業 |
| 倉庫・運輸関連業 |
| 海運業 |
| 空運業 |
| 電気・ガス業 |
+————————–+
34 rows in set (0.05 sec)
早く気づけばよかった。
DBから同業種・同じ市場の銘柄を抽出する
select * from table where で条件を記載します。
$code = empty($_GET["code"])? 'null' : $_GET["code"]; $dsn = "mysql:dbname=equity;host=localhost"; $user = "hoge"; $password = "hogehoge"; try { $dbh = new PDO($dsn, $user, $password); } catch (PDOException $e){ print('connection failed:'.$e->getMessage()); } $sql = "select * from lists where code = $code"; $stmt = $dbh->query($sql); $result = $stmt->fetch(PDO::FETCH_ASSOC); $sector = $result['sector']; $market = $result['market']; echo "<b>".$result['name']. "</b>(".$code.") "; echo $result['sector'] ." ".$result['market']. "<br><br>"; echo "同業種の銘柄(".$sector.")"."<br>"; $sql2 = "select * from lists where market = '$market' AND sector = '$sector' and code != $code"; $stmt2 = $dbh->query($sql2); while($result = $stmt2->fetch(PDO::FETCH_ASSOC)){ echo $result["code"]." ".$result["name"]. "<br>"; }
mysqlでuniqueを後から追加
alter table music01 add unique (title);
入ってますね。
既にテーブルの中の値が重複している場合は、一度削除しなければなりません。
また、既にuniqueが設定されている場合は、上書きされて、uniqueが設定されます。
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql テーブル連携
まず、一つ目のテーブルを作くってデータを入れます。
create table cake.base( id int unsigned auto_increment primary key, code int, name varchar(255) ); insert into base(code, name) values ('3689', 'イグニス'), ('4579', 'ラクオリア創薬'), ('3825', 'リミックスポイント');
二つ目のテーブルを作って、こちらにもデータを挿入。
create table cake.data( id int unsigned auto_increment primary key, code int, price int, time datetime default null ); insert into cake.data(code, price, time) values ('3689', '3240', now()), ('3689', '3245', now()), ('3689', '3250', now()), ('3689', '3245', now());
INNER JOINでカラムを指定して結合する
SELECT base.code, base.name, data.price, data.time FROM base INNER JOIN data ON base.code = data.code;
OUTER JOIN
SELECT base.code, base.name, data.price, data.time FROM base LEFT OUTER JOIN data ON base.code = data.code;
dataが入っていないラクオリア創薬、リミックスポイントもselectされます。
更にテーブルを連結する場合も、joinでok
create table cake.market(
id int unsigned auto_increment primary key,
code int,
market varchar(255)
);
insert into market(code, market) values
(‘3689’, ‘マザーズ’),
(‘4579’, ‘ジャスダック’),
(‘3825’, ‘東証二部’);
SELECT base.code, base.name, data.price, data.time, market.market FROM base JOIN market ON base.code = market.code JOIN data ON base.code = data.code;
mysqlで複数のテーブルからselectする
hoge1~3のテーブルから検索しようとする際に、
$sql = "select * from hoge01, hoge02, hoge03";
と書くと、強制終了となりました。
$sql = "select * from hoge01 union select * from hoge02 union select * from hoge03";
こちらなら、問題なく検索されます。
pdoでテーブルのデータを削除する
まず、mysqlにデータを入れます。
mysql> insert into kabuki(name, lat, lng) values('歌舞伎町店', '35.6969674', '139.700469'); Query OK, 1 row affected (0.10 sec) mysql> select * from kabuki; +-----------------+-----------+------------+ | name | lat | lng | +-----------------+-----------+------------+ | 歌舞伎町店 | 35.696967 | 139.700469 | +-----------------+-----------+------------+ 1 row in set (0.05 sec)
pdo exec(‘TRUNCATE TABLE kabuki’)でデータを削除します。
<?php $dsn = "mysql:dbname=map;host=localhost"; $user = "hoge"; $password = "hogehoge"; try { $dbh = new PDO($dsn, $user, $password); } catch (PDOException $e){ print('connection failed:'.$e->getMessage()); } $dbh->exec('TRUNCATE TABLE kabuki'); ?>
削除されてますね。
mysql> select * from kabuki; Empty set (0.10 sec)
地図データを入れる
CREATE TABLE google.markers ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(60) NOT NULL, address VARCHAR(80) NOT NULL, lat FLOAT(10, 6) NOT NULL, lng FLOAT(10, 6) NOT NULL, type VARCHAR(30) NOT NULL ) ENGINE = MYISAM; INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Love.Fish', '580 Darling Street, Rozelle, NSW', '-33.861034', '151.171936', 'restaurant'); INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Young Henrys', '76 Wilford Street, Newtown, NSW', '-33.898113', '151.174469', 'bar'); INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Hunter Gatherer', 'Greenwood Plaza, 36 Blue St, North Sydney NSW', '-33.840282', '151.207474', 'bar'); INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`) VALUES ('The Potting Shed', '7A, 2 Huntley Street, Alexandria, NSW', '-33.910751', '151.194168', 'bar'); INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Nomad', '16 Foster Street, Surry Hills, NSW', '-33.879917', '151.210449', 'bar'); INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Three Blue Ducks', '43 Macpherson Street, Bronte, NSW', '-33.906357', '151.263763', 'restaurant'); INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Single Origin Roasters', '60-64 Reservoir Street, Surry Hills, NSW', '-33.881123', '151.209656', 'restaurant'); INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Red Lantern', '60 Riley Street, Darlinghurst, NSW', '-33.874737', '151.215530', 'restaurant');
where 1 は無条件で全データを抽出という意味。
mysql> select * from markers where 1;
+—-+————————+———————————————–+————+————+————+
| id | name | address | lat | lng | type |
+—-+————————+———————————————–+————+————+————+
| 1 | Love.Fish | 580 Darling Street, Rozelle, NSW | -33.861034 | 151.171936 | restaurant |
| 2 | Young Henrys | 76 Wilford Street, Newtown, NSW | -33.898113 | 151.174469 | bar |
| 3 | Hunter Gatherer | Greenwood Plaza, 36 Blue St, North Sydney NSW | -33.840282 | 151.207474 | bar |
| 4 | The Potting Shed | 7A, 2 Huntley Street, Alexandria, NSW | -33.910751 | 151.194168 | bar |
| 5 | Nomad | 16 Foster Street, Surry Hills, NSW | -33.879917 | 151.210449 | bar |
| 6 | Three Blue Ducks | 43 Macpherson Street, Bronte, NSW | -33.906357 | 151.263763 | restaurant |
| 7 | Single Origin Roasters | 60-64 Reservoir Street, Surry Hills, NSW | -33.881123 | 151.209656 | restaurant |
| 8 | Red Lantern | 60 Riley Street, Darlinghurst, NSW | -33.874737 | 151.215530 | restaurant |
+—-+————————+———————————————–+————+————+————+
8 rows in set (0.00 sec)
mysqlでのfloat
floatは4バイト、Dobuleは8バイト
mysql> CREATE TABLE google.float_test ( -> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -> num FLOAT(10, 2) -> ) ENGINE = MYISAM; Query OK, 0 rows affected (0.02 sec) mysql> INSERT INTO float_test (num) VALUES (1.0), (1.1),(1.11),(1.111); Query OK, 4 rows affected (0.13 sec) Records: 4 Duplicates: 0 Warnings: 0
データを確認
mysql> select * from float_test; +----+------+ | id | num | +----+------+ | 1 | 1.00 | | 2 | 1.10 | | 3 | 1.11 | | 4 | 1.11 | +----+------+ 4 rows in set (0.00 sec)
CREATE TABLE google.float_test ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, num FLOAT(6, 2) ) ENGINE = MYISAM; INSERT INTO float_test (num) VALUES (1.0), (10.1),(100.11),(1000.111); mysql> select * from float_test; +----+---------+ | id | num | +----+---------+ | 1 | 1.00 | | 2 | 10.10 | | 3 | 100.11 | | 4 | 1000.11 | +----+---------+ 4 rows in set (0.00 sec)
どうやらfloat(n.y) のnは全体の桁数、yは小数点以下の桁数ですね。
mysqlでENGINE = MYSAMを指定しない場合
tableを作ります。
CREATE TABLE google.MYISAM ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR (60) NOT NULL ) ENGINE = MYISAM; CREATE TABLE google.NONE_MYISAM ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR (60) NOT NULL );
mysql> show tables; +------------------+ | Tables_in_google | +------------------+ | MYISAM | | NONE_MYISAM | +------------------+ 2 rows in set (0.00 sec)
こちらのコマンドで、ストレージエンジンにMYISAMが使われているか、確認できます。
mysql> SELECT -> TABLE_SCHEMA, -> TABLE_NAME, -> ENGINE -> FROM -> information_schema.TABLES -> WHERE -> TABLE_SCHEMA NOT IN( -> Display all 770 possibilities? (y or n) -> 'information_schema', -> Display all 770 possibilities? (y or n) -> 'performance_schema', -> Display all 770 possibilities? (y or n) -> 'mysql' -> );
以下のように、MYISAMを指定しない場合は、InnoDBのエンジンが使われていますね。
mysql> drop table MYISAM, NONE_MYISAM; Query OK, 0 rows affected (0.01 sec) mysql> show tables; Empty set (0.00 sec)