Pilih semua kolom kecuali satu di MySQL?


365

Saya mencoba menggunakan pernyataan pilih untuk mendapatkan semua kolom dari tabel MySQL tertentu kecuali satu. Apakah ada cara sederhana untuk melakukan hal ini?

SUNTING: Ada 53 kolom dalam tabel ini (BUKAN DESAIN SAYA)


6
53 kolom? Saya akan tetap menggunakan SELECT * seperti yang disarankan Thomas dalam kasus itu ... kecuali kolom tambahan itu memiliki sejumlah besar data yang tidak diinginkan untuk diambil ...?
Mike Stone

Kecuali satu kolom ... Saya kira Anda tahu mana yang harus diabaikan, maka INFORMATION_SCHEMA.kolom adalah caranya.
Alfabravo

Lihat jawaban ini yang melakukan apa yang ingin Anda lakukan!
donL

Kolom big data adalah masalah nyata ketika data geografis disimpan. Kolom dapat berukuran banyak megabita. Mereka bekerja dengan baik di mana klausa untuk menemukan baris, tetapi Anda sering tidak ingin data dalam hasil.
Jason

Penggunaan umum untuk ini adalah mengecualikan kolom ID kenaikan-otomatis. Misalnya, untuk memilih data yang akan dimasukkan ke dalam tabel yang berbeda, yang memiliki ID sendiri.
ToolmakerSteve

Jawaban:


222

Sebenarnya ada cara, Anda harus memiliki izin untuk melakukan ini ...

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;

Mengganti <table>, <database> and <columns_to_omit>


20
peringatan: INFORMATION_SCHEMA kueri memiliki kinerja yang sangat buruk, jadi hati-hati jenis kueri ini tidak berada di jalur kritis untuk apa pun.
Bill Karwin

9
Seperti yang dikatakan @Jan Koritak di bawah, jawaban ini tidak benar-benar berfungsi jika kolom judul yang ingin Anda hapus juga merupakan sub-string dari judul untuk setiap kolom yang ingin Anda simpan. Ada jawaban yang lebih baik yang mirip dengan ini yang dapat ditemukan di sini .
donL

8
Ini jauh lebih buruk daripada hanya menentukan kolom yang merupakan praktik terbaik yang diketahui.
HLGEM

3
Ini tidak berfungsi jika ada spasi di nama kolom. Itu harus diperbarui untuk selalu mengelilingi nama-nama di backticks<column_name>
adamF

3
Ini juga tidak akan berfungsi jika kolom yang diabaikan adalah yang terakhir yang tercantum dalam struktur tabel (karena penggantian tidak akan cocok dengan koma trailing).
Vincent Pazeller

61

Dalam definisi mysql (manual) tidak ada hal seperti itu. Tetapi jika Anda memiliki jumlah kolom yang sangat besar col1, ...,, col100berikut ini dapat bermanfaat:

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
Beri saya pesan kesalahan pada langkah ke-3: "Jumlah kolom tidak cocok dengan jumlah nilai pada baris 1". Jadi saya mengubah langkah 2 menjadi "UPDATE temp_tb SET id = NULL" dan kemudian berhasil.
oyvey

1
Ok, ini berhasil. Tetapi ketika saya menjalankan kueri ini lagi, itu memberi saya kesalahan, bahwa, temp_tb sudah ada. Untuk berapa banyak waktu temp_tb ada di memori? Mohon maaf jika itu pertanyaan bodoh. PS membatalkan jawaban Anda.
Karan

2
@Karan Untuk menjalankan kueri ini berulang kali, tambahkan perintah lain ke awal:DROP TABLE IF EXISTS temp_tb;
gregn3

1
@Karan Untuk menentukan mesin memori, gunakan perintah:, CREATE TEMPORARY TABLE temp_tb ENGINE=MEMORY (SELECT * FROM orig_tb); jika tidak, ia disimpan ke disk secara default, dan selamat dari server restart. ( terima kasih )
gregn3

Jawaban yang sangat bagus. Untuk menjatuhkan beberapa kolom , lihat jawaban ini .
S3DEV

45

Apakah tampilan bekerja lebih baik dalam kasus ini?

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

