Co mowi standard o instrukcji "select * from tabela" ?
Edward - 30-06-2006 00:08
Co mowi standard o instrukcji "select * from tabela" ?
Witam,
Oczywiscie szukalem po sieci odpowiedzi ale nie znalazlem. Na szybko wiec zainstalowalem 40tude i pytam Was, proszac o pomoc z ponizszym problemem.
Powiedzmy ze mam tabele: create table Tabela1 ( Pole1 int ,Pole2 int )
Jak sie zachowa instrukcja: "select * from Tabela1"? W jakiej kolejnosci zostana zwrocone poszczegolne pola tabeli? Czy to prawda ze standard SQL (nie wiem czy jakis konkretny czy wszystkie) nie zapewnia, ze w pierwszej kolumnie zostanie zwrocone Pole1 a w drugiej Pole2 ? Czy to prawda, ze moze byc tak, ze jednym razem zwroci w pierwszej kolumnie Pole1 a innym razem Pole2? I czy to prawda, że dlatego nie powinno sie sotsowac zapisu "select * from Tabela1", tylko zawsze powinno sie wymieniac poszczegolne wszystkie pola w tabeli ? ("select Pole1, Pole2 from Tabela1") ???
pozdrawiam i licze na konkretne odpowiedzi (w razie odpowiedzi twierdzacych na poszczegolne pytania, prosilbym o skierowanie mnie do wiarygodnego zrodla wiedzy na ten temat)
z gory dziekuje za jakakolwiek pomoc
Edward
Brzezi - 30-06-2006 00:08
co do glownego pytania nie wiem, ale...
> I czy to prawda, że dlatego nie powinno sie sotsowac zapisu "select * from > Tabela1", tylko zawsze powinno sie wymieniac poszczegolne wszystkie pola w > tabeli ? ("select Pole1, Pole2 from Tabela1") ???
select * ... nie oznacza ze nie mozesz sie odwolywac bezwzglednie do pol po ich nazwie, przeciez kazda kolumna ma swoja nazwe, nawet jak podasz *, wiec przy wyciaganiu danych pobieraj je po nazwie, a nie po indeksie, nie bedzie problemu...
Pozdrawiam Brzezi -- [ E-mail: brzezi@enter.net.pl ][ brzezi:~# uptime ] [ Ekg: #3781111 ][ 23:59:02 up 7 days, 11:22, 3 users, ] [ LinuxUser: #249916 ][ load average: 0.96, 0.67, 0.68 ]
Edward - 30-06-2006 00:08
Dnia 29 Jun 2006 22:00:45 GMT, Brzezi napisał(a):
> select * ... nie oznacza ze nie mozesz sie odwolywac bezwzglednie do pol po > ich nazwie, przeciez kazda kolumna ma swoja nazwe, nawet jak podasz *, wiec > przy wyciaganiu danych pobieraj je po nazwie, a nie po indeksie, nie bedzie > problemu... >
To wiem ze tak jest, ale to nie w tym problem. Co powiesz np. o takiej sytuacji:
create table Tabela2 ( Pole1 int ,Pole2 int ) insert into Tabela2 select * from Tabela1
?? poza tym musze znac odpowiedz na moje pytania, a nie jak sobie radzic w poszczegolnych sytuacjach :)
Lucyna Witkowska - 01-07-2006 00:57
Edward <edwardek@poczta.onet.pl> napisał: > Oczywiscie szukalem po sieci odpowiedzi ale nie znalazlem. > Na szybko wiec zainstalowalem 40tude i pytam Was, proszac o pomoc > z ponizszym problemem.
> Powiedzmy ze mam tabele: > create table Tabela1 ( > Pole1 int > ,Pole2 int > )
> Jak sie zachowa instrukcja: "select * from Tabela1"? > W jakiej kolejnosci zostana zwrocone poszczegolne pola tabeli? > Czy to prawda ze standard SQL (nie wiem czy jakis konkretny czy wszystkie) > nie zapewnia, ze w pierwszej kolumnie zostanie zwrocone Pole1 a w drugiej > Pole2 ?
No nie, jakis porzadek musi byc. Kolejnosc na liscie SELECT jest zachowana w wyniku.
> Czy to prawda, ze moze byc tak, ze jednym razem zwroci w pierwszej kolumnie > Pole1 a innym razem Pole2?
:-) Nie.
> I czy to prawda, że dlatego nie powinno sie sotsowac zapisu "select * from > Tabela1", tylko zawsze powinno sie wymieniac poszczegolne wszystkie pola w > tabeli ? ("select Pole1, Pole2 from Tabela1") ???
W Oracle SELECT * zwraca kolumny w kolejnosci podanej w chwili tworzenia obiektu. Wiarygodne źródło: ORACLE SQL Reference.
Powinno sie jednak wymieniac kolumny, zeby uniezaleznic SELECT od zmian struktury tabeli, a takze zmiejszyc koszty przez wyciecie przesylania niepotrzebnych danych.
> pozdrawiam i licze na konkretne odpowiedzi (w razie odpowiedzi twierdzacych > na poszczegolne pytania, prosilbym o skierowanie mnie do wiarygodnego > zrodla wiedzy na ten temat)
Mam nadzieje, ze moja odpowiedz jest konkretna ;-)
Pozdrowienia, LW
Szczepan Marchewka - 01-07-2006 00:57
Z tego, co pamietam, to standard rzeczywiscie nie narzuca kolejnosci kolumn, ale chyba wszystkie systemy baz danych stosuja jakis konkretny porzadek kolumn (wg kolejnosci kolumn przy tworzeniu tabeli). Teoretycznie powinno sie unikac "SELECT * FROM tabela" ze wzgledu na przenosnosc miedzy roznymi bazami danych i ich wersjami (moglyby stosowac rozne sortowanie kolumn), ale to chyba tylko teoretycznie.
Natomiast moim zdaniem absolutnie niemozliwe jest, by zdarzylo sie, ze raz takie zapytanie zwroci Pole1, Pole2, a innym razem Pole2, Pole1. To to by bylo czyste szalenstwo ze strony producenta bazy danych.
Szczepan@Marchewka.info.pl ----- In the beginner's mind there are many possibilities, but in the expert's mind there are few. (Shunryu Suzuki 1905-1971)
Artur Gancarz - 06-07-2006 00:20
Użytkownik Edward napisał: > Witam, > > Oczywiscie szukalem po sieci odpowiedzi ale nie znalazlem. > Na szybko wiec zainstalowalem 40tude i pytam Was, proszac o pomoc > z ponizszym problemem. > > Powiedzmy ze mam tabele: > create table Tabela1 ( > Pole1 int > ,Pole2 int > ) > > Jak sie zachowa instrukcja: "select * from Tabela1"? > W jakiej kolejnosci zostana zwrocone poszczegolne pola tabeli? > Czy to prawda ze standard SQL (nie wiem czy jakis konkretny czy wszystkie) > nie zapewnia, ze w pierwszej kolumnie zostanie zwrocone Pole1 a w drugiej > Pole2 ? > Czy to prawda, ze moze byc tak, ze jednym razem zwroci w pierwszej kolumnie > Pole1 a innym razem Pole2?
Widzisz, w standardzie SQL jest również taka opcja jak wpisywanie do tabeli wartości bez podania nazw kolumn, np.:
insert into tabela1 values(34,564,3245,3454);
Z góry wtedy wpisujący musi wiedzieć, jaka jest kolejność kolumn, bo inaczej dane by wpisywał "przypadkowo". Jest to pośrednia odpowiedź na twoje pytanie: kolejność jest zawsze taka sama - taka jak przy tworzeniu obiektu. Istotne jest również i to, że przy modyfikacji struktury tabeli masz możliwość podawania np. przy dodawaniu kolumny gdzie ona ma się znaleźć (jej kolejność), np:
alter table tabela1 add column imie_drugie char(15) AFTER imie;
W tym przypadku koniecznie struktura tabeli ma być taka, ze kolumna "imie_drugie" ma się znaleźć po kolumnie "imie". Jest też opcja FIRST. Bez podania parametru kolumna zostanie dodana na końcu.
> I czy to prawda, że dlatego nie powinno sie sotsowac zapisu "select * from > Tabela1", tylko zawsze powinno sie wymieniac poszczegolne wszystkie pola w > tabeli ? ("select Pole1, Pole2 from Tabela1") ???
Pola podaje się z powodu nieco innego, często chcesz danych tylko z kilku kolumn, a zapytanie jest "skomplikowane" i łączy wiele tabel, zaś w wyniku dostałbyć np. 30 kolumn, a których interesuje cię tylko 5. Reszta danych tylko "zatyka" łącze (przy założeniu że server-SQL i client-SQL są na różnych komputerach) lub "zajmuje" czas procka, a najważniejsze, że nie mieści się na ekranie i nie jesteś tego w stanie przeczytać (3-5 krotne zawinięcie wiersza dla mnie jest nie do "rozpracowania").
> pozdrawiam i licze na konkretne odpowiedzi (w razie odpowiedzi twierdzacych > na poszczegolne pytania, prosilbym o skierowanie mnie do wiarygodnego > zrodla wiedzy na ten temat) > > z gory dziekuje za jakakolwiek pomoc > > Edward
Mam nadzieję, że byłem konkretny
Artur Gancarz
Edward - 07-07-2006 02:21
Dnia Thu, 29 Jun 2006 23:53:19 +0200, Edward napisał(a):
Dziekuje wszystkich za odpowiedzi. Bardzo mi to pomoglo i wiele wyjasnilo. Najistotniejsze jest to ze producent bazy danych czesto okresla jaka jest kolejnosc pol (mnie interesowal MS Server i znalazlem w dokumentacji MS w internecie wyraznie napisane, ze kolejnosc pol jest taka jaka zostala zdefiniowana w tabeli lub w perspektywie). To co napisal Pan Artur tez jest bardzo wazne - oznacza to ze, standard moze nie narzuca w jakim porzadku maja byc wyswietlane pola, ale przyjmuje ze jakis narzucony porzadek zawsze producent bazy danych zrobi/powininen zrobic.
pozdrawiam Edward
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[help] Illustrator CS - =?ISO-8859-2?Q?znikn=B1=B3_Selection_?==?ISO-8859-2?Q?Tool_=28V=29?=
[mysql 4.0] SELECT t1.id, t1.foo FROM t1 oraz COUNT t2 w jednym zapytaniu.
=?iso-8859-2?q?select_sum_i_dwie_tabele..._b=B3=EAdna_agregac ja?=
=?iso-8859-2?Q?=5BMySql=5D_-_select_po_5_rekordow_mniejssych_i_wi=EAkszych?=
=?iso-8859-2?Q?=5BMySql=5D_Select_wed=B3ug_nazwy_pola?=
=?ISO-8859-2?Q?[mysql]_Nie_potrafi=EA_zgrupowa=E6_selecta_(proste)?=
=?ISO-8859-2?Q?[MS_SQL]_update_wielu_p=F3l_na_raz_z_selecta?=
Wstawianie nowego wiersza w przypadku jego braku podczas SELECT w PostgreSQL
[pgsql] jak =?ISO-8859-2?Q?zrobi=E6_taki_select_=3F?=
[MySql] Select, polskie znaki i duze oraz małe litery
zanotowane.pldoc.pisz.plpdf.pisz.pllisinski.htw.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|