Co to znaczy wybrać 1 z tabeli?

146

Widziałem wiele zapytań z czymś następującym.

Select 1  
From table

Co to 1oznacza, jak zostanie wykonany i co zwróci?

Ponadto w jakich scenariuszach można to wykorzystać?

Microsoft Developer
źródło
Pokaż nam pełne zapytanie
gbn

Odpowiedzi:

107

SELECT 1 FROM TABLE_NAMEoznacza „Zwróć 1 z tabeli”. Samo w sobie jest dość zwyczajne, więc zwykle będzie używane z WHEREi często EXISTS(jako notatki @gbn niekoniecznie jest to najlepsza praktyka, jednak jest na tyle powszechne, że można je zauważyć, nawet jeśli nie jest to naprawdę znaczące ( to powiedziawszy, użyję go, ponieważ inni go używają i jest to „bardziej oczywiste” od razu. Oczywiście może to być problem lepkiej kury z jajkiem, ale generalnie nie rozwodzę się)).

 SELECT * FROM TABLE1 T1 WHERE EXISTS (
     SELECT 1 FROM TABLE2 T2 WHERE T1.ID= T2.ID
 );

Zasadniczo powyższe zwróci wszystko z tabeli 1, która ma odpowiedni identyfikator z tabeli 2. (Jest to oczywiście sztuczny przykład, ale uważam, że przekazuje ideę. Osobiście prawdopodobnie zrobiłbym to powyżej, SELECT * FROM TABLE1 T1 WHERE ID IN (SELECT ID FROM TABLE2);ponieważ uważam, że jako O WIELE bardziej wyraźne dla czytelnika, chyba że istniał istotny powód, aby tego nie robić).

EDYTOWAĆ

Właściwie jest jeden przypadek, o którym do tej pory zapomniałem. W przypadku, gdy próbujesz określić istnienie wartości w bazie danych z języka zewnętrznego, czasami SELECT 1 FROM TABLE_NAMEbędzie używany. Nie zapewnia to znaczących korzyści w porównaniu z wyborem pojedynczej kolumny, ale w zależności od implementacji może oferować znaczne korzyści w porównaniu z wykonaniem a SELECT *, po prostu dlatego, że często jest tak, że im więcej kolumn DB zwraca do języka, tym większe są dane struktura, co z kolei oznacza, że ​​zajmie więcej czasu.

cwallenpoole
źródło
I dlaczego „normalnie” z ISTNIEJE? Czy masz dowód dlaczego ?
gbn
6
I -1 za propagowanie mitu...EXISTS (SELECT 1...
gbn
2
@Gbn Nie mam pojęcia, dlaczego widziałem to tam znacznie częściej niż cokolwiek innego. Po prostu widziałem to tam znacznie częściej.
cwallenpoole
2
Lepki kurczak? Nie chciałbym tego zjeść! Może powinien to być „okrutny problem z kurczakiem i jajkiem”?
No'am Newman,
2
@Ben: IN i EXISTs zwykle optymalizują się zgodnie z tym samym planem
gbn
106

select 1 from tablezwróci stałą 1 dla każdego wiersza tabeli. Jest to przydatne, gdy chcesz tanio określić, czy rekord pasuje do Twojej whereklauzuli i / lub join.

Sahil Muthoo
źródło
1
Ta odpowiedź miała dla mnie najwięcej sensu
Joseph Astrahan
2
W istocie bardzo ważna kwestia: „dla KAŻDEGO wiersza w tabeli”. W ten sposób sprawdzenie „dostępności tabeli” jako część, na przykład kontroli stanu tabeli zawierającej sto milionów wierszy, zakończy się zestawieniem wyników o wartości stu milionów „1”. (uwaga: nie żeby to się NIGDY wydarzyło ... w produkcji;);))
conny
Dosłownie to powinna być tutaj akceptowana odpowiedź!
Fahad Javed
40

Jeśli masz na myśli coś takiego

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT 1 FROM table WHERE...) 

to mit, że 1jest lepszy niż

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT * FROM table WHERE...) 

1Lub *w EXISTS jest ignorowany i można napisać to jak na stronie 191 ANSI SQL 1992 standard :

SELECT * FROM AnotherTable
  WHERE EXISTS (SELECT 1/0 FROM table WHERE...) 