15
HA HA! Ya, tentu. Sekarang bagaimana Anda membangun tampilan untuk memasukkan semua TAPI salah satu kolom. Saya pikir Anda melihat bagaimana ini menimbulkan pertanyaan asli. Bahkan, saya menemukan utas ini secara khusus karena saya ingin membuat tampilan yang mengecualikan kolom tertentu tanpa dipaksa untuk membuat daftar semua kolom yang tersisa secara eksplisit dalam definisi tampilan.
Chris Nadovich

31

Anda dapat melakukan:

SELECT column1, column2, column4 FROM table WHERE whatever

tanpa mendapatkan kolom3, meskipun mungkin Anda mencari solusi yang lebih umum?


3
Sebagian besar jawaban yang berperingkat lebih tinggi kebanyakan hanya menemukan cara untuk menghasilkan kueri yang tepat ini tanpa mengetik dengan tangan
mehtunguh

5
Sebenarnya, untuk alasan pemeliharaan, sangat berguna untuk memiliki jenis pertanyaan "segalanya kecuali". Kalau tidak, daftar bidang eksplisit harus diperbarui jika bidang baru ditambahkan kemudian.
leiavoia

1
@lev, itu benar dan MEREKA HARUS MENJADI !!! SEBELUM Anda tidak tahu apakah Anda ingin memiliki kolom di masa depan (mungkin itu adalah kolom data meta atau yang tidak berlaku untuk layar tertentu). Kamu tidak; ingin merusak kinerja dengan mengembalikan lebih dari yang Anda butuhkan (yang benar 100% dari waktu ketika Anda memiliki gabung dalam) Saya sarankan Anda membaca tentang mengapa pilih * adalah antipattern SQL.
HLGEM

26
OP menyatakan ada> 50 kolom jadi ini agak tidak praktis.
augurar

1
@HLGEM Tidak juga, saya ingin memilih semua kolom tanpa mempertahankan kueri setiap kali saya menambahkan kolom baru, kecuali salah satu dari mereka, dan ini tidak akan berhasil dalam kasus saya. Tapi bagaimanapun aku menerapkan solusi Sean O untuk diriku sendiri
OverCoder

26

Jika Anda mencari untuk mengecualikan nilai bidang, misalnya untuk masalah keamanan / info sensitif, Anda dapat mengambil kolom itu sebagai nol.

misalnya

SELECT *, NULL AS salary FROM users

13
Mengapa? Itu tidak bekerja. Jika Anda memiliki gaji kolom, kueri ini hanya akan berakhir dengan hasil memiliki dua kolom bernama gaji, satu penuh nol dan satu dengan gaji aktual.
Myforwik

4
@Myforwik Permintaan ini memang menambahkan salarykolom kedua . Tapi karena itu diambil setelah *, itu menimpa yang asli. Itu tidak cantik, tetapi itu berhasil.
Sean O

68
SQL selalu mengizinkan duplikat nama kolom dalam hasil-set. Jika Anda ingin ini berfungsi, Anda harus menjalankannya dengan aplikasi klien yang tidak mendukung dupes dan memberikan prioritas pada dupe terakhir. Klien baris perintah resmi mendukung dupes. HeidiSQL mendukung mereka juga. SQL Fiddle tidak, tetapi menampilkan dupe pertama , bukan yang terakhir. Singkatnya: ini tidak berhasil .
Álvaro González

9
Tentu saja itu tidak berhasil. Ini adalah contoh yang bagus mengapa Anda harus menguji jawaban Anda di mysql sendiri, alih-alih melalui perpustakaan yang berbicara dengan mysql.
Myforwik

8
@SeanO, @ Alastair, @ Semuanya, Tidak Mengesampingkan. Server masih mengembalikan data sensitif.
Pacerier

22

Sejauh pengetahuan saya, tidak ada. Anda dapat melakukan sesuatu seperti:

SELECT col1, col2, col3, col4 FROM tbl

dan secara manual pilih kolom yang Anda inginkan. Namun, jika Anda ingin banyak kolom, maka Anda mungkin hanya ingin melakukan:

SELECT * FROM tbl 

dan abaikan saja apa yang tidak Anda inginkan.

