Transact-SQL Temelleri. T-SQL Programlamanın Temelleri

SQL (Yapılandırılmış Sorgu Dili) - bu, veri oluşturmak, değiştirmek ve değiştirmek için kullanılan evrensel bir bilgisayar dilidir. ilişkisel veritabanları danikh (mova yapılandırılmış istekler).

SQL bu şekilde bilgisel-mantıksal benim programlamam gibi görünüyor, ama benim programlamam değil, ama aynı zamanda SQL, prosedürel uzantılarının olasılığını taşıyor, bu tür bir dilin bir bütün olarak iyileştirilmesiyle, bir programlama dili olarak görülebilir.

Bu saatte, aşağıdaki SQL belirtimleri genişletildi:

Veri tabanı ve SQL belirtimi
Veritabanı türü SQL belirtimi
Microsoft SQL İşlem SQL'i
Microsoft Jet/Erişim Jet SQL
MySQL SQL/PSM (SQL/Kalıcı Kayıtlı Modül)
kehanet PL/SQL (Yordamsal Dil/SQL)
IBM DB2 SQL PL (SQL Prosedürel Dil)
InterBase/Firebird PSQL (Yordamsal SQL)

Bu makale, Microsoft SQL Sunucuları tarafından kazanıldığı için Transact-SQL belirtimine bakacaktır. Bize özgü Oskіlki üssü SQL aynıdır, daha fazla komut ve senaryo kolayca diğer SQL türlerine aktarılır.

Randevu

Transact-SQL, Microsoft'un SQL yordamsal uzantısıdır. Bunun gibi SQL harf uzantıları tesadüfi yetenekler yak:

  • anahtar operatörler,
  • yerel ve küresel değişiklikler,
  • farklı Ek fonksyonlar satırların, tarihlerin, matematiğin vb. işlenmesi için,
  • Microsoft Windows Kimlik Doğrulama Desteği

Mova Transact-SQL wiki'nin anahtarıdır SQL Server. Bir SQL Server örneğiyle etkileşime giren tüm programlar, uygulamalarına ve temel arabirimine bakılmaksızın, sunucuda Transact-SQL yönergelerini çalıştırır.

Veri tabanı doğrulandı

Teorik materyalde ustalaşmak için, yoganın açıkça uygulamaya konması gerekiyor. Pratik olması için, az miktarda değer için akılda kalan bir veri tabanı oluşturabiliriz.

Ayrıca, bir veritabanı oluşturmak ve onu її değerlerle depolamak için, komutları yürütmek ve SQL sunucusunu indirmek ve saldırı komut dosyasını günlüğe kaydetmek için konsolu açmak gerekir:

Veritabanı Oluşturma USE master CREATE DATABASE TestDatabase GO -- Tablo Oluşturma USE TestDatabase CREATE TABLE Kullanıcılar (UserID int PRIMARY KEY, UserName nvarchar(40), UserSurname nvarchar(40), DepartmentID int, PositionID int) CREATE , DepartmentName nvarchar(40)) CREATE TABLE Pozisyonlar (PositionID int PRIMARY KEY, PositionName nvarchar(40), BaseSalary money) CREATE TABLE (CustomerID int PRIMARY KEY, CustomerName nvarchar(40), CustomerAddress n PRIMARY KEY, CustomerID int, UserID int, text) GO -- Tabloyu doldur KULLAN TestDatabase INSERT Users VALUES (1, "Ivan", "Petrov", 1, 1) INSERT Users VALUES (2, "Ivan", "Sidorov", 1, 2) INSERT Users VALUES (3, "Petr", "Ivanov " , 1, 2) Kullanıcı DEĞERLERİNİ EKLE (4, "Nikolay", "Petrov", 1, 3) Kullanıcı DEĞERLERİNİ EKLE (5, "Nikolay", "Ivanov", 2, 1) Kullanıcı DEĞERLERİNİ EKLE (6, "Sergey " , "Sidorov", 2, 3) EKLE Kullanıcılar DEĞERLER (7, "Andrey", "Bukin", 2, 2) EKLE Kullanıcılar DEĞERLER (8, "Viktor", "Rybakov", 4, 1) EKLE Departmanlar DEĞERLER ( 1 , "Üretim") EKLE Bölümler DEĞERLER (2, "Dağıtım") EKLE Bölümler DEĞERLER (3, "Satın Alma") ", 1000) EKLE Pozisyonlar DEĞERLER (2, "Kıdemli analist", 650) DEĞERLER EKLE (1, "Alex Company ", "606443, Rusya, Bor, Lenina str., 15") DEĞERLERİ GİRİN (2, "Potrovka", "115516, Moskova, Promyshlennaya str., 1") DEĞERLERİ GİRİN (1, 1, 1, "Özel parçalar " ) GİTMEK

Not. Microsoft SQL Server 2000 için, Query Analyzer'a bağlıdır. Microsoft SQL Server 2005 için, SQL Server Management Studio'yu kontrol edin.

SQL server üzerindeki script sonucunda TestDatabase veritabanı beş coristuvach tablosu ile oluşturulacaktır: Kullanıcılar, Departmanlar, Pozisyonlar, Yerel Müşteriler, Yerel Siparişler.

Kullanıcılar
Kullanıcı kimliği Kullanıcı adı KullanıcıSoyadı Departman Kimliği Pozisyon Kimliği
1 İvan Petrov 1 1
2 İvan Sidorov 1 2
3 Peter İvanov 1 3
4 Nicholas Petrov 1 3
5 Nicholas İvanov 2 1
6 sergei Sidorov 2 3
7 Andrey Bukin 2 3
8 galip Rybakov 4 1
Pozisyonlar
Pozisyon Kimliği Pozisyon Adı Asgari ücret
1 müdür 1000
2 kıdemli analist 650
3 Analist 400
Yerel siparişler
Sipariş Kimliği Müşteri Kimliği Kullanıcı kimliği Tanım
1 1 1 Özel parçalar
Bölümler
Departman Kimliği Bölüm Adı
1 Üretme
2 dağıtım
3 Satın alma
Yerel Müşteriler
Müşteri Kimliği Müşteri adı Müşteri adresi
1 Alex Şirketi 606443, Rusya, Bor, Lenina str., 15
2 Potrovka 115516, Moskova, Promyshlennaya str., 1

Sözdizimi Öğeleri

Komut dosyası yönergeleri

Komut dosyası yönergeleri - bunlar, MS SQL'de daha yaygın olan belirli komutlardır. Qi komutları, sunucunun bir komut dosyası ve işlemlerle çalışma kurallarını belirlemesine yardımcı olur. Tipik temsilciler: GO - SQL sunucusuna betiğin sonu hakkında sinyal verir, EXEC (veya EXECUTE) - bir prosedürü veya bir skaler işlevi simgeleştirir.

Yorumlar

Komut dosyası blokları için açıklamaların oluşturulması ve ayrıca komut dosyası ayarlandığında komutların zaman sınırlaması için yorumlar çizilir. Yorumlar hem satır benzeri hem de blok benzeridir:

  • -- - bir satır yorumu, önünde iki eksi olan birden fazla satır içerir.
  • /* */ - blok yorumu, tüm komut bloğunu, belirtilen yapı için talimatları hariç tutar.

tipi danih

Dil programlamada olduğu gibi, SQL öğrenin farklı şekiller değişikliği kaydetmek için veriler:

  • Sayılar - sayısal değerleri kaydetmek için (int, tinyint, smallint, bigint, sayısal, ondalık, para, küçük para, kayan nokta, gerçek).
  • Tarih - o saatin tarihini kaydetmek için (tarihsaat, küçüktarihsaat).
  • Karakter verilerini kaydetmek için karakterler (char, nchar, varchar, nvarchar).
  • Dviykovі - ikili verileri (ikili, değişken ikili, bit) kaydetmek için.
  • Daha fazla cilt - büyük ikili verileri (metin, ntext, resim) kaydetmek için veri türleri.
  • Özel - göstergeler (imleç), 16 baytlık onaltılık sayı, GUID için bir kazanç (benzersiz tanımlayıcı), satır değiştirme damgası (zaman damgası), satır sürümü (rowversion), tablolar (tablo).

Not. Rusça sembollerin seçimi için (değil ASCII kodlaması) veri türleri, karakterleri iki bayt olarak kodlar gibi "n" (nchar, nvarchar, ntext) önekiyle yazılır. Aksi takdirde, Unicode çalışması için "n" den itibaren veri türleri kullanılır.

Not. Yaşam değişikliği verileri için "var" önekinden veri türleri yazılır. "var" öneki olmayan veri türleri bellek alanında sabitlenebilir, bazıları boşluk veya sıfırlarla doldurulabilir.

tanımlayıcılar

tanımlayıcı - ce özel karakterler, іdentifіkatsіїїїї їkh tipi аbo grupuvannya slіv u zminnu için yakі vykoristovuyutsya zі zmіnnimi. tanımlayıcı türleri:

  • @ - yerel değişikliğin tanımlayıcısı (koristuvach).
  • @@ - Küresel değişikliğin tanımlayıcısı (tanıtıldı).
  • # - prosedürün yerel tablosunun tanımlayıcısı.
  • ## - Prosedürün genel tablosunun tanımlayıcısı.
  • - Değişiklikteki kelimelerin gruplandırılmasının tanımlayıcısı.

Değişiklikler

Timchas'ın haraçını kurtarmak adına senaryolarda değişiklikler yapılır. Sob pratsyuvati zі zminnoyu, її seslendirme işlemde zdіysnen olmadan önce, takımın muzaffer tsyu zminna gibi galip gelmesi gibi, kınamak gerekir. Aksi takdirde, işlem tamamlandıktan sonra GO'dan sonra değişir gibi görünüyor.

Değiştirilen ayarlar DECLARE komutu ile değiştirilebilir, değiştirilen ayarlar SET komutu veya SELECT komutu ile ayarlanabilir:

TestDatabase -- Anonim değişiklikler KULLANIN . SELECT @EmpName AS GO sorgusunun sonucu olarak değişen @EmpName'i görme

Not. Her popo için bir değişimde kelime grubu vardır - kelimeler kare yayda yerleştirildiği için tasarım tek değişiklik olarak kabul edilir.

Operatörler

Operatörler - tse özel komutlar, değişiklikler üzerinde basit işlemler gerçekleştirmek için kullanılır:

  • Aritmetik operatörler: "*" - çarpma, "/" - bölme, "%" - modül alt bölme, "+" - toplama, "-" - toplama, "()" - yaylar.
  • Eşleşen operatörler: "=" - bir, ">" - daha fazla, "<" - меньше, ">=" - birden fazla, "<=" меньше или равно, "<>"- iyi değil.
  • Sıralama işleçleri: "+" - satırları kapatma.
  • Mantıksal işleçler: "VE" - bir, "VEYA" - ya "DEĞİL" - değil.

Sistem fonksiyonları

Transact-SQl belirtimi, standart SQL yeteneklerini aşağıdaki işlevleri içerecek şekilde önemli ölçüde genişletir:

  • Toplama işlevleri-koleksiyonlarla çalışan işlevler aynı değere sahiptir. Tipik temsilciler: AVG - sütunun ortalama değeri, SUM - sütunun toplamı, MAX - sütunun maksimum değeri, COUNT - sütundaki öğelerin sayısı.
  • Skaler fonksiyonlar, skaler verilerle çalışan veya giriş verileri olmadan girmek yerine bir değeri döndüren işlevlerdir. Tipik temsilciler: DATEDIFF – tarihler arasındaki fark, ABS – sayı modülü, DB_NAME – veri tabanı adı, USER_NAME – akış satırı kaydedici adı, SOL – veri satırının parçası.
  • Vikoristovuyutsya gibi işlevler-belirleyiciler-işlevler, sanki diğer verilere zorlanmış gibi. Tipik temsilciler: OPENXML - XML ​​yapılarına bakmak için veri ağacı göstergesi, OPENQUERY - başka bir isteğe bakmak için veri ağacı göstergesi.

Not. İşlevlerin tam listesi SQL Server Bağlantılarında bulunabilir.

Not. Skaler fonksiyonlardan önce, komut dosyası metninde underdog tarafından "@@" olarak adlandırılan genel değişiklikler ekleyebilirsiniz.

TestDatabase -- Bebek ortalama maaşı için Wiktor toplama işlevini KULLANIN Pozisyonlar GO'DAN AVG (BaseSalary) AS SEÇİN -- Veri tabanı adını almak için Wiktor skaler işlevini (30) SET @MyUser = USER_NAME() SELECT "Geçerli kullanıcının" veritabanı kullanıcı adı şu: "+ @MyUser GO -- Başka bir sunucudan veri almak için değişken arayan işlevi SELECT * FROM OPENQUERY(OracleSvr, "SEÇİCİ ad, id FROM Owner.titles") GO

Virazi

Viraz, girişte skaler bir değer aldığı ve çıkışta farklı bir değer verdiği veya skaler bir değer aldığı için semboller ve operatörlerin birleşimidir. Transact-SQL'in 3 tipi vardır: DDL, DCL ve DML.

  • DDL (Veri Tanımlama Dili) - veritabanında nesnelerin oluşturulması için hackler. Bu sınıfın ana temsilcileri şunlardır: CREATE - nesnelerin oluşturulması, ALTER - nesnelerin değiştirilmesi, DROP - nesnelerin kaldırılması.
  • DCL (Veri Kontrol Dili) - veritabanı nesnelerine ilişkin hakların tanınmasının tanınması. Bu sınıfın ana temsilcileri: HİBE - nesneye izin verildi, REDDET - nesneye çitle çevrildi, İPTAL - nesneye bu çite izin verdi.
  • DML - Veri İşleme Dili Bu sınıfın ana temsilcileri şunlardır: SELECT - veri seçimi, INSERT - veri ekleme, UPDATE - veri değişikliği, SİL - veri görünümü.

TestDatabase KULLANIN -- DDL etiketi TABLO OLUŞTUR TempUsers (UserID int, UserName nvarchar(40), DepartmentID int) GO -- DCL etiketi GRANT SELECT ON Users TO public GO -- DML etiketi SELECT UserID, UserName + " " + UserSurname AS F GO -- DDL DROP TABLE TempUsers GO wiki

Komut dosyası kontrolü

Transact-SQL, ihtiyacınız olan mantıkla doğrudan döngü içinde bir akıştaki betiği hacklemenize izin veren özel komutlara sahiptir.

  • Gruplandırma bloğu, virüsleri tek bir mantıksal blokta (BEGIN ... END) birleştiren bir yapıdır.
  • Zihin bloğu - şarkı söyleyen zihnin vizyonunu saptırmanın bir yolu olarak bir yapı (IF ... ELSE).
  • Döngü bloğu - mantıksal bir bloğun tekrarını düzenleyen bir yapı (WHILE ... BREAK ... CONTINUE).
  • Geçiş - kod akışını belirtilen etikete (GOTO) geçirme komutu.
  • Zatrimka - vikonannya senaryosunu zatrimka yapan bir ekip (WAITFOR)
  • Pardon Weekly – bir betik için af oluşturan bir komut (RAISERROR)

Virüslerin dinamik tasarımı

Ardından, Transact-SQL'in temellerini anladıktan ve basit uygulamalar üzerinde pratik yaptıktan sonra, katlama yapılarına geçebilirsiniz. Veri tabanlarını arayın ve ek senaryolar (komut dosyaları) için onları yedekleyin - görsel düzenleyici hayvanlar için basitse, ancak nedolikiv olmadan büyük bir veri tabanı oluşturmazsanız, onu kaydetmezsiniz. İstatistiklerin koçanını tahmin ettiğiniz anda, son veri tabanı oluşturuldu ve ek bir senaryo için dolduruldu. Senaryo - yöneticinin çalışmasını otomatikleştirmek için mantıksal bir blokta birleştirilmiş yalnızca bir veya daha fazla virüs.

Ses senaryoları, standart komut dosyaları için evrensel bir zasib olarak yazılır, bu nedenle dinamik olarak tasarlanmış mantık içerirler - komut dosyasının parametrelerini hızlı bir şekilde değiştirmenize olanak tanıyan belirli nesne adlarını değil, değiştirilecek komutları isteyin ve ekleyin.

USE master -- Dinamik verileri ayarla DECLARE @dbname varchar(30), @tablename varchar(30), @column varchar(30) SET @dbname = "TestDatabase" SET @tablename = "Pozisyonlar" SET @column = "BaseSalary" - - Dinamik veri varyantı EXECUTE ("USE" + @dbname + "AVG'yi SEÇ(" + @column + ") AS FROM " + @tablename) GO

Verilerin toplanması

SQL taşımalarında tablodan veri seçimi SELECT komutu yardımıyla belirtilir:

SEÇME<названия колонок или *>İTİBAREN<название таблицы>

Kilidin arkasında, SELECT komutu, ihmal edilebilecek ALL parametresine sahiptir. Komutta DISTINCT parametresini belirtirseniz, sonuç yalnızca seçimden benzersiz (tekrarlanamaz) kayıtlar tüketilecektir.

Komutlardaki nesnelerin adlarını SQL sunucusuna değiştirmek için AS komutu değiştirilir. Vicoristannya tsієї komutları, sıranın uzun süresini hızlandırmaya yardımcı olur ve bu nedenle sonucu kullanışlı olanlardan alır.

Yerel Müşteriler tablosundan tüm kayıtları seçin SELECT * FROM -- Kullanıcılar tablosundan KullanıcıAdı sütununun benzersiz kayıtlarını seçin SELECT DISTINCT UserName FROM Users

Kullanıcı adı
Andrey
İvan
Nicholas
Peter
sergei
galip

Verilerin filtrelenmesi WHERE komutu yardımıyla gerçekleştirilir, bu durumda sonraki operatörler ve bu komut eşittir: =,<, >, <=, >=, <>, LIKE, LIKE DEĞİL, AND, OR, NOT, BETWEEN, NOT BETWEEN, IN, NOT IN, NULL, IS NOT NULL. Vahşi bir görünümde, filtreden SELECT komutu şöyle görünür:

SEÇME<названия колонок или *>İTİBAREN<название таблицы>NEREDE<условие>

Bir dizi hizalamada, sembollerin ve ikamelerin yerine getirilmesine izin verilir:

  • % - bir dizi sembol olsun;
  • _ – bir karakter;
  • - tapınaklarda bir sembol, işaretler olup olmadığı;
  • [^] - kollarda değil, bir sembol olun.
-- Kullanıcılar tablosundaki tüm kayıtları seçin, burada DepartmentID = 1 SELECT * FROM Users NEREDE DepartmentID = 1
Kullanıcı kimliğiKullanıcı adıKullanıcıSoyadıDepartman KimliğiPozisyon Kimliği
1 İvan Petrov 1 1
2 İvan Sidorov 1 2
3 Peter İvanov 1 2
4 Nicholas Petrov 1 3
-- Kullanıcılar tablosundan adında A harfi olan tüm kayıtları seçin SEÇİN * KULLANICI ADI "%a%" GİBİ KULLANICILARDAN
Kullanıcı kimliğiKullanıcı adıKullanıcıSoyadıDepartman KimliğiPozisyon Kimliği
1 İvan Petrov 1 1
2 İvan Sidorov 1 2
4 Nicholas Petrov 1 3
5 Nicholas İvanov 2 1
7 Andrey Bukin 2 2
-- Kullanıcılar tablosundan, arkadaşlarının adında V olmayan bir harf bulunan tüm kayıtları seçin SEÇ * KULLANICI ADI "_[^v]%" GİBİ KULLANICILARDAN

Filtreleme, bir dizi içecek arasından bir içecek tasarlayabilmeniz için bir içecek seçmenizi sağlar:

BaseSalary de Positions tablosundan PositionID sütununun kayıtlarını seçin< 600 SELECT PositionID FROM Positions WHERE BaseSalary < 600 -- Выбрать все записи из таблицы Users, у кого имя Ivan или Andrey SELECT * FROM Users WHERE UserName IN ("Ivan", "Andrey")

Seçimdeki verileri sıralamak için ORDER BY komutu kullanılır ve ardından bu komutun text, ntext ve image tipindeki verileri sıralamadığını kontrol edin. Varsayılan olarak, sıralama boyuta göre gerçekleştirilir, bu nedenle bu tür için ASC parametresi atlanabilir:

SEÇME<названия колонок или *>İTİBAREN<название таблицы>NEREDE<условие>TARAFINDAN SİPARİŞ<названия колонок>

