Czytałem kilka artykułów, ale naprawdę nie rozumiałem, co robi select 1 from
? Ktoś mówi „powinieneś używać select 1
zamiast 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_table
co robi to stwierdzenie?
sql-server-2008
Mehmet
źródło
źródło
select 1
zamiastselect *
npEXISTS
. Klauzuli. Optymalizator został ulepszony dawno temu. To było nigdy zamiennikiem „dostać wszystkie kolumny z tego zbioru wynikowego”.Odpowiedzi:
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.
źródło
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.
źródło
Robi to co prosisz,
SELECT 1 FROM table
będzieSELECT
(powrót) A1
dla każdego wiersza w tej tabeli, jeżeli były 3 wiersze w tabeli, co można uzyskaćSpójrz na Count (*) vs Count (1), który może być problemem, który zostałeś opisany.
źródło
WHERE
klauzuli jest prawdziwy, czy fałszywy. Jest często używany w zapytaniach podrzędnych.Instrukcja
SELECT 1 FROM SomeTable
po prostu zwraca kolumnę zawierającą wartość1
dla każdego wiersza w Twojej tabeli. Jeśli dodasz kolejną kolumnę, np.SELECT 1, cust_name FROM SomeTable
Wtedy będzie to trochę jaśniejsze:cust_name ----------- --------------- 1 Village Toys 1 Kids Place 1 Fun4All 1 Fun4All 1 The Toy Store
źródło
SELECT COUNT(*) in EXISTS/NOT EXISTS
EXISTS(SELECT CCOUNT(*) FROM TABLE_NAME WHERE CONDITIONS)
-EXISTS
warunek 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 EXISTS
warunek zawsze zwróci fałsz, niezależnie odCONDITIONS
tego, czy są spełnione, czy nie.SELECT COUNT 1 in EXISTS/NOT EXISTS
EXISTS(SELECT CCOUNT 1 FROM TABLE_NAME WHERE CONDITIONS)
-EXISTS
warunek zwróci true, jeśliCONDITIONS
zostanie spełniony. W przeciwnym razie fałszywe.NOT EXISTS(SELECT CCOUNT 1 FROM TABLE_NAME WHERE CONDITIONS)
-NOT EXISTS
warunek zwróci fałsz, jeśliCONDITIONS
zostanie spełniony. W przeciwnym razie prawda.źródło