Dalam kasus khusus Anda, saya akan menyarankan:

SELECT * FROM tbl

kecuali Anda hanya ingin beberapa kolom. Jika Anda hanya ingin empat kolom, maka:

SELECT col3, col6, col45, col 52 FROM tbl

akan baik-baik saja, tetapi jika Anda menginginkan 50 kolom, maka setiap kode yang membuat kueri akan menjadi (juga?) sulit dibaca.


3
Pilih * adalah pilihan yang buruk selalu. Jangan rekomendasikan itu. Baca mengapa ini adalah SQl Antipattern.
HLGEM

18

Saat mencoba solusi oleh @Mahomedalid dan @Junaid saya menemukan masalah. Jadi terpikir untuk membagikannya. Jika nama kolom memiliki spasi atau tanda hubung seperti check-in maka kueri akan gagal. Solusi sederhana adalah dengan menggunakan backtick di sekitar nama kolom. Kueri yang dimodifikasi ada di bawah

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

Jika kolom yang tidak ingin Anda pilih memiliki sejumlah besar data di dalamnya, dan Anda tidak ingin memasukkannya karena masalah kecepatan dan Anda sering memilih kolom lainnya, saya sarankan Anda membuat tabel baru dengan satu bidang yang biasanya tidak Anda pilih dengan kunci ke tabel asli dan hapus bidang dari tabel asli. Bergabunglah dengan tabel ketika bidang ekstra itu benar-benar diperlukan.



8

Masalah utama saya adalah banyak kolom yang saya dapatkan ketika bergabung dengan tabel. Meskipun ini bukan jawaban untuk pertanyaan Anda (cara memilih semua kecuali kolom tertentu dari satu tabel), saya pikir perlu disebutkan bahwa Anda dapat menentukan untuk mendapatkan semua kolom dari tabel tertentu, bukan hanya menentukan .table.

Berikut adalah contoh bagaimana ini bisa sangat berguna:

pilih pengguna. *, phone.meta_value sebagai telepon, zipcode.meta_value sebagai zipcode

dari pengguna

tinggalkan gabung user_meta sebagai ponsel
pada ((users.user_id = phone.user_id) AND (phone.meta_key = 'phone'))

tinggalkan gabung user_meta sebagai kode pos
pada ((users.user_id = zipcode.user_id) AND (zipcode.meta_key = 'zipcode'))

Hasilnya adalah semua kolom dari tabel pengguna, dan dua kolom tambahan yang digabungkan dari tabel meta.


2
terima kasih, saya perlu memilih semua kolom dari tabel pertama dan hanya satu bidang dari tabel kedua dalam bergabung dan jawaban Anda membantu saya.
mohammad falahat

5

Saya menyukai jawaban dari @Mahomedalidselain fakta ini diinformasikan dalam komentar dari @Bill Karwin. Kemungkinan masalah yang diangkat @Jan Koritakadalah benar saya menghadapi itu, tetapi saya telah menemukan trik untuk itu dan hanya ingin membagikannya di sini untuk siapa saja yang menghadapi masalah.

kita bisa mengganti fungsi REPLACE dengan klausa tempat dalam sub-kueri pernyataan Disiapkan seperti ini:

Menggunakan nama tabel dan kolom saya

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;

Jadi, ini akan mengecualikan hanya bidang idtetapi tidakcompany_id


4

Merupakan praktik yang baik untuk menentukan kolom yang Anda tanyakan bahkan jika Anda menanyakan semua kolom.

Jadi saya sarankan Anda menulis nama setiap kolom dalam pernyataan (tidak termasuk yang tidak Anda inginkan).

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

FROM table

Kerjanya seperti kontrak dengan kode dan ketika melihat kueri, Anda tahu persis data apa yang dapat Anda ekstrak dari itu tanpa melihat skema tabel.
mbillard

6
@ododecraft: Ini praktik yang baik untuk alasan yang sama sehingga praktik yang baik untuk selalu mengembalikan tipe yang sama dari suatu fungsi (bahkan jika Anda bekerja dalam bahasa yang tidak dipaksakan). Pada dasarnya hanya Prinsip Terkejut.
Daniel Pryden

4

Kerjakan saja

