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. ログ速(ろぐそく、logsoku) - 過去ログ スレタイ検索 全文検索 (18 PV)
  2. 徳洲会から5000万円の資金提供を受けていた猪瀬直樹東京都知事、政治資金収支報告書虚偽記載の疑い (13 PV)
  3. “フクイチ”で新たな恐怖! 海外の研究者や政府関係者が不安視、苛立つ最悪の「地底臨界」危機進行中? (12 PV)
  4. 日銀追加緩和決定で円安ドル高が加速、ドル円は111円台に (11 PV)
  5. Aカップ美女エヴァ・メンデスの映画「ザ・スピリット」でのギリギリ露出が話題に (9 PV)
  6. 2ちゃんねる(2ch)検索 掲示板 - スレタイ、過去ログ、全文検索 (4 PV)
  7. 全米が大興奮、米人気女優ジェニファー・ローレンスさんやモデルのケイト・アプトンさんヌード写真が流出 (3 PV)
  8. 岡沢高宏の相棒でヤクザの金村剛弘(金剛弘)が西新宿の路上で襲撃され死亡 (2 PV)
  9. 読売新聞「石井誠」記者変死事件 (2 PV)
  10. 「サイバッチ」危うし! (2 PV)

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

  1. 日銀追加緩和決定で円安ドル高が加速、ドル円は111円台に (675 PV)
  2. “フクイチ”で新たな恐怖! 海外の研究者や政府関係者が不安視、苛立つ最悪の「地底臨界」危機進行中? (626 PV)
  3. 徳洲会から5000万円の資金提供を受けていた猪瀬直樹東京都知事、政治資金収支報告書虚偽記載の疑い (552 PV)
  4. ログ速(ろぐそく、logsoku) - 過去ログ スレタイ検索 全文検索 (395 PV)
  5. 2ちゃんねる(2ch)検索 掲示板 - スレタイ、過去ログ、全文検索 (332 PV)
  6. PHP、MySQLで動くオープンソース掲示板ソフト (326 PV)
  7. Aカップ美女エヴァ・メンデスの映画「ザ・スピリット」でのギリギリ露出が話題に (224 PV)
  8. ピーアーク三田は許せない 東京都港区 (108 PV)
  9. 行方不明、家出、人探し掲示板 (107 PV)
  10. 掲示板やチャットなどのフリーPHPスクリプトの配布サイト (88 PV)

アクセス統計

ディレクトリ

関連サイト