MySQLで1つを除くすべての列を選択しますか?


365

selectステートメントを使用して、1つを除く特定のMySQLテーブルからすべての列を取得しようとしています。これを行う簡単な方法はありますか?

編集:このテーブルには53列があります(私のデザインではありません)


6
53列?その場合、トーマスが示唆するように、私はSELECT *を使い続けます...その追加の列に、取得するのが望ましくない大量のデータがない限り...?
マイクストーン

1つの列を除いて...無視する必要がある列を知っていると思います。そのため、INFORMATION_SCHEMA.columnsを使用します。
アルファブラボ

あなたがやりたいことをするこの答えをチェックしてください!
donL

地理データが保持されている場合、ビッグデータ列は実際の問題です。列のサイズは数メガバイトになる場合があります。それらは、where句で行を検索するのに適していますが、そのデータを結果に含めたくない場合があります。
Jason

これの一般的な用途は、自動インクリメントID列を除外することです。たとえば、独自のIDを持つ別のテーブルに挿入するデータを選択します。
ToolmakerSteve

回答:


222

実際に方法はありますが、これを行うにはもちろん権限が必要です...

SET @sql = CONCAT('SELECT ', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), '<columns_to_omit>,', '') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '<table>' AND TABLE_SCHEMA = '<database>'), ' FROM <table>');

PREPARE stmt1 FROM @sql;
EXECUTE stmt1;

交換 <table>, <database> and <columns_to_omit>


20
注意:INFORMATION_SCHEMAクエリのパフォーマンスはかなり低いため、このタイプのクエリは、クリティカルパスに含まれていないことに注意してください。
ビルカーウィン、2011

9
@Jan Koritakが以下に述べるように、削除したいタイトルの列が保持したい列のタイトルのサブストリングでもある場合、この回答は実際には機能しません。これに似たより良い答えがここにあります
donL

8
これは、既知のベストプラクティスである列を指定するだけの場合よりもはるかに悪いです。
HLGEM 2014年

3
列名にスペースがある場合、これは機能しません。名前を常にバッククォートで囲むように更新する必要があります<column_name>
adamF

3
無視される列がテーブル構造にリストされている最後の列である場合も、これは機能しません(置換が末尾のコマと一致しないため)。
Vincent Pazeller、2015

61

mysqlの定義(手動)では、そのようなことはありません。ただし、列の数が非常に多いcol1場合col100は、以下が役立ちます。

DROP TABLE IF EXISTS temp_tb;
CREATE TEMPORARY TABLE ENGINE=MEMORY temp_tb SELECT * FROM orig_tb;
ALTER TABLE temp_tb DROP col_x;
SELECT * FROM temp_tb;

4
3番目のステップでエラーメッセージ「列数が行1の値数と一致しません」が表示されました。そこで、ステップ2を "UPDATE temp_tb SET id = NULL"に変更し、それが機能しました。
oyvey 2016年

1
わかりました。しかし、このクエリを再度実行すると、temp_tbが既に存在するというエラーが発生します。temp_tbがメモリにどれだけの時間ありますか?ばかげた質問ならお詫びします。PSがあなたの回答に賛成票を投じました。
カラン

2
:先頭に別のコマンドを追加し、繰り返しこのクエリを実行する@KaranDROP TABLE IF EXISTS temp_tb;
gregn3