SELECT * FROM table WHERE whatever

Lalu taruh kolom di bahasa pemrograman favorit Anda: php

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

6
Kecuali kolom yang ingin Anda kecualikan adalah Gumpalan besar atau semacamnya.
Bill Karwin

1
Ini buruk jika Anda mencoba untuk menghindari data yang terbuang.
Kristopher Ives

1 kolom dari 53 seharusnya tidak membuat perbedaan. Jika berhasil, mungkin desainnya buruk.
Petr Peller

1
Memilih * adalah antipattern SQL dan seharusnya tidak pernah digunakan dalam kode produksi.
HLGEM

1
Saya tidak setuju bahwa SELECT * adalah semacam anti-pola yang seharusnya "tidak pernah" digunakan dalam kode produksi. Jauh lebih jelas bahwa Anda telah mengambil semua kolom Anda - dibandingkan dengan referensi silang daftar panjang kolom yang mungkin, atau tidak, sebenarnya semua bidang. Ini juga, sangat jelas, lebih cepat untuk dikodekan, sejauh ini. Dan ada banyak, banyak kasus di mana bidang tabel akan sesuai persis dengan bidang dalam tampilan atau formulir.
Geoff Kendall

4

Saya setuju dengan solusi "sederhana" untuk mendaftarkan semua kolom, tetapi ini bisa memberatkan, dan kesalahan ketik dapat menyebabkan banyak waktu terbuang. Saya menggunakan fungsi "getTableColumns" untuk mengambil nama-nama kolom saya yang cocok untuk menempel ke kueri. Maka yang perlu saya lakukan adalah menghapus yang tidak saya inginkan.

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;

Hasil Anda mengembalikan string yang dibatasi koma, misalnya ...

col1, col2, col3, col4, ... col53



4

Ya, meskipun bisa I / O tinggi tergantung pada tabel di sini adalah solusi yang saya temukan untuk itu.

SELECT *
INTO #temp
FROM table

ALTER TABLE #temp DROP COlUMN column_name

SELECT *
FROM #temp

Ini akan sangat lambat untuk setiap tabel berukuran sedang.
Joel

3

Saya setuju bahwa itu tidak cukup untuk Select *, jika yang Anda tidak perlu, seperti yang disebutkan di tempat lain, adalah Gumpalan, Anda tidak ingin memiliki overhead merayap masuk

Saya akan membuat tampilan dengan data yang diperlukan, maka Anda dapat Select *dengan nyaman - jika perangkat lunak database mendukungnya. Lain, letakkan data besar di tabel lain.


3

Pada awalnya saya pikir Anda bisa menggunakan ekspresi reguler, tetapi karena saya sudah membaca dokumen MYSQL sepertinya Anda tidak bisa. Jika saya adalah Anda, saya akan menggunakan bahasa lain (seperti PHP) untuk menghasilkan daftar kolom yang ingin Anda dapatkan, simpan sebagai string dan kemudian gunakan itu untuk menghasilkan SQL.


3

Saya ingin ini juga jadi saya membuat fungsi sebagai gantinya.

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)."`";
    }
}

Jadi cara kerjanya adalah Anda memasukkan tabel, lalu kolom yang tidak Anda inginkan atau seperti dalam array: array ("id", "name", "whatevercolumn")

Jadi di pilih Anda bisa menggunakannya seperti ini:

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

atau

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

3

Saya setuju dengan jawaban @ Mahomedalid, tetapi saya tidak ingin melakukan sesuatu seperti pernyataan yang disiapkan dan saya tidak ingin mengetik semua kolom, jadi yang saya miliki adalah solusi konyol.

Pergi ke tabel di phpmyadmin-> sql-> pilih, itu dump kueri: salin, ganti dan selesai! :)


2

Meskipun saya setuju dengan jawaban Thomas (+1;)), saya ingin menambahkan peringatan bahwa saya akan menganggap kolom yang tidak Anda inginkan berisi hampir tidak ada data. Jika itu berisi sejumlah besar teks, xml atau gumpalan biner, maka luangkan waktu untuk memilih setiap kolom satu per satu. Performa Anda akan menderita sebaliknya. Bersulang!


2

