SQL Veri Manipülasyon Dili
SQL veri işleme dili (DML), veritabanı verilerini sorgulamak ve değiştirmek için kullanılır. Bu bölümde, aşağıda tanımlanan SELECT, INSERT, UPDATE ve DELETE SQL DML komut deyimlerinin nasıl kullanılacağı anlatılacaktır.
- SELECT - veritabanındaki verileri sorgulamak için
- INSERT - bir tabloya veri eklemek için
- UPDATE - bir tablodaki verileri güncellemek için
- DELETE - bir tablodan veri silmek için
SQL DML deyimi içinde:
- Bir ifadedeki her cümle yeni bir satırda başlamalıdır.
- Her cümlenin başlangıcı diğer cümlelerin başlangıcı ile aynı hizada olmalıdır.
- Bir cümlenin birkaç bölümü varsa, bunlar ayrı satırlarda görünmeli ve ilişkiyi göstermek için cümlenin başlangıcının altında girintili olmalıdır.
- Ayrılmış kelimeleri temsil etmek için büyük harfler kullanılır.
- Kullanıcı tanımlı kelimeleri temsil etmek için küçük harfler kullanılır.
SELECT İfadesi
SELECT ifadesi veya komutu, kullanıcının belirli kriterlere dayalı olarak tablolardan veri çekmesine olanak tanır. Aşağıdaki sıraya göre işlenir:
SELECT DISTINCT öğe(ler)
FROM tablo(lar)
WHERE yüklemi
GROUP BY alan(lar)ı
ORDER BY alanlar
Employees tablosundan bir çalışan telefon listesi oluşturmak için SELECT deyimini aşağıdaki gibi kullanabiliriz:
SELECT FirstName, LastName, phone FROM Employees ORDER BY LastName |
Bu eylem, aşağıdaki tabloda görülen Employees (Çalışanlar) tablosundan çalışanın soyadını, adını ve telefon numarasını görüntüler.
Last Name | First Name | Phone Number |
Hagans | Jim | 604-232-3232 |
Wong | Bruce | 604-244-2322 |
Bir sonraki örnekte, bir Publishers tablosu kullanacağız (Aşağıdaki tablo). ( Example Publishing ve ABC Publishing için Yayıncı Ülkesi alanında Kanada'nın yanlış yazıldığını fark edeceksiniz. Yanlış yazımı düzeltmek için ülke alanını Canada olarak standartlaştırmak üzere UPDATE deyimini kullanın - bu bölümün ilerleyen kısımlarında UPDATE deyimine bakın).
Publisher Name | Publisher City | Publisher Province | Publisher Country |
Acme Publishing | Vancouver | BC | Canada |
Example Publishing | Edmonton | AB | Cnada |
ABC Publishing | Toronto | ON | Canda |
Yayıncının adını ve şehrini eklerseniz, SELECT deyimini ve ardından virgülle ayrılmış alan adlarını kullanırsınız:
SELECT PubName, city FROM Publishers |
Bu eylem Yayıncılar tablosundan yayıncının adını ve şehrini görüntüler.
City görünen adı altında yalnızca yayıncının adını istiyorsanız, pub_name ve city'yi virgülle ayırmadan SELECT deyimini kullanırsınız:
SELECT PubName city FROM Publishers |
Bu eylemin gerçekleştirilmesi, Publishers tablosundan yalnızca pub_name'i bir "city" başlığıyla görüntüleyecektir. Virgülü dahil etmezseniz, SQL Server pub_name için yeni bir sütun adı istediğinizi varsayar.
WHERE ölçütlü SELECT ifadesi
Bazen Publishers tablosunun bir bölümüne odaklanmak isteyebilirsiniz, örneğin yalnızca Vancouver'da bulunan yayıncılar gibi. Bu durumda, WHERE kriteriyle birlikte SELECT ifadesini kullanırsınız, yani WHERE city = 'Vancouver'.
Bu ilk iki örnek, BETWEEN kullanarak WHERE ölçütü ile kayıt seçiminin nasıl sınırlandırılacağını göstermektedir. Bu örneklerin her biri, stokta 20 ila 50 arasında ürün bulunan mağaza ürünleri için aynı sonuçları verir.
Örnek #1, miktarı 20 ile 50 arasında olan qty'yi kullanmaktadır.
SELECT StorID, qty, TitleID FROM Sales WHERE qty BETWEEN 20 and 50 (includes the 20 and 50) |
Diğer yandan Örnek #2, adet >=20 ve adet <=50 kullanır.
SELECT StorID, qty, TitleID FROM Sales WHERE qty >= 20 and qty <= 50 |
Örnek #3, NOT BETWEEN kullanarak WHERE ölçütü ile kayıt seçiminin nasıl sınırlandırılacağını göstermektedir.
SELECT StorID, qty, TitleID FROM Sales WHERE qty NOT BETWEEN 20 and 50 |
İlerideki iki örnek, kayıt seçimini IN kullanarak WHERE kriteriyle sınırlamanın iki farklı yolunu gösterir ve her biri aynı sonuçları verir.
Örnek #4, WHERE ifadesinin bir parçası olarak province= kullanarak kayıtların nasıl seçileceğini gösterir.
SELECT * FROM Publishers WHERE province = ‘BC’ OR province = ‘AB’ OR province = ‘ON’ |
Örnek #5 WHERE ifadesinin bir parçası olarak province IN kullanarak kayıtları seçer.
SELECT * FROM Publishers WHERE province IN (‘BC’, ‘AB’, ‘ON’) |
Son iki örnek, kayıtları seçmek için NULL ve NOT NULL öğelerinin nasıl kullanılabileceğini göstermektedir. Bu örnekler için, Title, Quantity ve Price (kitabın fiyatı) adlı alanları içeren bir Books tablosu (gösterilmemiştir) kullanılacaktır. Her yayıncının tüm kitaplarını listeleyen bir Books tablosu vardır.
Örnek #6 NULL kullanır.
SELECT price, title FROM Books WHERE price IS NULL |
Örnek #7 NOT NULL kullanır.
SELECT price, title FROM Books WHERE price IS NOT NULL |
LIKE cümlesinde joker karakterleri kullanma
LIKE anahtar sözcüğü, karakter dizelerinin belirtilen bölümleriyle eşleşen alanları içeren satırları seçer. LIKE char, varchar, text, datetime ve smalldatetime verileri ile kullanılır. Joker karakter, kullanıcının belirli harfleri içeren alanlarla eşleşmesini sağlar. Örneğin, province = 'N%' joker karakteri 'N' harfi ile başlayan tüm illeri verecektir. Aşağıdaki tablo, SELECT ifadesinde joker karakterleri düzenli ifade biçiminde belirtmenin dört yolunu gösterir.
% | Sıfır veya daha fazla karakterden oluşan herhangi bir dize |
_ | Herhangi bir tek karakter |
[ ] | Belirtilen aralıktaki (örn. [a-f]) veya kümedeki (örn. [abcdef]) herhangi bir tek karakter |
[^] | Belirtilen aralıkta (örn. [^a – f]) veya kümede (örn. [^abcdef]) olmayan herhangi bir tek karakter |
1 numaralı örnekte, LIKE 'Mc%', "Mc" harfleriyle başlayan tüm soyadlarını arar (örneğin, McBadden).
SELECT LastName FROM Employees WHERE LastName LIKE ‘Mc%’ |
Örnek #2: LIKE '%inger', "inger" harfleriyle biten tüm soyadlarını arar (örneğin, Ringer, Stringer).
SELECT LastName FROM Employees WHERE LastName LIKE ‘%inger’ |
Örnek #3: LIKE '%en%', "en" harflerini içeren tüm soyadlarını arar (örneğin, Bennett, Green, McBadden).
SELECT LastName FROM Employees WHERE LastName LIKE ‘%en%’ |
ORDER BY yan tümcesi ile SELECT ifadesi
Ortaya çıkan listedeki kayıtları sıralamak için ORDER BY cümlesi kullanılır. Sonuçları artan sırada sıralamak için ASC'yi, azalan sırada sıralamak için DESC'yi kullanın.
Örneğin, ASC ile:
SELECT * FROM Employees ORDER BY HireDate ASC |
Ve DESC ile:
SELECT * FROM Books ORDER BY type, price DESC |
GROUP BY yan tümcesi ile SELECT ifadesi
GROUP BY cümlesi, her grup için bir çıktı satırı oluşturmak için kullanılır ve aşağıda gösterildiği gibi seçilen sütunlar için özet değerler üretir.
SELECT type FROM Books GROUP BY type |
İşte yukarıdaki ifadeyi kullanan bir örnek.
SELECT type AS ‘Type’, MIN(price) AS ‘Minimum Price’ FROM Books WHERE royalty > 10 GROUP BY type |
SELECT ifadesi, fiyatın null olmadığı bir WHERE ölçütü içeriyorsa,
SELECT type, price FROM Books WHERE price is not null |
sonra GROUP BY cümlesini içeren bir ifade şu şekilde görünür:
SELECT type AS ‘Type’, MIN(price) AS ‘Minimum Price’ FROM Books WHERE price is not null GROUP BY type |
GROUP BY ile COUNT Kullanımı
Bir kapta kaç öğe olduğunu saymak için COUNT'u kullanabiliriz. Ancak, farklı renklerdeki misketler gibi farklı öğeleri ayrı gruplar halinde saymak istiyorsak, GROUP BY komutuyla birlikte COUNT işlevini kullanırız.
Aşağıdaki SELECT ifadesi, GROUP BY cümlesiyle birlikte COUNT fonksiyonunu kullanarak veri gruplarının nasıl sayılacağını göstermektedir.
SELECT COUNT(*) FROM Books GROUP BY type |
GROUP BY ile AVG ve SUM Kullanma
Herhangi bir grubun ortalamasını vermek için AVG işlevini ve toplamı vermek için SUM işlevini kullanabiliriz.
Örnek #1, GROUP BY türü ile AVG FONKSİYON'unu kullanır.
SELECT AVG(qty) FROM Books GROUP BY type |
Örnek #2, GROUP BY türüyle birlikte SUM işlevini kullanır.
SELECT SUM(qty) FROM Books GROUP BY type |
Örnek #3, SELECT deyiminde GROUP BY türüyle birlikte hem AVG hem de SUM işlevlerini kullanır.
SELECT ‘Total Sales’ = SUM(qty), ‘Average Sales’ = AVG(qty), stor_id FROM Sales GROUP BY StorID ORDER BY ‘Total Sales’ |
HAVING ile satırları kısıtlama
HAVING cümlesi satırları kısıtlamak için kullanılabilir. HAVING'in toplama işlevini içerebilmesi dışında WHERE koşuluna benzer; WHERE bunu yapamaz.
HAVING cümlesi WHERE cümlesi gibi davranır, ancak gruplar için geçerlidir. Bu örnekte, 'BC' iline sahip grupları hariç tutmak için HAVING cümlesini kullanıyoruz.
SELECT au_fname AS ‘Author”s First Name’, province as ‘Province’ FROM Authors GROUP BY au_fname, province HAVING province <> ‘BC’ |
INSERT deyimi
INSERT deyimi bir tabloya satır ekler. Ek olarak,
- INSERT, verilerin ekleneceği tablo veya görünümü belirtir.
- Column_list, INSERT işleminden etkilenecek sütunları listeler.
- Bir sütun atlanırsa, her bir değer sağlanmalıdır.
- Sütunları dahil ediyorsanız, bunlar herhangi bir sırada listelenebilir.
- VALUES, tabloya eklemek istediğiniz verileri belirtir. VALUES zorunludur.
- IDENTITY özelliğine sahip sütunlar, column_list veya values_clause içinde açıkça listelenmemelidir.
INSERT ifadesi için sözdizimi şöyledir:
INSERT [INTO] Table_name | view name [column_list] DEFAULT VALUES | values_list | select statement |
INSERT ifadesiyle satır eklerken bu kurallar geçerlidir:
- Bir varchar veya text sütununa boş bir dize (' ') eklendiğinde tek bir boşluk eklenir.
- Tüm char sütunları tanımlanan uzunlukta sağa doldurulur.
- Yalnızca boşluk içeren dizeler dışında, varchar sütunlarına eklenen verilerden sondaki tüm boşluklar kaldırılır. Bu dizeler tek bir boşluğa kırpılır.
- Bir INSERT ifadesi bir kısıtlamayı, varsayılanı veya kuralı ihlal ederse ya da yanlış veri türündeyse, ifade başarısız olur ve SQL Server bir hata mesajı görüntüler.
column_list'teki sütunlardan yalnızca bazıları için değer belirttiğinizde, değeri olmayan sütunlara aşağıdaki üç şeyden biri olabilir:
- Sütun bir DEFAULT kısıtlamasına sahipse, sütuna bir varsayılan bağlıysa veya temel kullanıcı tanımlı veri türüne bir varsayılan bağlıysa varsayılan bir değer girilir.
- Sütun NULL'lara izin veriyorsa ve sütun için varsayılan değer yoksa NULL girilir.
- Sütun NOT NULL olarak tanımlanmışsa ve varsayılan yoksa bir hata mesajı görüntülenir ve satır reddedilir.
Bu örnek, yayıncının Authors tablosuna bir kayıt eklemek için INSERT kullanır.
INSERT INTO Authors VALUES(‘555-093-467’, ‘Martin’, ‘April’, ‘281 555-5673’, ‘816 Market St.,’ , ‘Vancouver’, ‘BC’, ‘V7G3P4’, 0) |
Aşağıdaki örnekte, Publishers tablosuna bir sütun listesiyle kısmi bir satırın nasıl ekleneceği gösterilmektedir. Ülke sütununun varsayılan değeri Canada'dır, bu nedenle değerlerinize dahil etmenizi gerektirmez.
INSERT INTO Publishers (PubID, PubName, city, province) VALUES (‘9900’, ‘Acme Publishing’, ‘Vancouver’, ‘BC’) |
IDENTITY sütununa sahip bir tabloya satır eklemek için aşağıdaki örneği izleyin. IDENTITY için değer veya sütun listesindeki sütunun adını sağlamayın.
INSERT INTO jobs VALUES (‘DBA’, 100, 175) |
Bir IDENTITY sütununa belirli değerler ekleme
Varsayılan olarak, bir IDENTITY sütununa doğrudan veri eklenemez; ancak, bir satır yanlışlıkla silinirse veya IDENTITY sütun değerlerinde boşluklar varsa, bir satır ekleyebilir ve IDENTITY sütun değerini belirtebilirsiniz.
IDENTITY_INSERT option |
Belirli bir kimlik değeri ile eklemeye izin vermek için IDENTITY_INSERT seçeneği aşağıdaki gibi kullanılabilir.
SET IDENTITY_INSERT jobs ON INSERT INTO jobs (job_id, job_desc, min_lvl, max_lvl) VALUES (19, ’DBA2’, 100, 175) SET IDENTITY_INSERT jobs OFF |
SELECT ifadesi ile satır ekleme
Bazen büyük bir tablodan küçük bir geçici tablo oluşturabiliriz. Bunun için bir SELECT ifadesi ile satır ekleyebiliriz. Bu komut kullanılırken, benzersizlik için herhangi bir doğrulama yapılmaz. Sonuç olarak, aşağıdaki örnekte aynı pub_id'ye sahip birçok satır olabilir.
Bu örnek, CREATE TABLE ifadesini kullanarak daha küçük bir geçici Publishers tablosu oluşturur. Ardından, publis tablosundan bu geçici Publishers tablosuna kayıt eklemek için SELECT ile INSERT ifadesi kullanılır.
CREATE TABLE dbo.tmpPublishers ( PubID char (4) NOT NULL , PubName varchar (40) NULL , city varchar (20) NULL , province char (2) NULL , country varchar (30) NULL DEFAULT (‘Canada’) ) INSERT tmpPublishers SELECT * FROM Publishers |
Bu örnekte, verilerin bir alt kümesini kopyalıyoruz.
INSERT tmpPublishers (pub_id, pub_name) SELECT PubID, PubName FROM Publishers |
Bu örnekte, yayıncıların verileri tmpPublishers tablosuna kopyalanır ve ülke sütunu Canada olarak ayarlanır.
INSERT tmpPublishers (PubID, PubName, city, province, country) SELECT PubID, PubName, city, province, ‘Canada’ FROM Publishers |
UPDATE ifadesi
UPDATE ifadesi, yeni veri ekleyerek veya mevcut verileri değiştirerek mevcut satırlardaki verileri değiştirir.
Bu örnek, Publishers tablosundaki tüm kayıtlar için ülke alanını Canada olarak standartlaştırmak üzere UPDATE deyimini kullanır.
UPDATE Publishers SET country = ‘Canada’ |
Bu örnek, 10 ile 20 arasındaki royalty tutarları için royalty tutarını %10 artırır.
UPDATE roysched SET royalty = royalty + (royalty * .10) WHERE royalty BETWEEN 10 and 20 |
UPDATE ifadesine alt sorguları dahil etme
Çalışanlar tablosundan 2010 yılında yayıncı tarafından işe alınan çalışanlara, iş türlerine göre en yüksek iş seviyesine terfi verilir. UPDATE ifadesi bu şekilde görünecektir.
UPDATE Employees SET job_lvl = (SELECT max_lvl FROM jobs WHERE employee.job_id = jobs.job_id) WHERE DATEPART(year, employee.hire_date) = 2010 |
DELETE ifadesi
DELETE ifadesi bir kayıt kümesinden satırları kaldırır. DELETE, silinecek satırları tutan tablo veya görünümü adlandırır ve bir seferde yalnızca bir tablo veya satır listelenebilir. WHERE, silme işlemini seçilen kayıtlarla sınırlayan standart bir WHERE cümlesidir.
DELETE söz dizimi şu şekildedir.
DELETE [FROM] {table_name | view_name } [WHERE clause] |
DELETE ifadesi için kurallar şunlardır:
- WHERE cümlesini atlarsanız, tablodaki tüm satırlar kaldırılır (dizinler, tablo, kısıtlamalar hariç).
- DELETE, birden fazla tabloyu adlandıran bir FROM cümlesine sahip bir görünümle kullanılamaz. (Delete aynı anda yalnızca bir temel tabloyu etkileyebilir).
Aşağıda kullanılabilecek üç farklı DELETE ifadesi yer almaktadır.
- Bir tablodaki tüm satırları silme.
DELETE FROM Discounts |
2. Seçilen satırları silme:
DELETE FROM Sales WHERE stor_id = ‘6380’ |
3. Alt sorgudaki bir değere göre satırları silme:
DELETE FROM Sales WHERE title_id IN (SELECT title_id FROM Books WHERE type = ‘mod_cook’) |
Yerleşik İşlevler
SQL Server'da aşağıdakiler gibi birçok yerleşik işlev vardır:
- Aggregate: özet değerleri döndürür
- Conversion: bir veri türünü diğerine dönüştürür
- Date: tarihler ve saatler hakkında bilgi görüntüler
- Mathematical: sayısal veriler üzerinde işlemler gerçekleştirir
- String: karakter dizeleri, ikili veriler veya ifadeler üzerinde işlemler gerçekleştirir
- System: veritabanından özel bir bilgi parçası döndürür
- Text and image: metin ve görüntü verileri üzerinde işlemler gerçekleştirir
Aşağıda ilk dört işlev için ayrıntılı açıklamalar ve örnekler bulacaksınız.
Aggregate fonksiyonları
Aggregate fonksiyonları bir dizi değer üzerinde hesaplama yapar ve tek veya özet bir değer döndürür. Aşağıdaki tablo bu fonksiyonları listeler.
Fonksiyon | Açıklama |
AVG | İfadedeki tüm değerlerin veya yalnızca DISTINCT değerlerinin ortalamasını döndürür. |
COUNT | İfadedeki boş olmayan değerlerin sayısını döndürür. DISTINCT belirtildiğinde, COUNT boş olmayan benzersiz değerlerin sayısını bulur. |
COUNT(*) | Satır sayısını döndürür. COUNT(*) parametre almaz ve DISTINCT ile birlikte kullanılamaz. |
MAX | İfadedeki maksimum değeri döndürür. MAX sayısal, karakter ve datetime sütunlarıyla kullanılabilir, ancak bit sütunlarıyla kullanılamaz. Karakter sütunlarında MAX, harmanlama dizisindeki en yüksek değeri bulur. MAX, boş değerleri yoksayar. |
MIN | İfadedeki minimum değeri döndürür. MIN; sayısal, karakter ve datetime sütunlarıyla kullanılabilir, ancak bit sütunlarıyla kullanılamaz. Karakter sütunlarında MIN, sıralama dizisinde en düşük olan değeri bulur. MIN, boş değerleri yoksayar. |
SUM | İfadedeki tüm değerlerin veya yalnızca DISTINCT değerlerinin toplamını döndürür. SUM yalnızca sayısal sütunlarla kullanılabilir. |
Aşağıda yukarıdaki tabloda listelenen toplam fonksiyonların her birine örnekler verilmiştir.
Örnek #1: AVG
SELECT AVG (price) AS ‘Average Title Price’ FROM Books |
Örnek #2: COUNT
SELECT COUNT(PubID) AS ‘Number of Publishers’ FROM Publishers |
Örnek #3: COUNT
SELECT COUNT(province) AS ‘Number of Publishers’ FROM Publishers |
Örnek #3: COUNT (*)
SELECT COUNT(*) FROM Employees WHERE job_lvl = 35 |
Örnek #4: MAX
SELECT MAX (HireDate) FROM Employees |
Örnek #5: MIN
SELECT MIN (price) FROM Books |
Örnek #6: SUM
SELECT SUM(discount) AS ‘Total Discounts’ FROM Discounts |
Conversion fonksiyonu
Dönüştürme işlevi bir veri türünü diğerine dönüştürür.
Aşağıdaki örnekte, iki adet 9 içeren bir fiyat beş karaktere dönüştürülmüştür. Bu ifade için söz dizimi SELECT 'The date is ' + CONVERT(varchar(12), getdate()) şeklindedir.
SELECT CONVERT(int, 10.6496) SELECT title_id, price FROM Books WHERE CONVERT(char(5), price) LIKE ‘%99%’ |
Bu ikinci örnekte, dönüştürme işlevi verileri farklı bir boyuta sahip bir veri türüne değiştirir.
SELECT title_id, CONVERT(char(4), ytd_sales) as ‘Sales’ FROM Books WHERE type LIKE ‘%cook’ |
Date işlevi
Date fonksiyonu, belirtilen bir tarihe bir aralık ekleyerek bir tarih üretir. Sonuç, date artı date parçalarının sayısına eşit bir datetime değeridir. Date parametresi bir smalldatetime değeriyse, sonuç da bir smalldatetime değeridir.
DATEADD işlevi, tarih değerlerini eklemek ve artırmak için kullanılır. Bu fonksiyonun sözdizimi DATEADD(datepart, number, date) şeklindedir.
SELECT DATEADD(day, 3, hire_date) FROM Employees |
Bu örnekte, DATEDIFF(datepart, date1, date2) işlevi kullanılmıştır.
Bu komut, belirtilen iki tarih arasında geçilen tarih bölümü "sınırlarının" sayısını döndürür. Kesişen sınırları sayma yöntemi, DATEDIFF tarafından verilen sonucu dakika, saniye ve milisaniye gibi tüm veri türlerinde tutarlı hale getirir.
SELECT DATEDIFF(day, HireDate, ‘Nov 30 1995’) FROM Employees |
Herhangi bir tarih için, o tarihin herhangi bir bölümünü yıldan milisaniyeye kadar inceleyebiliriz.
SQL Server tarafından tanınan tarih parçaları (DATEPART) ve kısaltmalar ile kabul edilebilir değerler aşağıdaki tabloda listelenmiştir.
TARİH KISMI | KISALTMA | DEĞERLER |
Year | yy | 1753-9999 |
Quarter | 1-4 | |
Month | mm | 1-12 |
Day of year | dy | 1-366 |
Day | dd | 1-31 |
Week | wk | 1-53 |
Weekday | dw | 1-7 (Sun.-Sat.) |
Hour | hh | 0-23 |
Minute | mi | 0-59 |
Second | ss | 0-59 |
Millisecond | ms | 0-999 |
Matematiksel fonksiyonlar
Matematiksel fonksiyonlar sayısal veriler üzerinde işlem yapar. Aşağıdaki örnek, yayıncı tarafından satılan her bir kitabın mevcut fiyatını ve tüm fiyatların %10 artması durumunda ne olacağını listelemektedir.
SELECT Price, (price * 1.1) AS ‘New Price’, title FROM Books SELECT ‘Square Root’ = SQRT(81) SELECT ‘Rounded‘ = ROUND(4567.9876,2) SELECT FLOOR (123.45) |
Tabloları Birleştirme
İki veya daha fazla tablonun birleştirilmesi, belirtilen sütunlardaki verilerin karşılaştırılması ve uygun satırlardan yeni bir tablo oluşturmak için karşılaştırma sonuçlarının kullanılması işlemidir. Birleştirme ifadesi:
- Her tablodan bir sütun belirtir
- Bu sütunlardaki değerleri satır satır karşılaştırır
- Nitelikli değerlere sahip satırları yeni bir satırda birleştirir
Karşılaştırma genellikle eşitlik için olsa da -tam olarak eşleşen değerler- diğer birleştirme türleri de belirtilebilir. İç, sol (dış), sağ (dış) ve çapraz birleştirme gibi tüm farklı birleştirmeler aşağıda açıklanacaktır.
İç birleştirme
İç birleştirme, aynı veri türüne sahip bir sütundaki iki tabloyu birbirine bağlar. Yalnızca sütun değerlerinin eşleştiği satırlar döndürülür; eşleşmeyen satırlar atılır.
Örnek #1
SELECT jobs.job_id, job_desc FROM jobs INNER JOIN Employees ON employee.job_id = jobs.job_id WHERE jobs.job_id < 7 |
Örnek #2
SELECT authors.au_fname, authors.au_lname, books.royalty, title FROM authorsINNER JOIN titleauthor ON authors.au_id=titleauthor.au_id INNER JOIN books ON titleauthor.title_id=books.title_id GROUP BY authors.au_lname, authors.au_fname, title, title.royalty ORDER BY authors.au_lname |
Sol dış birleştirme
Sol dış birleştirme, tüm sol dış satırların döndürüleceğini belirtir. Sol tablodaki belirtilen koşulu karşılamayan tüm satırlar sonuç kümesine dahil edilir ve diğer tablodaki çıktı sütunları NULL olarak ayarlanır.
Bu ilk örnek, sol dış birleştirme için yeni sözdizimini kullanır.
SELECT publishers.pub_name, books.title FROM Publishers LEFT OUTER JOIN Books On publishers.pub_id = books.pub_id |
Bu, eski sözdizimini kullanan bir sol dış birleştirme örneğidir.
SELECT publishers.pub_name, books.title FROM Publishers, Books WHERE publishers.pub_id *= books.pub_id |
Sağ dış birleştirme
Bir sağ dış birleştirme, sonuç kümesine sağ tablodaki belirtilen koşulu karşılamayan tüm satırları dahil eder. Diğer tabloya karşılık gelen çıktı sütunları NULL olarak ayarlanır.
Aşağıda, sağ dış birleştirme için yeni sözdizimini kullanan bir örnek yer almaktadır.
SELECT titleauthor.title_id, authors.au_lname, authors.au_fname FROM titleauthor RIGHT OUTER JOIN authors ON titleauthor.au_id = authors.au_id ORDERY BY au_lname |
Bu ikinci örnek, sağ dış birleştirme için kullanılan eski sözdizimini göstermektedir.
SELECT titleauthor.title_id, authors.au_lname, authors.au_fname FROM titleauthor, authors WHERE titleauthor.au_id =* authors.au_id ORDERY BY au_lname |
Tam dış birleştirme
Tam dış birleştirme, her iki tablodaki bir satırın seçim kriterleriyle eşleşmemesi durumunda, satırın sonuç kümesine dahil edileceğini ve diğer tabloya karşılık gelen çıktı sütunlarının NULL olarak ayarlanacağını belirtir.
İşte bir tam dış birleştirme örneği.
SELECT books.title, publishers.pub_name, publishers.province FROM Publishers FULL OUTER JOIN Books ON books.pub_id = publishers.pub_id WHERE (publishers.province <> “BC” and publishers.province <> “ON”) ORDER BY books.title_id |
Çapraz birleştirme
Çapraz birleştirme, iki tabloyu birleştiren bir çarpımdır. Bu birleştirme, WHERE cümlesi belirtilmemiş gibi aynı satırları döndürür. Örneğin:
SELECT au_lname, pub_name, FROM Authors CROSS JOIN Publishers |
Alıştırmalar |
1 ila 17. sorular için Microsoft tarafından oluşturulan PUBS örnek veritabanını kullanın. Bu veritabanını oluşturacak betiği indirmek için lütfen aşağıdaki siteye gidin: http://www.microsoft.com/en-ca/download/details.aspx?id=23654. 1. 2011’de yayınlanan yayın tarihlerinin ve başlıkların (kitapların) bir listesini görüntüleyin. 2. Geleneksel veya modern yemek pişirme olarak kategorize edilmiş başlıkların bir listesini görüntüleyin. Kitaplar tablosunu kullanın. 3. İlk adları beş harf uzunluğunda olan tüm yazarları görüntüleyin. 4. Kitaplar tablosundan şunları görüntüle: her yayıncı tarafından yayınlanan kitaplar hakkında tür, fiyat, yayıncı kimliği ve başlık bilgilerini. ‘Tür’ sütununu ‘Kitap Kategorisi’ olarak yeniden adlandırın. Önce türe (azalan) ve ardından fiyata (artan) göre sıralayın. 5. Books tablosunu kullanarak title_id, pubdate ve pubdate artı üç günü görüntüleyin. 6. datediff ve getdate fonksiyonlarını kullanarak Books tablosundaki kitapların yayınlanmasından bu yana ay cinsinden ne kadar zaman geçtiğini belirleyin. 7. 30’dan fazla kopya satan tüm kitapların başlık ID’lerini ve miktarlarını listeleyin. 8. Ontario’da (ON) yaşayan yazarların tüm soyadlarının ve yaşadıkları şehirlerin bir listesini görüntüleyin. 9. Payterms alanında bir 60 içeren tüm satırları görüntüleyin. Sales tablosunu kullanın. 10. İlk adları beş harf uzunluğunda olan , O veya A ile biten ve M veya P ile başlayan tüm yazarları görüntüleyin. 11. Fiyatı 30 dolardan fazla olan ve T ile başlayan ya da yayıncı kimliği 0877 olan tüm başlıkları görüntüleyin. 12. Employees tablosundan, iş seviyesi 200’den büyük olan çalışanlar için ad (fname), soyad (lname), çalışan kimliği (emp_id) ve iş seviyesi (job_lvl) sütunlarını görüntüleyin ve sütun başlıklarını şu şekilde yeniden adlandırın: “First Name,” “Last Name,” “IDENTIFICATION#” and “Job Level.” 13. Telif ücretini, telif ücreti artı %50’yi “telif ücreti artı 50” ve title_id olarak görüntüleyin. Roysched tablosunu kullanın. 14. STUFF işlevini kullanarak “1234567” dizesinden bir “12xxxx567” dizesi oluşturun. 15. Her başlığın ilk 40 karakterini ve o başlığın bugüne kadarki ortalama aylık satışını (ytd_sales/12) görüntüleyin. Title tablosunu kullanın. 16. Kaç kitap için fiyat belirlendiğini gösterin. 17. Her türdeki tüm kitapların ortalama maliyetini içeren bir yemek kitapları listesi görüntüleyin. GROUP BY öğesini kullanın. |
İleri Düzey Sorular (Union, Intersect ve Minus) |
1. İlişkisel küme operatörleri UNION, INTERSECT ve MINUS yalnızca ilişkiler union-compatible ise düzgün çalışır. Birlik uyumlu ne anlama gelir ve bu koşulu nasıl kontrol edersiniz? 2. UNION ve UNION ALL arasındaki fark nedir? Her biri için sözdizimini yazınız. 3. Employees ve Employees_1 olmak üzere iki tablonuz olduğunu varsayalım. Employees tablosu üç çalışanın kayıtlarını içeriyor: Alice Cordoza, John Cretchakov ve Anne McDonald. Employees_1 tablosu çalışanların kayıtlarını içerir: John Cretchakov ve Mary Chen. Bu bilgiler göz önüne alındığında, UNION sorgusu için sorgu çıktısı nedir? Sorgu çıktısını listeleyin. 4. Soru 3’teki çalışan bilgileri göz önüne alındığında, UNION ALL sorgusu için sorgu çıktısı nedir? Sorgu çıktısını listeleyin. 5. Soru 3’teki çalışan bilgileri göz önüne alındığında, INTERSECT sorgusu için sorgu çıktısı nedir? Sorgu çıktısını listeleyin. 6. Soru 3’teki çalışan bilgileri göz önüne alındığında, EXCEPT sorgusu için sorgu çıktısı nedir? Sorgu çıktısını listeleyin. 7. Çapraz birleştirme nedir? Sözdizimine bir örnek verin. 8. Bu üç birleştirme türünü açıklayın: —1. sol dış birleştirme —2. sağ dış birleştirme —3. tam dış join 9. Alt sorgu nedir ve temel özellikleri nelerdir? 10. İlişkili alt sorgu nedir? Bir örnek veriniz. 11. Bir Product tablosunun PROD_CODE ve VEND_CODE olmak üzere iki öznitelik içerdiğini varsayalım. PROD_CODE için değerler şunlardır: ABC, DEF, GHI ve JKL. Bunlar VEND_CODE için aşağıdaki değerlerle eşleşir: Sırasıyla 125, 124, 124 ve 123 (örneğin, PROD_CODE değeri ABC, VEND_CODE değeri 125’e karşılık gelir). Satıcı tablosu 123, 124, 125 ve 126 değerlerine sahip tek bir VEND_CODE özniteliği içerir. (Product tablosundaki VEND_CODE özniteliği, Vendor tablosundaki VEND_CODE için bir yabancı anahtardır). 12. Soru 11’deki bilgiler göz önüne alındığında, aşağıdakiler için sorgu çıktısı ne olurdu? Değerleri göster. —1. Bu iki tabloya dayalı bir UNION sorgusu —2. Bu iki tabloya dayalı bir UNION ALL sorgusu —3. Bu iki tabloya dayalı bir INTERSECT sorgusu —4. Bu iki tabloya dayalı bir MINUS sorgusu |
İleri Düzey Sorular (Birleştirmeleri Kullanma) |
1. Satışı olmayan başlıklar da dahil olmak üzere Kitaplar ve Satışlar tablolarındaki tüm başlıkların ve satış sayılarının bir listesini görüntüleyin. Birleştirme kullanın. 2. Yazarların soyadlarının ve her yazarın yayınladığı tüm ilişkili başlıkların yazarın soyadına göre sıralanmış bir listesini görüntüleyin. Birleştirme kullanın. Şu adda bir görünüm olarak kaydedin: Yayınlanmış Yazarlar. 3. Bir alt sorgu kullanarak, %100 telif ücreti alan ve Alberta’da yaşayan tüm yazarları (soyadını ve adını, posta kodunu gösterin) görüntüleyin. Bunu AuthorsView başlıklı bir görünüm olarak kaydedin. Görünümü oluştururken, yazarın soyadını ve adını ‘Soyadı’ ve ‘Adı’ olarak yeniden adlandırın. 4. Is Anger the Enemy başlığını satmayan mağazaları gösterin. 5. 2013’ten sonraki satışlar için mağaza adlarının bir listesini görüntüleyin (Sipariş Tarihi 2013’ten büyüktür). Mağaza adını ve sipariş tarihini görüntüleyin. 6. “News & Brews” mağaza adında satılan kitapların başlık listesini görüntüleyin. Mağaza adını, başlıkları ve sipariş tarihlerini görüntüleyin. 7. Toplam satışları (qty) başlığa göre listeleyin. Toplam miktar ve başlık sütunlarını görüntüleyin. 8. Türe göre toplam satışları (qty) listeleyin. Toplam miktar ve tür sütunlarını görüntüleyin. 9. Türe göre toplam satışları (qty*price) listeleyin. Toplam dolar değeri ve tür sütunlarını görüntüleyin. 10. Yayıncıya göre toplam kitap türü sayısını hesaplayın. Her yayıncı için yayıncı adını ve toplam kitap türü sayısını gösterin. 11. Herhangi bir kitap türüne sahip olmayan yayıncı adlarını gösterin. Yalnızca yayıncı adını göster. |
Yorumlar
Yorum Gönder