1
@Karanメモリエンジンを指定するには、コマンドを使用しますCREATE TEMPORARY TABLE temp_tb ENGINE=MEMORY (SELECT * FROM orig_tb); 。それ以外の場合は、デフォルトでディスクに保存され、サーバーの再起動後も存続します。(感謝
gregn3

すばらしい答えです。以下のために複数の列を削除する、を参照してくださいこの回答
S3DEV

45

この場合、ビューはうまく機能しますか?

CREATE VIEW vwTable
as  
SELECT  
    col1  
    , col2  
    , col3  
    , col..  
    , col53  
FROM table

15
はは!ええ、確かに。次に、すべてのBUT 1つの列を含むビューをどのように構築しますか。これがどのようにして元の質問を引き起こしているのかわかると思います。実際、このスレッドを見つけたのは、ビュー定義で残りのすべての列を明示的にリストせずに特定の列を除外するビューを作成したかったからです。
Chris Nadovich

31

できるよ:

SELECT column1, column2, column4 FROM table WHERE whatever

column3を取得せずに、おそらくより一般的な解決策を探していましたか?


3
より高い評価の答えのほとんどは、手で入力せずにこの正確なクエリを生成する方法を見つけるだけです
mehtunguh

5
実際、メンテナンス上の理由から、「次のものを除くすべて」の種類のクエリがあると便利です。そうでない場合、後で新しいフィールドが追加された場合、明示的なフィールドリストを更新する必要があります。
leiavoia 14年

1
@lev、それは正しいですし、彼らはすべきです!!! 将来の列が必要かどうかがわからないため(メタデータ列か、特定の画面に適用されない列である可能性があります)。あなたはいけません。必要以上に返すことでパフォーマンスを損なう(内部結合がある場合は100%の確率です)select *がSQLアンチパターンである理由を読んでおくことをお勧めします。
HLGEM 2014年

26
OPは50列以上あると述べているため、これはかなり非現実的です。
オーグラ

1
@HLGEMそうではありません。新しい列を追加するたびに、クエリを維持せずにすべての列を選択する必要がありました。しかし、とにかく私はSean Oのソリューションを自分に適用しました
OverCoder '15

26

たとえばセキュリティ上の問題や機密情報のためにフィールドの値を除外したい場合は、その列をnullとして取得できます。

例えば

SELECT *, NULL AS salary FROM users

13
どうして?動作しません。列の給与がある場合、このクエリは、salaryという名前の2つの列を含む結果になります。1つはnullでいっぱいで、もう1つは実際の給与です。
Myforwik 2013

4
@Myforwikこのクエリは実際に2番目のsalary列を追加します。ただし、*の後に取得されるため、元のファイルが上書きされます。きれいではありませんが、動作します。
Sean O

68
SQLでは、結果セット内の列名の重複を常に許可しています。これを機能させるには、複製サポートしていないクライアントアプリケーションで実行し、最後の複製を優先する必要があります。公式のコマンドラインクライアントはdupeをサポートしています。HeidiSQLはそれらもサポートします。SQL Fiddleは表示しませんが、最後ではなく最初の重複を表示します。要約すると、これは機能しません
アルバロゴンザレス2013年

9
もちろん動作しません。これは、mysqlと通信するライブラリではなく、mysql自体で答えをテストする必要がある理由の良い例です。
Myforwik 2013年

8
@ SeanO、@ Alastair、@全員、オーバーライドしません。サーバーは引き続き機密データを返します。
Pacerier、2015

22

私の知る限りではありません。次のようなことができます:

SELECT col1, col2, col3, col4 FROM tbl

必要な列を手動で選択します。ただし、多くの列が必要な場合は、次のようにすることができます。

SELECT * FROM tbl 

そして、あなたが望まないものを無視してください。

あなたの特定のケースでは、私はお勧めします:

SELECT * FROM tbl

数列だけ必要な場合を除きます。4つの列だけが必要な場合は、次のようにします。

SELECT col3, col6, col45, col 52 FROM tbl

大丈夫ですが、50列が必要な場合は、クエリを作成するコードが(あまりにも)読みにくくなります。


3
選択*は常に悪い選択です。それをお勧めしません。それがSQlアンチパターンである理由を読んでください。
HLGEM 2014年

18

@Mahomedalidと@Junaidによる解決策を試しているときに問題が見つかりました。だからそれを共有することを考えました。列名にチェックインのようにスペースまたはハイフンがある場合、クエリは失敗します。簡単な回避策は、列名をバックティックで囲むことです。変更されたクエリは以下のとおりです

SET @SQL = CONCAT('SELECT ', (SELECT GROUP_CONCAT(CONCAT("`", COLUMN_NAME, "`")) FROM
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'users' AND COLUMN_NAME NOT IN ('id')), ' FROM users');
PREPARE stmt1 FROM @SQL;
EXECUTE stmt1;

11

選択したくない列に大量のデータが含まれていて、速度の問題のためにその列を含めたくなく、他の列を頻繁に選択する場合は、新しいテーブルを作成することをお勧めします元のテーブルへのキーでは通常選択しない1つのフィールドを使用して、元のテーブルからフィールドを削除します。その追加フィールドが実際に必要なときにテーブルを結合します。



8

主な問題は、テーブルを結合するときに取得する多くの列です。これはあなたの質問(1つのテーブルから特定の列を除くすべてを選択する方法)に対する回答ではありませんが、を指定するだけでなく、特定のテーブルからすべての列を取得するように指定できることは言及する価値があると思います。table.

これが非常に役立つ例を以下に示します。

users。*、phone.meta_valueを電話として、zipcode.meta_valueを郵便番号として選択

ユーザーから

user_metaを電話として残す
on((users.user_id = phone.user_id)AND(phone.meta_key = 'phone'))

user_metaを郵便番号として結合する
on((users.user_id = zipcode.user_id)AND(zipcode.meta_key = 'zipcode'))

結果は、usersテーブルのすべての列と、メタテーブルから結合された2つの追加の列です。


2
ありがとう、私は結合で最初のテーブルのすべての列と2番目のテーブルの1つのフィールドのみを選択する必要があり、あなたの答えが助けになりました。
mohammad falahat

5

からの@Mahomedalidコメントで知らされたこの事実の他に、私は答えが好きでした@Bill Karwin。が提起する可能性のある問題@Jan Koritakは真実です。私はそれに直面しましたが、そのトリックを見つけたので、問題に直面している人のためにここで共有したいと思います。

次のように、REPLACE関数をPreparedステートメントのサブクエリのwhere句に置き換えることができます。

テーブルと列の名前を使用する

SET @SQL = CONCAT('SELECT ', (SELECT GROUP_CONCAT(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'users' AND COLUMN_NAME NOT IN ('id')), ' FROM users');
PREPARE stmt1 FROM @SQL;
EXECUTE stmt1;

だから、これが唯一のフィールドを除外するために起こっているidではなく、company_id


4

すべての列を照会する場合でも、照会する列を指定することをお勧めします。

したがって、ステートメントに各列の名前を記述することをお勧めします(不要な列は除きます)。

SELECT
    col1
    , col2
    , col3
    , col..
    , col53

FROM table

これはコードとの契約のように機能し、クエリを見ると、テーブルのスキーマを調べなくても、そこから抽出できるデータが正確にわかります。
mbillard 2009

6
@kodecraft:常に同じ型を関数から返すことは良い習慣であるのと同じ理由で良い習慣です(それが強制されていない言語で作業している場合でも)。基本的には、最小サプライズの原則にすぎません。
Daniel Pryden

4

するだけ

SELECT * FROM table WHERE whatever

次に、好きなプログラミング言語の列をドロップします:php

while (($data = mysql_fetch_array($result, MYSQL_ASSOC)) !== FALSE) {
   unset($data["id"]);
   foreach ($data as $k => $v) { 
      echo"$v,";
   }      
}

6
除外したい列が巨大なBLOBか何かでない限り。
ビルカーウィン

1
無駄なデータを避けようとするなら、これは悪いことです。
Kristopher Ives

53からの1列は違いを生むべきではありません。もしそうなら、それはおそらく悪いデザインです。
Petr Peller、

1
SElect *はSQLアンチパターンであり、製品コードでは使用しないでください。
HLGEM 2015年

1
SELECT *がプロダクションコードで「決して」使用されるべきではないある種のアンチパターンであることには同意しません。実際にすべてのフィールドであるかどうかにかかわらず、列の長いリストを相互参照する場合と比較して、すべての列を取得したことははるかに明確です。また、非常に明らかに、コーディングがはるかに高速です。また、テーブルのフィールドがビューまたはフォームのフィールドに正確に対応するケースは数多くあります。
ジェフケンドール

4

すべての列を一覧表示する「単純な」ソリューションに同意しますが、これは負担が大きく、タイプミスにより多くの時間を無駄にする可能性があります。関数「getTableColumns」を使用して、クエリへの貼り付けに適した列の名前を取得します。次に、必要のないものを削除するだけです。

CREATE FUNCTION `getTableColumns`(tablename varchar(100)) 
          RETURNS varchar(5000) CHARSET latin1
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE res  VARCHAR(5000) DEFAULT "";

  DECLARE col  VARCHAR(200);
  DECLARE cur1 CURSOR FOR 
    select COLUMN_NAME from information_schema.columns 
    where TABLE_NAME=@table AND TABLE_SCHEMA="yourdatabase" ORDER BY ORDINAL_POSITION;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
  OPEN cur1;
  REPEAT
       FETCH cur1 INTO col;
       IF NOT done THEN 
          set res = CONCAT(res,IF(LENGTH(res)>0,",",""),col);
       END IF;
    UNTIL done END REPEAT;
  CLOSE cur1;
  RETURN res;

結果は、たとえば、コンマ区切りの文字列を返します...

col1、col2、col3、col4、... col53



4

はい、ただし、テーブルによってはI / Oが高くなる可能性がありますが、これは私が見つけた回避策です。

SELECT *
INTO #temp
FROM table

ALTER TABLE #temp DROP COlUMN column_name

SELECT *
FROM #temp

これは、適度なサイズのテーブルでは非常に遅くなります。
ジョエル

3

Select *他の場所で言及されているように、不要なものがBLOBである場合、それだけでは不十分であることに同意します。

必要なデータを含むビューを作成Select *します。データベースソフトウェアがサポートしていれば、快適に使用できます。そうでなければ、巨大なデータを別のテーブルに入れてください。


3

最初は正規表現を使用できると思っていましたが、MYSQLドキュメントを読んでいるので、それはできないようです。私だったら、別の言語(PHPなど)を使用して取得したい列のリストを生成し、それを文字列として格納してから、それを使用してSQLを生成します。


3

これも欲しかったので、代わりに関数を作成しました。

public function getColsExcept($table,$remove){
    $res =mysql_query("SHOW COLUMNS FROM $table");

    while($arr = mysql_fetch_assoc($res)){
        $cols[] = $arr['Field'];
    }
    if(is_array($remove)){
        $newCols = array_diff($cols,$remove);
        return "`".implode("`,`",$newCols)."`";
    }else{
        $length = count($cols);
        for($i=0;$i<$length;$i++){
            if($cols[$i] == $remove)
                unset($cols[$i]);
        }
        return "`".implode("`,`",$cols)."`";
    }
}

したがって、どのように機能するかは、テーブルを入力し、次に不要な列を入力するか、配列のように入力することです:array( "id"、 "name"、 "whatevercolumn")

したがって、selectでは次のように使用できます。

mysql_query("SELECT ".$db->getColsExcept('table',array('id','bigtextcolumn'))." FROM table");

または

mysql_query("SELECT ".$db->getColsExcept('table','bigtextcolumn')." FROM table");

3

@Mahomedalidの答えに同意しますが、準備されたステートメントのようなことをしたくなかったし、すべてのフィールドを入力したくなかったので、私が持っていたのはばかげた解決策でした。

phpmyadmin-> sql-> selectのテーブルに移動すると、クエリがダンプされます。コピー、置換、完了です!:)


2

私はトーマスの答え(+1;)に同意しますが)、私はあなたがいることを柱と仮定しますという警告を追加したいと思いませんしたいが、ほとんどのデータが含まれています。大量のテキスト、xml、またはバイナリblobが含まれている場合は、時間をかけて各列を個別に選択してください。そうしないと、パフォーマンスが低下します。乾杯!