gbn
źródło
1
Właśnie sprawdziłem, że postgres to szanuje, exists (select 1/0działa jak urok
alex
22

robi to, co mówi - zawsze zwraca liczbę całkowitą 1. Służy do sprawdzania, czy istnieje rekord pasujący do Twojej klauzuli where.

Neville Kuyt
źródło
22
uhm - pytanie brzmiało „co to znaczy”, a nie „czy to dobra praktyka”. Zgadzam się, że nie robi to różnicy z punktu widzenia wydajności - ale jest to konwencja, której używają programiści, prawdopodobnie dlatego, że 1 jest powszechnie interpretowany jako „prawdziwy”.
Neville Kuyt
20

select 1 from table jest używany przez niektóre bazy danych jako zapytanie do testowania połączenia w celu sprawdzenia, czy istnieje, często używane podczas pobierania lub zwracania połączenia do / z puli połączeń.

Tomek
źródło
2
Tak było w moim przypadku, jest to dość powszechne wśród aplikacji JBOSS i TOMCAT.
Valter Silva,
13

Wynik jest 1dla każdego rekordu w tabeli. __

TiyebM
źródło
Niezupełnie, próbowałem stworzyć pustą tabelę i wykonać zapytanie, wynik to sześć 1s.
r0ng
9

Chociaż nie jest to powszechnie znane, zapytanie może mieć HAVINGklauzulę bez GROUP BYklauzuli.

W takich okolicznościach HAVINGklauzula dotyczy całego zestawu. Oczywiście SELECTklauzula nie może odnosić się do żadnej kolumny, w przeciwnym razie (poprawiłbyś) błąd „Kolumna jest nieprawidłowa w zaznaczeniu, ponieważ nie jest zawarta w GROUP BY” itd.

W związku z tym, wartość dosłowne muszą być używane (ponieważ SQL nie zezwala resultset z zerowym kolumn - dlaczego ?!), a wartość literalna 1 ( INTEGER) jest powszechnie stosowany: jeśli HAVINGocenia klauzula TRUEwtedy resultset będzie jednym rzędzie z jednego kolumna pokazująca wartość 1, w przeciwnym razie otrzymasz pusty zestaw.

Przykład: aby sprawdzić, czy kolumna ma więcej niż jedną odrębną wartość:

SELECT 1
  FROM tableA
HAVING MIN(colA) < MAX(colA);
onedaywhen
źródło
„Oczywiste jest, że klauzula SELECT nie może odnosić się do dowolnej kolumny” - czy nie byłoby bardziej uzasadnione, aby wybrać wyrażenie bool: SELECT MIN(colA) < MAX(colA) FROM tableA?
Paul Spiegel
7

Aby być bardziej szczegółowym, użyłbyś tego do zrobienia

SELECT 1 FROM MyUserTable WHERE user_id = 33487

zamiast robić

SELECT * FROM MyUserTable WHERE user_id = 33487

ponieważ nie zależy Ci na oglądaniu wyników. Pytanie o numer 1 jest bardzo łatwe dla bazy danych (ponieważ nie musi wyszukiwać).

Robert Martin
źródło
Zgodnie z powyższymi komentarzami, wygląda na to, że Select 1 nie jest lepszy pod względem wydajności niż select *, czy tak jest?
eRaisedToX
5

Jeśli nie wiesz, czy istnieją jakieś dane w Twojej tabeli, czy nie, możesz użyć następującego zapytania:

SELECT cons_value FROM table_name;

Dla przykładu:

SELECT 1 FROM employee;
  1. Zwróci kolumnę, która zawiera całkowitą liczbę wierszy, a wszystkie wiersze mają tę samą stałą wartość 1 (tym razem zwraca 1 dla wszystkich wierszy);
  2. Jeśli w Twojej tabeli nie ma wiersza, nic nie zwróci.

Tak więc używamy tego zapytania SQL, aby dowiedzieć się, czy w tabeli są jakieś dane, a liczba wierszy wskazuje, ile wierszy istnieje w tej tabeli.

mahbub_siddique
źródło
3

Oznacza to, że chcesz, aby wartość " 1 " była wyjściem lub była używana przez większość czasu jako zapytania wewnętrzne, ponieważ z jakiegoś powodu chcesz obliczyć zapytania zewnętrzne na podstawie wyników zapytań wewnętrznych ... nie zawsze, gdy używasz 1, ale ty mają określone wartości ...

To statycznie da wynik jako wartość 1.

DShah
źródło
3

Jeśli chcesz tylko sprawdzić prawdę lub fałsz na podstawie klauzuli WHERE, wybierz 1 z tabeli, w której warunek jest najtańszym sposobem.


źródło
2

Widzę, że jest zawsze używany w iniekcjach SQL, takich jak:

www.urlxxxxx.com/xxxx.asp?id=99 union select 1,2,3,4,5,6,7,8,9 from database;

Liczb tych można użyć do odgadnięcia, gdzie istnieje baza danych, oraz nazwy kolumny podanej bazy danych oraz wartości tabel.

EmilyAvon
źródło
0

oznacza to po prostu, że pobierasz numer z pierwszej kolumny z tabeli ,,,, oznacza wybierz Emply_num, Empl_no From Employees; tutaj używasz wybierz 1 z Pracowników; oznacza to, że pobierasz kolumnę Emply_num. Dzięki

zeeshan rajput
źródło
Pamiętam taką składnię, ale jest ona specyficzna dla bazy danych, której nie pamiętam. Postgresql?
diynevala
0

Powód jest inny, przynajmniej w przypadku MySQL. To pochodzi z podręcznika MySQL

InnoDB oblicza wartości liczności indeksu dla tabeli przy pierwszym dostępie do tej tabeli po uruchomieniu, zamiast przechowywać takie wartości w tabeli. Ten krok może zająć dużo czasu w systemach, które dzielą dane na wiele tabel. Ponieważ ten narzut dotyczy tylko początkowej operacji otwierania tabeli, aby „rozgrzać” tabelę do późniejszego użycia, uzyskaj do niej dostęp natychmiast po uruchomieniu, wydając instrukcję taką jak SELECT 1 FROM tbl_name LIMIT 1

Ramona Morea
źródło
0

Jest to używane tylko dla wygody za pomocą funkcji JEŻELI ISTNIEJE (). W przeciwnym razie możesz iść z

select * from [table_name]

Obraz W przypadku „JEŚLI ISTNIEJE” wystarczy wiedzieć, że każdy wiersz z określonym warunkiem istnieje lub nie, nie ma znaczenia, jaka jest zawartość wiersza.

select 1 from Users

powyższy przykładowy kod, zwraca nie. wierszy równa się nie. użytkowników z 1 w jednej kolumnie

arvind singh
źródło