Neden bir SQL sorgusunda Kimden Öncesinde Seçim? [kapalı]


67

Bu beni okulda çok rahatsız eden bir şey.

Beş yıl önce, SQL'i öğrendiğimde, ilk önce neden istediğimiz alanları daha sonra istediklerimizi istediğimizi merak ettim.

Benim düşünceme göre, şunu yazmalıyız:

From Employee e
Select e.Name

Peki neden norm aşağıdakileri söylüyor?

Select e.Name -- Eeeeek, what does e mean?
From Employee e -- Ok, now I know what e is

SQL'i anlamak haftalar sürdü ve o zamanın çoğunun yanlış elemanlar tarafından tüketildiğini biliyorum.

C # ile yazmak gibidir:

string name = employee.Name;
var employee = this.GetEmployee();

Öyleyse, bunun tarihsel bir nedeni olduğunu varsayıyorum. Neden?


64
OO maymunlarını onların yerinde tutmak bir DBA komploudur.
gbn

3
Ne yazık ki, SEQUEL'i tanıtan makalede konuyla ilgili herhangi bir bilgi bulamıyorum ve sorunuza cevap verecek özel alıntılar olduğunu sanmıyorum. Gnat'ın cevabı muhtemelen en iyi açıklamadır - ancak komplo teorisini reddetmem.
yannis

2
Şahsen, her zaman Linqstandartlaştırılmış SQLsözdizimini kullanmamış olmayı diledim .
jp2code

4
SELECT ifadesindeki maddeler , işlem sırası değildir .
S.Lott

8
Güzel soru. Bir diğeri, INSERT ve UPDATE sorgularının farklı sözdizimi modelleri kullanmak zorunda olmaları gerekir: (field1, field2) VALUES (f1, f2) vs (field1 = f1, field2 = f2).
LarsTech

Yanıtlar:


86

Başlangıçta SQL dili için SEQUEL ayakta denirdi

  • Doğal dilin hecelemesine yakın olduğu varsayılarak , İngilizceye vurgu yapılandırılmış İngilizce Sorgu Dili .

Şimdi, bu iki cümleyi heceleyerek İngilizce cümleleri heceleyin:

  1. "Çalışan tablosundan e Sütun seç e.Name"
  2. "E sütununu seçin. Çalışan tablosundaki ad e"

İkinci sesler doğal İngiliz diline daha yakın sesler bu yüzden norm olarak belirlenmiştir.

BTW aynı muhakemeye Wherevb . Gider - SQL ifadeleri kasıtlı olarak doğal dile yakın olacak şekilde tasarlanmıştır.


7
Tabii ki Microsoft, ilk önce FROM olarak LINQ ile görmezden geldi!

27
İngilizce'de çok sayıda gözetleme mantığı var: /
Michael K

15
@Digger - tasarım gereği: seçim ilk önce geldiyse, seçim bölümündeki intellisense'i destekleyemediler.
Scott Whitlock

6
@Digger: LINQ, OO / modern Object.Method veya Object.Property'yi izler. SQL’in 40 yıldır civarında olduğunu unutma
gbn

7
Bunun yerine english.stackexchange.com'da bu soruyu yayınlamalıydım :)
Cyril Gandon

37

Çünkü SELECT bir select ifadesinde gerekli ve FROM gerekli değil.

Select 'This String'

Elbette sql deyiminiz FROM'dan sonra SELECT, DELETE, UPDATE ifadesini aramak için ayrıştırılabilir, ancak bu gerçekten büyük bir anlaşma mı?

Unutma, bunların hepsi istihbarattan önce yapıldı. O kadar karmaşık değil.

Düzenleme: Muhtemelen sql tercümanlarının ikisini birden yapamadıkları için bir neden yoktur.


2
Yine de, FROM myTable;yerine de yazabilirsiniz FROM myTable SELECT *; Bu sadece bir gereksinim gibi gözüküyor çünkü alıştığınız şey bu.
user606723

13
Sadece gerekli olması, önce gelmesi gerektiği anlamına gelmez.
LarsTech

8
ANSI'da SQL FROMgereklidir. Bu yüzden birçok RDBMS'nin adı verilen bir masa DUAL ya da diğer tek sıra kukla masalar var
Martin Smith

@LarsTech - önce gelmek zorunda değil, ama neden karmaşık hale getiriyor. Seçme ifadesi denir, sadece seçim kelimesiyle başlayın.
JeffO

3
@JeffO: Tamam. SELECT FROM Customers COLUMNS FirstName, LastName, PhoneNumber.
Allon Guralnek,

10

