工具邦 / MySQLの構文チェック
MySQL において date_format 関数を使えば日付のこまかいフォーマットを指定することができるが、専用の関数や extraxt 関数を使ったほうが後日、マニュアルを調べる手間が減る。 select now(); # 2012-07-08 10:11:12 select curdate(); # 2012-07-08 select curtime(); # 09:10:11 select year(now()); # 2012 select month(now()); # 7 select day(now()); # 8 select time(now()); # 09:10:11 select hour(now()); # 9 select minute(now()): # 10 select second(now()); # 11 select extract(year fr
問題 こんなテーブル a があります。 create table a (id int, flag int); こんなふうにデータを入れて、 insert into a (id, flag) values (1, 1), (2, 1), (3, 0), (4, 0), (5, 1); こんなふうになっているとします。 select * from a; +----+------+ | id | flag | +----+------+ | 1 | 1 | | 2 | 1 | | 3 | 0 | | 4 | 0 | | 5 | 1 | +----+------+ なるべく単純な1つのSQLで、すべてのレコード数と、flag=1のレコード数と、flag=0のレコード数を取得せよ。 なお、サブクエリは使わないこと。 ヒント 集計を3つしたいので、こうなる? select count(????), c
UNION は複数の SELECT 文によってデータをそれぞれ取得し、その結果を結合した上で1つのデータとして取得する場合に使います。書式は次の通りです。 SELECT col_name1, ... FROM table_name1 UNION [ALL | DISTINCT] SELECT col_name2, ... FROM table_name2 [UNION [ALL | DISTINCT] ...] 最初の SELECT 文で取得したデータに、次の UNION のあとの SELECT 文で取得したデータを結合して取得します。 3 つ以上のテーブルを結合したい場合は UNION 以下をテーブルの数だけ記述してください。 取得したデータのカラム名は最初の SELECT 文のあとに記載されたカラム名となります。それぞれの SELECT 文で取得するデータのカラムの数は同じである必要が
REPLACE文について unknown REPLACE文は、INSERT文とUPDATE文を合体させたようなものです。 挿入するデータが既にテーブルに存在する場合は、新しくレコードを挿入せず、既存のレコードを新しいデータで上書き(置換)します。(UPDATE文と同じ) 逆に、挿入するデータがテーブルに存在しない場合は、新規レコードを挿入します(INSERT文と同じ)。 またREPLACE文は、INSERT文同様、SELECT文の結果を挿入することが可能です。 INSERT INTO テーブル名(フィールド名) VALUES (値) SELECT 文; REPLACE INTO テーブル名(フィールド名) VALUES (値) SELECT 文; # MySQLログイン、データベース選択 C:\mysql\bin> mysql -u root -p db_User Enter Enter
テーブルの中のカラムにプライマリーキー制約やユニーク制約が設定されている場合に、データを追加すると制約違反となる場合があります。このような場合通常はエラーとなりますが、エラーを発生させる代わりに既存のデータを指定の値で上書きすることができます。 次の書式を使います。 INSERT INTO tbl_name (col_name1, col_name2, ...) VALUES (value1, value2, ...) ON DUPLICATE KEY UPDATE col_name_x=value_x, col_name_y=value_y, ...; ユニーク制約などで違反するデータを追加しようとした時に、データを新規に追加するかわりに既存のデータの指定のカラムの値を更新するということです。この時、更新するカラムは複数指定できますが、エラーの元となるユニーク制約などが設定されたカラムの
読みは「ハイジエスキューエル」でいいのだろうか クララが立ったー!とは関係があるのかはわかりませんが、このHeidiSQLは大変高機能で重宝してます。仕事で何かといじることの多いRDBMSがMySQLなんですが、いくらCUIは好きとはいえ効率的な作業がしづらいため、やはりこういった類のソフトは必須です。 今までもCSEとかMySQL Workbenchとかも使ったのですが、いまいちしっくりこなかったので色々探していたところMOONGIFTさんのこの記事で見かけてからずっと使っています。使い始めのころはバグとか対応してないこととかも結構あったのですが、現在自分が使う分にはほとんど問題ないです。現在の安定版は5.1で、Nightly Buildsが結構早い頻度で出ているので実行ファイルを上書きするとより最新版です。(※執筆時の最新はRev.3548)アプリケーション上からもアップデートできます
魔境のコード解析してた Django 側では models.CharField で 255 まではいるようにしたフィールドをたくさん用意しておいて、それを適宜 int や string や boolean や datetime で擬似的に処理をするというちょっと複雑なフィールドがあるのだけど(まあちょっと慣れたらそういうシステムはありそうだが)、そこで不正なデータ(boolean でいれるべきフィールドに文字列をいれている)であることはわかっていたが、しかしなぜこのエラーがでるかわからなかった。エラーの意味自体は「このカラムにはいりきらないから切り詰めていれておいたよ」というものだけど、それが Django 側ではエラーとして落としてしまっているようだった。 結局これは2段階のフィールド設計になっていて、「一時的に登録するフィールド→正式に登録するフィールド」というのが用意してあった。その
区分値(もしくはON/OFFのフラグ)のカラムがあるとして、それぞれの区分値のレコード数をカウントしたものを、1度のSQLで同時に取得したい。 これを満たそうとして、ひどいSQLを書いてしまっていたことがテスト段階にて発覚。 サンプル ページ情報のテーブルと、アクセスログのテーブル 2つのテーブルから、各ページの月別アクセス数を求める ただし、PCと携帯のアクセスは別々に集計する こんな仕様とします。(※試したDBはPostgreSQL 8.3.7) 間違ったSQL select t1.page_id, coalesce(t2.count, 0) as pc_access_count, coalesce(t3.count, 0) as mobile_access_count, coalesce(t2.count, 0) + coalesce(t3.count, 0) as access_c
こんな感じで ~~~ mysql> ALTER TABLE table_name drop INDEX idx_id; Cannot drop index ‘idx_id’: needed in a foreign key constraint ~~~ と出てしまい、indexが削除出来ません。 どうやら外部キーが影響しているみたいです 外部キーの確認 ~~~ mysql> SHOW CREATE TABLE table_name; —- 省略 —- CONSTRAINT `table_name_ibfk_1` FOREIGN KEY (`id`) REFERENCES `foreign_table` (`id`) ON DELETE CASCADE ON UPDATE CASCADE —- 省略 —- ~~~ 多分こいつが原因ですね あとで戻さなきゃ行けないのでコピっておきます 外部キー
これから3回連載の予定で、SQL識別子のエスケープの問題について記事を書きます。SQL識別子のエスケープについてはあまり解説記事などがなく、エンジニア間で十分な合意がないような気がしますので、これらの記事が議論のきっかけになれば幸いです。 3回の予定は以下のとおりです。 間違いだらけのSQL識別子エスケープ(本稿) SQL識別子エスケープのバグの事例 SQL識別子は結局どうすればよいか ということで、まずはSQL識別子のエスケープの失敗例について説明します。この失敗例はあくまで説明のために作ったもので、実際のものではありません。また、想定が「ありえない」と思われるかもしれませんが、意図的なものですのでご容赦いただければと思います。また、「間違いだらけの」というタイトルは、今回の題材が間違いだらけという意味であり、巷のSQL呼び出しがそうであるという意味ではありません。本稿に登場する人物と団
こんばんは。 DBはめっきりPOSTGRESQLしか触れなくなったnobuです。 僕は初心者プログラマなので、 データベースに関しては基本的なSQLしか扱えません。 (というか、PHPで色々できるので基本的なSQLだけで大丈夫なことが多い( ´_ゝ`)ノ) 今回はそんなペーペープログラマが、フツーのプログラマにとっては見るのも恥ずかしい(かもしれない)話をします。 select文でのパディングの話です。 ワード・エクセル・パワーポイント・アクセス・WEBプログラミングを動画で楽々マスター!動画パソコン教室!【楽ぱそDVDプレミアム】オフィス2010 パディングというのは何かの文字でデータを埋めることです。 たとえば「123」というのを5桁のゼロパディングにして 「00123」みたいな。 数字は処理として扱いやすいですが、データとして見せる場合にパディングをしたい場合があります。 たとえばフ
忘れるのでメモ MySQL 5.1で確認した。 外部キー制約の確認 SHOW CREATE TABLE テーブル名; show create table bbs_thread; 外部キー制約の追加 ALTER TABLE テーブル名 ADD FOREIGN KEY (制約を張りたいカラム) REFERENCES 張りたいテーブル(張りたいカラム); alter table bbs_thread add foreign key (creator_id) references accounts_user(id); 外部キー制約の削除 ALTER TABLE テーブル名 DROP FOREIGN KEY 制約名; ALTER TABLE bbs_thread drop foreign key creator_id_refs_id_75448b6c;
複数の候補(値)の、どれかが当てはまる場合にデータを表示したい場合にIN演算子を 使用します。 候補(値)の数に特に制限はありません。値ごとに「カンマ」で区切ります。 構文 SELECT 列名 FROM テーブル名 WHERE 列名 IN(値1,値2); user表から「sasuke」、又は「ziro」の人を表示した例です。 mysql> SELECT * FROM user WHERE name IN('sasuke','ziro'); +--------+--------+ | name | pass | +--------+--------+ | sasuke | pass33 | | ziro | pass22 | +--------+--------+ 2 rows in set (0.02 sec) 以下の例は、上記と結果は同じですが、ORを使用した場合の例です。 2個程度でし
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く