Sonuçtaki satır sayısını artırmak için TOP komutu kazanır:

TOP [satır sayısı] SEÇİN<названия колонок или *>İTİBAREN<название таблицы>NEREDE<условие>TARAFINDAN SİPARİŞ<названия колонок>

Soruşturmanın ortasında, alınan haracın hesaplanması mümkündür. Hangi toplama işlevleri kullanılır:

  • AVG(sütun) – sütunun ortalama değeri;
  • COUNT(sütun) – sütundaki NULL olmayan öğelerin sayısı;
  • COUNT(*) – istekteki öğelerin sayısı;
  • MAKS(sütun) – sütundaki maksimum değer;
  • MIN(sütun) – sütundaki minimum değer;
  • TOPLA(sütun) – sütun için değerlerin toplamı.

Çeşitli ORDER, TOP komutları ve toplama işlevlerini uygulayın:

Kullanıcılar tablosundan, KullanıcıAdı'na göre sıralanmış, KullanıcıAdı sütununun ilk 3 benzersiz kaydını seçin. Pozisyonlar) )

Verileri gruplama

SQL, verileri bir tablodaki aynı alanların arkasında gruplandırmanıza olanak tanır. Verileri bazı parametrelere göre gruplandırmak için, SQL sorgusu için, hangi sütun adına, hangi gruplandırmanın yapılacağı GROUP BY komutunu yazmak gerekir. GROUP BY komutunda belirtilen sütunların SELECT komutunda bulunması gerekir ve SELECT komutu, verileri gruplandırmadan önce takılacağı için toplama işlevini değiştirmekten de sorumludur.

Dış görünüm grubundaki uygulayıcıların sayısını bulun (türün kimliğine göre uygulayıcı grupları ve dış görünüm grubundaki kayıt sayısını sıralayın) "Kullanıcı sayısı" olarak Departman Kimliği, COUNT(UserID) SEÇİN

Departman Kimliğikullanıcı sayısı
1 4
2 3
4 1

Grupların talebi üzerine satırları filtrelemek için zihin filtresini belirlemek üzere özel HAVING ekibi devreye alınacaktır. Arkasında filtreleme uygulanan sütunların GROUP BY ekibinde bulunması gerekir. HAVING komutu, GROUP BY olmadan da kullanılabilir, bu durumda WHERE komutundan önceki gibi çalışmaz, ancak aynı zamanda filtrelemenin zihninde yalnızca toplama işlevini engellemenize de olanak tanır.