2

Mahomedalidが投稿した答えには小さな問題があります:

内部の置換機能コードは「<columns_to_delete>,」を「」に置き換えていました。置換するフィールドが連結文字列の最後のフィールドである場合、この置換には問題があります。文字列。

私の提案:

SET @sql = CONCAT('SELECT ', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME),
                  '<columns_to_delete>', '\'FIELD_REMOVED\'')
           FROM INFORMATION_SCHEMA.COLUMNS
           WHERE TABLE_NAME = '<table>'
             AND TABLE_SCHEMA = '<database>'), ' FROM <table>');

交換<table><database>および`

削除された列は、文字列「FIELD_REMOVED」に置き換えられます。私の場合、これはメモリを保護しようとしたため機能します。(私が削除していたフィールドは約1MBのBLOBです)


2

@Mahomedalidの回答に基づいて、「mysqlで一部を除くすべての列を選択する」をサポートするためにいくつかの改善を行いました

SET @database    = 'database_name';
SET @tablename   = 'table_name';
SET @cols2delete = 'col1,col2,col3';

SET @sql = CONCAT(
'SELECT ', 
(
    SELECT GROUP_CONCAT( IF(FIND_IN_SET(COLUMN_NAME, @cols2delete), NULL, COLUMN_NAME ) )
    FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tablename AND TABLE_SCHEMA = @database
), 
' FROM ',
@tablename);

SELECT @sql;

colがたくさんある場合は、このSQLを使用してgroup_concat_max_lenを変更します。

SET @@group_concat_max_len = 2048;

2

Jan Koritakが指摘した矛盾を解決できるかもしれません

SELECT CONCAT('SELECT ',
( SELECT GROUP_CONCAT(t.col)
FROM
(
    SELECT CASE
    WHEN COLUMN_NAME = 'eid' THEN NULL
    ELSE COLUMN_NAME
    END AS col 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'employee' AND TABLE_SCHEMA = 'test'
) t
WHERE t.col IS NOT NULL) ,
' FROM employee' );

テーブル :

SELECT table_name,column_name 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'employee' AND TABLE_SCHEMA = 'test'

================================

table_name  column_name
employee    eid
employee    name_eid
employee    sal

================================

クエリ結果:

'SELECT name_eid,sal FROM employee'

1

常に同じ1つの列である場合は、それを含まないビューを作成できます。

そうでなければ、私はそうは思いません。


1

SQLを使用して、生成するSQLを好み、評価する場合は、SQLを生成できます。これは、情報スキーマから列名を抽出するための一般的なソリューションです。Unixコマンドラインからの例です。

代用

  • mysqlコマンドを使用したMYSQL
  • TABLEとテーブル名
  • 除外されたフィールド名を持つEXCLUDEDFIELD
echo $(echo 'select concat("select ", group_concat(column_name) , " from TABLE") from information_schema.columns where table_name="TABLE" and column_name != "EXCLUDEDFIELD" group by "t"' | MYSQL | tail -n 1) | MYSQL

この方法で実際に列名を抽出する必要があるのは1回だけで、その列を除外した列リストを作成してから、作成したクエリを使用するだけです。

したがって、次のようなもの:

column_list=$(echo 'select group_concat(column_name) from information_schema.columns where table_name="TABLE" and column_name != "EXCLUDEDFIELD" group by "t"' | MYSQL | tail -n 1)

これで、作成$column_listしたクエリで文字列を再利用できます。


1

この問題を解決するために、特に削除する列の数が少ない場合は、別の視点を追加したいと思います。

MySQL WorkbenchなどのDBツールを使用してselectステートメントを生成することができるため、生成されたステートメントの列を手動で削除し、SQLスクリプトにコピーするだけです。

MySQL Workbenchでは、それを生成する方法は次のとおりです。

テーブルを右クリック-> SQLエディターに送信->すべてのステートメントを選択。


1

受け入れられた回答にはいくつかの欠点があります。

  • テーブルまたは列の名前にバッククォートが必要な場合は失敗します
  • 省略したい列がリストの最後にある場合は失敗します
  • テーブル名を2回リストする必要があります(1回は選択用、もう1回はクエリテキスト用)。これは冗長で不要です。
  • 列名を間違った順序で返す可能性があります

これらの問題はすべて、バッククォートをSEPARATORforに含めGROUP_CONCAT、のWHERE代わりに条件を使用することで克服できますREPLACE()。私の目的のため(そして私は他の多くの人を想像します)、列名がテーブル自体に表示されるのと同じ順序で返されるようにしたいと思いました。これを実現するために、ここORDER BYではGROUP_CONCAT()関数内で明示的な句を使用しています。

SELECT CONCAT(
    'SELECT `',
    GROUP_CONCAT(COLUMN_NAME ORDER BY `ORDINAL_POSITION` SEPARATOR '`,`'),
    '` FROM `',
    `TABLE_SCHEMA`,
    '`.`',
    TABLE_NAME,
    '`;'
)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE `TABLE_SCHEMA` = 'my_database'
    AND `TABLE_NAME` = 'my_table'
    AND `COLUMN_NAME` != 'column_to_omit';

