SQLプログラミング質問スレ

このスレでは
「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
といった質問を受け付けています。

質問するときは使用するDBMSを必ず明記してください。

質問テンプレ


・DBMSとバージョン Oracle 、SQL server 2014、MySQL、PostgreSQL、SQLite、ACCESS、DB2など
・テーブルデータ
・欲しい結果
・説明

SQL(Structured Query Language)とは

SQL(Structured Query Language)はリレーショナルデータベースを操作(テーブルやインデックスの作成、テーブルに格納されたデータの操作)するための言語です。 SQLはISOによって標準化されていますが、標準を100%実装したDBMSは存在しません。 また、DBMSによっては標準でない独自の構文が追加されていることもあります。

SQL言語リファレンス一覧

Oracle Database
Microsoft SQL Server
IBM DB2 Database
PostgreSQL
MySQL

SQL 第2版 ゼロからはじめるデータベース操作 (プログラミング学習シリーズ)
翔泳社 著者:ミック


amazon.co.jpのカスタマーレビューを見る
powered by amalink

[4441] Posted by kagahiro at 2016/09/29 13:33:56
オープン | 7 point | Link (1) | Trackback (2) | Comment (5)

キーワード
SQL 質問 DBMS プログラミング

語句検索のホームページ


SQLプログラミング質問スレ 関連リンク

PHPでMySQLに接続して、SELECTでデータを取得するサンプルプログラム
PHPのプログラムからMySQLに接続し、SELECTでデータを取得する処理のサンプルプログラムです。あらかじめphpMyAdminを使用してMySQLにテータベース「testdb」を作成し、以下のSQLを実行しテーブル「users」を作成、3...

SQLプログラミング質問スレ トラックバック

トラックバックURL :

Linked from 語句ログ : MySQLのUPDATE文でLIMIT句を使用して上位3件のレコードを更新する at 2016/09/30 11:43:16
MySQLでは、UPDATEでLIMIT句とORDER BYを使用して上位n件のレコードを更新することができます。更新前にORDER BYで指定した方法で並べ替えられ(ASCは昇順、DESCは降順、省略した場合は昇順)、LIMIT句で指定した行数...
Linked from 語句ログ : MySQLのINSERT ... SELECT文でLIMIT句を使用して上位3件のレコードをテーブルに追加する at 2016/09/30 15:29:40
MySQLでは、INSERT ... SELECTを使用することで1つまたは複数のテーブルからレコードをテーブルに追加できます。また、SELECTでLIMIT句とORDER BYを使用して上位n件のレコードのみテーブルに追加することもできます。...

SQLプログラミング質問スレへのコメント

1 Posted by 名無しさん at 2016/09/29 23:22:05
よくある質問1

(問)
ID | DATE     | DATA
--+----------+-----
1 | 2007-11-11 | aaa
2 | 2007-11-11 | bbb
1 | 2007-11-10 | ccc
3 | 2007-11-12 | ddd
3 | 2007-11-11 | eee
4 | 2007-11-10 | fff
1 | 2007-11-12 | ggg

このようなテーブルから、下記のように

1 | 2007-11-12 | ggg
3 | 2007-11-12 | ddd
2 | 2007-11-11 | bbb
4 | 2007-11-10 | fff

各idに対して最新の1件だけ抽出するSQLの書き方を教えてください。

(答)
select A.ID,
    A.DATE,
    A.DATA
from TableName A
   inner join
   (select ID, max(DATE) as MAX_DATE
    from TableName
    group by ID
   ) B
   on A.ID = B.ID
   and A.DATE = B.MAX_DATE
;
2 Posted by 名無しさん at 2016/09/29 23:22:23
よくある質問2

(問)
key   data
----------------
1     a
1     a
1     b
1     b
1     a
2     b
2     a
2     a

というテーブルから

key   a   b
--------------------
1    3   2
2    2   1

というExcelのピボットの様なデータを取得したいのですが、どういうSQLになりますか?
a,bというのは固定なので、仮にcというデータがあっても無視して構いません。

(答)
SELECT key,
    SUM(CASE data WHEN 'a' THEN 1 END) AS a,
    SUM(CASE data WHEN 'b' THEN 1 END) AS b
FROM table
GROUP BY key
ORDER BY key
;
3 Posted by 名無しさん at 2016/09/29 23:25:07
よくある質問

(問)
ID HOGE
01 A
01 B
01 C
02 A
03 B

HOGEをAもBもCも持っている、ID:01だけ取り出すにはどうすればよかですか

(答1)
SELECT id
FROM TableName
WHERE hoge in ('A','B','C')
GROUP BY id
HAVING count(DISTINCT hoge) = 3
;

