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 WHEREEXISTS(SELECT1FROM 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.
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.
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ź!
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ń.
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ść:
„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
SELECT1FROM 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ć).
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 ...
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
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
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
Odpowiedzi:
SELECT 1 FROM TABLE_NAME
oznacza „Zwróć 1 z tabeli”. Samo w sobie jest dość zwyczajne, więc zwykle będzie używane zWHERE
i częstoEXISTS
(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ę)).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_NAME
bę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 aSELECT *
, 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.źródło
...EXISTS (SELECT 1...
select 1 from table
zwróci stałą 1 dla każdego wiersza tabeli. Jest to przydatne, gdy chcesz tanio określić, czy rekord pasuje do Twojejwhere
klauzuli i / lubjoin
.źródło
Jeśli masz na myśli coś takiego
to mit, że
1
jest lepszy niż1
Lub*
w EXISTS jest ignorowany i można napisać to jak na stronie 191 ANSI SQL 1992 standard :źródło
exists (select 1/0
działa jak urokrobi to, co mówi - zawsze zwraca liczbę całkowitą 1. Służy do sprawdzania, czy istnieje rekord pasujący do Twojej klauzuli where.
źródło
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ń.źródło
Wynik jest
1
dla każdego rekordu w tabeli.źródło
Chociaż nie jest to powszechnie znane, zapytanie może mieć
HAVING
klauzulę bezGROUP BY
klauzuli.W takich okolicznościach
HAVING
klauzula dotyczy całego zestawu. OczywiścieSELECT
klauzula 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śliHAVING
ocenia klauzulaTRUE
wtedy 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ść:
źródło
SELECT MIN(colA) < MAX(colA) FROM tableA
?Aby być bardziej szczegółowym, użyłbyś tego do zrobienia
zamiast robić
ponieważ nie zależy Ci na oglądaniu wyników. Pytanie o numer 1 jest bardzo łatwe dla bazy danych (ponieważ nie musi wyszukiwać).
źródło
Jeśli nie wiesz, czy istnieją jakieś dane w Twojej tabeli, czy nie, możesz użyć następującego zapytania:
Dla przykładu:
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.
źródło
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.
źródło
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
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.
źródło
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
źródło
Powód jest inny, przynajmniej w przypadku MySQL. To pochodzi z podręcznika MySQL
źródło
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
źródło