İlk gruptaki uygulayıcıların sayısını bulun (Grup uygulayıcıları - viddiliv tanımlayıcısı, cilt grubundaki kayıt sayısını analiz edin - sonuca rіvnim tanımlayıcısı ile viddіl'den daha az dahil edin) SELECTBY DepartmentUserID DepartmentID, COUNT kullanıcı AV DepartmentID, COUNT " 1 -- Знайти кількість працівників з певною посадою у кожному відділі -- (згрупувати працівників за ідентифікатором посад та відділів та -- порахувати кількість записів у кожній групі), а також порахувати -- кількість працівників у кожному відділі та загальну кількість працівників SELECT Departman Kimliği, Konum Kimliği, COUNT(UserID) Kullanıcılardan "Kullanıcı sayısı" OLARAK GROUP BY DepartmentID, PositionID İLE TOPLAMA

Departman KimliğiPozisyon Kimliğikullanıcı sayısı
1 1 1
1 2 2
1 3 1
1 HÜKÜMSÜZ 4
2 1 1
2 2 1
2 3 1
2 HÜKÜMSÜZ 3
4 1 1
4 HÜKÜMSÜZ 1
HÜKÜMSÜZ HÜKÜMSÜZ 8

Gruplama komutu ayrıca gruplandırılmış sütunların tüm kombinasyonlarını oluşturacak olan WITH CUBE işleci ile desteklenebilir: N sütun varsa, o zaman 2^N kombinasyon olacaktır.

Знайти кількість працівників з певною посадою в кожному відділі - (згрупувати працівників за ідентифікатором посад та відділів і - порахувати кількість записів у кожній групі), а також порахувати - кількість працівників за кожною посадою, по кожному відділу та - загальну кількість працівників SELECT DepartmentID, PositionID , COUNT(UserID) OLARAK "Kullanıcı sayısı" GROUP BY BY DepartmentID, PositionID İLE KÜPLÜ Kullanıcılar

Departman KimliğiPozisyon Kimliğikullanıcı sayısı
1 1 1
1 2 2
1 3 1
1 HÜKÜMSÜZ 4
2 1 1
2 2 1
2 3 1
2 HÜKÜMSÜZ 3
4 1 1
4 HÜKÜMSÜZ 1
HÜKÜMSÜZ HÜKÜMSÜZ 8
HÜKÜMSÜZ 1 3
HÜKÜMSÜZ 2 3
HÜKÜMSÜZ 3 2

GROUPING toplama işlevi, ROLLUP ve CUBE komutları tarafından bir kaydın eklenip eklenmediğini veya veri kutusundan bir kaydın kaldırılıp kaldırılmadığını belirlemenizi sağlar.

Dış görünüm grubundaki uygulayıcıların sayısını bulun (uygulayıcı grupları - değişkenlerin tanımlayıcısı ve dış görünüm grubundaki kayıt sayısını belirleyin) - ve ayrıca verilerde bulunmayan ek satırları belirleyin gerel SELECTUUPERING (UsersID of DepartmentID , COUNT(Departman Kimliğinin kullanıcı kimliği), COUNT(Departman Kimliğinin kullanıcı kimliği, COUNT(Departman Kimliğinin kullanıcı kimliği) Departman Kimliği) Kullanıcılar GROUP BY BY DepartmentID with ROLLUP'TAN "Eklenen satır" AS

Departman Kimliğikullanıcı sayısısatır eklendi
1 4 0
2 3 0
4 1 0
HÜKÜMSÜZ 8 1

Başka bir gruplama komutu olan COMPUTE, verileri gruplandırmanıza ve farklı tablolarda görüntülemenize olanak tanır. Yani, ROLLUP ve CUBE işleçleriyle GROUP BY komutu, bir yıldızla ek satırlar tablosuna grup verileri ekler ve grup verileri için COMPUTE komutu, tabloyu bir alt tablolar satırına genişletir ve ayrıca yıldızlarla bir alt tablo oluşturur. . COMPUTE komutu iki modda geçersiz kılınabilir:

  • sonucu tablo etrafında görüntülemek için toplama işlevinin ne kadar basit olduğu;
  • tabloyu bir çaça alt tablosuna genişleten bir gruplandırma komutu olarak BY parametresiyle

BY parametresine sahip COMPUTE komutu, ORDER BY komutuyla aşağı yukarı birleştirilebilir ve sıralama sütunları, gruplandırma sütunlarıyla aynıdır.

Bir şirket hesapları tablosu girin ve numaralarını kontrol edin SELECT * FROM Users COMPUTE COUNT(UserID)

Kullanıcı kimliğiKullanıcı adıKullanıcıSoyadıDepartman KimliğiPozisyon Kimliği
1 İvan Petrov 1 1
2 İvan Sidorov 1 2
3 Peter İvanov 1 2
4 Nicholas Petrov 1 3
5 Nicholas İvanov 2 1
6 sergei Sidorov 2 3
7 Andrey Bukin 2 2
8 galip Rybakov 4 1
cnt
8
-- Bir dış görünüm grubundaki uygulayıcıların sayısını bulun (Uygulayıcıları şuna göre gruplandırın -- Türlerin kimliği ve bir dış görünüm grubundaki kayıt sayısını sıralayın) * KULLANICILARDAN SEÇİN
Kullanıcı kimliğiKullanıcı adıKullanıcıSoyadıDepartman KimliğiPozisyon Kimliği
1 İvan Petrov 1 1
2 İvan Sidorov 1 2
3 Peter İvanov 1 2
4 Nicholas Petrov 1 3
cnt
4
Kullanıcı kimliğiKullanıcı adıKullanıcıSoyadıDepartman KimliğiPozisyon Kimliği
5 Nicholas İvanov 2 1
6 sergei Sidorov 2 3
7 Andrey Bukin 2 2
cnt
3
Kullanıcı kimliğiKullanıcı adıKullanıcıSoyadıDepartman KimliğiPozisyon Kimliği
8 galip Rybakov 4 1
cnt
1

Z'ednannya masası

SQL'deki en önemli ve gerekli sorgular - tablolar için ce sorguları, eğer dzherel sayısı oranında seçim gerekliyse. Bu nedenle, yazılı olarak katlamayı isteyin, ancak aynı zamanda yazı için de, kırıklar genellikle programda zaten hazırlanmış olan ve artık ekranda görüntülemek için yeterli olmayan sonucu görür.

SQL'de tabloları iki şekilde bağlayabilirsiniz: dikey ve yatay olarak.

UNION komutu ile dikey olarak oluşturulan ilk tablo örneğin, başka bir tablo ekleyin. Böyle bir kombinasyonla, tablonun birleştirilen sütunlarının sayısı aynı olabilir ve sütunların kendileri aynı adlara ve veri türlerine sahiptir. Her iki tabloda görünen aynı satırları eklerseniz, ALL parametresinin komutta belirtilmediğini göreceksiniz.

Ivan adlı tüm yazışmaları bilin ve sonucu döndürün -- "Petrov adlı tüm yazışmaları bul" sorgusunun sonucu -- yinelenen girişler SELECT * FROM Users WHERE KullanıcıAdı = "Ivan"

Kullanıcı kimliğiKullanıcı adıKullanıcıSoyadıDepartman KimliğiPozisyon Kimliği
1 İvan Petrov 1 1
2 İvan Sidorov 1 2
4 Nicholas Petrov 1 3
-- Ivan adlı tüm karşılık gelenleri bulun ve şunun sonucunu döndürün -- "Petrov adlı tüm karşılık gelenleri bul" sorgusunun sonucu -- yinelenen kayıtlar kaydedin SELECT * FROM Users WHERE KullanıcıAdı = "Ivan" UNION ALL SELECT * FROM Users WHERE UserSurname = " Petrov"
Kullanıcı kimliğiKullanıcı adıKullanıcıSoyadıDepartman KimliğiPozisyon Kimliği
1 İvan Petrov 1 1
2 İvan Sidorov 1 2
1 İvan Petrov 1 1
4 Nicholas Petrov 1 3

Yatay olarak z'ednannya zdіysnyuєtsya shlyah zcheplennya kіlkoh anahtar sütunların arkasındaki tablolar. En basit yatay birleştirmeyi, her iki tabloda da zustrіchaєtsya gibi anahtar alanın satırlarını seçerek, zchіplyuє tabloları gibi INNER JOIN komutunun yardımıyla takip eder.

SEÇME<названия колонок или *>İTİBAREN<таблица_1>INNER JOIN tablo_2 AÇIK tablo_1.key_field = tablo_2.key_field

Sol tablonun tüm alanları ile sağ tablodaki kayıtların bağımsız olarak birleştirilebilmesi için LEFT JOIN komutunun seçilmesi gerekmektedir. Bu komut, sol tablodan tüm satırları seçerek en alttaki tabloyu döndürür ve sağ tablodaki günlük olan veriler NULL değerlerle doldurulur.

SEÇME<названия колонок или *>İTİBAREN<таблица_1>SOL BİRLEŞTİRME tablo_2 AÇIK tablo_1.key_field = tablo_2.key_field

RIGHT JOIN komutu öndekine benzer, tek farkı en alttaki tabloda olması, sağdaki tablodan tüm satırları seçmesi ve soldaki tablonun günlük verilerinin NULL değerlerle doldurulmasıdır.

SEÇME<названия колонок или *>İTİBAREN<таблица_1>SAĞ BİRLEŞTİRME tablo_2 AÇIK tablo_1.key_field = tablo_2.key_field

FULL JOIN komutunun kendi katılma hakkı vardır, bu nedenle tabloları birleştirmez, her iki tablodan da satır seçmez ve günlük verileri NULL değerlere döndürmez.

SEÇME<названия колонок или *>İTİBAREN<таблица_1>TAM BİRLEŞTİRME table_2 ON table_1.key_field = table_2.key_field

Tablonun geri kalanı, CROSS JOIN komutu tarafından nadiren geçilir. Bu komut, anahtar alan seçimi olmadan tablolar oluşturur ve sonuç, farklı çıktı tabloları satırlarının aynı kombinasyonudur.

SEÇME<названия колонок или *>İTİBAREN<таблица_1>ÇAPRAZ BİRLEŞTİRME tablo_2

Birleştirme, ikiden fazla tablo ile sınırlı değildir, son zvіtіv oluşturmak için daha uygun olan birkaç JOIN komutu da alabilir. Aşağıda, tablodaki tüm komutlar için bir örnek verilmiştir.

KULLANICILARDAN * SEÇİN * INNER JOIN Departmanlar AÇIK Users.DepartmentID = Departments.DepartmentID

Kullanıcı kimliğiKullanıcı adıKullanıcıSoyadıDepartman KimliğiPozisyon KimliğiDepartman KimliğiBölüm Adı
1 İvan Petrov 1 1 1 Üretme
2 İvan Sidorov 1 2 1 Üretme
3 Peter İvanov 1 2 1 Üretme
4 Nicholas Petrov 1 3 1 Üretme
5 Nicholas İvanov 2 1 2 dağıtım
6 sergei Sidorov 2 3 2 dağıtım
7 Andrey Bukin 2 2 2 dağıtım
Kullanıcılardan * SEÇİN Bölümleri AÇIK KATILIN Users.DepartmentID = Departments.DepartmentID
Kullanıcı kimliğiKullanıcı adıKullanıcıSoyadıDepartman KimliğiPozisyon KimliğiDepartman KimliğiBölüm Adı
1 İvan Petrov 1 1 1 Üretme
2 İvan Sidorov 1 2 1 Üretme
3 Peter İvanov 1 2 1 Üretme
4 Nicholas Petrov 1 3 1 Üretme
5 Nicholas İvanov 2 1 2 dağıtım
6 sergei Sidorov 2 3 2 dağıtım
7 Andrey Bukin 2 2 2 dağıtım
8 galip Rybakov 4 1 HÜKÜMSÜZ HÜKÜMSÜZ
Kullanıcılardan * SEÇİN DOĞRUDAN Bölümleri KATILIN Users.DepartmentID = Departments.DepartmentID AÇIK
Kullanıcı kimliğiKullanıcı adıKullanıcıSoyadıDepartman KimliğiPozisyon KimliğiDepartman KimliğiBölüm Adı
1 İvan Petrov 1 1 1 Üretme
2 İvan Sidorov 1 2 1 Üretme
3 Peter İvanov 1 2 1 Üretme
4 Nicholas Petrov 1 3 1 Üretme
5 Nicholas İvanov 2 1 2 dağıtım
6 sergei Sidorov 2 3 2 dağıtım
7 Andrey Bukin 2 2 2 dağıtım
HÜKÜMSÜZ HÜKÜMSÜZ HÜKÜMSÜZ HÜKÜMSÜZ HÜKÜMSÜZ 3 Satın alma
Kullanıcılardan * SEÇİN TAM BİRLEŞTİRME Bölümleri AÇIK Users.DepartmentID = Departments.DepartmentID
Kullanıcı kimliğiKullanıcı adıKullanıcıSoyadıDepartman KimliğiPozisyon KimliğiDepartman KimliğiBölüm Adı
1 İvan Petrov 1 1 1 Üretme
2 İvan Sidorov 1 2 1 Üretme
3 Peter İvanov 1 2 1 Üretme
4 Nicholas Petrov 1 3 1 Üretme
5 Nicholas İvanov 2 1 2 dağıtım
6 sergei Sidorov 2 3 2 dağıtım
7 Andrey Bukin 2 2 2 dağıtım
HÜKÜMSÜZ HÜKÜMSÜZ HÜKÜMSÜZ HÜKÜMSÜZ HÜKÜMSÜZ 3 Satın alma
8 galip Rybakov 4 1 HÜKÜMSÜZ HÜKÜMSÜZ
SEÇ * Kullanıcılardan CROSS JOIN Departmanlar
Kullanıcı kimliğiKullanıcı adıKullanıcıSoyadıDepartman KimliğiPozisyon KimliğiDepartman KimliğiBölüm Adı
1 İvan Petrov 1 1 1 Üretme
2 İvan Sidorov 1 2 1 Üretme
3 Peter İvanov 1 2 1 Üretme
4 Nicholas Petrov 1 3 1 Üretme
5 Nicholas İvanov 2 1 1 Üretme
6 sergei Sidorov 2 3 1 Üretme
7 Andrey Bukin 2 2 1 Üretme
8 galip Rybakov 4 1 1 Üretme
1 İvan Petrov 1 1 2 dağıtım
2 İvan Sidorov 1 2 2 dağıtım
3 Peter İvanov 1 2 2 dağıtım
4 Nicholas Petrov 1 3 2 dağıtım
5 Nicholas İvanov 2 1 2 dağıtım
6 sergei Sidorov 2 3 2 dağıtım
7 Andrey Bukin 2 2 2 dağıtım
8 galip Rybakov 4 1 2 dağıtım
1 İvan Petrov 1 1 3 Satın alma
2 İvan Sidorov 1 2 3 Satın alma
3 Peter İvanov 1 2 3 Satın alma
4 Nicholas Petrov 1 3 3 Satın alma
5 Nicholas İvanov 2 1 3 Satın alma
6 sergei Sidorov 2 3 3 Satın alma
7 Andrey Bukin 2 2 3 Satın alma
8 galip Rybakov 4 1 3 Satın alma
dpt.DepartmentName'i "Departman" OLARAK, usr.UserName + " " + usr.UserSurname OLARAK "Kullanıcı adı", pos.PositionName "Pozisyon" OLARAK KULLANICILARDAN usr AS SOL KATIL Bölümleri AS dpt ON usr.DepartmentID = dpt.DepartmentID SOL KATIL Pozisyonlar ON usr.PositionID = pos.PositionID ORDER TARAFINDAN dpt.DepartmentID, pos.PositionID
DepartmanKullanıcı adıkonum
HÜKÜMSÜZ Viktor Rybakov müdür
Üretme İvan Petrov müdür
Üretme İvan Sidorov kıdemli analist
Üretme Petr İvanov kıdemli analist
Üretme Nikolay Petrov Analist
dağıtım Nikolay İvanov müdür
dağıtım Andrey Bukin kıdemli analist
dağıtım Sergey Sidorov Analist

Veri değişikliği

Öncelikle veri değiştirme komutlarından bahsedelim, Transact-SQL lehçesinin özelliklerini açıklamak gerekiyor. Adından da görebileceğiniz gibi, tüm mekanizma işlemlere, yani veri toplamaya, verileri değiştirmeye veya tablonun yapısına beslenen tek bir mantıksal modülde birleştirilen işlem sırasına dayanır. . Bir saat boyunca, veri komut dosyasındaki tüm işlemler engellenir, bu da verilerin tutarsızlığının tablo ve tamamlanmış komut dosyasıyla çalışma koçanı üzerinde bir saat boyunca gizlenmesine olanak tanır.

Transact-SQL işlemleri başına bir BEGIN TRANSACTION ... COMMIT TRANSACTION yapısına geçilir. Tsyu yapısı vikoristovuvat neobov'yazkovo, ancak daha sonra senaryoya verilen tüm komutlar geri alınamaz, bu nedenle cepheye çalışmak imkansızdır. İşlem bloğunun yapısı aynıdır:

BEGIN TRANSACTION [işlemim] [işlem] COMMIT TRANSACTION [işlemim] veya ROLLBACK TRANSACTION [işlemim]

Muzaffer bloğun poposu aşağıdadır:

Tüm çalışanlar için yeni maaş belirle İŞLEME BAŞLA TR1 GÜNCELLEME Pozisyonlar AYARLA Taban Maaş = 25000000000000000 IF @@ERROR<>0 BEGIN RAISERROR("Hata, işlem no tamamlandı!",16,-1) ROLLBACK TRANSACTION TR1 END ELSE COMMIT TRANSACTION TR1

Bir SQL sunucusu tablosuna veri eklemek için INSERT INTO komutu kullanılır:

INSERT INTO [tablo adı] (sütunlar) DEĞERLER ([sütun değerleri])

Komutun başka bir kısmı MS SQL Server 2003 için obov'yazkovoy değil, ama MS JET SQL bir kelime olmadan pardon sözdizimini görecek. Ekleme satırlar halinde yapılmalıdır, böylece tabloların tüm sütunları ve değerler odaya girilmesi gerektiği için odada belirtilir. Bir sütunun kapanışın arkasında bir değeri olabilirse veya boş bir değere izin veriyorsa, bu durumda ekleme komutunda bu sütun atlanabilir. INSERT INTO komutu ayrıca sütunların sırası için verilerin eklenmesini belirtmenize izin verir, ancak aynı zamanda sütunların sırasını da belirtmek gerekir.

Users tablosunda UserID = 9, UserName = "Nikolay", - UserSurname = "Gryzlov", DepartmentID = 4, PositionID = 2 şeklinde bir satır girin. INSERT INTO Users VALUES (9, "Nikolay", "Gryzlov", 4 , 2 ) -- Kullanıcılar tablosuna UserID = 10, UserName = "Nikolay", -- UserSurname = "Kozin", DepartmentID - promosyon değeri, PositionID - belirtilmemiş verileri içeren bir satır ekleyin. INSERT Users VALUES (10, "Nikolay", "Kozin", DEFAULT, NULL) -- Users tablosunda UserName = "Agrey", UserSurname = "Medvedev", -- UserID = 11, diğer değerleri içeren bir satır girin ​INTO INTO Kullanıcılar için (UserName, UserSurname, UserID) DEĞERLER ("Agrey", "Medvedev", 11)

Tablo tablosunun değerlerini değiştirmek için UPDATE komutu kullanılır:

UPDATE [tablo adı] SET [sütun adı]=[sütun değeri] WHERE [um]

Tablonun değerini güncelleme (değiştirme), başka bir tablodan bir akıl veya veri seçimi ile delice gerçekleştirilebilir.

Tüm posadlara 2000 birim maaş belirleyin. GÜNCELLEME Pozisyonları SET BaseSalary = 2000 -- Kimliği 1 olan Posad'lar maaşı 2500 birim olarak ayarlar. GÜNCELLEME Pozisyonlar SET BaseMaaş = 2500 NEREDE PositionID = 1 -- Kimliği 2 olan Posad maaşı %30 değiştirecek. GÜNCELLEME Pozisyonları SET BaseSalary = BaseSalary * 0,7 WHERE PositionID = 2 -- Tüm posadları sağlıklı bir maaş olarak ayarlayın (kuruluştaki çalışan listelerinin sayısı başına 30.000 ek) Pozisyonları GÜNCELLE SET BaseSalary = 30000 / (COUNT(UserID) FROM SEÇİN Kullanıcılar)

Verilerin görünümü DELETE komutuyla ayarlanır:

[tablo adı] NEREDEN [umova]'DAN SİL

Vydalennya danikh, bazı kriterleri görmek için çağrı yapar. Verilerin kaldırılması güvenli bir işlem olmadığından, böyle bir komuttan önce en iyisi SELECT komutuyla bir test seçimi oluşturmaktır, sanki bu verilerin sonucunu gördünüz, bunlar silinecek. İhtiyacınız kadar, SEÇ'i cesaretle DELETE ile değiştirebilir ve verileri silebilirsiniz.

Tanımlayıcı 10 ile kontrol listesi görünümü - Yükseltme modunda, SELECT komutunun kullanılması tavsiye edilir, - verilerin silinip silinmeyeceğini bilmek için: - SELECT UserID FROM Users WHERE UserID = 10 Users FROM Users INNER JOIN Departments ON Users.DepartmentID = Departments .DepartmentID WHERE Departments.DepartmentName = "Production" -- Tüm girdilerin görünümü Kullanıcılardan SİL

Not! Verileri filtrelemek için popoda sabit bir tablo var. Komutta bir dizi tabloyu yeniden düzenlemek isterseniz, DELETE kelimesinden sonra belirtildiği gibi veriler yalnızca tablolardan silinecektir.

Tabloları temizlemek için en iyi komut TRUNCATE TABLE komutudur.

KESME TABLOSU [tablo adı]

Tüm verilerin görünümüne bir örnek:

Kullanıcılar tablosunu temizleyin TRUNCATE TABLE Kullanıcılar

Transact-SQL, saat tablolarının yazılmasına izin verir, böylece tablolar sunucunun belleğinde bir saat boyunca veri tabanı ile çalışacak şekilde oluşturulur. Timchasov tabloları anne be-yak im'ya olabilir, ancak # sembolü ile guatr bağlamaya başlayın.

Bir zaman tablosu oluşturun #TempTable, kopyalayıp yapıştırın - Tablonun KullanıcıAdı sütunları Kullanıcılar SEÇİN KullanıcıAdı INTO #TempTable FROM Kullanıcılar - Zaman tablosunun tüm kayıtlarını seçin #TempTable SELECT *

Prosedürleri ve işlevleri kaydetme

Prosedürler ve işlevler, sunucuya kaydedilebilen bir dizi SQL operatörü tarafından kaydedilir. Komut dosyası sunucuya kaydedilirse, istemcilerin aynı okre operatörlerini yeniden ayarlaması gerekmez, kötü koku kaydedilen prosedüre geri dönebilir. Kaçınılması gereken prosedürler özellikle karmaşıksa, durumlar:

  • Çok sayıda istemci programı farklı dillerde yazılır veya farklı platformlarda çalışır, ancak aynı işlemleri veritabanlarıyla da gerçekleştirir.
  • Bezpeka birincil bir rol oynar. Kurtarma prosedürleri, ortanın güvenliğini ve güvenliğini sağlayan tüm standart operasyonlar için etkilidir ve prosedürler, cilt cerrahisinin uygun şekilde kaydedilmesini garanti eder. Bu tür bir kurulumla, programlar ve sürücüler veritabanı tablolarına doğrudan erişimi ortadan kaldırmaz ve yalnızca kaydedilen belirli prosedürleri seçebilir.
  • İstemci ve sunucu arasındaki trafiği azaltmak gerekir. Sunucu ve istemci arasında aktarılan bilgiler kademeli olarak azaltılır ve veritabanı sunucu sistemi üzerindeki yük artar, böylece bu durumda sunucu tarafında veri işlemeden daha fazla iş yapılır.

Bir dizi prosedür örneği, nelerin halledildiği ve nelerin halledildiği fonksiyonların bir örneği:

Maaş güncelleme işlevi CREATE PROCEDURE usp_UpdateSalary AS UPDATE Pozisyonları SET BaseSalary = 2000 GO -- Maaş güncelleme işlevi oluşturuldu CREATE FUNCTION usf_GetName (@UserID int) RETURNS varchar(255) + " " + KullanıcıSurname WHERE UserID = @UserID) -- EXEC Maaş TestDatabase.dbo.usp_UpdateSalary'yi güncelleyin -- ID 2 ile çalışan adını değiştirin SELECT TestDatabase.dbo.usf_GetName(2)

Yine, dikkat edilen prosedürler ve işlevler bir avantaj sağlar:

  • üretkenlik;
  • tüm zapitіv için zagalna mantığı;
  • trafik değişikliği;
  • güvenlik - koristuvachev'e erişim masaya değil, prosedüre verilir;

üretkenlik

Verimliliği artırmak için, o zaman İsveçli bir içici için, sıra sıra içecekleri istiflemek için aşağıdaki kuralları unutmayın:

  • Unicode NOT - liste için komutlar, sunucuya giden trafiği artıran adımların sonunda seçilir.
  • Unicate LIKE - bu operatör, birden fazla eşleştirme modeli için bir eşleştirme operatörüdür, gerekli filtreleme adımlarının sayısını azaltmak için daha düşük bir operatör ='dir.
  • Zastosovuvaty kesin şablonlar pokuku - pіdstanovki zbіlshuє saat vykonannya zaputu zastosuvannya symbolіv, revіrki vsіh vіkh varyant_v_іnіnіv_іnіїіі kurulum nіbnіbnі için oskіlki ek sunucu kaynakları.
  • Benzersiz SİPARİŞ - sıralama komutu, tablodaki satırları arka arkaya sıralamanıza olanak tanır, bu da sonucu engeller.

Vitaliy Bochkarov

T-SQL dili, veri kümelerini yönetmek için tanınır. Suçluluk nedenleriyle, eklentileri programlamak için gerekli olan geleneksel dillerin herhangi bir karakteristik özelliği yoktur. Madem uzun zamandır eklentiler oluşturmak için çalışıyorsunuz, o zaman sing-song, T-SQL ve VB, C# ve Java gibi diğer dillerde programlama fikrine karşı çıkın.

T-SQL paketleri

Bir T-SQL talimatına istek adı verilir ve bunların bir grubuna paket adı verilir. Paket talimatları dizisinin tamamı, tek bir birim olarak istemci programlarından sunucu tarafından değiştirilir.

SQL Server paketin tamamına sanki tek başına çalışıyormuş gibi bakar. Sadece bir talimatta affın varlığı, tüm paketin sarılmasının imkansızlığına yol açacaktır. Tam o saatte, dilbilgisi analizi nesnelerin ve şemaların adlarını değiştirmez, ancak şemanın kendisi, talimatları yazma işlemiyle değiştirilebilir.

Paketi tekrar ziyaret etmek

SQL betik dosyası ve Query Analyzer penceresi birkaç paket içerebilir. Zaman zaman, tüm paketler sonlandırıcıların anahtar sözcüklerini ekler. Zamovchuvannyam tsim için є GO anahtar kelimesi ve art arda birleşmiş buti olabilir. Diğer tüm semboller (navit açıklamaları) paket dağıtıcısını etkisiz hale getirecektir.

Paket dağıtımı aslında bir sunucu değil, Management Studio'nun bir işlevidir. Programın gücündeki Query Execution diyalog kutusundan değiştirebilirsiniz ama ben (arkadaşlara) önermiyorum.

DDL talimatları

Oluşturma Prosedürü gibi bazı DDL mov T-SQL ifadeleri, paketteki ilk talimatlardır. Kişisel olmayan nesneler yaratan eski senaryolar bile çoğu zaman çok sayıda yeniden paketleme paketi gerektirir. SQL Server oskіlki okremo, paketlerin arkasındaki sözdizimini ayrıştırır, bu tür kişisel olmayan dağıtıcıların varlığı, afların yerelleştirilmesine yardımcı olur.

Veri tabanları arasında geçiş

Çalışma modunda, veri tabanı her zaman araç çubuğunda görüntülenir ve bir noktada değiştirilebilir. Program kodu için, iş parçacığı tabanı USE anahtar kelimesiyle tanımlanır. Paketteki anahtar kelime, robotun akış noktasından başlayarak hangi veri tabanını temel alacağını belirtir:

Kazanan paketler

Paket, dekilkom şekillerde kullanılabilir.

Genel olarak SQL komut dosyası (böylece yenisinden önce giren tüm paketler) dosyanın yolu izlenebilir. Management Studio'nun SQL düzenleyicisinde sql ve tuşlara basmak (araç çubuğundaki Execute düğmesine basarak veya menüde Query 1 ^Execute öğesini seçerek). (Windows işletim sistemimi, SQL dosyasına tıkladığımda tüm sorgu çözümleyici otomatik olarak başlayacak şekilde kurdum.)

Management Studio'daki SQL editörü, bir SQL deyimi olarak da kullanılabilir. Kimler için görmek ve bir tuşa basmak gerekir (araç çubuğundaki Yürüt düğmesine tıklayın veya menüden Sorgu 1 ^Yürüt öğesini seçin).

ADO veya ODBC'nin yardımı için T-SQL program paketi kullanılabilir.

T-SQL Komut Dosyası Oluşturma Hakkında Dosya adını iletmek için ek SQLCmd komut satırı yardımcı programı da arayabilirsiniz. SQL yak parametresi.

SQLCmd yardımcı programının birkaç parametresi olabilir ve pratik ihtiyaçlar için kolayca özelleştirilebilir.

SQLCmd yardımcı programı div hakkında ek bilgi. Management Studio'ya ayrılmış 6. şubede.

bilgi

Alınan Vikonannya prosedürleri

SQL paketi için, kaydedilen yordam, exec anahtar sözcüğünün yardımından sonra çağrılır. Kim düşük kurallara uymalıdır. SQL Server için Oskіlki razrivi ryadkіv mantıklı değil, exec komutu önceki talimatların sonu anlamına geliyor.

Seçilmesi gereken prosedür paketin ilk satırında yer alıyorsa (aksi halde tek talimat ise), yeni dilde exes anahtar kelimesinin belirtilmesi zorunlu değildir. Aynı zamanda hangi anahtar kelimenin eklenmesi affa yol açmayacak ve ondan önce paketin metni değiştirileceği için gelecekteki sorunların çözülmesine yardımcı olacaktır.

Sistem prosedürünün seçilen sonraki iki wiki'si, paketteki alternatif exec komutlarını gösterir:

YÖNETİCİ sp_help;

Kime böldüğümüzde pakette sadece exec komutuna baktık. “Dynamic SQL” bölümünde yeshes anahtar kelimesinin yaratıcısı hakkında bilgi vereceğim.

T-SQL'de biçimlendirme

Kitabın metni uzatılarak, program kodu doğruluğu azaltacak şekilde biçimlendirildi; Biçimlendirmenin önemli anlarını kime ayırdık.

Eksiksiz talimatlar

ANSI SQL standardı, dış görünüm yönergelerinde noktadan virgülün kullanılmasını gerektirir. Aynı saatte, T-SQL üzerinde programlama yaparken, obov'yazkova noktası kiminle hareket etmiyor. Kilkom kurallarına kimler uymalıdır.

try end ifadesinden sonra її koymayın.

Düşündükten sonra її göndermeyin.

Obov'yazkovo її'yi CTE'nin ısı tablosu ayetlerinden sonra yerleştirin.

Program kodunun en kısa çalışması için yine de beneklerin bir topakla yenilmesi önerilir. SQL Server'ın gelecekteki sürümlerinde, daha gelişmiş bir çalışma olabilecek daha karmaşık hale gelebilir.

Prodovzhennya rowkіv

Talimatlar T-SQL, doğası gereği güçlü olabilir. Deyakі zapitami kalan rasdіlu s chislennym ob'ednannymi ve pіdzapitami tüm tarafı işgal ediyor. T-SQL'in satırın o sonundaki boşluk karakterlerini yoksayması özellikle uygundur. Tse, mevcut talimatın herhangi bir özel sembole ihtiyaç duymadan hücum satırında gerçekleştirilebileceği anlamına gelir. Bu güç, önemli dünyanın program kodunun okunmasını hareket ettirmesine izin verir.

Access gibi SQL'in diğer uygulamalarında, ifadenin tamamlanması, bir benek ile bir yumrunun varlığını gerektirir. SQL Server bazı varyasyonlara izin verir, ancak dili umursamaz.

Yorumlar

T-SQL dili, iki stilde bir yorum paketinde kullanılabilir: ANCI ve move C. İlki iki tire ile başlar ve satırın sonunda biter:

- ANSI stili hakkında yorum

Ayrıca, ANSI tarzı yorumlar bir dizi talimat gibi eklenebilir:

FirstName, LastName - seçilen Kişilerden sütunlar seçin - çıktı tablosu

Nerede Soyadı 'Hal%' Gibi; - sıralar halinde dizilmiş

SQL editörü, görülen tüm satırlardaki yorumları dondurabilir ve görebilir. Bunun için Düzenle^Gelişmiş^Yorum Yap menü komutunu seçmeniz gerekir ( veya ) veya Düzenle ^ Gelişmiş 1 ^ Yorumları Kaldır ( veya ).

C filminin tarzıyla ilgili yorumlar eğik çizimler ve küçük yıldızlarla (/*) başlar ve dönüş sekansında aynı sembollerle biter. Bu tür yorumlar, başlıklar veya harika test istekleri gibi satır bloklarını yorumlamak için en iyi seçimdir. /*

Tablo Ekleme Tetik Sırası Paul Nielsen

C stilindeki yorumların öne çıkan özelliklerinden biri, yorum yapılmadan yazılabilenlerdir.

T-SQL özelleştirmesi

SQL editörü bir af gösteriyorsa, paketteki karakteri ve satır numarasını gösterecektir. Pardon'a tıkladıktan sonra hemen üst sıraya geçebilirsiniz.

Affetmek, hatırlatmada atandığı gibi, genellikle yanlış bir kelimeyle kırılır - talimatlar açıklandığı için her şeyi yoluna koymak. Ses, aslında, af, gelecek ay emredilene kadar veya sonrasına kadar gecikmeden geri ödendi - her halükarda, tam olarak bir sonraki yerde yapılması emredildi.

SQL Server, paketleri yükseltmeyi kolaylaştırmak için bir dizi komut söyler. Zocrema, yazdırma komutu, sonuç veri kümesini oluşturmadan güncellemeyi etkisiz hale getirir. Özellikle, print komutunun özellikle bir pakette hata ayıklamak için değerli olduğuna saygı duyuyorum. Talep analizörü ağ modundaysa sonraki paketi seçin:

Ortaya çıkan veri seti tabloda görünür ve tek sıra halinde katlanır. Aynı zamanda, Mesajlar sekmesi bir sonraki sonucu gösterecektir:

(etkilenen 1 sıra(lar))

Bazen programı nesne sayısını engelleyecek şekilde ayarlamak gerekir. Duraklat komutu, toplu işi bir saatlik iş için duraklatmanıza izin verir. Örneğin, vikonannі saldırgan yoga kodunda, iki saniyelik bir aradan sonra başka bir satır görünür:

1 Koçan Yazdır";

bekleme gecikmesi *00:00:02';

Yazdır 'Kіnets 1;

Vikonanny kodunun sonucu:

Anahtar nokta, Server 2005'teki SQL New'in Management Studio sürümünde, pakette bulunan T-SQL motorunu içermemesidir.

2005 Visual Studio 2005

güncelleme, size www sitesinde anlatacağım. SQLServerİncil. com.

Değişiklikler

Be-yak mov vimagaє timchasovogo zberezhennya için zminnykh'in anısına anlamı. T-SQL'deki değişiklikler, değişiklikleri ve türleri tarafından takip edilen ek bir bildirim komutundan sonra oluşturulur. Farklı veri türleri için kazançlar, tablolardakilerle tam olarak eşleşir. Buna bir tablo tipi ve bir SQLVariant tipi ekleyebilirsiniz. Tek bir komutla, değişiklik dekilkasının kimin aracılığıyla kullanılabileceğini beyan edin.

Değişim için belirlenmiş alanı kilitlemenin önemi

Değişimin kapsamı (bu, kişinin yaşamı için kullanılan terimdir) yalnızca bir akış paketi için genişliyor. Değişikliğin oluşturulmasının kilitlenmesi için, null'un boş değerleri ve suçlu buti başlatma ihlalinin dahil edilmesinden önce kaldırılır.

Saldırı senaryosunda, gösterildikleri iki test değişikliği oluşturulur, alana kilitleme için bu değer atanır. Komut dosyasının tamamı tek bir dosyadadır, ancak teknik açıdan iki paket halinde katlanmıştır (GO komutuyla ayrılmış). Komut dosyasından hemen sonra, üç SELECT ifadesi gösterilir:

DECLARE @Test INT,

@TestTwo NVARCHAR(25);

SEÇ @ Test, @ Test İki;

SET @TestTwo = 'değer';

SELECT @ Test, @ Test İki ;

BatchTwo, @TestTwo olarak @Test SEÇİN;

(etkilenen 1 sıra(lar))

1 değer

(etkilenen 1 sıra(lar))

İleti 137, Düzey 15, Durum 2, Satır 2 “@Test” skaler değişkenini bildirmelidir.

İlk SELECT ifadesi iki boş değeri döndürür. Bundan sonra, değişiklikler başlatıldığında koku atanan değerleri döndürür. İlerleyen SELECT komutunun bir sonucu olarak paket tamamlandığında, pardon #137 bildirilir.

Yerel görevlendirme alanında değişiklik yapılabilir, böylece kaydedilen işlemler diğer paketlere yayılmaz.

set ve select komutlarının varyantı

Değişikliklere değer atamak için SET ve SELECT komutları kullanılabilir. Aralarındaki temel fark, SELECT komutunun veri tabanından bilgi (tablo, veri, veri vb.) çıkarabilmesi ve diğer SELECT komutlarını içermesi, SET komutunun ise virüsten gelen verilerden ayrılmasıdır. Birini beğen, böylece başka bir takım işlevi değiştirebilir. İşleve bir değişken sonucu veya bir sabit atamanız gerekiyorsa ve verilere bakmanız gerekmiyorsa SET komutunu kullanın.

SELECT ifadesi birden fazla girişten değer alabilir. Deri lezyonlarının değeri değişikliğe atanabilir. SELECT deyimi satır satır hareket ettikçe kalan satırların değerleri değişir. SELECT komutu, bireysel tanımlayıcının alanına göre sıralandığı şekilde 32 satırda gelir. Aynı saatte kod değiştirilir ve isim artık listedeki diğer kişiler değildir:

©TempID INT'yi beyan edin,

@TempLastName VARCHAR(25);

SET@TempID=99;

@TempID=KişiKimliği,

@TempLastName = Soyadı

Kişi Kimliğine Göre SİPARİŞ;

Vikonannya paketinin sonucu:

32 @kod dinlenmesi:Campbell

Sivri uçta, af uzatıldı. Ka. Ortaya çıkan veri kümesinin birden fazla satıra kadar ekleneceğini düşünmediğinizden, değişiklikleri doldurmak için SELECT deyimini tekrar kontrol etmeyin. Başka bir durumda, sadece geriye kalan haraç sırası sizi tatmin edecek.

SELECT ifadesi aynı satırı döndürmezse değişmez. Bir sonraki istek değeri döndürmez, Kişi tablosunda 100 tanımlayıcısına sahip kayıtlar yoktur. @TempIDvariable'ı değiştirme nedenlerinden dolayı, kalan temel satırın değerini umarız, tercihi değiştirirken boş değeri alırız:

@TempID INT'yi bildirin,

@TempLastName VARCHAR(25);

SET@TempID=99;

@TempID = KişiKimliği SEÇİN,

@TempLastName = Kişi Kimliğinden Kişinin Soyadı NEREDE Kişi Kimliği = 100 Kişi Kimliğine Göre SİPARİŞ;

@TempID, @TempLastName SEÇİN;

99 @kod son: BOŞ

Umovny vіdbіr

Bir sonraki SELECT ifadesi, WHERE önermesinin yerini almak içindir ve sözdizimi doğrudur, ancak onlar için anlaşılmaz görünebilir:

SELECT @ change = viraz WHERE boolean-viraz;

Bazen, WHERE yan tümcesi akıllı bir if ifadesi gibi çalışır. Doğruysa, değişiklik değeri atanır, aksi takdirde SELECT ifadesi geçersiz kılınır, ancak değişiklik değeri değişmez.

SQL Sorgularındaki Değişikliklerin Varyantı

T-SQL dilinin otoritelerinden en sevdiklerimden biri, program kodunda değiştirilecek olan, katlanan dinamik satırları çökertmeden uygulamalarda değiştirilebilenlerdir. Dinamik SQL kendi temelini sürdürür, ancak bir değişikliğin yardımı için değerleri tek tek daha basit bir şekilde değiştirebilirsiniz.

Skrіz, de zapі muzaffer viraz olabilir, galip gelebilir ve değişebilir. Adımlama noktasında, değişikliğin ikamesi şu önermede gösterildi: NEREDE: OBXKites KULLANIN;

DECLARE @ProductCode CHAR(10);

@Kodu AYARLA = '1001';

Üründen ÜrünAdı SEÇİN

WHERE Kodu = @ProductCode;

Sonuç reddedilecek:

Temel Kutu Uçurtma 21 inç

Birden çok atamayla yapılan değişiklikler

Birden çok atamayla yapılan değişiklikler - bu, ek SELECT yönergeleri ve kapsamı için kendinize değişiklik eklemenize izin veren düşmanca bir yöntemdir.

Kime gerçek hayattan az sayıda uygulama gösterilecek. Bununla birlikte, basitlik adına, SELECT deyiminin temel biçimini tanıtmama izin verin:

SEÇ @ değiştir = @ değiştir + d. stowpet FROM(kerowan_table) as d;

Dikey çizgiyi yatay bir listeye çevirerek, değişikliğe bir deri sıra seramik masa eklenir.

Bu tür bir öngörü genellikle pratiktir. Başka bir deyişle, dikey liste, alt başlığı birkaç inç uzatarak, yığınlara bölünmüş yatay bir listeye daha kolay dönüştürülebilir. Kısa yatay listeler insanlar tarafından kolayca kabul edilir ve ayrıca yerden tasarruf sağlar.

Dış Bankalar Deniz Fenerleri turu için tarihlerin bir listesi, Cape Hatter'ın baş veritabanında Reklam girişimleri olarak gösterilen hücum kıçında oluşturulur:

@EventDates VARCHAR(1024);

SET @EventDates = '';

©EventDates = @EventDates + CONVERT(VARCHAR(15), a.d,107) + ' SEÇİN

FROM (Etkinlik katılım Turu'ndan DateBegin'i [d] olarak seçin

Event.TourID = Tour.TourlD WHERE Turunda. = 'Dış Banka Deniz Fenerleri') olarak;

SEÇ Sol(@EventDates, Len(@EventDates)-1)

AS 'Outer Banks Deniz Fenerleri Etkinlikleri';

Vikonannya paketinin sonucu:

Dış Bankalar Deniz Feneri Etkinlikleri

Sayısal atamalarla sayıların değiştirilmesi sorunu, denormalize edilmiş verilerin doğru sırasının garanti edilmesidir. Bu belgelememe yöntemi hile gibi göründüğünden, SQL Server'ın tüm parlaklığıyla övünemezsiniz. Prote vin, günün randevularının anısına kırmızı bayrak olarak gösterilebilir (imleci geçersiz kıldığını görüyorum).

Leran2002 9 Nisan 2015, 12:31

MS SQL Server lehçesini kullanarak SQL (DDL, DML) öğrenmek için öğrenci. levrek parçası

  • SQL,
  • Microsoft SQL Sunucusu
  • öğretici

Bu asistanın ne hakkında

Tsey podruchnik є kshtalt'ta "hafızamın damgasına" shchos z mov SQL (DDL, DML), tobto. Mesleki faaliyet sürecinde biriktirdiği şekliyle bu bilgiler sürekli kafamda toplanıyor. Benim için Tse, veri tabanlarıyla çalışırken en yaygın olan yeterli bir minimumdur. Daha fazla yeni SQL yapısı gönderme ihtiyacı nedeniyle, MSDN kitaplığından yardım istedim ve onu İnternet'e koydum. Kanımca, kafanızdaki her şeyi oldukça sorunsuz bir şekilde alın, bu kişinin özellikle fazla bir şeye ihtiyacı yoktur. Ale ana yapıları bilmek daha da iyidir, çünkü koku zastosovnі pratik olarak Oracle, MySQL, Firebird gibi zengin ilişkisel veri tabanlarında. Vidminnosti esas olarak veri türleriyle ilgilidir, ancak ayrıntılarla değiştirilebilirler. SQL dilinin ana yapıları o kadar zengin değildir ve sürekli uygulama için pis koku hızla unutulur. Örneğin, nesne oluşturmak için (tablo, indeks, indeks vb.), bir veri tabanı ile çalışmak için bir metin editörü (IDE) yeterlidir ve bir veri tabanı ile çalışmak için görsel araçlar kullanmaya gerek yoktur. belirli bir veritabanı türü (MS SQL), Oracle, MySQL, Firebird, …). Metnin tamamının gözünüzün önünde olması kullanışlıdır ve örneğin bir dizin veya takas oluşturmak için sayısal sekmeleri sıralamanız gerekmez. Veritabanıyla sonradan çalışma durumunda, nesneyi oluşturun, değiştirin ve özellikle ek komut dosyaları için yeniden oluşturun, görsel modda daha hızlı, hatta daha düşük görünecektir. Ayrıca, komut dosyası modunda (uygun doğruluk için vіdpovіdno), nesneleri adlandırmak için kuralları ayarlamak ve kontrol etmek daha kolaydır (benim öznel düşüncem). Bundan önce, komut dosyaları farklı bir zamanda manuel olarak ince ayar yapılabilir, değiştirirseniz, bir veritabanında (örneğin, bir testte) dolaşmak için, onu başka bir veritabanına (verimli) bu şekilde aktarmak gerekir.

Mova SQL birkaç bölüme ayrılmıştır, burada en önemli 2 bölüme bakacağım:
  • DML – Veri İşleme Dili
    • SEÇ - veri seçimi
    • INSERT - yeni veri ekle
    • GÜNCELLEME - veri güncellemesi
    • SİL - verileri sil
    • BİRLEŞTİRME - kızgın danich
Çünkü Ben bir uygulayıcıyım, çünkü böyle bir teori belirli bir asistan için yeterli olmayacaktır ve tüm yapılar pratik dipçikler üzerinde açıklanmaktadır. O zamana kadar, dil programlamanın ve özellikle SQL'in yalnızca pratikte, kendi kendine çalışarak ve diğer tasarımı kazanırsan ne öğreneceğini anlayarak ustalaşılabileceğini önemsiyorum.

Bu asistan, Adım Adım, tobto ilkesine göre oluşturulmuştur. sonrasında yogo okumak ve sonrasında çantaya koymak gerekiyor. Komut hakkında daha ayrıntılı bilgi edinmeniz gerekiyorsa, İnternet'te, örneğin MSDN kitaplığından belirli bir arama yapın.

Bu asistanın yazılmasından hemen önce, MS SQL Server sürüm 2014'ün veritabanı sorgulandı, komut dosyaları yazmak için MS SQL Server Management Studio'yu (SSMS) sorguladım.

Kısaca MS SQL Server Management Studio (SSMS) hakkında

SQL Server Management Studio (SSMS), veritabanı bileşenlerini yapılandırmak, yönetmek ve yönetmek için Microsoft SQL Server için bir yardımcı programdır. Bu yardımcı program, betik düzenleyicinin (temel olarak bizim tarafımızdan kullanılacaktır) ve nesnelerle çalışan ve sunucuyu ince ayar yapan grafik programının yerini alacaktır. SQL Server Management Studio'nun ana aracı, sunucu nesnelerini gözden geçirmenize, görüntülemenize ve ayrıca onlara değer vermenize olanak tanıyan Nesne Gezgini'dir. Bu metne genellikle Wikipedia'dan başvurulur.

Yeni bir betik düzenleyici oluşturmak için Yeni Sorgu düğmesine tıklayın:

Akış veri tabanını değiştirmek için gördüğünüz listeyi değiştirebilirsiniz:

Bir şarkı komutu (veya bir grup komut) kazanmak için onu görebilir ve “Execute / Vikonati” düğmesine veya “F5” tuşuna basabilirsiniz. Kural olarak şu anda editörde sadece bir komut var, aksi halde tüm komutları seçmeniz gerekiyor, hiçbir şey görmenize gerek yok.

Özellikle nesneleri (tablolar, tablolar, dizinler) oluşturan komut dosyalarını değiştirmek istiyorsanız, değiştirmek için, belirli grubu (örneğin, Tablolar), tablonun kendisini veya Stovpts grubunu gördükten sonra bağlam menüsünden değiştirin. diğerinde

Buradaki izmaritleri hedeflemek için bilmemiz gereken her şey yolunda. SSMS yardımcı programı için Reshta'yı bağımsız olarak öğrenmek çok önemli değil.

Trochy teorisi

İlişkisel veri tabanı (RDB, aksi takdirde yalnızca bir veritabanı bağlamında) birbiriyle ilişkili tabloların bir koleksiyonudur. Açıkça söylemek gerekirse, veritabanı, verilerin yapılandırılmış bir görünümden kaydedildiği bir dosyadır.

DBMS - Veri Tabanı Yönetim Sistemi, tobto. Belirli bir veri tabanı türüyle (MS SQL, Oracle, MySQL, Firebird, ...) çalışmak için araçlar kompleksi.

Not
Çünkü hayatta, roma dilinde "Oracle DB" diyoruz veya sadece "Oracle" diyoruz, gerçekten "Oracle DBMS" gibi görünüyor, sonra bu asistan bağlamında bazen DB terimi kullanılıyor. Bağlamdan, bence, bunu kendim halletmek mantıklı olacaktır.

Masa Stovptsі, böylece kendilerine alanlar veya sütunlar diyebilirler, tüm kelimeler kendilerine söyledikleri eşanlamlılar olarak muzaffer olacaktır.

Tablo, RDB'nin ana nesnesidir, RDB'nin tüm verileri tablonun sütunlarında bir satırda alınır. Satırlar, kayıtlar - ayrıca eşanlamlılar.

Cilt tabloları için, like ve її stovptsіv, onlardan önce ne tür yıllar önce isimler verilir.
MS SQL'deki nesne adı (tablo adı, sütun adı, dizin adı) maksimum 128 karakter uzunluğunda olabilir.

sonuçlandırmak için– DB ORACLE nesne adları en fazla 30 karakter içerebilir. Bu nedenle, belirli bir veritabanı için, karakter sayısı sınırına uymak için nesneleri adlandırmak için kendi kurallarını değiştirmek gerekir.

SQL - veritabanına DBMS'nin önünde yazmanıza izin veren dil. Belirli bir DBMS için SQL dilinin belirli bir uygulaması (kendi lehçesi) olabilir.

DDL ve DML - SQL filminin alt kümesi:

  • Mova DDL, tobto veritabanının yapısını değiştirmeden önce hizmet vermektedir. tablolar ve bağlantılar oluşturmak/değiştirmek/görüntülemek için.
  • Mova DML, tablolardan, tobto'dan verileri değiştirmenize olanak tanır. h її satırlar. Win, tablolardan veri seçmenize, tablolara yeni veriler eklemenize ve ayrıca ilgili verileri güncellemenize ve görüntülemenize olanak tanır.

Move SQL'de 2 tür yorum olabilir (tek satırlı ve çok satırlı):

Tek satırlı yorum
і

/* hata sıralı yorum */

Vlasne, teori için her şey yeterli olacaktır.

DDL - Veri Tanımlama Dili

Örneğin, є olmayan bir programcı durumunda spivrobitnikov hakkındaki verileri içeren tabloya bir göz atalım:

Tabloların farklı sütunları şu adlara sahip olabilir: Personel numarası, PIB, Doğum tarihi, E-posta, Posada, Vіddіl.

Bu stovptsіv'in derisi, yenisinde intikam alınacak veri türü ile karakterize edilebilir:

  • Personel numarası - tam sayı
  • PIB - sıra
  • Doğum tarihi - tarih
  • E-posta - satır
  • Posada - sıra
  • Viddil - sıra
Stovptsya tipi - bir karakteristik, bunlar hakkında nasıl konuşulur, yakі danі dans stovpets'i kurtarabilir.

Başlangıç ​​​​olarak, yalnızca MS SQL'de ayırt edilen bu tür temel veri türlerini hatırlamak yeterli olacaktır:

Değer MS SQL tarafından belirlenmiş Tanım
Satır değiştirme evi varchar(N)
і
nvarchar(N)
Ek sayı N için, çift sıra için olası maksimum sıra uzunluğunu belirtebiliriz. Örneğin, "PIB" değerinin en fazla 30 karakter içerebileceğini söylemek istiyorsanız, nvarchar(30) türünü belirtmelisiniz.
varchar ve nvarchar arasındaki fark, varchar'ın, bir karakterin 1 bayt aldığı ASCII formatındaki satırları kaydetmenize izin vermesi ve bir karakter 2 bayt aldığında nvarchar'ın Unicode formatındaki satırları almasıdır.
Varchar türü, yalnızca bu alana Unicode karakterlerin kaydedilmesine gerek olmadığından %100 emin olduğunuz şekilde seçilebilir. Örneğin, e-posta adresini kaydetmek için varchar kullanılabilir, çünkü ASCII karakterlerinden daha fazla şarkı söylüyor.
Satır sabit dozhina karakter(N)
і
nchar(N)
Değiştirilebilir dozhina satırında, bu tür aynı olarak kabul edilir, dozhina satırı N karakterden azdır, her zaman dozhina N'nin sağ elini kullanan kişi tarafından boşluklarla tamamlanır ve bakışta veritabanından alınır. , toto. veritabanından tam olarak N karakter alır (bir karakter char için 1 bayt ve nchar türü için 2 bayt alır). Uygulamada, bu türün sıkışık olduğu nadiren bilinir ve genellikle kazanır, o zaman char(1) biçiminde daha da önemlisi kazanır. alan bir karakter ise.
Bütün sayı int Danimarka tipi, stovptsi'de hem olumlu hem de olumsuz bir tam sayıdan daha fazla şarkı söylememize izin verir. Sonlandırma için (şu anda bizim için o kadar önemli değil) - -2 147 483 648 ila 2 147 483 647 int tipine izin veren sayı aralığı. Tanımlayıcıları ayarlamak için kullanılan ana türü adlandırın.
Konuşma chi deisne numarası batmadan yüzmek Basit bir dilde konuşursanız, bunlar bir düzine nokta (virgül) olabilen sayılardır.
tarih tarih Depolarda, üç depodan biriktiği için yalnızca Tarihi kaydetmeniz gerekiyorsa: Sayılar, Aylar ve Roku. Napriklad, 02/15/2014 (Fierce 15, 2014). "Kabul tarihi", "Doğum tarihi" vb. için Danimarka tipi seçilebilir. sessiz ortamlarda tarihi sabitlemek bizim için önemliyse ama depo saati bizim için önemli değilse onu bırakabiliriz ya da görmeyiz.
Saat zaman Danimarka tipi yenilebilir, bu nedenle stovptlardan, tobto'dan belirli bir saatten fazla tasarruf etmek gerekir. Yıllar, Khvilini, Saniye ve Milisaniye. Örneğin, 17:38:31.3231603
Örneğin, ünlü "Uçuşun kalkış saati".
tarih o saat tarih saat Bu tür, hem Tarih hem de Saatin aynı anda kaydedilmesine izin verir. Örneğin, 15.02.2014 05:38:31.323
Popo için yapabilirsin ama tarih olması gerektiği gibi aynı saat.
Prapor biraz Danimarka tipi manuel olarak “Tak” / “Hi” formunun değerini kaydedecek şekilde ayarlanır, de “Tak” 1, “Hi” 0 olarak alınır.

Bu nedenle, çitle çevrilmemiş olsa bile alanın kendisinin değeri belirtilmeyebilir, alanın değeri için NULL anahtar sözcüğü seçilir.

Uygulama amacıyla Test adında bir test veritabanı oluşturalım.

Aşağıdaki komut çalıştırılarak basit bir veritabanı (ek parametreler belirtilmeden) oluşturulabilir:

VERİTABANI OLUŞTURMA Testi
Veri tabanını şu komutla görüntüleyebilirsiniz (sizi bu komuttan da koruyacağız):

DROP VERİTABANI Testi
Veri tabanımıza gitmek için şu komutu kullanabilirsiniz:

ABD Testi
Aksi takdirde, SSMS menü alanındaki listeden Test veritabanını seçin. Benimle çalışırken, çoğu zaman üsler arasında geçiş yapma yöntemiyle kazanırım.

Artık veri tabanımızda bir tablo oluşturabiliriz, vikorist açıklamaları pis kokulu görünüyor, vicorist bu Kiril karakterlerini heceledi:

CREATE TABLE [Kayıt Cihazları]([Personel Numarası] int, [PIB] nvarchar(30), [Pop Tarihi] tarih, nvarchar(30), [Posada] nvarchar(30), [Viddil] nvarchar(30))
Bu vesileyle kare yaya […] isimlerini koyuyoruz.

Ek olarak, veritabanında daha fazla netlik için, nesnelerin tüm adları daha kısaca Latince olarak ayarlanmalı ve kayrak adlarında şarkı söylememelidir. MS SQL'de ses aynı zamanda kelime büyük harfle başlar, örneğin "Personel numarası" alanı için PersonelNumarası adını belirleyebiliriz. Ayrıca ad, örneğin TelefonNumarası1 gibi sayılarla bükülebilir.

Not
Bazı DBMS'lerde, "PHONE_NUMBER" adı için mevcut biçimi kısaltabiliriz, örneğin, ORACLE veritabanında bu biçim sıklıkla kullanılır. Doğal olarak, alan adı belirlenirken VTYS'de seçilen anahtar kelimelerden kaçınmak gerekli değildir.

Herhangi bir nedenle, kare kemerli sözdizimini unutabilir ve [Spivrobitniki] tablosuna bakabilirsiniz:

DÜŞME TABLOSU
Örneğin 3 çalışanlı bir tablo "Çalışanlar" olarak adlandırılabilir ve її alanlarına aşağıdaki adlar verilebilir:

  • Kimlik - personel numarası (arayanın kimliği)
  • İsim - PIB
  • Doğum günü - doğum günü tarihi
  • E-posta
  • Pozisyon - Posada
  • Departman - Viddil
Tanımlayıcı alan için en yaygın isim kelime kimliğidir.

Şimdi tablomuzu oluşturalım:

CREATE TABLE Çalışanlar(ID int, Ad nvarchar(30), Doğum tarihi, E-posta nvarchar(30), Pozisyon nvarchar(30), Departman nvarchar(30))
stowpci için dizeleri ayarlamak için NOT NULL seçeneğini kullanabilirsiniz.

Halihazırda temel olan tablo için, saldırgan komutların yardımıyla alanlar yeniden atanabilir:





























Kimlik alanı güncellemesi ALTER TABLE Çalışanları ALTER COLUMN ID int NOT NULL

Not
Çoğu DBMS için SQL mov'un ana konsepti aynı bırakılmıştır (geliştirme şansı bulduğum bu DBMS hakkında yargıda bulunabilirim). DDL'nin farklı DBMS'lerdeki kapsamı esas olarak veri türleriyle ilgilidir (burada yalnızca adları değil, uygulamalarının ayrıntıları da değiştirilebilir), bu nedenle SQL uygulamasının en belirgin özellikleri maalesef lehçedeki küçük farklılıklar olabilir. tek bir standart yoktur). SQL'in temelleri ile bir DBMS'den diğerine geçiş yapabilirsiniz, çünkü o halde, yeni DBMS'de komutların uygulanmasına ilişkin ayrıntılar hakkında daha fazla bilgi edinmeniz gerekir. Çoğu durumda, sadece bir benzetme yapmak yeterli olacaktır.

Tablo oluşturma CREATE TABLE Çalışanlar(ID int, -- ORACLE'da int yazın - sayıya eşdeğer(38) Ad nvarchar2(30), -- ORACLE'de nvarchar2 MS SQL'de nvarchar'a eşdeğer Doğum tarihi, E-posta n , Pozisyon nvarchar2 (30) , Departman nvarchar2(30)); -- ID ve Name alanlarını güncelleyin (burada ALTER COLUMN, MODIFY(…) ile değiştirilir) ALTER TABLE Çalışanları MODIFY(ID int NOT NULL,Name nvarchar2(30) NOT NULL); -- PK ekleyin (MS SQL'de yapı i'ye benzer, aşağıda gösterilecektir) ALTER TABLE Çalışanlar ADD CONSTRAINT PK_Employees PRIMARY KEY(ID);
ORACLE є vіdminnostі vіdminnostі vіdmіnnostі vіdіnії için vіdіnії ії tip varchar2 uygulamasında, yogo kodlaması lаshtuvan db і metnine düşer, örneğin UTF-8 kodlamasında kaydedilebilir. Her şeyden önce, ORACLE'daki alan uzunluğu hem bayt hem de karakter olarak ayarlanabilir, bunlar için alan uzunluğundan sonra belirtilen BYTE ve CHAR ek seçenekleri belirtilir, örneğin:

NAME varchar2(30 BYTE) -- 30 bayta kadar alan kapsamı NAME varchar2(30 CHAR) -- 30 karaktere kadar alan alanı
Bir seçenek olarak, ORACLE tipi varchar2(30) içinde basit bir ekleme olması durumunda veritabanında saklamak için BYTE veya CHAR kilitlerini değiştirmek mümkün olacaktır, böylece bazen IDE özelleştirmelerinde ayarlanabilir. Bir saat boyunca kolayca kaybolabilirsiniz, çünkü ORACLE tipi kural olarak varchar2 tipini kullanır (ve burada bir saat için geçerlidir, örneğin UTF-8 kodlamasıyla), CHAR'ı açıkça yazacağım (çünkü daha kolay satırın kendisini karakterlerle adlandırmak için).

Ancak, tablolarda olduğu gibi, zaten є yak-nebud verileri de vardır, o zaman komutların başarılı bir şekilde yazılması için, tablonun tüm satırlarının obov'yazkovo zapovneni kimlik ve Ad alanlarına sahip olması gerekir. Bunu örnek üzerinde göstereceğiz, aşağıdaki komut dosyası tarafından oluşturulabilen ID, Pozisyon ve Departman alanlarındaki veri tablosuna ekleyeceğiz:

EKLE Çalışan(ID,Pozisyon,Departman) DEĞERLER (1000,N"Director",N"Yönetim"), (1001,N"Programcı",N"BT"), (1002,N"Muhasebeci",N"Muhasebe" ), (1003,N"Kıdemli programcı",N"BT")
Bazen INSERT komutu da bir af görür, çünkü eklerken, Ad alanının değerini dil alanına atamadılar.
Tabloda zaten veri varsa, ALTER TABLE Çalışanları ALTER COLUMN ID int NOT NULL komutu başarılı oldu ve ALTER TABLE Çalışanları ALTER COLUMN Name int NOT NULL komutu, Ad alanının NULL (atanmamış) olduğuna dair bir af mesajı gördü. değer.

Ad alanı için bir değer ekleyin ve veri girişini yenileyin:


Ayrıca, NOT NULL seçeneği, her yeni tablo oluşturulduğunda, yani yenilebilir. CREATE TABLE komutu bağlamında.

Arka tarafta, komutun yardımı için tabloyu görebiliriz:

DROP TABLE Çalışanları
Şimdi ID ve Name sütunlarını doldurmak için zorunlu olan bir tablo oluşturalım:

CREATE TABLE Çalışanlar(ID int NOT NULL, Name nvarchar(30) NOT NULL, Doğum tarihi, Email nvarchar(30), Pozisyon nvarchar(30), Departman nvarchar(30))
İsimden sonra NULL yazmak da mümkündür, bu da yeni NULL değerlerinin (belirtilmemiştir) geçerli olacağı anlamına gelir, ancak bu çalışma obov'yazkovo değildir, bu nedenle karakteristik anlayış uğruna verilmiştir.

Zapovnennia için gerekli neobov'yazkovym stovpet'lerini yapmak gerektiğinden, aşağıdaki komut sözdizimi galip gelir:

ALTER TABLE Çalışanları ALTER COLUMN İsim nvarchar(30) NULL
Abo basit:

ALTER TABLE Çalışanları ALTER COLUMN İsim nvarchar(30)
Bu komut ile ayrıca alanın tipini daha küçük bir toplam tipine çevirebilir veya ikincisini değiştirebiliriz. Örneğin, Ad alanını 50 karaktere genişletin:

ALTER TABLE Çalışanları ALTER COLUMN İsim nvarchar(50)

Birincil anahtar

Tablolar birleştirildiğinde, dış görünüm satırı için benzersiz olan küçük benzersiz bir stovpet'in veya bir stovptsiv kombinasyonunun olması önemlidir - verilen benzersiz değerler için, kaydı kesin olarak tanımlayabilirsiniz. Bu değer tablonun birincil anahtarı olarak adlandırılır. Çalışanlar tablomuz için, bu tür benzersiz değerlere bir kimlik atanabilir ("Çalışanın geçici personel numarası" olarak kullanılabilir - bizim durumumuzda, değer cilt uzmanı için benzersizdir ve tekrarlanamaz).

Ek komutu kullanarak zaten var olan tablonun ilk anahtarını oluşturabilirsiniz:

ALTER TABLE Çalışanlar KISITLAMA EKLE PK_Çalışanlar BİRİNCİL ANAHTAR(ID)
De "PK_Employees" tse іm'ya obmezhennya, ilk anahtar için scho vydpovidaє. Birincil anahtarın adını seslendirin, herhangi bir tablo adından sonra “PK_” öneki seçilir.

İlk anahtar dekilkoh alanlarından oluştuğu için, bu alanların kemerlerde yeniden işlenmesi gerekir:

ALTER TABLE tablo_adı KISITLAMA EKLE exchange_name PRIMARY KEY(field1,field2,…)
Varto, MS SQL'de, NOT NULL karakteristiği nedeniyle alanların birincil anahtardan önce dahil edilmesi gerektiğini belirtir.

Ayrıca, ilk anahtar, tablo oluşturulurken gecikmeden atanabilir, tobto. CREATE TABLE komutu bağlamında. Tabloyu görelim:

DROP TABLE Çalışanları
Ve sonra її, vikoristovuyuuchi saldırgan sözdizimi oluşturalım:

CREATE TABLE Çalışanlar(ID int NOT NULL, Name nvarchar(30) NOT NULL, Virtual Hour, Email nvarchar(30), Position nvarchar(30), Departman nvarchar(30), CONSTRAINT PK_Employees PRIMARY KEY tüm alanların çalışanı olarak)
Veri tablosundaki verilerin oluşturulmasından sonra:

EKLE Çalışan(Kimlik,Pozisyon,Departman,Adı) DEĞERLER (1000,N"Director",N"Yönetim",N"Ivanov I.I."), (1001,N"Programcı",N"IT",N" Petrov P.P." ), (1002,N"Muhasebeci",N"Muhasebe",N"Sidoriv S.S."), (1003,N"Kıdemli Programcı",N"IT",N"Andreev A. A.")
Bir tablonun ilk anahtarı bir sütunun değerinden küçük olduğu için aşağıdaki sözdizimini çevirebilirsiniz:

CREATE TABLE Çalışanlar(ID int NOT NULL CONSTRAINT PK_Employees PRIMARY KEY, - alanın bir özelliği olarak belirtilebilir Ad nvarchar(30) NOT NULL, Doğum tarihi, E-posta nvarchar(30), Pozisyon nvarchar(30), Departman n
Şirketin gerçek adını ayarlayabilir veya ayarlayamazsınız, bu durumda size bir sistem adı atanır (örneğin, PK__Employee__3214EC278DA42077):

CREATE TABLE Çalışanlar(ID int NOT NULL, Name nvarchar(30) NOT NULL, Doğum tarihi, E-posta nvarchar(30), Pozisyon nvarchar(30), Departman nvarchar(30), BİRİNCİL ANAHTAR(ID))
Abo:

CREATE TABLE Çalışanlar(ID int NOT NULL PRIMARY KEY, Name nvarchar(30) NOT NULL, Doğum tarihi, Email nvarchar(30), Pozisyon nvarchar(30), Departman nvarchar(30))
Ale, post_ynih tabloları zavzhdya için bi'yi açıkça im'ya obmezhennya olarak ayarlamanızı öneririm, tk. onları açıkça belirlemek ve anlamak için, onunla manipülasyonlar yapmak daha kolay olacaktır, örneğin, aşağıdakileri çözebilirsiniz:

ALTER TABLE Çalışanları DROP CONSTRAINT PK_Employees
Ancak bu kadar kısa bir sözdizimi, sınırlara adlar atamadan, manuel olarak zastosovuvat, veritabanının zaman tablosunun oluşturulma saatini belirledi (zaman tablosunun süresi # chi ##'ye dayalıdır), maç olur olmaz görüldü.

Muhtemelen

Hemen ilerleyen komutlara baktık:
  • TABLO OLUŞTUR tablo_adı (bu türdeki alanların yeniden yüzeylenmesi, sınırlandırma) – akış veritabanında yeni bir tablo oluşturulana kadar hizmet eder;
  • DÜŞME TABLOSU tablo_adı – bir akış veritabanından uzak tablo olarak hizmet eder;
  • TABLOYU DEĞİŞTİR Tablo ismi ALTER SÜTUN im'ya_stovptsya ... – stovptsya türünü güncellemeye veya ayarını değiştirmeye hizmet eder (örneğin, NULL veya NOT NULL karakteristiğini ayarlamak için);
  • TABLOYU DEĞİŞTİR Tablo ismi KISITLAMA EKLE im'ya_obezhennya BİRİNCİL ANAHTAR(field1, field2,…) – mevcut tabloya birincil anahtarın eklenmesi;
  • TABLOYU DEĞİŞTİR Tablo ismi DÜŞÜRME KISITLAMASI exchange_name - tablolardan uzak değişim.

Timchas tabloları hakkında Troch'lar

MSDN'den Virizka. MS SQL Server'da iki tür zaman tablosu vardır: yerel (#) ve genel (##). Yerel zaman tabloları, oturum bir SQL Server örneğiyle tamamlanana kadar, tıpkı geçmişteki yaratım kokusu gibi, yaratıcıları tarafından daha az görünür. Yerel saat tabloları, SQL Server örneğinde saat açıldığında otomatik olarak görünür. Küresel saat tabloları, tablolarda göründükleri şekliyle tüm saatler SQL Server örneğine dahil edilmişse, bu tabloların oluşturulmasından sonra oluşturulmuş ve görünür durumda olsunlar, tüm saatler tarafından görülebilir.

Zamanlama tabloları tempdb sistem veritabanında oluşturulur, yani. ana veritabanı tarafından görülmeden oluşturulduğunda, başka bir zaman tablosunda birincil tablolarla aynıdır, DROP TABLE komutu yardımıyla görülebilirler. Çoğu zaman, yerel (#) saat tabloları galip gelir.

Bir zaman tablosu oluşturmak için CREATE TABLE komutunu kullanabilirsiniz:

CREATE TABLE #Temp(ID int, Name nvarchar(30))
MS SQL'deki zaman tablosu birincil tabloya benzer olduğundan, DROP TABLE komutunun kendisi tarafından da görülebilir:

DÜŞÜRME TABLOSU #Sıcaklık

Böylece, zaman tablosunun kendisi (orijinal tablo gibi) oluşturulabilir ve muzaffer SELECT ... INTO sözdizimi tarafından döndürülen verilerle hemen yüklenebilir:

Çalışanlardan #Temp INTO ID, Name SEÇİN

Not
Farklı DBMS'lerde, zaman tablolarının uygulanması farklı olabilir. Örneğin, ORACLE ve Firebird DBMS'de, timchasovyh tablolarının yapısı daha sonra CREATE GLOBAL TEMPORARY TABLE komutu tarafından atanan veri toplama özelliklerinden atanacaktır ve zaten ana tabloların ortasını kontrol etmek gerekliydi ve onunla oldukça büyük bir masa olarak çalışın.

Veritabanının normalleştirilmesi - alt tablolara (belgelere) bölme ve bağlantı atama

Akış tablomuz Çalışanlar, yılın ilk yarısında aflarla tehdit edeceğim koristuvach'ın Pozisyon ve Departman alanlarına herhangi bir metin girebilenler için yeterli olmayabilir, böylece bir spіvrobіtnik'in şarabı olarak girilebilir. а vіddіl sadece “ІТ” ve başka bir spіvrobіtnik için, örneğin üçüncü "IT" de "IT-viddil" girin. Sonuç olarak, annenin uvazi koristuvach, tobto üzerinde olması mantıksızdı. aynı vіddіlu uygulayıcıları tarafından verilen spіvrobіtniki ne yaptı, koristuvach kendini ne tarif etti ve 3 farklı vіddіlu? Ve ayrıca, bize göre, böyle bir isim için verileri doğru bir şekilde gruplayamayız, de, cilt hastalığının analizinde spivrobitniklerin sayısını göstermek mümkündür.

Başka bir nedolіk polygaє y obsyazі zberіgannya tsієї іnformatsії її її dubluvannyam, tobto. bir cilt sembolü için, kişinin adına cilt sembolü seçimi için veri tabanında kullanılan kişinin adının belirtilmesi gerekir.

Üçüncü nedolіk, örneğin "Programcı" adını "Genç programcı" olarak değiştirmek gerektiğinden, bir bitkinin adını değiştirir gibi, bu alanları güncellemenin katlanabilirliğidir. Bu noktada, aynı Posada dorovnyu «Programist» içinde tablonun dış görünüm satırında değişiklikler yapabileceğiz.

Bu eksiklikleri ve zastosovuєtsya'yı önlemek için veri tabanının normalleştirilmesi denir - bunları alt tablolara bölmek, dovidniki tabloları. Üçlü olmayan teorilerde ve kıvrımlarda yalan söylemek obov'yazkovo değil, normal formların ne hayal edileceği, normalleşmenin özünü anlamak için yeterli.

“Plant” ve “Viddili” olmak üzere 2 tablo oluşturalım, ilki Pozisyonlar, diğeri Departmanlar:

CREATE TABLE Konumlar(ID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_Positions PRIMARY KEY, Name nvarchar(30) NOT NULL) CREATE TABLE Departmanlar(ID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_Departments PRIMARY ) NOT NULL)
Saygılarımızla, burada yeni bir KİMLİK seçeneği getirdik, tabiri caizse ID sütununda verilenler otomatik olarak 1'den başlayarak, yani 1'den numaralandırılıyor. yeni kayıtlar eklerken sırayla 1, 2, 3 vb. değerler atanır. Bu tür alanlara otomatik artış denir. Bir tablonun kendisine atanmış birden fazla KİMLİK alanı olabilir ve kural olarak bir dile sahip olması gerekli değildir, böyle bir alan bu tablo için birincil anahtardır.

Not
Farklı DBMS'lerde, özel bir kişiden sulamanın uygulanması kendi başına çalışabilir. Örneğin MySQL'de, böyle bir alan ek AUTO_INCREMENT seçeneğine atanır. ORACLE ve Firebird'de, önceden bu işlevsellik çeşitli dizilerin (SEQUENCE) yardımıyla öykünülebiliyordu. Bildiğim kadarıyla ORACLE, KİMLİK OLARAK OLUŞTURULDU seçeneğini hemen ekledi.

Çalışanlar tablosunun Pozisyon ve Departman alanlarındaki akış verisi kayıtlarına göre tabloları otomatik olarak hatırlayalım:

Konumlar tablosunun Ad alanı, tablonun Konum alanından benzersiz değerlerle yüklenir.
Aynı şey Departmanlar tablosu için de mümkündür:

Departmanları KOYUN(Adı) Çalışanlardan FARKLI Departman SEÇİN BÖLÜM BOŞ OLMADI
Pozisyonlar ve Departmanlar tablolarına baktığımızda ID alanına değer yazarak da değerleri numaralandırabiliriz:

SEÇ * Pozisyonlardan

SEÇ * Bölümlerden

Tabloların verileri artık yerleşim yeri başkanı ve viddіlіv için dovіdnikov rolünü oynuyor. Şimdi iniş tanımlayıcısını soruyoruz ve vіddіlіv. Bu tanımlayıcıları toplamak için Çalışanlar tablosunda yeni alanlar oluşturuyoruz:

Tesis kimliği için bir alan ekleyin ALTER TABLE Çalışanlar ADD PositionID int -- tesisin kimliği için bir alan ekleyin ALTER TABLE Çalışanlar ADD DepartmentID int
Uygulanabilir sulama türü, dovidniklerde olduğu gibi, bu tse int'de her ikisinin de hatasıdır.

Tarlaları kimin aracılığıyla dirilterek, tek bir komutla tablodaki tabloya bir miktar sulama eklemek de mümkündür:

ALTER TABLE Çalışanları ADD PositionID int, DepartmentID int
Şimdi bu alanlara değeri (muhtemel takas - YABANCI ANAHTAR) yazacağız, verilen alanlara yazmanın mümkün olmaması için, alanlarda bulunan kimliğin değerini, günlük ortalama değerini yazacağız.

ALTER TABLE Çalışanlar KISITLAMA EKLE FK_Employees_PositionID YABANCI ANAHTAR(PositionID) REFERANSLAR Pozisyonlar(ID)
Ben başka bir alan için aynı zrobimo:

ALTER TABLE Çalışanlar KISITLAMA EKLE FK_Employees_DepartmentID YABANCI ANAHTAR(DepartmentID) REFERANSLAR Departmanlar(ID)
Artık bu alana belirtilen tarihten itibaren ekstra bir ID değeri girilebilir. Görünüşe göre, yeni bir rekor veya ekim kazanmak istiyorsanız, son tarihe yeni bir rekor eklemek bizim sorumluluğumuz olacak. Çünkü yabani otların artık tek bir örnekte dovіdniki'ye kaydedildiği bitki, daha sonra adını değiştirmek için dovidnik'te її tіlki'yi değiştirmek yeterlidir.

Іm'ya possilnogo obezhennya, çağrı, є depolanabilir, "FK_" ön ekinden katlanır, ardından ім'ya alanlarındaki işaretin işaretinden sonra ім'я tablolarına gidin, yak tablo-dodnik'in tanımlayıcısını isteyin .

KİMLİKÇİ (ID) vanaların içini arayın, yake vicoristov, Zv'yazkiv ve Yak Zariga için Tilki olacak, Bilshosti vipadkiv'de, postaya seyahat, vinosa, vinics, doktordan din kayıtları yok.

ALTER TABLE tbl KISITLAMA EKLE IM_ID YABANCI ANAHTAR(alan1, alan2,…) REFERANSLAR tablo_adresi(alan1, alan2,…)
Bu durumda, "table_domain" tablosunda, gösterimlerin ilk anahtarı, çıkartma alanlarının (field1, field2, ...) birleşimidir.

Pekala, şimdi PositionID ve DepartmentID alanlarını dokümanlardan gelen ID değerleriyle güncelleyelim. Bu DML'yi UPDATE komutuyla yükleyin:

GÜNCELLEME e SET PozisyonID=(Ad=e.Pozisyon NEREDE Pozisyonlardan ID SEÇ), DepartmanID=(Ad=e.Departman NEREDE Departmanlardan ID SEÇ) Çalışanlardan e
Olanlara hayret ediyoruz, diye sordu vykonavshi:

SEÇ * ÇALIŞANLARDAN

İşte bu kadar, farklı posadlar ve diğer tanımlayıcılarla doldurulmuş PositionID ve DepartmentID alanları artık Çalışanlar tablosundaki Pozisyon ve Departman alanlarında bulunmamaktadır, şu alanları görebilirsiniz:

ALTER TABLE Çalışanları DROP COLUMN Pozisyon, Departman
Şimdi tablomuz şöyle görünüyor:

SEÇ * ÇALIŞANLARDAN

İD İsim Doğum günü E-posta Pozisyon Kimliği Departman Kimliği
1000 İvanov I.I. HÜKÜMSÜZ HÜKÜMSÜZ 2 1
1001 Petrov P.P. HÜKÜMSÜZ HÜKÜMSÜZ 3 3
1002 Sidorov S.S. HÜKÜMSÜZ HÜKÜMSÜZ 1 2
1003 Andreev A.A. HÜKÜMSÜZ HÜKÜMSÜZ 4 3

Toto. Sonuç olarak, dünya üstü bilgileri topladık. Şimdi, sayıların ardından, o değişkeni koyun, bunları açık bir şekilde adlandırabilirsiniz, tablolar-dodniklerde vicorist değerler:

SELECT e.ID,e.Name,p.Name PozisyonAdı,d.Name DepartmanAdı Çalışanlardan e SOL JOIN Departmanlar d AÇIK d.ID=e.DepartmentID LEFT JOIN Pozisyonları p AÇIK p.ID=e.PozisyonID

Object Inspector'da bu tablo için oluşturulmuş tüm nesneleri dahil edebiliriz. Bu nesnelerle çeşitli işlemler yapabilirsiniz - örneğin, nesneleri yeniden adlandırın ve kaldırın.

Tablonun kendisi için sorulabileceğini de belirtmek gerekir, tobto. yinelemeli olarak zorla yapılabilir. Butt için bu spivrobitnik'in sipariş edildiği spivrobitnik'in göstergesi olduğu için spivrobitnik'lerle tablomuza bir alan daha ManagerID ekliyoruz. Bir alan oluşturuyoruz:

ALTER TABLE Çalışanları ADD ManagerID int
Bu alan geçerli bir NULL değerine sahiptir, alan boş olacaktır, örneğin, ayırıcının üzerinde ek sayılar yoktur.

Şimdi Çalışanlar tablosunda bir YABANCI ANAHTAR oluşturalım:

ALTER TABLE Çalışanlar KISITLAMA EKLE FK_Employees_ManagerID YABANCI ANAHTAR (ManagerID) REFERANSLAR Çalışanlar(ID)
Şimdi bir diyagram oluşturalım ve tablolarımız arasındaki bağlantılara nasıl baktığımıza hayret edelim:

Benim hatam sonucu resim gelecek (Çalışanlar tablosu Pozisyonlar ve Departmanlar tablolarına bağlıdır ve kendi üzerinde de çalışır):

Gönderdiğiniz anahtarlar, ON DELETE CASCADE ve ON UPDATE CASCADE gibi ek seçenekler içerebilir, bunlar hakkında konuşmak, bir kaydı gördüğünüzde veya güncellediğinizde nasıl davranacağınız, eklenti tablosuna nasıl göndereceğiniz gibi. Bu seçenekler belirtilmezse, o kaydın diğer tablodan gönderildiği tarih tablosundaki kimliği değiştiremeyiz, bu nedenle tüm satırları görene kadar tarihin kendisinden böyle bir kayıt göremeyiz. bu tüm kayda atıfta bulunur. Bu satırlarda daha fazla anlam eklemek için yeni.

Örneğin, FK_Employees_DepartmentID için atanmış ON DELETE CASCADE seçeneklerinden tabloyu yeniden oluşturalım:

DROP TABLE Çalışanlar CREATE TABLE Çalışanlar(ID int NOT NULL, İsim nvarchar(30), Doğum tarihi, Email nvarchar(30), PositionID int, DepartmentID int, ManagerID int, CONSTRAINT PK_Employees PRIMARYKE ) REFERANSLAR Departmanlar(ID) ON DELETE CASCADE, CONSTRAINT FK_Employees_PositionID YABANCI ANAHTAR(PozisyonID) REFERANSLAR Pozisyonlar(ID), KISITLAMA FK_Employees_ManagerID YABANCI ANAHTAR (YöneticiKimliği) )DEĞERLER (1000,N"Ivanov I.I.","19550219",2,1,NULL), (1001,N"Petrov P.P.", "19831203",3,3,1003), (1002 ,N"Sidorov S.S.","19760607",1,2,1000), (1003,N"Andreev A.A.","19820417",4,3,1000)
Departmanlar tablosundan ID 3 ile yapıldığını gördük:

KİMLİK=3 NEREDE Departmanları SİL
Çalışanlar tablosundaki verilere bakıldığında:

SEÇ * ÇALIŞANLARDAN

İD İsim Doğum günü E-posta Pozisyon Kimliği Departman Kimliği Yönetici Kimliği
1000 İvanov I.I. 1955-02-19 HÜKÜMSÜZ 2 1 HÜKÜMSÜZ
1002 Sidorov S.S. 1976-06-07 HÜKÜMSÜZ 1 2 1000

Bachimo gibi, 3. Çalışanlar tablosu verildiğinde, öyle oldu.

ON UPDATE CASCADE seçeneği aynı şekilde davranır, ancak yalnızca kimliğin değeri güncellendiğinde. Örneğin, posad kontrol listesindeki fabrika ID'sini değiştirirsek, bu durumda Çalışanlar tablosunun DepartmanID'si, kontrol listesinde belirlediğimiz gibi yeni ID değeri ile güncellenecektir. Ale, bu vipadka tse'de görmemeyi gösteriyor, çünkü Sonraki talebe saldırmamıza izin vermemek için Departmanlar tablosundaki Kimlik sütununda KİMLİK seçeneği bulunmalıdır (girişin kimliğini 3'ten 30'a değiştirin):

GÜNCELLEME Departmanları SET ID=30 WHERE ID=3
Golovne zrozumit tsikh 2 seçeneklerinin özünü DELETE CASCADE ve ON GÜNCELLEME CASCADE. Ben zastosovuyu tsі bile nadiren seçerim ve iyi düşünmenizi tavsiye ederim, nasıl uygulanabilir bir obezhennya'ya girilir, tk. raporun tablosundan alışılmadık bir kayıtla, büyük sorunlara yol açabilir ve bir Lantzugian tepkisi yaratabilir.

Not 3:

IDENTITY değeri ekleme/değiştirme izni var SET IDENTITY_INSERT Departmanlar ON INSERT Departmanlar(ID,Name) VALUES(3,N"IT") -- IDENTITY değerinin eklenmesini/değiştirilmesini engelle SET
TRUNCATE TABLE komutu yardımıyla tekrardan Çalışanlar tablosunu temizleyelim:

TRUNCATE TABLE Çalışanları
Ön INSERT komutunu tekrar ziyaret ederek bu verilerde tekrar ediyorum:

EKLE Çalışan (Kimlik,Ad,Doğum Günü,PozisyonKimliği,DepartmanKimliği,YöneticiKimliği)DEĞERLER (1000,N"Ivanov I.I.","19550219",2,1,NULL), (1001,N"Petrov P.P." ,"19831203",3 ,3,1003), (1002,N"Sidorov S.S.","19760607",1,2,1000), (1003,N"Andreev A.A.","19820417" ,4,3,1000)

Muhtemelen

Şu anda, birkaç DDL komutu daha bilgimize geldi:
  • KİMLİK'i alana eklemek - tablo için alanın otomatik olarak doldurulmasına (alan-adı) izin verir;
  • TABLOYU DEĞİŞTİR Tablo ismi EKLEMEK change_fields_with_characteristics – tabloya yeni alanlar eklemenizi sağlar;
  • TABLOYU DEĞİŞTİR Tablo ismi DÜŞÜK SÜTUN list_of_fields - tablolardan alanları görmenizi sağlar;
  • TABLOYU DEĞİŞTİR Tablo ismi KISITLAMA EKLE im'ya_obezhennya YABANCI ANAHTAR(alanlar) REFERANSLAR doc_table(fields) – bir tablo ile bir belge tablosu arasında bir bağlantı atamanıza izin verir.

Diğer borsalar – BENZERSİZ, VARSAYILAN, KONTROL

BENZERSİZ sulamanın yardımı için, belirli bir alanda veya bir dizi sulamada cilt çizgisinin değerinin ne kadar benzersiz olabileceğini söyleyebilirsiniz. Çalışanlar tablosu söz konusu olduğunda, E-posta alanına da bir sınır yerleştirebilirsiniz. Henüz atanmamışlar gibi E-posta değerlerini yalnızca önceden hatırlayın:

GÜNCELLEME Çalışanları AYARLA E-posta=" [e-posta korumalı]"WHERE ID=1000 UPDATE Çalışan E-postasını Ayarla=" [e-posta korumalı]" WHERE ID=1001 UPDATE Çalışanlar SET Email=" [e-posta korumalı]"WHERE ID=1002 UPDATE Çalışanlar SET E-postası=" [e-posta korumalı] NEREDE KİMLİĞİ=1003
Ve şimdi obmezhennia benzersizliği alanına koyabilirsiniz:

ALTER TABLE Çalışanlar KISITLAMA EKLE UQ_Employees_Email UNIQUE(Email)
Artık muhabir, bir dizi spivrobitnik içeren aynı E-postayı giremez.

Benzersizlik değiş tokuşu bu şekilde adlandırılır - her şeyden önce, "UQ_" ön eki tablonun adını verir ve alan adının alt bölümünün işaretinden sonra, verilen değiş tokuş üst üste bindirilmiş gibi.

Görünüşe göre sulamaların kombinasyonu tablolardaki sıra sıralarında benzersizdir, ancak bunları kimin aracılığıyla kullanmak mümkündür:

ALTER TABLE tablo_adı KISITLAMA EKLE exchange_name UNIQUE(field1,field2,…)
VARSAYILAN kutu alanına ekleme konusunda ek yardım için, kilidin değerini açılır listede gösterilecek şekilde ayarlayabiliriz, böylece yeni bir kayıt eklerken alan, alanın alanlar listesinde yeniden listelenmeyecektir. EKLE komutu. Masaları katlarken aynı santrali aracısız kurabilirsiniz.

Çalışanlar tablosuna "Tarih Alınacak" yeni bir alan ekleyelim ve HireDate olarak adlandıralım ve bu alanı kilitlemek için değerin geçerli tarih olacağını varsayalım:

ALTER TABLE Çalışanlar ADD HireDate tarih NOT NULL DEFAULT SYSDATETIME()
HireDate zaten varsa, aşağıdaki sözdizimini değiştirebilirsiniz:

ALTER TABLE Çalışanları HireDate İÇİN VARSAYILAN SYSDATETIME() EKLE
Burada obezhennya'nın adını girmedim, çünkü vipadku VARSAYILAN'da, bunun o kadar kritik olmadığına dair bir fikrim vardı. Ama nazik çalışırsan, o zaman sanırım sıraya girip normal bir isim sormana gerek yok. Şu şekilde dövüş:

ALTER TABLE Çalışanlar KISITLAMA EKLE DF_Employees_HireDate DEFAULT SYSDATETIME() FOR HireDate
Daha önce buna dair bir işaret yoksa, dış görünüm kaydına eklediğinizde HireDate alanına daha doğru bir tarih eklenecektir.

Yeni bir giriş eklerken, güncel tarih de otomatik olarak eklenir, ancak bunu açıkça ayarlayamayız. stovptsіv listesinde gösterilmiyor. Çeviride HireDate alanı belirtilmeden, eklenen değer uygulamada gösterilir:

EKLE Çalışan(Kimlik,Ad,E-posta)DEĞERLER(1004,N"Sergeev S.S."," [e-posta korumalı]")
Ne olduğunu görelim:

SEÇ * ÇALIŞANLARDAN

İD İsim Doğum günü E-posta Pozisyon Kimliği Departman Kimliği Yönetici Kimliği İşe AlmaTarihi
1000 İvanov I.I. 1955-02-19 [e-posta korumalı] 2 1 HÜKÜMSÜZ 2015-04-08
1001 Petrov P.P. 1983-12-03 [e-posta korumalı] 3 4 1003 2015-04-08
1002 Sidorov S.S. 1976-06-07 [e-posta korumalı] 1 2 1000 2015-04-08
1003 Andreev A.A. 1982-04-17 [e-posta korumalı] 4 3 1000 2015-04-08
1004 Sergeev S.S. HÜKÜMSÜZ [e-posta korumalı] HÜKÜMSÜZ HÜKÜMSÜZ HÜKÜMSÜZ 2015-04-08

Bu durumda alana girilecek değerin değiştirilmesi gerekiyorsa, CHECK dönüşümü kontrol edilir. Örneğin, personel numarası alanına mi є іdidentifier svrobіtnik (ID) gibi bir değişim koyduk. Böyle bir değiş tokuşun yardımı için, personel sayısı ve suçlu anaların 1000'den 1999'a kadar olduğunu varsayalım:

ALTER TABLE Çalışanları KISITLAMA EKLE CK_Employees_ID KONTROLÜ(ID 1000 İLE 1999 ARASI)
Değişim kendi başına böyle adlandırılır, önce "CK_" öneki vardır, sonra tabloya ve alanın adını veririz, yak'a sınır getirilir.

Değişimin çalıştığı, yeniden doğrulama için kabul edilemez bir giriş eklemeye çalışalım (gerekli affı alabiliriz):

EKLE Çalışan(ID,Email) DEĞERLER(2000," [e-posta korumalı]")
Şimdi de 1500 ile girilen değeri değiştiriyoruz ve girilecek kaydı değiştiriyoruz:

EKLE Çalışan(ID,Email) DEĞERLER(1500," [e-posta korumalı]")
Ayrıca bir isim belirtmeden BENZERSİZ ve KONTROL alışverişi oluşturabilirsiniz:

ALTER TABLE Çalışanları ADD UNIQUE (E-posta) ALTER TABLE Çalışanları ADD CHECK (ID 1000 İLE 1999 ARASI)
Ancak yine de iyi bir uygulamadır ve bunu net bir görüntünün önüne koymak daha iyidir, çünkü daha sonra neyin daha önemli olacağını öğrenebilmemiz için, cevaplayacağımız nesneyi ve harikayı göstermemiz gerekecek.

İyi bir isim ile, borsa hakkında birçok bilgi bu isim üzerinde aracı olmadan tanınabilir.

Görünüşe göre, tablolar birleştirildiğinde tüm değiş tokuşlar bir kerede oluşturulabilir, ancak yine de mümkün değildir. Tabloyu görelim:

DROP TABLE Çalışanları
І її z usіma'yı oluşturulan değiş tokuşlarla tek bir komut CREATE TABLE ile yeniden oluşturmak mümkündür:

CREATE TABLE Çalışanlar(ID int NOT NULL, İsim nvarchar(30), Doğum tarihi, Email nvarchar(30), PositionID int, DepartmentID int, HireDate date NOT NULL DEFAULT SYSDATETIME(), -- for DEFAULT i z(ID), CONSTRAINT FK_Employees_DepartmentID YABANCI ANAHTAR(DepartmentID) REFERANSLAR Departmanlar(ID), CONSTRAINT FK_Employees_PositionID YABANCI ANAHTAR(PositionID) REFERANSLAR Pozisyonlar(ID), CONSTRAINT UQ_Employees_Email UNIQUE (Email), CONSTRAINT CK_Employees_ID KONTROLÜ (ID 1000 VE 1999 ARASINDA))

INSERT Çalışanları (Kimlik,Ad,Doğum Günü,E-posta,PozisyonKimliği,DepartmanKimliği)DEĞERLER (1000,N"Ivanov I.I.","19550219"," [e-posta korumalı]",2,1), (1001,N"Petrov P.P.","19831203"," [e-posta korumalı]",3,3), (1002,N"Sidorov S.S.","19760607"," [e-posta korumalı]",1,2), (1003,N"Andreev A.A.","19820417"," [e-posta korumalı]",4,3)

BİRİNCİL ANAHTAR ve BENZERSİZ sınırları birleştirildiğinde oluşturulan dizinlerle ilgili Troch'lar

Ekran görüntüsünde görebileceğiniz gibi, PRIMARY KEY ve UNIQUE sınırları birleştirildiğinde, aynı ada sahip dizinler (PK_Employees ve UQ_Employees_Email) otomatik olarak oluşturuldu. Kilitleme için birincil anahtarın indeksi CLUSTERED olarak oluşturulur ve indeks NONCLUSTERED olarak çözümlenir. Varto, kümelenmiş dizin anlayışının ABD DBMS'de olmadığını söylüyor. Tablo birden fazla kümelenmiş (KÜMELENMİŞ) dizine sahip olabilir. KÜMELENMİŞ - tablonun kayıtlarının bu dizine göre sıralanacağı anlamına gelir, bu nedenle bu dizinin tüm tablo verilerine doğrudan erişimi olabileceğini söyleyebilirsiniz. Tablonun baş dizini. Daha kaba, fiyat endeksi, masaya civatalama nasıl denir. Küme indeksi - bu, içmenin optimizasyonuna yardımcı olabilecek daha da zor bir görevdir, şimdilik, sadece unutmayın. Kümelenmiş victorist indeksinin birincil anahtarda değil, farklı bir indeks için olduğunu söylemek istiyorsak, birincil anahtarlar suçlu olanla birleştirildiğinde, NONCLUSTERED seçeneğini belirtin:

ALTER TABLE tablo_adı KISITLAMA EKLE exchange_name BİRİNCİL ANAHTAR OLMAYAN(alan1,alan2,…)
Örneğin, PK_Employees değişim dizini kümelenmemiştir ve UQ_Employees_Email değişim dizini kümelenmiştir. Bizden önce aşağıdaki obezhennya'yı gördük:

ALTER TABLE Çalışanları DROP CONSTRAINT PK_Employees ALTER TABLE Çalışanları DROP CONSTRAINT UQ_Employees_Email
Ve şimdi onları CLUSTERED ve NONCLUSTERED seçenekleriyle oluşturuyoruz:

ALTER TABLE Çalışanları KISITLAMA EKLE PK_Çalışanlar PRIMARY KEY NONCLUSTERED (ID) ALTER TABLE Çalışanları KISITLAMA EKLE UQ_Employees_Email BENZERSİZ KÜMELENMİŞ (E-posta)
Şimdi, Çalışanlar tablolarından seçimi seçtikten sonra, kayıtların UQ_Employees_Email kümelenmiş dizinine göre sıralandığını görüyoruz:

SEÇ * ÇALIŞANLARDAN

İD İsim Doğum günü E-posta Pozisyon Kimliği Departman Kimliği İşe AlmaTarihi
1003 Andreev A.A. 1982-04-17 [e-posta korumalı] 4 3 2015-04-08
1000 İvanov I.I. 1955-02-19 [e-posta korumalı] 2 1 2015-04-08
1001 Petrov P.P. 1983-12-03 [e-posta korumalı] 3 3 2015-04-08
1002 Sidorov S.S. 1976-06-07 [e-posta korumalı] 1 2 2015-04-08

Bundan önce eğer clustered index PK_Employees index ise standart kayıtlar ID alanına göre sıralanıyordu.

Ancak bu durumda, küme endeksinin özünü gösteren bir uçtan daha fazlasıdır, çünkü her şeyden önce, Çalışanlar tablosundan önce, kimlik alanını girmeniz istenecektir ve bazı durumlarda, kendiniz bir doktor gibi davranabilirsiniz.

Dovіdnikіv çağrı dotsіlno için, birincil anahtar tarafından istemlerin schob küme dizini, tk. isteklerde genellikle otrimanna için sürücünün tanımlayıcısını isteriz, örneğin adlandırma (Plant, Viddilu). Burada, daha önce yazdıklarım hakkında, küme indeksinin satır tablolarına doğrudan erişebileceğini ve yıldızların açık olduğunu, ek veri olmadan herhangi bir tablonun değerini alabileceğimizi tahmin ediyoruz.

Kümelenme indeksi, en yaygın seçim olan sulamadan önce durgunlaşabilir.

Tablolardaki düğümler, bir vekil alana göre bir anahtar oluşturur, bu sütunun y ekseni, vekil birincil anahtar için CLUSTERED dizin seçeneğinin değerini değiştirmek ve vekil birincil anahtarı harmanlarken NONCLUSTERED seçeneğini belirtmek için kullanılır.

Muhtemelen

Bu aşamada alışılagelmiş değişim türleri hakkında bilgi sahibi olduk, en basit şekliyle “ALTER TABLE im'ya_table_ADD CONSTRAINT im'ya_obrazhennia...” gibi bir komutla oluşturulurlar:
  • BİRİNCİL ANAHTAR- birincil anahtar;
  • YABANCI ANAHTAR- Nalashtuvannya zv'yazkіv tіl_snostі verilerini kontrol ediyorum;
  • EŞSİZ- benzersizlik yaratmanıza izin verir;
  • KONTROL ETMEK- veri girişinin doğruluğunu düzeltmenizi sağlar;
  • VARSAYILAN- kilit için değer belirlemenizi sağlar;
  • Ayrıca, tüm tesislerin muzaffer komut tarafından görülebileceğini unutmayın “ TABLOYU DEĞİŞTİR Tablo ismi DÜŞÜRME KISITLAMASI im'ya_obezhennya".
Bu yüzden sık sık bu indekslere rastladık ve küme kavramlarını sıraladık ( KÜMELENMİŞ) ve küme olmayan ( KÜMELENMEMİŞ) dizin.

Bağımsız indekslerin oluşturulması

Kendi kendine yeterlilik altında, burada PRİMER ANAHTAR ve EŞSİZ değişimi için yaratıldıkları için dizinler üzerinde çalışıyorlar.

Alan veya alanlardaki dizinler saldırgan bir komutla oluşturulabilir:

INDEX IDX_Employees_Name ON Çalışanlar(Ad) OLUŞTUR
Ayrıca burada KÜMELENMİŞ, KÜMELENMEYEN, BENZERSİZ seçeneklerini belirleyebilirsiniz ve dış görünümle çevrelenmiş ASC (kilitleyerek) veya DESC alanının doğrudan sıralamasını da belirleyebilirsiniz:

BENZERSİZ KÜMELENMEMİŞ ENDEKSİ OLUŞTUR UQ_Employees_EmailDesc ON Çalışanlar(Email DESC)
Kümelenmemiş bir dizinin oluşturulma saatinde, NONCLUSTERED seçeneğine izin verilebilir, çünkü umovchannyam için uvazі üzerinde çalışmaz, komutta CLUSTERED ve NONCLUSTERED seçeneğinin konumunu belirtmek için burada basitçe gösterilmeyecektir.

Dizini saldırgan komutla görüntüleyebilirsiniz:

DROP INDEX IDX_Employees_Name ON Çalışanlar
CREATE TABLE komutu bağlamında tıpkı bir indeks gibi basit indeksler oluşturulabilir.

Örneğin, tabloyu tekrar görebilirim:

DROP TABLE Çalışanları
І bir CREATE TABLE komutuyla değiş tokuşların ve dizinlerin oluşturulmasıyla çözülebilir її:

CREATE TABLE Çalışanlar(ID int NOT NULL, Name nvarchar(30), Doğum tarihi, Email nvarchar(30), PositionID int, DepartmentID int, HireDate date NOT NULL CONSTRAINT DF_Employees_HireDATE DEFAULT ), CONSTRAINT FK_Employees_DepartmentID YABANCI ANAHTAR(DepartmentID) REFERENCES Departmanlar(ID ), CONSTRAINT FK_Employees_PositionID YABANCI ANAHTAR(PozisyonID) REFERANSLAR Pozisyonlar(ID), CONSTRAINT FK_Employees_ManagerID YABANCI ANAHTAR (YöneticiKimliği) REFERANSLAR Çalışanlar(ID), CONSTRAINT UQ_Employees_Email UNIQUE(Email), CONSTRAINT CK_Employees_ID CHECK(ID ARASINDA 1000Ad 9))D_9)
Nasamkіnets, spіvrobіtnikіv'imizin tablosuna eklenir:

INSERT Çalışanları (Kimlik,Ad,Doğum Günü,E-posta,PozisyonKimliği,DepartmanKimliği,YöneticiKimliği)DEĞERLER (1000,N"Ivanov I.I.","19550219"," [e-posta korumalı]",2,1,NULL), (1001,N"Petrov P.P.","19831203"," [e-posta korumalı]",3,3,1003), (1002,N"Sidorov S.S.","19760607"," [e-posta korumalı]",1,2,1000), (1003,N"Andreev A.A.","19820417"," [e-posta korumalı]",4,3,1000)
Ek varto, küme olmayan dizinden önce, INCLUDE'daki ek їх girişinden sonraki değeri dahil edebileceğinizi belirtir. Toto. bu durumda, INCLUDE-index'in kümelenmiş bir dizin olması gerekiyordu, ancak şimdi tabloya eklerin dizini değil, gerekli değerler dizine ekleniyor. Açıkçası, bu tür dizinler aynı zamanda seçim başına içme verimliliğini de artırabilir (SELECT), tüm alanlar dizinde listelendiğinden, o zaman dizinde tabloya bakmanıza gerek kalmayabilir. Ale ce doğal olarak dizine katkıda bulunur, çünkü Aktarılan alanların değerleri dizinde çoğaltılır.

MSDN'den Virizka. Dizinleri harmanlamak için genel komut sözdizimi

OLUŞTUR [Benzersiz] [KÜMELENMİŞ | KÜMELENMEMİŞ] INDEX dizin_adı AÇIK (sütun [ ASC | DESC ] [ ,...n ]) [ INCLUDE (sütun_adı [ ,...n ]) ]

Muhtemelen

Dizinler veri seçiminin (SELECT) güvenliğini değiştirebilir, ancak dizinler veri değiştirme tablolarının güvenliğini değiştirebilir, çünkü Sistemin dış görünümü değiştirildikten sonra, belirli bir tablo için tüm dizinlerin yeniden yapılması gerekecektir.

Cilt tipinde Bazhano, en uygun çözümü, altın ortalamayı, titreşimin verimliliğini ve bu kayaların düz nehir üzerindeki modifikasyonunu bilir. İndeks oluşturma stratejisi ve miktarları çeşitli faktörlere bağlı olabilir, örneğin tablolardaki veriler sıklıkla değiştirilir.

Visnovok shodo DDL

Gördüğünüz gibi, DDL dili ilk bakışta göründüğü kadar tutarlı değil. Burada, üç tabloyla da çalışan tüm ana yapıları pratik olarak gösterebilirim.

Golovne - özü anlayın ve pratik yapın.

SQL adındaki mucizevi film alemine hakim olmanızda size bol şans.

SQL, Yapılandırılmış Sorgu Dili'nin kısaltmasıdır. SQL, ilişkisel cebire dayalıdır ve ilişkisel veritabanlarıyla arayüz oluşturmak için özel olarak geliştirilmiştir.

SQL є, her şey için persh, bilgi ve mantıksal maden, tasarruf verilerinin açıklaması, analizi ve değiştirilmesiyle tanınır. SQL benim programlamam değil. Hemen filmin belirli uygulamaları hakkında, ses, çeşitli prosedürel uzantılar içerir.

Mova SQL є sukupnіstyu operatörleriіv, yakі chotiri gruplarına ayrılabilir:

  • DDL (Veri Tanımlama Dili) - Veri Tanımlama Operatörleri
  • DML (Veri Manipülasyon Dili) - Veri Manipülasyon Operatörleri
  • DCL (Veri Kontrol Dili) - verilere erişmek için operatörler
  • TCL (İşlem Kontrol Dili) - işlem yönetimi operatörleri

SQL standartlaştırılmış benimdir. Standart SQL, görünüşe göre ANSI SQL olarak adlandırılan ANSI standartları komitesi (Amerikan Ulusal Standartlar Enstitüsü) tarafından sağlanmaktadır.

Birçok DBMS geliştiricisi, talimatlara ek işleçler ekleyerek SQL yeteneklerini genişletti. Ek işlevlerin uygulanması veya basit işlemlerin uygulanmasının basitleştirilmesi için çok sayıda uzantı gereklidir. Sık sık daha fazla korisnі kokusu almak istiyorum, tsі razshirennya pri'yazanі sevnoї DBMS'ye nadiren podtremuyuyutsya daha nizh bir rozrobnik. Tüm harika DBMS'ler ve navit ti, sanki genişleyebilirlermiş gibi ANSI SQL'i (daha büyük ve daha küçük bir dünya) destekler. Uygun isimleri (PL-SQL, Transact-SQL vb.) Taşımak için Okremі uygulamaları. Transact-SQL (T-SQL), Microsoft'un bilindiği üzere SQL Movie, secret ve SQL Server uygulamasıdır.

Bir veri seçimi isteyin (SELECT deyimi)

SELECT, en yaygın SQL ifadesidir. Tablodan bilgi seçimi atamalarında. SELECT operatörünün yardımı için tablolardan veri alın, en az iki kelime belirtmeniz gerekir - neyi seçmek istediğinizi ve yıldızları.

Seçilmiş okremih stoptsiv

SEÇME

Üründen

Üzerine gelinen işleçte, Ürün tablosundan Açıklama adı altında bir sütun seçmek için SELECT ifadesi seçilir. Im'ya stovptsya, shokaєtsya, zazuєєєєєДєєєєєєєєєі ініні ініні SELECT anahtar kelimesi ve 'FROM' anahtar kelimesi, verilerin seçildiği ім'я tablosunda gösterilir.

Bu testi Management Studio'da yapmak için şu adımları izleyin:

Stovptsiv sayısının seçimi

Giriş sayısı tablosundan seçim için aynı SELECT deyimi seçilir. Vіdminnіst polagaє, SELECT anahtar kelimesinden sonra, stovptsіv'nin adlarının sayısının kimin aracılığıyla belirtilmesi gerekir.

SEÇ, Stokta

Üründen

Tüm makalelerin seçimi

En önemli girişlerden bir seçim yapmak mümkündür (numara başına bir sayı), SELECT operatörünün yardımıyla, hiçbirini çakıştırmadan tüm girişleri talep edebilirsiniz. Stovptsiv adlarının değiştirilmesi için "zirochka" (*) grup sembolü eklenir. Tse soymak böyle bir şekilde.

SEÇME*

Üründen

Verileri sıralama

Seçim sonucunda veriler, kokunun tablolarda yer aldığı sırayla görüntülenecektir. Seçilenlerin tam olarak sıralanması için SELECT ifadesine ek olarak ORDER BY önermesi kullanılır. Bu önermelerde, sonuçları sıralamak için gerekli olan bir veya birkaç stovptsiv adıyla belirtilir. Bir sonraki kıçına bak.

Üründen

InStock TARAFINDAN SİPARİŞ

Bu nedenle, DBMS'ye verileri InStock sütununun değerinin büyümesine göre sıralamasını söylediği için, ORDER BY önermesinin bir ipucu ile öncekiyle aynıdır.

kіlkom stovptsami'ye göre sıralama

Sütun sayısına göre sıralamak için isimlerini kimin aracılığıyla girmeniz yeterlidir. Saldırgan kod için üç kelime seçilir ve sonuç ikisi için sıralanır - önce numara için, sonra ad için.

IdProd, , InStock'u SEÇİN

Üründen

InStock TARAFINDAN SİPARİŞ,

Sütun sayısına göre sıralarken, sıralama düzeninin satırdaki değerlerle aynı olacağını anlamak önemlidir. Yani stokta belirtilen ürünler, sadece aynı InStock değerlerine sahip satırlar olduğu sürece açıklama sütununa göre sıralanır. InStock sütununun değeri eşleşmezse, Açıklama sütununun değerleri sıralanmayacaktır.

Doğrudan sıralamada kontrol et

ORDER BY önermesi, azalan düzene göre de sıralanabilir. Bunun için DESC anahtar kelimesini belirtmeniz gerekir. Saldırgan popoda ürünler miktara göre alt sıra artı ürün adına göre sıralanır.

IdProd, , InStock'u SEÇİN

Üründen

InStock DESC'E GÖRE SİPARİŞ

DESC anahtar sözcüğü, yalnızca belirtildikten sonra başa kadar kullanılır. Ön stok için, DESC anahtar sözcüğü Açıklama için değil, Stoktaki stok için belirtildi. Bu sırayla, InStock sütunu değişiklik sırasına göre sıralanır ve Açıklama sütunu artan düzendedir (varsayılan olarak alınır).

İşlem SQL'i(Olarak adlandırılan T-SQL) veri tabanı ( veri tabanı) tekel olması gereken prosedürel dil programlaması Microsoft ve muzaffer SQL Server.

Prosedürel dil bula olasılıkları genişletmek için tasarlanmıştır SQL ile iyi bir entegrasyon olasılığı ile SQL. Yerel değişiklikler ve satırların/verilerin işlenmesi gibi bazı işlevler eklendi. Dili destekleyen işlevler Turing tamamlandı (**).

Pis koku, kaydetme prosedürlerini yazmak için de kullanılır: Sunucuda bulunan bir kod parçası, saf küme tabanlı işlemleri yönetmesi kolay veya imkansız olabilen katlama iş kurallarını yönetir.

A Turing Tamamlandı sistem, içinde bir yanıt bulan bir programın yazılabileceği bir sistem anlamına gelir (çalışma zamanı veya bellekle ilgili hiçbir garanti olmamasına rağmen).

2- Transact-SQL'e Bakmak

T-SQL komut blokları tarafından düzenlenen bir komut bloğu, başka bir komut bloğunun içine yerleştirilebilir; BAŞLAMAK ve ile bitirmek SON blokta çok sayıda komut var ve Kremlin'de noktalı (;) bire bir komutlar var.

Blok yapısı:

BEGIN -- Değişkenleri bildirin -- T-SQL İfadeleri END;

3- SQL Server Management Studio ile başlayın

Bu yazıda size programlamayı göstereceğim. SQL Server, görsel bir enstrümanda SQL Server Yönetim Stüdyosu.

Tse çizimi SQL Server Yönetim Stüdyosu Açıldığında. Є deakі popo veri tabanı yeniden yüklersen SQL Server.

Veya oluşturabilirsiniz öğrenme SQL , küçük bir veri tabanı SQL Server Açık İnternet sitesi .

Sağ fareye tıklayın veri tabanı, seçme "Yeni Sorgu" tsgogo için schob vіdkriti vіkno veri tabanı.

programlamaya hazır mısın veri tabanı H SQL Server.

Aşağıda kolay bir komut bloğu gösterilmiştir, 2 sayının toplamını kontrol edin:

Begin -- Bir değişken bildirmek Declare @v_Result Int; -- 50 değerinde bir değişken bildirmek Declare @v_a Int = 50; -- 100 değerinde bir değişken bildirmek Declare @v_b Int = 100; -- Konsolu yazdırın (Geliştirici için). -- Int'yi String'e dönüştürmek için Cast kullanma -- 2 diziyi birleştirmek için + operatörünü kullanma Print "v_a= " + Cast(@v_a as varchar(15)); -- Konsol Yazdır "v_b=" + Cast(@v_b as varchar(15)); -- Toplam Kümesi @v_Sonuç = @v_a + @v_b; -- Konsolu Yazdır Print "v_Result=" + Cast(@v_Result as varchar(15)); son;

Komut bloğunu çalıştırmak için işarete tıklayın ve sonuca hayret edin SQL Server Yönetim Stüdyosu :

4- Temel Transact-SQL Komutları

4.1- If-elsif-else komutu

Sözdizimi:

EĞER SONRA İş 1; SON EĞER;

BEGIN -- Bir değişken tanımlayın DECLARE @v_Option tamsayı; DECLARE @v_Action varchar(30); SET @v_Option = 2; IF @v_Option = 1 SET @v_Action = "Çalıştır"; ELSE IF @v_Option = 2 BEGIN PRINT "Başka blokta if @v_Option = 2"; SET @v_Action = "Yedekleme"; SON; BAŞKA IF @v_Option = 3 SET @v_Action = "Durdur"; ELSE SET @v_Action = "Geçersiz"; -- PRINT "@v_Action=" + @v_Action; SON;

Poponun fırlatılmasının sonucu:

4.2- WHILE döngüsü

döngüde SIRASINDA Kazanabilirsin KIRMAK döngüden çıkmak için
zafer takımı DEVAM ETMEK bloktaki komutları atlamak için SIRASINDA ve yeni bir döngü oluşturmak için daha düşük.

< @y WHILE (@x < @y) BEGIN SET @step = @step + 1; -- Every time loop execute, x increases by 1. SET @x = @x + 1; -- Every time loop execute, x decreases by 2. SET @y = @y - 2; PRINT "Step =" + CAST(@step AS varchar(10)); PRINT "@x =" + CAST(@x AS varchar(10)) + " / @y = " + CAST(@y AS varchar(10)); END; -- Write log PRINT "x,y = " + CAST(@x AS varchar(10)) + ", " + CAST(@y AS varchar(10)); END;

Poponun fırlatılmasının sonucu:

BAŞLA - 2 değişken x ve y bildirme DECLARE @x integer = 0; DECLARE @y tamsayı = 10; -- Step DECLARE @step integer = 0; -- @x iken< @y WHILE (@x < @y) BEGIN SET @step = @step + 1; -- Every time the loop execute, x increases by 1 SET @x = @x + 1; -- Every time the loop execute, y decreases by 1 SET @y = @y - 2; PRINT "Step =" + CAST(@step AS varchar(10)); PRINT "@x =" + CAST(@x AS varchar(10)) + " / @y = " + CAST(@y AS varchar(10)); -- If @x >2 sonra döngüden çıkın -- (WHILE'daki koşullar hala doğru olsa da). IF @x > 2 BREAK; SON; -- Günlük yaz PRINT "x,y = "+ CAST(@x AS varchar(10)) + "," + CAST(@y AS varchar(10)); SON;

Poponun fırlatılmasının sonucu:

Takım DEVAM ETMEK yeni bir döngü başlatmak için daha düşük (döngüde) olan komutları atlamanıza olanak tanır.

BEGIN - 2 değişken x ve y bildirme. DECLARE @x tamsayı = 0; DECLARE @y tamsayı = 10; -- Step DECLARE @step integer = 0; -- @x iken< @y WHILE (@x < @y) BEGIN SET @step = @step + 1; -- Every time the loop execute, x increases by 1 SET @x = @x + 1; -- Every time the loop execute, x decreases by 2 SET @y = @y - 2; -- If @x < 3 , then skip the statements below -- And continue new step IF @x < 3 CONTINUE; -- If @x < 3 the statements below "CONTINUE" will not be run. PRINT "Step =" + CAST(@step AS varchar(10)); PRINT "@x =" + CAST(@x AS varchar(10)) + " / @y = " + CAST(@y AS varchar(10)); END; -- Write log PRINT "x,y = " + CAST(@x AS varchar(10)) + ", " + CAST(@y AS varchar(10)); END;

5- Değişiklikten önce talebe veri ekleyin

Değeri istekten değiştirebilirsiniz. Çizimlere hayret edin popo:

Ata_Değer_Örnek

BAŞLANGIÇ - @v_Emp_ID değişkeni bildirmek DECLARE @v_Emp_ID tamsayı = 1; DECLARE @v_First_Name varchar(30); DECLARE @v_Last_Name varchar(30); DECLARE @v_Dept_ID tamsayı; -- Değişkenlere değer atayın SELECT @v_First_Name = emp.First_Name, @v_Last_Name = emp.Last_Name, @v_Dept_Id = emp.Dept_Id Emp.Emp_ID = @v_Emp_Id NEREDE Çalışan Emp; -- Değerleri yazdır YAZDIR " @v_First_Name = " + @v_First_Name; YAZDIR " @v_Last_Name = " + @v_Last_Name; PRINT "@v_Dept_Id = " + CAST(@v_Dept_ID AS varchar(15)); SON;

Poponun fırlatılmasının sonucu:

6- Özellikle T-SQL'deki verilere bakın

6.1- Verileri görüntüle TABLO (Örtülü görünüm)

T-SQL Verilerin görünümü ile değişiklikleri seslendirmenize izin veriyorum MASA.

Sözdizimi:

TABLE türünde bir değişken tanımlayın. -- NOT: İstişareler ayrıca daha fazla istişareye tabi olabilir (Örneğe bakın). @v_variable_name TABLE(Column1 DataType1, Column2 DataType2);

Parametrenin TABLE tipine atanması. @v_Table TABLE (First_Name Varchar(30), Last_Name Varchar(30), Dept_ID Integer, Maaş Float); -- Yardımcılar yardımcıları da üstlenebilir: @v_table TABLE (Product_ID Tamsayı KİMLİK(1,1) PRIMARY KEY, Product_Name DataType2 NOT NULL Varsayılan ("Bilinmeyen"), Fiyat Para Kontrolü (Fiyat)< 10.0));

Örnek: Değiştirilecek kadar veri girin MASA.

Ayrıca güncelleyebilirsiniz güncelleme düz görünürde MASA:

Silmek düz görünürde MASA:

Sorgu değişiklikle ilgili verileri gör MASA:

BEGIN DECLARE @v_Emp_ID tamsayı = 1; -- TABLE türünde bir değişken bildirin. DECLARE @v_Table TABLE (First_Name varchar(30), Last_Name varchar(30), Dept_Id integer, Maaş kayan DEFAULT 1000); -- Değişken INSERT INTO ifadesi, @v_Table'a veri eklemek için. INSERT INTO @v_Table (First_name, Last_Name, Dept_ID) emp.First_Name, emp.Last_Name, emp.Dept_Id SEÇİN Çalışan Emp WHERE Emp.Emp_ID< 4; -- Update @v_Table UPDATE @v_Table SET Salary = Salary + 100 WHERE First_name = "Susan"; -- Query @v_Table. SELECT * FROM @v_Table; END;

Poponun fırlatılmasının sonucu:

6.2- Veri görünümü TABLOSU (Açık görünüm)

T-SQL Vidi değişikliğini seslendirmene izin veriyorum MASA dolaylı olarak. Değişimin adı ile başlar # .

BEGIN -- #v_My_Table'a veri eklemeden önce SELECT INTO makalesine bağlantı. #v_My_Table İÇİN emp.First_Name, emp.Last_Name, emp.Dept_Id, 1000 Maaş SEÇİN Çalışan Emp WHERE Emp.Emp_ID< 4; -- Update #v_My_Table UPDATE #v_My_Table SET Salary = Salary + 100 WHERE First_name = "Susan"; -- Query #v_My_Table. SELECT * FROM #v_My_Table; END;

Poponun fırlatılmasının sonucu:

7- İmleç

7.1- İmleç nedir?

İmleç Yapıştırma satırlarındaki verileri işlemenizi sağlayan ce yapılandırma türü değişiklik. İsteğin sırasına göre düşecek satır sayısı. İşleme ve işleme sürecinde imleç deri veri satırı aracılığıyla. Bu veri satırı imleçle gösterilir. İmleci değiştirerek tüm veri satırlarına erişebilirsiniz.

7.2- İmleci seslendirin

Sözdizimi

ISO Sözdizimi DECLARE imleç_adı [ INSENSITIVE ] [ SCROLL ] CURSOR FOR select_deyimi [ FOR ( READ ONLY | UPDATE [ OF sütun_adı [ ,...n ] ] ) ] ] [ ] -- Transact-SQL Genişletilmiş Sözdizimi DECLARE imleç_adı CURSOR [ YEREL | KÜRESEL] [YALNIZCA İLERİ | KAYDIR] [STATİK | ANAHTAR TAKIMI | DİNAMİK | FAST_FORWARD] [ READ_ONLY | SCROLL_LOCKS | İYİMSER ] [ TÜR_UYARI ] seçim_ifadesi İÇİN [ GÜNCELLEME İÇİN [ OF sütun_adı [ ,...n ] ] ] [;]

7.3- İmleçli hisse senedi

Learningsql KULLANIN; BEGIN -- -- Bir değişken bildirin: DECLARE @v_Emp_ID tamsayı; DECLARE @v_First_Name varchar(50); DECLARE @v_Last_Name varchar(50); DECLARE @v_Count tamsayı; -- Bir İMLEÇ bildirin. Emp.EMP_ID, Emp.FIRST_NAME, Emp.LAST_NAME SELECT İÇİN My_Cursor İMLEÇ BİLDİRİN Çalışan Emp WHERE Emp.EMP_ID< 3; -- Open Cursor OPEN My_Cursor; -- Move the cursor to the first record. -- And assign column values to variables. FETCH NEXT FROM My_Cursor INTO @v_Emp_ID, @v_First_Name, @v_Last_Name; -- The FETCH statement was successful. (@@FETCH_STATUS = 0) WHILE @@FETCH_STATUS = 0 BEGIN PRINT "First Name = "+ @v_First_Name+" / Last Name = "+ @v_Last_Name; -- Move to the next record. -- And assign column values to the variables FETCH NEXT FROM My_Cursor INTO @v_Emp_ID, @v_First_Name, @v_Last_Name; END -- Close Cursor. CLOSE My_Cursor; DEALLOCATE My_Cursor; END;

Poponun fırlatılmasının sonucu:

7.4- İmlecin eşleşmesinin sonu

Learningsql KULLANIN; BEGIN -- -- Bir değişken bildirin: DECLARE @v_Emp_ID tamsayı; DECLARE @v_First_Name varchar(50); DECLARE @v_Last_Name varchar(50); -- Bir imleç değişkeni bildirme. @My_Cursor İMLEÇ BİLDİRİN; -- CURSOR değişkeni için Select deyimini ayarlayın. @My_Cursor = CURSOR FOR SELECT Emp.EMP_ID, Emp.FIRST_NAME, Emp.LAST_NAME FROM Employee Emp WHERE Emp.EMP_ID olarak ayarlayın< 3; -- Open Cursor OPEN @My_Cursor; -- Move the cursor to the first line. -- And assign column values to the variables. FETCH NEXT FROM @My_Cursor INTO @v_Emp_ID, @v_First_Name, @v_Last_Name; -- The FETCH statement was successful. (@@FETCH_STATUS = 0) WHILE @@FETCH_STATUS = 0 BEGIN PRINT "First Name = "+ @v_First_Name+" / Last Name = "+ @v_Last_Name; -- Move to the next record. -- And assign column values to the variables. FETCH NEXT FROM @My_Cursor INTO @v_Emp_ID, @v_First_Name, @v_Last_Name; END -- Close Cursor. CLOSE @My_Cursor; DEALLOCATE @My_Cursor; END;

Sonuçlar örneği çalıştırır:

8- Kapatma

programlama yaparken T-SQL kodunuz için bir affınız olabilir, örneğin 0'a ayarladığınızda bir af. bu durumu düzeltmek için.

Basit bir popoya hayret edin, 0 düşürüldüğünde bir affın nasıl düzeltileceği.

TryCatch_Örnek

Learningsql KULLANIN; BEGIN -- -- Bir değişken bildirin: DECLARE @v_a float = 20; DECLARE @v_b float = 0; DECLARE @v_c float; DECLARE @v_Error_Number tamsayı; -- Chatter hataları için BEGIN TRY .. END TRY yazın. -- Bu blok için af nasıl alınır -- BEGIN CATCH .. END CATCH bloğuna atlayacaksınız. BEGIN DENE --- PRINT "@v_a=" + CAST(@v_a AS varchar(15)); YAZDIR " @v_b = " + CAST(@v_b AS varchar(15)); -- Yoga nedeniyle 0 hatasına bölün. SET @v_c = @v_a / @v_b; -- Bu satırın altında çalışmaz. -- Blok için program atlama BEGIN CATCH .. END CATCH PRINT "@v_c=" + CAST(@v_c AS varchar(15)); END TRY -- BEGIN CATCH .. END CATCH , BEGIN TRY .. END TRY'nin hemen arkasına yerleştirilir . BAŞLAMA YAKALAMA - Hata Numarası. SET @v_Error_Number = ERROR_NUMBER(); -- Hata numarasını yazdırın: PRINT "Hata Numarası: " + CAST(@v_Error_Number AS varchar(15)); -- Hata mesajı: PRINT "Hata Mesajı: " + ERROR_MESSAGE(); -- Ön hata: PRINT "Hata Önem Derecesi: " + CAST(ERROR_SEVERITY() AS varchar(15)); -- Hata Durumu: PRINT "Hata Durumu: " + CAST(ERROR_STATE() AS varchar(15)); -- Satır Numarası: PRINT "Hata Satırı: " + CAST(ERROR_LINE() AS varchar(15)); -- Prosedürün adı (veya işlev veya tetikleyici). PRINT "Hata Prosedürü: " + ERROR_PROCEDURE(); SON YAKALAMA; SON;

Sonuç

Pardon bilgisi:

İşlev Tanım
YANLIŞ NUMARA() Pardon numarasını çevirin.
HATA MESAJI() Size affı anlatayım. Bildirimler, tarih, nesnenin adı veya saat gibi parametreler tarafından verilen değeri içerir.
ERROR_SEVERITY() Bağışlamanın ciddiyetini yarığa çevirin.
ERROR_STATE() Af durumunu çevirin.
HATA_LINE() Satır numarasını af koduna çevir
ERROR_PROCEDURE() Adı döndür saklı yordam veya tetiklemek, de af oldu

9- İşlev

Yak prosedür(prosedür), işlev(işlev) - komutlar T-SQL, ana rolü değiştirmek için Prosedür görünümünde işlev, değeri haftanın saatine göre döndürür.
İşlevin kendisi şuraya kaydedilebilir: veri tabanı görüşte Mağaza prosedürü.

Klasör sözdizimi işlev(Fonksiyonlar).

İşlev_adı: -- bağımsız değişken: -- kip: GİRİŞ, ÇIKIŞ, varsayılan GİRİŞ -- veri türü: İŞLEV OLUŞTUR ([ @argument1 datatype1 , @argument2 datatype2 , ... ]) RETURNS veri tipi AS BEGIN -- Değişkenleri bildir -- İfadeler -- Dönüş değeri END;

Parametreli işlev CREATE FUNCTION Sum_Ab(a Integer, b Integer) RETURNS Integer AS Yaz dönüş a + b; son; -- parametresiz işlev CREATE FUNCTION Get_Current_Datetime() RETURNS Tarih AS Başlangıç ​​dönüşü CURRENT_TIMESTAMP; son;

Bırakma işlevi:

Düşürme İşlevi DÜŞÜRME FONKSİYONU ; -- Popo için: DROP FUNCTION My_Function;

Popo katlama fonksiyonları:

İlk elinin poposu işlev(fonksiyonlar) saat SQL Server:

  1. Bir İşlev Oluştur
  2. Derleme işlevi
  3. fonksiyon başlangıcı

İşlevi kaydedin - Uygulanır uygulanmaz sırayla değiştirin, yeni için oluşturun. OBJECT_ID(N"dbo.My_Sum", N"FN") IS NULL DEĞİLSE DROP FONKSİYONU My_Sum; GO CREATE FUNCTION My_Sum (@p_a float, @p_b float) RETURNS float AS BEGIN -- Float'ın değişken tipini bildirme DECLARE @v_C float; -- v_C SET @V_C = @p_A + @p_B için değer atayın; -- geri dönüş değeri. DÖNÜŞ @v_C; SON;

İşlevi tamamlamak için işarete tıklayın.

İşlev, oluşturduğunuz şekliyle, bir Skaler değeri döndüren basit bir işlevdir. Nasıl olduğu hakkında konuşabilirsin SQL Server Yönetim Stüdyosu:

Sağdaki fareye basarak işlevi protesto edebilirsiniz, seçin:

  • Komut dosyası işlevi şu şekilde -> SEÇİN -> Yeni Sorgu Düzenleyici Penceresi

Test kutusunu işaretleyin, parametre değerini değiştirebilirsiniz:

Parametre değerini değiştirin ve başlatmaya tıklayın.

Fonksiyonlar takımın kaderini alabilir SEÇME.

Hesap acc'DAN acc.account_id, acc.cust_id, acc.avail_balance, acc.pending_balance, dbo.MY_SUM(acc.avail_balance, acc.pending_balance) bakiyesini SEÇİN;

SQL sorgusunun sonucu:

10- Prosedür

Komut grubu T-SQL, prosedürde (prosedürde) seçilebilen, böylece vikonnanny, küfür, güvenlik, veri güvenliği, geliştirmenin parlaklığı olasılığını artırabilirsiniz.

Prosedürler kaydedilebilir veri tabanı Yak nesnesi veri tabanı tekrar ziyaret için hazır. Prosedüre bulaşma denir Mağaza prosedürü. Schob Vikonati Mağaza prosedürü, kaydettikten hemen sonra Mağaza prosedürü, kokular derlenir p kodu bu vikonnanny tarafından teşvik edilebilir.

Prosedürler, değerleri doğrudan işlev olarak döndürmez ( işlev). Ale, belki anne 0 veya daha fazla parametre bırakabilir.

Kapanış prosedürü için sözdizimi:

Prosedür_adı: -- argüman: -- mod: giriş tipi: GİRİŞ veya ÇIKIŞ, varsayılan değer GİRİŞ'tir -- veri tipi: -- Not: İsteğe bağlı parametreler bir () ile girilebilir veya gereksiz olabilir. PROSEDÜR OLUŞTUR [ argüman1 veri tipi1 , argüman2 veri tipi2 , ... ] AS BEGIN -- Değişkenleri bildirin. - Açıklamalar .. SON; -- VEYA: PROSEDÜR OLUŞTURUN ([ argüman1 veri tipi1 , argüman2 veri tipi2 , ... ]) AS BAŞLANGIÇ - Değişkenleri bildirin. - Açıklamalar .. SON;

Parametresiz işlem. CREATE Prosedür Do_Something AS Begin - Değişkenleri burada bildirin. @v_a Tamsayısını bildirin; -- Burada bir şeyler yapın -- .... Bitiş; -- Parametreli prosedür -- 1 giriş parametresi ve 2 giriş parametresi CREATE Prosedürü Do_Something (@p_Param1 Varchar(20), @v_Param2 Varchar(50) OUTPUT) AS Begin -- Değişkenleri bildir Bildir @v_a Tamsayı; - Burada bir şeyler yap. -- ...Son;

Bırakma prosedürü:

Bırakma Prosedürü: BIRAKMA PROSEDÜRÜ

Vikonannya prosedürü için Kroki:

Bir katlama prosedürü örneği:

Get_Employee_Infos

Zaten varsa, Get_Employee_Infos prosedürünü bırakın. -- (Yeniden oluşturmayı etkinleştirmek için) OBJECT_ID(N"dbo.Get_Employee_Infos", N"P") NULL DEĞİLSE DROP PROCEDURE Get_Employee_Infos; GO -- Giriş parametreli prosedür: p_Emp_Id -- Ve çıkış: v_First_Name, v_Last_Name, v_Dept_Id. OLUŞTURMA PROSEDÜRÜ Get_Employee_Infos (@p_Emp_Id tamsayı , @v_First_Name varchar(50) OUTPUT , @v_Last_Name varchar(50) OUTPUT , @v_Dept_Id tamsayı OUTPUT) -- Tamsayıyı dizeye (Varchar) dönüştürmek için Cast kullanın. -- İki diziyi birleştirmek için + operatörünü kullanın. PRINT "Parametre @p_Emp_Id = " + CAST(@p_Emp_ID AS varchar(15)); -- -- Tablo gibi verileri sorgulayın ve değişkenlere değer atayın. -- Emp.Emp_Id = @p_Emp_Id NEREDE Çalışan Emp'DEN @v_First_Name = Emp.First_Name, @v_Last_Name = Emp.Last_Name, @v_Dept_Id = Emp.Dept_Id SEÇİN; -- -- Günlük (Geliştiriciler için). - YAZDIR "Kayıt Bulundu!"; YAZDIR " @v_First_Name= " + @v_First_Name; YAZDIR " @v_Last_Name= " + @v_Last_Name; PRINT "@v_Dept_Id=" + CAST(@v_Dept_Id AS varchar(15)); SON;

  • bir işaretle Kaydetme noktası işlemde: işlem adını kaydetme_of_savepoint
  • @@aktarım Değişken: Akış oturumunda kazanmak için atanan işlem numarası (geri alma veya taahhütle tamamlanmadı).
    1. Takım geri alma tran + tên_của_savepoint işlemin son konumuna geri alınmasına yardımcı olur Kaydetme noktası(tamamlanan işlemlerin etkisi olmadan), manipülasyon bittiğinde engelleme (kilitler) açılır (kilidini açar) geri almaşarkı ögeleri.
    2. Açık bir işlem ortaya çıktığında, kaybedilebileceği konusunda yeniden müzakere etmek gerekir ( geri alma) veya açık bir görünümde sabitlenmiş ( işlemek), olmasa da, işlem başkalarına yardım edecek kaynakları ödünç almaya ve ödünç almaya devam edin işlemler.
    3. Takım geri alma sadece veritabanındaki işlemleri anlatmaya yardımcı olur ( sokmak, silmek, güncelleme). Diğer komutlar, örneğin iliştir, komutta yer almaz. geri alma.

    İşlem_Örnek1

    BEGIN -- Hangi hesabın ACCOUNT_ID = 1, 2 hesabı var aslında DB'de var -- Aslında işlem başlamadan önce kontrol etmek için ifadeler yazabilirsiniz -- -- A hesabı (Zaten DB'de garantiler var) DECLARE @Account_Id_A inte 1; -- B hesabı (DB'de zaten garantiler var) DECLARE @Account_Id_B tamsayı = 2; -- Miktar DECLARE @Amount float = 10; -- Bank DECLARE @Execute_Branch_Id tamsayı = 1; -- İşlem Sayısını yazın. -- Geçerli, bu saatte işlem yok ve PRINT "@@TranCount = " + CAST(@@Trancount AS varchar(5)); PRINT "İşlemi başlat"; -- İşlemi başlat BEGIN TRAN; - Hata yakalama. DEĞERLENDİRMEYE BAŞLAYIN -- -- Hesaptan 10$ çıkarın GÜNCELLEME Hesabı AYARLA AVAIL_BALANCE = AVAIL_BALANCE - @Amount WHERE Account_Id = @Account_Id_A; -- -- İşlem bilgilerini Acc_Transaction tablosuna girin. INSERT INTO ACC_TRANSACTION (TXN_DATE, FUNDS_AVAIL_DATE, TXN_TYPE_CD, ACCOUNT_ID, AMOUNT, EXECUTION_BRANCH_ID) DEĞERLERİ (CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, "CDT", @Account_Id_A -- -- Hesap B'ye 10$ ekleyin. -- -- İşlem bilgilerini Acc_Transaction tablosuna girin.INSERT INTO ACC_TRANSACTION (TXN_DATE, FUNDS_AVAIL_DATE, TXN_TYPE_CD, ACCOUNT_ID, AMOUNT, EXECUTION_BRANCH_ID) VALUES (CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, "CDT", @Account_Id_B; -- İşlemi kaydet IF @@ Trancount > 0 PRINT "Commit Transaction"; COMMIT TRAN; END TRY -- Pardons Catch bloğunun çalışacağını biliyorsanız BEGIN CATCH PRINT "Error:" + ERROR_MESSAGE(); PRINT "Error -> Rollback Transaction"; IF @@ Trancount > 0 GERİ DÖNÜŞ TRAN;SON YAKALAMA;END;

    Poponun fırlatılmasının sonucu:

    12-Tetik

    Trigger ile ilgili makale eklendi, yardım için talimatlara bakabilirsiniz:

    • YAPILACAK Bağlantı!