0

私には提案がありますが、解決策はありません。一部の列のデータセットが大きい場合は、以下を試してください。

SELECT *, LEFT(col1, 0) AS col1, LEFT(col2, 0) as col2 FROM table

-1

私はこれに対する答えをスローするのがかなり遅いです、これは私がいつもそれをやってきた方法であり、率直に言って、それは最高の答えよりも100倍優れていて、きちんとしています。そしてそれが便利だと思う

    //create an array, we will call it here. 
    $here = array();
    //create an SQL query in order to get all of the column names
    $SQL = "SHOW COLUMNS FROM Table";
        //put all of the column names in the array
        foreach($conn->query($SQL) as $row) {
            $here[] = $row[0];
        }
    //now search through the array containing the column names for the name of the column, in this case i used the common ID field as an example
    $key = array_search('ID', $here);
    //now delete the entry
    unset($here[$key]);

それはきちんとしているかもしれませんが、それは質問に答えません:彼はphpについて尋ねていません、そしてあなたは彼が望むもののselectステートメントや結果を与えません、しかし彼が望むカラムを含むphp配列だけです。
gou1 2013年

2
-1。これはSQLコードではなくSELECT、ここにステートメントはありません。この単語は一度も発生しません。
Frungi 2013

これは、(a)SQLよりもPHPに慣れている、または(b)読みやすくするためにコードを複数行に分散したい場合に限り、より簡潔です。ポイント(b)を認めます。また、多くのユースケースでは違いはわずかですが、アプローチのパフォーマンスは低下します。質問に対する他のコメントも参照してください。叫ぶ価値はないので、元の質問から不適切なコメントを削除することをお勧めします。
mc0e 2013