Jawaban yang diposting oleh Mahomedalid memiliki masalah kecil:

Di dalam kode fungsi pengganti diganti " <columns_to_delete>," oleh "", penggantian ini memiliki masalah jika bidang yang diganti adalah yang terakhir di string concat karena yang terakhir tidak memiliki karakter koma "," dan tidak dihapus dari string.

Lamaran ku:

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>');

Mengganti <table>, <database>dan `

Kolom yang dihapus diganti dengan string "FIELD_REMOVED" dalam kasus saya ini berfungsi karena saya mencoba untuk menyimpan memori. (Bidang yang saya hapus adalah Gumpalan sekitar 1MB)


2

Berdasarkan jawaban @Mahomedalid, saya telah melakukan beberapa perbaikan untuk mendukung "pilih semua kolom kecuali beberapa di 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;

Jika Anda memiliki banyak cols, gunakan sql ini untuk mengubah group_concat_max_len

SET @@group_concat_max_len = 2048;

2

Mungkin saya punya solusi untuk perbedaan Jan Koritak yang ditunjukkan

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' );

Meja :

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

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

Hasil Permintaan:

'SELECT name_eid,sal FROM employee'

1

Jika selalu satu kolom yang sama, maka Anda dapat membuat tampilan yang tidak ada di dalamnya.

Kalau tidak, tidak, kurasa tidak.


1

Anda dapat menggunakan SQL untuk menghasilkan SQL jika Anda suka dan mengevaluasi SQL yang dihasilkannya. Ini adalah solusi umum karena mengekstrak nama kolom dari skema informasi. Berikut adalah contoh dari baris perintah Unix.

Mengganti

  • MYSQL dengan perintah mysql Anda
  • TABEL dengan nama tabel
  • EXCLUDEDFIELD dengan nama bidang yang dikecualikan
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

Anda benar-benar hanya perlu mengekstrak nama kolom dengan cara ini hanya sekali untuk membuat daftar kolom mengecualikan kolom itu, dan kemudian hanya menggunakan kueri yang telah Anda buat.

Jadi sesuatu seperti:

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)

Sekarang Anda dapat menggunakan kembali $column_liststring dalam kueri yang Anda buat.


1

Saya ingin menambahkan sudut pandang lain untuk menyelesaikan masalah ini, khususnya jika Anda memiliki sejumlah kecil kolom untuk dihapus.

Anda bisa menggunakan alat DB seperti MySQL Workbench untuk menghasilkan pernyataan pilih untuk Anda, jadi Anda hanya perlu menghapus kolom-kolom tersebut untuk pernyataan yang dibuat dan menyalinnya ke skrip SQL Anda.

Di MySQL Workbench cara untuk menghasilkannya adalah:

Klik kanan pada tabel -> kirim ke Sql Editor -> Pilih Semua Pernyataan.


1

Jawaban yang diterima memiliki beberapa kekurangan.

  • Gagal di mana nama tabel atau kolom memerlukan backticks
  • Gagal jika kolom yang ingin Anda hilangkan adalah yang terakhir dalam daftar
  • Ini membutuhkan daftar nama tabel dua kali (sekali untuk pilih dan yang lainnya untuk teks kueri) yang berlebihan dan tidak perlu
  • Ini berpotensi dapat mengembalikan nama kolom dalam urutan yang salah

Semua masalah ini dapat diatasi dengan hanya memasukkan backticks di SEPARATORuntuk Anda GROUP_CONCATdan menggunakan WHEREkondisi alih-alih REPLACE(). Untuk tujuan saya (dan saya bayangkan banyak orang lain), saya ingin nama kolom dikembalikan dalam urutan yang sama dengan yang muncul di tabel itu sendiri. Untuk mencapai ini, di sini kita menggunakan ORDER BYklausa eksplisit di dalam GROUP_CONCAT()fungsi:

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

Saya punya saran tetapi bukan solusi. Jika beberapa kolom Anda memiliki kumpulan data yang lebih besar maka Anda harus mencoba dengan mengikuti

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

-1

Saya sangat terlambat dalam mengeluarkan jawaban untuk ini, katakanlah ini adalah cara saya selalu melakukannya dan terus terang, ini 100 kali lebih baik dan lebih rapi daripada jawaban terbaik, saya hanya berharap seseorang akan melihatnya. Dan menemukannya bermanfaat

    //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]);

Mungkin rapi, tetapi tidak menjawab pertanyaan: dia belum bertanya tentang php, dan Anda tidak memberikan pernyataan pilih atau hasil dari apa yang dia inginkan, tetapi hanya array php yang berisi kolom yang dia inginkan.
gou1

2
–1. Ini bukan kode SQL, dan tidak ada SELECTpernyataan di sini — kata itu bahkan tidak muncul sekali.
Frungi

Ini hanya lebih rapi sejauh (a) Anda lebih nyaman dengan PHP daripada SQL, atau (b) Anda suka menyebarkan kode Anda ke beberapa baris agar mudah dibaca. Saya akan mengakui poin (b). Pendekatan Anda juga akan kurang berkinerja, meskipun perbedaannya akan kecil dalam banyak kasus penggunaan. Lihat juga komentar lain tentang pertanyaan Anda. Tidak layak diteriaki, jadi sarankan Anda menghapus komentar yang tidak pantas dari pertanyaan awal.
mc0e

-5

Pilih * adalah antipattern SQL. Seharusnya tidak digunakan dalam kode produksi karena berbagai alasan termasuk:

Dibutuhkan sedikit lebih lama untuk diproses. Ketika berbagai hal dijalankan jutaan kali, bagian-bagian kecil itu bisa berarti. Basis data yang lambat di mana kelambatan disebabkan oleh jenis pengkodean yang ceroboh ini adalah jenis yang paling sulit untuk digunakan.

Ini berarti Anda mungkin mengirim lebih banyak data daripada yang Anda butuhkan yang menyebabkan kemacetan server dan jaringan. Jika Anda memiliki gabungan dalam, kemungkinan mengirim lebih banyak data daripada yang Anda butuhkan adalah 100%.

Ini menyebabkan masalah pemeliharaan terutama ketika Anda telah menambahkan kolom baru yang tidak ingin Anda lihat di mana-mana. Lebih lanjut jika Anda memiliki kolom baru, Anda mungkin perlu melakukan sesuatu pada antarmuka untuk menentukan apa yang harus dilakukan dengan kolom itu.

Itu dapat merusak pandangan (saya tahu ini benar di server SQl, mungkin atau mungkin tidak benar di mysql).

Jika seseorang cukup konyol untuk membangun kembali tabel dengan kolom dalam urutan yang berbeda (yang seharusnya tidak Anda lakukan tetapi itu terjadi sepanjang waktu), semua jenis kode dapat rusak. Terutama kode untuk menyisipkan misalnya di mana tiba-tiba Anda meletakkan kota ke dalam bidang address_3 karena tanpa menentukan, database hanya dapat berjalan sesuai urutan kolom. Ini cukup buruk ketika tipe data berubah tetapi lebih buruk ketika kolom bertukar memiliki tipe data yang sama karena Anda dapat pergi untuk kadang-kadang memasukkan data buruk yang berantakan untuk dibersihkan. Anda perlu peduli dengan integritas data.

Jika digunakan dalam sisipan, itu akan mematahkan sisipan jika kolom baru ditambahkan dalam satu tabel tetapi tidak yang lain.

Mungkin mematahkan pemicu. Masalah pemicu bisa sulit didiagnosis.

Tambahkan semua ini terhadap waktu yang diperlukan untuk menambahkan nama kolom (heck Anda bahkan mungkin memiliki antarmuka yang memungkinkan Anda untuk menyeret nama kolom (saya tahu saya lakukan di SQL Server, saya yakin ada beberapa cara untuk lakukan ini adalah beberapa alat yang Anda gunakan untuk menulis pertanyaan mysql.) Mari kita lihat, "Saya dapat menyebabkan masalah pemeliharaan, saya dapat menyebabkan masalah kinerja dan saya dapat menyebabkan masalah integritas data, tapi hei saya menghemat waktu dev selama lima menit." di kolom spesifik yang Anda inginkan.

Saya juga menyarankan Anda membaca buku ini: 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 & kata kunci = sql + antipatterns

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.