Was macht "1 auswählen aus"?

80

Ich habe einige Artikel gelesen, aber wirklich nicht verstanden, was zu select 1 fromtun ist. Jemand sagt "Sie sollten select 1anstelle von verwenden select *". Hier ist eine Beispieltabelle:

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

Was wird das Ergebnis sein, wenn ich schreibe, select 1 from customer_tablewas macht diese Aussage?

Mehmet
quelle
Vor ungefähr einem Jahrzehnt war es vernünftig, select 1anstelle select *einer EXISTSKlausel einen Vorschlag zu machen . Der Optimierer wurde vor langer Zeit verbessert. Es war nie ein Ersatz für "Alle Spalten aus dieser Ergebnismenge abrufen".
Damien_The_Unbeliever
12
Hast Du es versucht???
Jimmy D

Antworten:

72
select 1 from table

gibt für jede Zeile in der Tabelle eine Spalte mit Einsen zurück. Sie können es mit einer where-Anweisung verwenden, um zu überprüfen, ob Sie einen Eintrag für einen bestimmten Schlüssel haben, wie in:

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

Was Ihr Freund wahrscheinlich gesagt hat, ist, dass Sie aus zwei Gründen genau die Spalten angeben sollten, die Sie genau benötigen, anstatt Massenauswahl mit select * from table zu treffen:

1) Leistung & Sie können mehr Daten abrufen, als Sie tatsächlich benötigen.

2) Der Benutzer der Abfrage kann sich auf die Reihenfolge der Spalten verlassen. Wenn Ihre Tabelle aktualisiert wird, erhält der Client Spalten in einer anderen Reihenfolge als erwartet.

Vladimir
quelle
33

Die Konstruktion wird normalerweise bei "Existenz" -Kontrollen verwendet

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

oder

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

Beide Konstruktionen sind äquivalent. In der Vergangenheit sagten die Leute, die Auswahl * sei besser, weil der Abfrage-Governor dann die am besten indizierte Spalte verwenden würde. Dies hat sich als nicht wahr erwiesen.

Filip De Vos
quelle
24

Es macht, was Sie fragen, SELECT 1 FROM tablewird für jede Zeile in dieser Tabelle SELECTein (zurückgeben) 1, wenn es 3 Zeilen in der Tabelle gäbe, die Sie erhalten würden

1
1
1

Schauen Sie sich Count (*) vs Count (1) an, was möglicherweise das Problem ist, das Sie beschrieben haben.

Alex K.
quelle
3
Warum sollte ich das wollen?
CodyBugstein
7
@Imray Dies ist nützlich, wenn Sie nur interessiert sind, ob die Bedingung in Ihrer WHEREKlausel wahr oder falsch ist. Es wird häufig in Unterabfragen verwendet.
Andreas
9

Die Anweisung gibt SELECT 1 FROM SomeTablenur eine Spalte zurück, die den Wert 1für jede Zeile in Ihrer Tabelle enthält. Wenn Sie eine weitere Spalte hinzufügen, z. B. SELECT 1, cust_name FROM SomeTablewird dies etwas klarer:

            cust_name
----------- ---------------
1           Village Toys
1           Kids Place
1           Fun4All
1           Fun4All
1           The Toy Store
Justin
quelle
4
SELECT COUNT(*) in EXISTS/NOT EXISTS

EXISTS(SELECT CCOUNT(*) FROM TABLE_NAME WHERE CONDITIONS)- Die EXISTSBedingung wird immer wahr zurückgegeben, unabhängig davon, ob die BEDINGUNGEN erfüllt sind oder nicht.

NOT EXISTS(SELECT CCOUNT(*) FROM TABLE_NAME WHERE CONDITIONS)- Die NOT EXISTSBedingung wird immer falsch zurückgegeben, unabhängig davon, CONDITIONSob sie erfüllt sind oder nicht.

SELECT COUNT 1 in EXISTS/NOT EXISTS

EXISTS(SELECT CCOUNT 1 FROM TABLE_NAME WHERE CONDITIONS)- Die EXISTSBedingung wird true zurückgegeben, wenn sie CONDITIONSerfüllt ist. Sonst falsch.

NOT EXISTS(SELECT CCOUNT 1 FROM TABLE_NAME WHERE CONDITIONS)- Die NOT EXISTSBedingung gibt false zurück, wenn sie CONDITIONSerfüllt ist. Sonst wahr.

Veera
quelle