Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Artikel ini menjelaskan perbedaan antara Entity SQL dan Transact-SQL.
Dukungan Pewarisan dan Hubungan
Entity SQL bekerja langsung dengan skema entitas konseptual dan mendukung fitur model konseptual seperti warisan dan hubungan.
Saat bekerja dengan pewarisan, sering kali berguna untuk memilih instans dari subtipe dalam kumpulan instans supertipe. Operator oftype di Entity SQL (mirip oftype dengan C# Sequences) menyediakan kemampuan ini.
Dukungan untuk Koleksi
Entity SQL memperlakukan koleksi sebagai entitas kelas satu. Contohnya:
Ekspresi koleksi tersebut sah dalam klausa
from.indanexistssubkueri telah digeneralisasi untuk mengizinkan koleksi apa pun.Subkueri adalah salah satu jenis koleksi.
e1 in e2danexists(e)merupakan konstruksi SQL Entitas untuk melakukan operasi ini.Operasi set, seperti
union,intersect, danexcept, sekarang beroperasi pada kumpulan.Penggabungan beroperasi pada kumpulan data.
Dukungan untuk Ekspresi
Transact-SQL memiliki subkueri (tabel) dan ekspresi (baris dan kolom).
Untuk mendukung koleksi dan koleksi berlapis, Entity SQL menjadikan semuanya sebagai ekspresi. Entity SQL lebih mudah disusun daripada Transact-SQL—setiap ekspresi dapat digunakan di mana saja. Ekspresi kueri selalu menghasilkan kumpulan tipe yang diproyeksikan dan dapat digunakan di mana saja ekspresi koleksi diizinkan. Untuk informasi tentang ekspresi Transact-SQL yang tidak didukung di Entity SQL, lihat Ekspresi yang Tidak Didukung.
Berikut ini adalah semua kueri SQL Entitas yang valid:
1+2 *3
"abc"
row(1 as a, 2 as b)
{ 1, 3, 5}
e1 union all e2
set(e1)
Perawatan Seragam Subkueri
Mengingat penekanannya pada tabel, Transact-SQL melakukan interpretasi kontekstual subkueri. Misalnya, subkueri dalam from klausul dianggap sebagai multiset (tabel). Tetapi subkueri yang sama yang digunakan dalam select klausul dianggap sebagai subkueri skalar. Demikian pula, subkueri yang digunakan di sisi kiri operator in dianggap sebagai subkueri skalar, sementara sisi kanan diharapkan menjadi subkueri multihimpunan.
Entity SQL menghilangkan perbedaan ini. Ekspresi memiliki interpretasi seragam yang tidak bergantung pada konteks penggunaannya. Entity SQL menganggap semua subkueri sebagai subkueri multiset. Jika nilai skalar diinginkan dari subkueri, Entity SQL menyediakan anyelement operator yang beroperasi pada koleksi (dalam hal ini, subkueri), dan mengekstrak nilai singleton dari koleksi.
Menghindari Pemaksaan Implisit untuk Subkueri
Efek samping terkait dari perlakuan seragam subkueri adalah konversi implisit subkueri ke nilai skalar. Secara khusus, dalam Transact-SQL, multiset baris (dengan satu bidang) secara implisit dikonversi menjadi nilai skalar yang jenis datanya adalah bidang .
SQL entitas tidak mendukung pemaksaan implisit ini. Entity SQL menyediakan operator ANYELEMENT untuk mengekstrak nilai tunggal dari koleksi, serta klausa select value untuk menghindari pembuatan pembungkus baris dalam ekspresi kueri.
Pilih Nilai: Menghindari Pembungkus Baris Implisit
Klausa pilih dalam subkueri Transact-SQL secara implisit membuat pembungkus baris di sekitar item dalam klausa. Ini menyiratkan bahwa kita tidak dapat membuat koleksi skalar atau objek. Transact-SQL memungkinkan koersi implisit antara rowtype yang terdiri dari satu bidang dan nilai singleton dari jenis data yang sama.
Entity SQL menyediakan select value klausul untuk melewati konstruksi baris implisit. Hanya satu item yang dapat ditentukan dalam select value klausa. Ketika klausa seperti itu digunakan, tidak ada pembungkus baris yang dibangun di sekitar item dalam select klausa, dan koleksi bentuk yang diinginkan dapat diproduksi, misalnya, select value a.
Entity SQL juga menyediakan konstruktor baris untuk membangun baris arbitrer.
select mengambil satu atau beberapa elemen dalam proyeksi dan menghasilkan rekaman data dengan bidang:
select a, b, c
Korelasi Kiri dan Pembauran
Dalam Transact-SQL, ekspresi dalam cakupan tertentu (klausa tunggal seperti select atau from) tidak dapat mereferensikan ekspresi yang ditentukan sebelumnya dalam cakupan yang sama. Beberapa dialek SQL (termasuk Transact-SQL) mendukung bentuk terbatas ini dalam from klausul.
Entity SQL menggeneralisasi korelasi kiri dalam from klausul, dan memperlakukannya secara seragam. Ekspresi dalam from klausa dapat mereferensikan definisi sebelumnya (definisi ke kiri) dalam klausa yang sama tanpa perlu sintaks tambahan.
Entity SQL juga memberlakukan pembatasan tambahan pada kueri yang melibatkan group by klausul. Ekspresi dalam klausa select dan having dari kueri tersebut hanya dapat merujuk ke kunci group by melalui aliasnya. Konstruksi berikut ini valid dalam Transact-SQL tetapi tidak ada di 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
Mereferensikan Kolom (Properti) Tabel (Koleksi)
Semua referensi kolom di Entity SQL harus memenuhi syarat dengan alias tabel. Konstruksi berikut (dengan asumsi bahwa a adalah kolom yang valid dari tabel T) valid dalam Transact-SQL tetapi tidak di Entity SQL.
SELECT a FROM T
Formulir SQL Entitas adalah sebagai berikut
SELECT t.a AS A FROM T AS t
Alias tabel bersifat opsional dalam from klausa. Nama tabel digunakan sebagai alias implisit. SQL Entitas juga memungkinkan formulir berikut:
SELECT Tab.a FROM Tab
Navigasi Melalui Objek
Transact-SQL menggunakan notasi "." untuk mereferensikan kolom (baris) tabel. Entity SQL memperluas notasi ini (dipinjam dari bahasa pemrograman) untuk mendukung navigasi melalui properti objek.
Misalnya, jika p adalah ekspresi jenis Orang, berikut ini adalah sintaks SQL Entitas untuk mereferensikan kota alamat orang ini.
p.Address.City
Tidak Ada Dukungan untuk *
Transact-SQL mendukung sintaks * yang tidak memenuhi syarat sebagai alias untuk seluruh baris, dan sintaks * yang memenuhi syarat (t.*) sebagai pintasan untuk bidang tabel tersebut. Selain itu, Transact-SQL memungkinkan agregat hitungan khusus(*), yang mencakup null.
Entity SQL tidak mendukung konstruksi * . Transact-SQL kueri formulir select * from T dan select T1.* from T1, T2... dapat diekspresikan di Entity SQL sebagai select value t from T as t dan select value t1 from T1 as t1, T2 as t2..., masing-masing. Selain itu, konstruksi ini menangani pewarisan (substitutabilitas nilai), sementara select * varian dibatasi untuk properti tingkat atas dari jenis yang dideklarasikan.
SQL Entity tidak mendukung count(*) agregat. Gunakan count(0) sebagai gantinya.
Perubahan pada Pengelompokan Berdasarkan
Entity SQL mendukung alias kunci group by . Ekspresi dalam klausa select dan klausa having harus merujuk ke kunci group by melalui alias ini. Misalnya, sintaks SQL Entitas 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 Collection-Based
Entity SQL mendukung dua jenis agregat.
Agregat berbasis koleksi beroperasi pada koleksi dan menghasilkan hasil agregat. Ini dapat muncul di mana saja dalam kueri, dan tidak memerlukan group by klausa. Contohnya:
SELECT t.a AS a, count({1,2,3}) AS b FROM T AS t
Entity SQL juga mendukung agregat bergaya SQL. Contohnya:
SELECT a, sum(t.b) FROM T AS t GROUP BY t.a AS a
Penggunaan Klausa ORDER BY
Transact-SQL memungkinkan klausul ORDER BY hanya ditentukan di blok SELECT .. FROM .. WHERE yang paling atas. Di SQL Entitas, Anda dapat menggunakan ekspresi berlapis ORDER BY dan dapat ditempatkan di mana saja dalam kueri, tetapi pengurutan dalam kueri berlapis 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
Pengidentifikasi
Dalam Transact-SQL, perbandingan pengidentifikasi didasarkan pada kolase database saat ini. Dalam SQL Entitas, pengidentifikasi selalu tidak peka huruf besar/kecil dan sensitif terhadap aksen (artinya, Entitas SQL membedakan antara karakter yang beraksen dan tidak beraksen; contohnya, 'a' tidak sama dengan 'ấ'). Entity SQL memperlakukan versi huruf yang muncul sama tetapi berasal dari halaman kode yang berbeda sebagai karakter yang berbeda. Untuk informasi selengkapnya, lihat Set Karakter Input.
Fungsionalitas Tidak Tersedia di Entity SQL Transact-SQL
Fungsionalitas Transact-SQL berikut tidak tersedia di Entity SQL.
DML
Entity SQL saat ini tidak menyediakan dukungan untuk pernyataan DML (sisipkan, perbarui, hapus).
DDL
Entity SQL tidak menyediakan dukungan untuk DDL dalam versi saat ini.
Pemrograman Imperatif
Entity SQL tidak menyediakan dukungan untuk pemrograman imperatif, tidak seperti Transact-SQL. Gunakan bahasa pemrograman sebagai gantinya.
Mengelompokkan Fungsi
Entity SQL belum memberikan dukungan untuk fungsi pengelompokan (misalnya, CUBE, ROLLUP, dan GROUPING_SET).
Fungsi Analitik
SQL Entitas belum memberikan dukungan untuk fungsi analitik.
Fungsi Bawaan, Operator
Entity SQL mendukung subset fungsi dan operator bawaan Transact-SQL. Operator dan fungsi ini kemungkinan akan didukung oleh penyedia toko utama. Entity SQL menggunakan fungsi khusus penyimpanan yang dideklarasikan dalam manifes penyedia. Selain itu, Kerangka Kerja Entitas memungkinkan Anda untuk mendeklarasikan fungsi penyimpanan bawaan dan yang ditentukan pengguna yang ada, agar SQL Entitas dapat digunakan.
Petunjuk
Entity SQL tidak menyediakan mekanisme untuk petunjuk kueri.
Pengelompokan Hasil Kueri
Entity SQL tidak mendukung pengelompokan hasil kueri. Misalnya, berikut ini adalah Transact-SQL yang valid (pengiriman secara bertahap):
SELECT * FROM products;
SELECT * FROM categories;
Namun, SQL Entitas 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.