Bagikan melalui


Perbedaan Entity SQL dari Transact-SQL

Artikel ini menjelaskan perbedaan antara Entity SQL dan Transact-SQL.

Dukungan Turunan dan Hubungan

Entity SQL bekerja secara langsung dengan skema entitas konseptual dan mendukung fitur model konseptual seperti turunan dan hubungan.

Saat bekerja dengan turunan, Entity SQL seringkali berguna untuk memilih contoh subjenis dari koleksi instans supertipe. Operator oftype di Entity SQL (mirip dengan oftype di C# Sequences) menyediakan kemampuan ini.

Dukungan untuk Koleksi

Entity SQL memperlakukan koleksi sebagai entitas kelas satu. Misalnya:

  • Ekspresi koleksi valid dalam klausa from.

  • Subkueri in dan exists telah digeneralisasi untuk memungkinkan pengumpulan apa pun.

    Subkueri adalah salah satu jenis koleksi. e1 in e2 dan exists(e) adalah konstruksi Entity SQL untuk melakukan operasi ini.

  • Operasi kumpulan, seperti union, intersect, dan except, sekarang beroperasi pada koleksi.

  • Penggabungan beroperasi pada koleksi.

Dukungan untuk Ekspresi

Transact-SQL memiliki subkueri (tabel) dan ekspresi (baris dan kolom).

Untuk mendukung koleksi dan koleksi berlapis, Entity SQL membuat segalanya menjadi ekspresi. Entity SQL lebih dapat disusun daripada Transact-SQL—setiap ekspresi dapat digunakan di mana saja. Ekspresi kueri selalu menghasilkan koleksi dari jenis yang diproyeksikan dan dapat digunakan di mana saja ekspresi koleksi diizinkan. Untuk informasi tentang ekspresi Transact-SQL yang tidak didukung di Entity SQL, baca Ekspresi yang Tidak Didukung.

Berikut ini adalah semua kueri Entity SQL yang valid:

1+2 *3  
"abc"  
row(1 as a, 2 as b)  
{ 1, 3, 5}
e1 union all e2  
set(e1)  

Perlakuan Seragam untuk Subkueri

Mengingat penekanannya pada tabel, Transact-SQL melakukan interpretasi kontekstual dari subkueri. Misalnya, subkueri dalam klausa from dianggap sebagai multiset (tabel). Tetapi subkueri yang sama yang digunakan dalam klausa select dianggap sebagai subkueri skalar. Demikian pula, subkueri yang digunakan di sisi kiri operator in dianggap sebagai subkueri skalar, sedangkan sisi kanan diharapkan menjadi subkueri multiset.

Entity SQL menghilangkan perbedaan ini. Sebuah ekspresi memiliki interpretasi yang seragam yang tidak bergantung pada konteks penggunaannya. Entity SQL menganggap semua subkueri sebagai subkueri multiset. Jika nilai skalar diinginkan dari subkueri, Entity SQL menyediakan operator anyelement yang beroperasi pada koleksi (dalam hal ini, subkueri), dan mengekstrak nilai tunggal dari koleksi.

Menghindari Pemaksaan Implisit untuk Subkueri

Efek samping terkait dari perlakuan seragam subkueri adalah konversi implisit subkueri ke nilai skalar. Secara khusus di Transact-SQL, multiset baris (dengan satu bidang) secara implisit diubah menjadi nilai skalar yang jenis datanya adalah bidang tersebut.

Entity SQL tidak mendukung pemaksaan implisit ini. Entity SQL menyediakan operator ANYELEMENT untuk mengekstrak nilai tunggal dari koleksi, dan klausa select value untuk menghindari pembuatan pembungkus baris selama ekspresi kueri.

Pilih Nilai: Menghindari Pembungkus Baris Implisit

Klausa pilih dalam subkueri Transact-SQL secara implisit membuat pembungkus baris di sekitar item dalam klausa. Cara ini menyiratkan bahwa kita tidak dapat membuat koleksi skalar atau objek. Transact-SQL memungkinkan pemaksaan implisit antara rowtype dengan satu bidang dan nilai tunggal dari jenis data yang sama.

Entity SQL menyediakan klausa select value untuk melompati konstruksi baris implisit. Hanya satu item yang dapat ditentukan dalam klausa select value. Ketika klausa seperti itu digunakan, tidak ada pembungkus baris yang dibangun di sekitar item dalam klausa select, dan koleksi bentuk yang diinginkan dapat dihasilkan, misalnya select value a.

Entity SQL juga menyediakan konstruktor baris untuk membuat baris arbitrer. select mengambil satu atau beberapa elemen dalam proyeksi dan menghasilkan rekaman data dengan bidang:

select a, b, c

Aliasing dan Korelasi Kiri

Dalam Transact-SQL, ekspresi dalam cakupan tertentu (klausa tunggal seperti select atau from) tidak dapat merujuk ekspresi yang ditentukan sebelumnya dalam cakupan yang sama. Beberapa dialek SQL (termasuk Transact-SQL) mendukung bentuk terbatas ini dalam klausa from.

Entity SQL menggeneralisasi korelasi kiri dalam klausa from, dan memperlakukannya secara seragam. Ekspresi dalam klausa from dapat merujuk definisi sebelumnya (definisi di sebelah kiri) dalam klausa yang sama tanpa memerlukan sintaksis tambahan.

Entity SQL juga memberlakukan batasan tambahan pada kueri yang melibatkan klausul group by. Ekspresi dalam klausul select dan having dari kueri tersebut hanya dapat merujuk ke kunci group by melalui aliasnya. Konstruksi berikut ini valid dalam Transact-SQL tetapi tidak dalam Entity SQL:

SELECT t.x + t.y FROM T AS t group BY t.x + t.y

Untuk melakukan ini di Entity SQL:

SELECT k FROM T AS t GROUP BY (t.x + t.y) AS k

Kolom Referensi (Properti) Tabel (Koleksi)

Semua referensi kolom di Entity SQL harus memenuhi syarat dengan alias tabel. Konstruksi berikut (dengan asumsi bahwa a adalah kolom tabel yang valid T) valid di Transact-SQL tetapi tidak di Entity SQL.

SELECT a FROM T

Bentuk Entity SQL adalah

SELECT t.a AS A FROM T AS t

Alias tabel bersifat opsional dalam klausul from. Nama tabel digunakan sebagai alias implisit. Entity SQL memungkinkan formulir berikut dan juga:

SELECT Tab.a FROM Tab

Transact-SQL menggunakan "." notasi untuk referensi kolom (baris) tabel. Entity SQL memperluas notasi ini (dipinjam dari bahasa pemrograman) untuk mendukung navigasi melalui properti suatu objek.

Misalnya, jika p adalah ekspresi dari jenis Orang, berikut ini adalah sintaksis Entity SQL untuk merujuk kota alamat orang ini.

p.Address.City

Tidak Ada Dukungan untuk *

Transact-SQL mendukung sintaksis * yang tidak memenuhi syarat sebagai alias untuk seluruh baris, dan sintaksis * yang memenuhi syarat (t.*) sebagai pintasan untuk bidang tabel itu. Selain itu, Transact-SQL memungkinkan agregat count(*) khusus, yang mencakup null.

Entity SQL tidak mendukung konstruksi *. Kueri Transact-SQL dalam bentuk select * from T dan select T1.* from T1, T2... dapat dinyatakan dalam Entity SQL masing-masing sebagai select value t from T as t dan select value t1 from T1 as t1, T2 as t2.... Selain itu, konstruksi ini menangani turunan (kemampuan substitusi nilai), sedangkan varian select * dibatasi untuk properti tingkat atas dari jenis yang dideklarasikan.

Entity SQL tidak mendukung agregat count(*). Gunakan count(0) sebagai gantinya.

Perubahan pada Grup Berdasarkan

Entity SQL mendukung aliasing kunci group by. Ekspresi dalam klausul select dan klausul having harus merujuk ke kunci group by melalui alias ini. Misalnya, sintaksis Entity SQL ini:

SELECT k1, count(t.a), sum(t.a)
FROM T AS t
GROUP BY t.b + t.c AS k1

...setara dengan Transact-SQL berikut:

SELECT b + c, count(*), sum(a)
FROM T
GROUP BY b + c

Agregat Berbasis Koleksi

Entity SQL mendukung dua jenis agregat.

Agregat berbasis koleksi beroperasi pada koleksi dan menghasilkan hasil agregat. Agregat ini dapat muncul di mana saja dalam kueri, dan tidak memerlukan klausa group by. Misalnya:

SELECT t.a AS a, count({1,2,3}) AS b FROM T AS t

Entity SQL juga mendukung agregat gaya SQL. Misalnya:

SELECT a, sum(t.b) FROM T AS t GROUP BY t.a AS a

Penggunaan Klausul ORDER BY

Transact-SQL memungkinkan klausul ORDER BY ditentukan hanya di blok SELECT .. FROM .. WHERE paling atas. Di Entity SQL, Anda dapat menggunakan ekspresi ORDER BY bertumpuk dan dapat ditempatkan di mana saja dalam kueri, tetapi pengurutan dalam kueri bertumpuk tidak dipertahankan.

-- The following query will order the results by the last name  
SELECT C1.FirstName, C1.LastName  
        FROM AdventureWorks.Contact AS C1
        ORDER BY C1.LastName  
-- In the following query ordering of the nested query is ignored.  
SELECT C2.FirstName, C2.LastName  
    FROM (SELECT C1.FirstName, C1.LastName  
        FROM AdventureWorks.Contact as C1  
        ORDER BY C1.LastName) as C2  

Identifiers

Dalam Transact-SQL, perbandingan pengenal didasarkan pada pemeriksaan database saat ini. Di Entity SQL, pengidentifikasi selalu peka huruf besar/kecil dan peka aksen (yaitu, Entity SQL membedakan antara karakter beraksen dan tidak beraksen; misalnya, 'a' tidak sama dengan 'ấ'). Entity SQL memperlakukan versi huruf yang tampak sama tetapi berasal dari halaman kode yang berbeda sebagai karakter yang berbeda. Untuk informasi selengkapnya, lihat Tataan Karakter Input.

Fungsionalitas Transact-SQL Tidak Tersedia di Entity SQL

Fungsionalitas Transact-SQL berikut ini tidak tersedia di Entity SQL.

DML
Entity SQL saat ini tidak menyediakan dukungan untuk pernyataan DML (insert, update, delete).

DDL
Entity SQL tidak memberikan dukungan untuk DDL dalam versi saat ini.

Pemrograman Imperatif
Entity SQL tidak memberikan dukungan untuk pemrograman imperatif, tidak seperti Transact-SQL. Gunakan bahasa pemrograman sebagai gantinya.

Fungsi Pengelompokan
Entity SQL belum menyediakan dukungan untuk fungsi pengelompokan (misalnya, CUBE, ROLLUP, dan GROUPING_SET).

Fungsi Analitik
Entity SQL tidak (belum) menyediakan dukungan untuk fungsi analitik.

Fungsi Bawaan, Operator
Entity SQL mendukung subset dari fungsi dan operator bawaan Transact-SQL. Operator dan fungsi ini kemungkinan besar akan didukung oleh penyedia layanan utama. Entity SQL menggunakan fungsi khusus penyimpanan yang dideklarasikan dalam manifes penyedia. Selain itu, Entity Framework memungkinkan Anda untuk mendeklarasikan fungsi penyimpanan bawaan dan yang ditentukan pengguna, untuk digunakan Entity SQL.

Petunjuk
Entity SQL tidak menyediakan mekanisme untuk petunjuk kueri.

Hasil Kueri Pembuatan Batch
Entity SQL tidak mendukung hasil kueri pembuatan batch. Misalnya, berikut ini adalah Transact-SQL yang valid (mengirim sebagai batch):

SELECT * FROM products;
SELECT * FROM categories;

Namun, Entity SQL yang setara tidak didukung:

SELECT value p FROM Products AS p;
SELECT value c FROM Categories AS c;

Entity SQL hanya mendukung satu pernyataan kueri yang menghasilkan hasil per perintah.

Lihat juga