(答2)
select *
from TableName T1
where not exists (select *
         from (values 'A', 'B', 'C') T2 (HOGE)
         where not exists (select *
                  from TableName T3
                  where T1.ID = T3.ID
                  and T2.HOGE = T3.HOGE
                  )
         )
;
※valuesの部分(Table Value Constructor)はDBMSによって文法がかなり違うので注意
4 Posted by 名無しさん at 2016/09/29 23:25:29
よくある質問4

(問)
列の数が可変な問合せはどう書きますか?

(答)
標準SQLでは書けません。
pivotという機能を搭載したDBMSなら一見書けそうですが実はやっぱり書けません。
Oracle 11g以降でpivot xmlというキーワードを使用すれば一応可変っぽくはなります。
が、素直にプロシージャを書くかアプリケーションで処理したほうが良いでしょう。

SQL Serverのpivot(2005以降)
http://msdn.microsoft.com/ja-jp/library/ms177410.aspx

Oracleのpivot(11g以降)
http://download.oracle.com/docs/cd/E16338_01/server.112/b56299/statements_10002.htm#CHDCEJJE
http://www.oracle.com/technetwork/articles/sql/11g-pivot-097235.html
5 Posted by 名無しさん at 2016/09/29 23:25:57
よくある質問5

(問)
年月(YYYYMM)を指定し、その年月に対応する年月日を取得したい

 例:201006を指定したら、以下の結果を得たい

   20100601
   20100602
    ・
    ・
    ・
   20100630

(答)
SQLでは存在しないデータを生成することはできません。
この問いの場合は素直にカレンダーテーブルを用意しましょう。

どうしてもやりたければ以下のような方法もなくはないですが、
再帰問合せの本来の使い方ではありません。
やめておくことを強くお奨めします。
(PostgreSQLのgenerate_series()関数なら辛うじてセーフかもしれませんが
 賛否の分かれるところでしょう。)

with TEMP (NUM) as (
    select 1 from dual
    union all
    select NUM + 1 from TEMP where NUM < 31
)
select to_char(to_date('201006', 'YYYYMM') + NUM - 1, 'YYYYMMDD')
from TEMP
where to_date('201006', 'YYYYMM') + NUM - 1 < add_months(to_date('201006', 'YYYYMM'), 1)
;

※上記はOracleの場合です。(11gR2以降)
※再帰問合せをサポートするDBMSならこれを適当に改変すれば動きますが
 どのみちお奨めしません。

詳細の入力フィールドを表示する

おすすめ  (チェックしてコメントすると最新情報に掲載)
コメント :

< 前のスレッド      次のスレッド >

アクセスランキング

今日のアクセスランキング(上位10件)

  1. PHP、MySQLで動くオープンソース掲示板ソフト (5 PV)
  2. プリンセスガーデンホテル女性社長の「片岡都美」氏はフジモリ元大統領夫人 (3 PV)
  3. YAKUZA Wiki (3 PV)
  4. 2ちゃんねる(2ch)検索 掲示板 - スレタイ、過去ログ、全文検索 (3 PV)
  5. 2ちゃんねる スレッドタイトル検索 (2 PV)
  6. 5ちゃんねる(5ch.net、旧2ちゃんねる)掲示板 (2 PV)
  7. 海江田万里経産相がハイパーレスキュー隊幹部に対して「速やかにやらなければ処分する」と圧力発言 (1 PV)
  8. ログ速(ろぐそく、logsoku) - 過去ログ スレタイ検索 全文検索 (1 PV)
  9. 読売新聞「石井誠」記者変死事件 (1 PV)
  10. ジェイコム男、投資家BNF氏が消息不明 (1 PV)

今月のアクセスランキング(上位10件)

  1. ログ速(ろぐそく、logsoku) - 過去ログ スレタイ検索 全文検索 (85 PV)
  2. PHP、MySQLで動くオープンソース掲示板ソフト (57 PV)
  3. 5ちゃんねる(5ch.net、旧2ちゃんねる)掲示板 (35 PV)
  4. 「坑うつ剤」のヤバさは異常 (23 PV)
  5. プリンセスガーデンホテル女性社長の「片岡都美」氏はフジモリ元大統領夫人 (23 PV)
  6. 2ちゃんねる(2ch)検索 掲示板 - スレタイ、過去ログ、全文検索 (22 PV)
  7. YAKUZA Wiki (12 PV)
  8. 2chみたいな掲示板「PHP 2chBBS」 (10 PV)
  9. ピーアーク三田は許せない 東京都港区 (10 PV)
  10. 行方不明、家出、人探し掲示板 (6 PV)

アクセス統計

ディレクトリ

関連サイト