Ben referansları ile yedeklemek olabilecek bir cevabı biliyorum, ama spekülasyon yapmak olsaydı etmeyin: SQL bir olduğunu bildirim dil , böyle bir dil ifadesi açıklanır neyi ile değil de yapmak istiyorsunuz nasıl bunu yapmak istiyorum.

Dolayısıyla, "YDEN SEÇ X", "YDEN SEÇİM X" yazarken, "Veritabanından neyi seçmek isterdim" cevabını vermek için daha uygun bir yol gibi geliyor.

Ek olarak, SQL'de SELECT / UPDATE / INSERT, yapmak üzere olduğunuz işlem tipini belirtir ve FROM, veritabanındaki doğru tablodan seçmenize yardımcı olan bir cümledir. Yine, verilerle yaptığınız şey , tam olarak bunu nasıl başaracağınıza göre önceliklidir.


1
+1: Zorunlu ya da prosedürel değil. Maddelerin sırası sadece İngilizce’ye uygun. Daha fazlası değil.
S.Lott

ON ve NEREDE, belirli bir ifadedeki cümle sırasının öneminin daha iyi örnekleri olabilir.
JeffO,

5

SQL, İngilizce konuşanları hedef alan yapılandırılmış bir sorgu dilidir. SELECT, INSERT, UPDATE ve DELETE zorunlu komutlardır. İngilizce'de zorunlu komutlar cümleyi veya ifadeyi başlatır. Karşılaştırmak:

West young man go!

için

Go west young man!

SQL ikinci (zorunlu) formatı izler. Ayrıca dört zorunlu komutun üç önemli farklı formatı vardır. Düşünmek:

FROM    employees a,
        accounts b
UPDATE  ...

veya

INTO    customers a
SELECT  ...

Yapmakta olduğunuz işlemi biliyorsanız, doğru formatı seçmek daha kolaydır.

Seçim durumunda, hangi özellikleri istediğinizi belirler, sonra bunları içeren tabloları eklersiniz. Seçim ölçütlerini oluştururken, ek tablolar ekleyebilirsiniz. Dinamik olarak ölçüt eklerken, genellikle sorgunun statik bir bölümünün sonunda yapılabilir.


7
Bu yüzden Yoda, SQL'i geliştirmede yer almadı.
adam f

GÜNCELLEME getirmek ilginç. UPDATE ... FROMIMO, İngiliz benzeri bir yapı değildir. Daha iyi bir önerim yok ki ...
Robert Brown

Amaç, edatın fiil ile eşleşmesi gerektiğini belirtmekti.
BillThor

3

SQL deyimleri fiillerle başlar. Dil tasarımcılarının seçimi buydu ve birçok programlama dili bu şekilde çalışıyor. Anlamsal olarak, bu şekilde çalışan programlama dillerini görmek nadir değildir:

verb(noun, noun, noun);

Ayrıca, örnek olarak verdiğiniz SELECT ifadesi durumunda, önerilen sözdiziminiz nesneyi ifadeye ilk koyar. Bir VSO (fiil, konu, nesne) cümle düzeni yerine, doğal dillerle karşılaştırıldığında çok garip olan OVS'ye sahip olacaksınız. SVO (örneğin İngilizce), VSO (örneğin Arapça) ve SOV (örneğin Latince), insan konuşmasının daha makul yaklaşımlarıdır.


2

Özellikle alt sorgularla, örneğin ayrıştırmayı önemli ölçüde karmaşıklaştıracağını düşünüyorum.

  FROM Foo f
  JOIN (FROM Bar b
        WHERE b.ID = f.ID
        UPDATE b
           SET b.Wibble = 1) x
    ON x.ID = f.ID
SELECT f.XYZ

Bunu ayrıştırmak daha karmaşık olurdu. UPDATE öğesinin FROM yan tümcesini çözümleyene kadar bir sözdizimi hatası olduğunu söyleyemezsiniz ve ayrıştırıcının bir alt sorguyu ayrıştırdığını bilmek için yeterli bağlamı hatırlaması gerekir. Zaten alt sorgularda güncellemelere izin verildiğini sanmıyorum, ancak eğer öyleyse (belki bir RETURNING cümlesiyle) öyleyse, SELECT ifadesini çözümleyene kadar bunun geçersiz olduğunu söyleyemeyebilirsiniz.

Bu, en azından dilbilgisi için k değerini artırır ve en kötüsü bağlamı hassas kılar, ancak bu benim oldukça loş bir şekilde hatırlanan derleyici tasarım kağıtlarımın sınırlarını zorluyor.


Bunun için Wiki makalesine bakıldığında QUELaynı anda geliştirildi ve sözdizimi cümlelerinin sırası OP'nin önerdiği gibi.
Martin Smith
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.