Co oznacza „wybierz 1 z”?

80

Czytałem kilka artykułów, ale naprawdę nie rozumiałem, co robi select 1 from? Ktoś mówi „powinieneś używać select 1zamiast select *”. Oto przykładowa tabela:

cust_id     cust_name       cust_address

1000000001  Village Toys    Mapl
1000000002  Kids Place      South
1000000003  Fun4All         Sunny
1000000004  Fun4All         Riverside
1000000005  The Toy Store   53rd

Jaki będzie skutek, gdy napiszę, select 1 from customer_tableco robi to stwierdzenie?

Mehmet
źródło
Mniej więcej dziesięć lat temu rozsądną radą było sugerowanie select 1zamiast select *np EXISTS. Klauzuli. Optymalizator został ulepszony dawno temu. To było nigdy zamiennikiem „dostać wszystkie kolumny z tego zbioru wynikowego”.
Damien_The_Unbeliever
12
Próbowałeś ???
Jimmy D,

Odpowiedzi:

73
select 1 from table

zwróci kolumnę 1 dla każdego wiersza w tabeli. Możesz go użyć z instrukcją where, aby sprawdzić, czy masz wpis dla danego klucza, jak w:

if exists(select 1 from table where some_column = 'some_value')

Twój znajomy prawdopodobnie powiedział, że zamiast wybierać zbiorczo za pomocą funkcji select * from table, powinieneś precyzyjnie określić kolumny, których potrzebujesz, z dwóch powodów:

1) wydajność i możesz pobrać więcej danych, niż faktycznie potrzebujesz.

2) użytkownik zapytania może polegać na kolejności kolumn. Jeśli Twoja tabela zostanie zaktualizowana, klient otrzyma kolumny w innej kolejności niż oczekiwano.

Vladimir
źródło
33

Konstrukcja jest zwykle używana do sprawdzania „istnienia”

if exists(select 1 from customer_table where customer = 'xxx')

lub

if exists(select * from customer_table where customer = 'xxx')

Obie konstrukcje są równoważne. W przeszłości ludzie mówili, że opcja select * była lepsza, ponieważ zarządca zapytań używałby wtedy najlepiej indeksowanej kolumny. Udowodniono, że to nieprawda.

Filip De Vos
źródło
24

Robi to co prosisz, SELECT 1 FROM tablebędzie SELECT(powrót) A 1dla każdego wiersza w tej tabeli, jeżeli były 3 wiersze w tabeli, co można uzyskać

1
1
1

Spójrz na Count (*) vs Count (1), który może być problemem, który zostałeś opisany.

Alex K.
źródło
3
Dlaczego miałbym tego chcieć?
CodyBugstein
7
@Imray Jest to przydatne, gdy interesuje Cię tylko, czy warunek w Twojej WHEREklauzuli jest prawdziwy, czy fałszywy. Jest często używany w zapytaniach podrzędnych.
Andreas
9

Instrukcja SELECT 1 FROM SomeTablepo prostu zwraca kolumnę zawierającą wartość 1dla każdego wiersza w Twojej tabeli. Jeśli dodasz kolejną kolumnę, np. SELECT 1, cust_name FROM SomeTableWtedy będzie to trochę jaśniejsze:

            cust_name
----------- ---------------
1           Village Toys
1           Kids Place
1           Fun4All
1           Fun4All
1           The Toy Store
Justin
źródło
4
SELECT COUNT(*) in EXISTS/NOT EXISTS

EXISTS(SELECT CCOUNT(*) FROM TABLE_NAME WHERE CONDITIONS)- EXISTSwarunek zawsze zwróci true, niezależnie od tego, czy WARUNKI są spełnione, czy nie.

NOT EXISTS(SELECT CCOUNT(*) FROM TABLE_NAME WHERE CONDITIONS)- NOT EXISTSwarunek zawsze zwróci fałsz, niezależnie od CONDITIONStego, czy są spełnione, czy nie.

SELECT COUNT 1 in EXISTS/NOT EXISTS

EXISTS(SELECT CCOUNT 1 FROM TABLE_NAME WHERE CONDITIONS)- EXISTSwarunek zwróci true, jeśli CONDITIONSzostanie spełniony. W przeciwnym razie fałszywe.

NOT EXISTS(SELECT CCOUNT 1 FROM TABLE_NAME WHERE CONDITIONS)- NOT EXISTSwarunek zwróci fałsz, jeśli CONDITIONSzostanie spełniony. W przeciwnym razie prawda.

Veera
źródło