-5

Select *はSQLアンチパターンです。次のような多くの理由により、本番コードでは使用しないでください。

処理に少し時間がかかります。何百万回も実行されている場合、それらの小さなビットが問題になる可能性があります。このタイプのずさんなコーディングが原因で速度が低下する低速データベースは、パフォーマンスの調整が最も困難です。

これは、おそらく必要以上のデータを送信していることを意味し、サーバーとネットワークの両方のボトルネックを引き起こします。内部結合がある場合、必要以上のデータを送信する可能性は100%です。

特に、どこにも表示したくない新しい列を追加した場合、メンテナンスの問題が発生します。さらに、新しい列がある場合は、その列をどうするかを決定するためにインターフェースに何かをする必要があるかもしれません。

これはビューを壊す可能性があります(これはSQlサーバーでは当てはまりますが、mysqlでは当てはまらない場合もあります)。

列が異なる順序でテーブルを再構築するのに十分な愚か者がいる場合(これは行うべきではありませんが、常に発生します)、あらゆる種類のコードが壊れる可能性があります。たとえば、突然都市をaddress_3フィールドに指定せずに挿入している場合など、挿入の特別なコードを記述します。データベースは列の順序でのみ実行できます。これは、データ型が変更される場合は十分に悪いですが、交換された列が同じデータ型である場合はさらに悪いことがあります。データの整合性に注意する必要があります。

挿入で使用されている場合、一方のテーブルに新しい列が追加され、もう一方のテーブルには追加されないと、挿入が中断されます。

トリガーが壊れる可能性があります。トリガーの問題は診断が難しい場合があります。

列名を追加するのにかかる時間と照らし合わせて、これらすべてを足し合わせてください(列名の上にドラッグできるインターフェイスさえあるかもしれません(SQL Serverでやっていることを知っているので、いくつかの方法があると思います)これは、mysqlクエリの記述に使用するツールです。「メンテナンスの問題が発生したり、パフォーマンスの問題が発生したり、データの整合性の問題が発生したりする可能性がありますが、開発時間を5分節約できました。」必要な特定の列で。

この本を読むことをお勧めします:http : //www.amazon.com/SQL-Antipatterns-Programming-Pragmatic-Programmers-ebook/dp/B00A376BB2/ref=sr_1_1?s= digital-text&ie=UTF8&qid=1389896688&sr =1- 1&keywords = sql + antipatterns

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.