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
danexists
telah digeneralisasi untuk memungkinkan pengumpulan apa pun.Subkueri adalah salah satu jenis koleksi.
e1 in e2
danexists(e)
adalah konstruksi Entity SQL untuk melakukan operasi ini.Operasi kumpulan, seperti
union
,intersect
, danexcept
, 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
Navigasi Melalui Objek
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.