Sayfalar

Sql etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Sql etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

9 Eylül 2019 Pazartesi

SQL View Tablolar


View Özellikleri:
- Genellikle karmaşık sorguların tekbir sorgu haline getirilip kullanılmasıdır.
- Bu amaçla raporlama işlemlerinde kullanılmaktadırlar.
- Aynı zamanda güvenlik amacı ile orjinal VT 3. kişilerden korunması amacı ile de kullanılmaktadırlar.

-Herhangi bir sorguyu tablo haline getirirek , bu tablo üzerinden işlemler yapabiliriz.
-ÖNEMLİ!: Insert, Update, Delete sorguları ile bu tabloda değişiklikler yapılabilir fakat bu değişiklikleri fiziksel tabloya yani gerçek verinin çekildiği tabloya yansıtılar. 
-View yapıları fiziksel yani VT'ınına kaydedilen tablolardır.
-View'lar normal tablolara göre daha yavaş çalışırlar.
-View içinde OrderBy kullanılamaz! Ancak View üzerinden Select alınırsa kullanılır.
    SELECT * FROM  VW_SATISTOPLAMI  ORDER BY Total vb...


CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition




ÖRNEK 1:

CREATE VIEW SampleViewOfPersoneller AS
SELECT * FROM Personeller

----------------------------------------------------------- 

Önemli!! Eğer View üzerinde bir alan değiştrilirse Personeller tablosunda da bu alanlar değişecektir!!
UPDATE SampleViewOfPersoneller SET Adres='Şişli 19 Mayıs Mah.'  

WHERE komutunu UNUTTUNUZ Orjinal Personeller Tablosunda ki tüm tablo verileri değişti!! Yedek almadıysanız Geçmiş olsun!!

Ana Tabloda bir değişiklik yapıldığında Örn bir kolon tipi değiştiğinde bu tabloyu kullanan View'larda hata alarız. Bunu önleme için oluşturulan view'lar With Schemabinding komutu ile yaratılırsa, Ana tabloda bir değişiklik yapılırken etkilenen tablolar için bir uyarı alabiliriz. Creat sırasında Ana tablo çağırılıken dbo. namespace'i ile çağrılmalıdır.


CREATE VIEW SampleViewOfPersoneller AS
WITH SCHEMABINDING
SELECT * FROM dbo.Personeller


-------------------------------------------------------------- 


ÖRNEK2:

CREATE VIEW VW_SATISTOPLAMI AS

SELECT P.Adi,P.SoyAdi, SUM(SD.BirimFiyati*SD.Miktar) Total FROM Personeller P
JOIN Satislar S ON S.PersonelID= P.PersonelID
JOIN [Satis Detaylari] SD ON SD.SatisID= S.SatisID
GROUP BY P.Adi,P.SoyAdi



 

TSql - Constraints


CONSTRAINTS

Contraints tablolarda ki kısıtlamaları, kuralları belirlemek için kullanılırlar. Genellilke tablo yaratılırken yada alter komutu ile kullanılırlar.

CREATE TABLE table_name (
    column1 datatype constraint,
    column2 datatype constraint,
    column3 datatype constraint,
    ....
);



ALTER TABLE TableName
ADD CONSTRAINT ConstraintName TYPE  Value  FOR ColumnName


  • DEFAULT - Varsayılan bir değer atar.
  • CHECK - Veri işlenmeden önce belirtilen şarta uygunluğunu kontrol eder.
  • NOT NULL - Kolonun mutlaka bir değer alacağını belirtir.
  • UNIQUE - Kolondaki tüm değerlerin tekil olacağını belirtir.
  • PRIMARY KEY -Kolonda yer alacak her bir satır için özel bir anahtar üretir.
  • FOREIGN KEY -Diğer tablodaki bir primary keyîn ilişkisel olarak bu tabloya eklenmesini sağlar
  • INDEX - Daha hızlı veri çekilmesini sağlar.


Örnek:
DEAFULT***********

ALTER TABLE CUSTOMERS
ADD CONSTRAINT TitleConstDF DEFAULT ('Mr') FOR Title


Örnek:
CHECK***********

ALTER TABLE CUSTOMERS
ADD CONSTRAINT AgeConst CHECK (Age>=18)

**Önemli Not: Eğer Check Constrait oluşturulurken ilgilil tabloda bu şarta uymayan veriler varsa Check Constrait oluşturulmayacaktır. Bunu aşmak içinse With NoCheck ile kullanılmalıdır.

Hata Kodu:
Msg 547, Level 16, State 0, Line 38
The ALTER TABLE statement conflicted with the CHECK constraint "AgeConstBelow". The conflict occurred in database "TESTDB", table "dbo.Customers", column 'Age'.


ALTER TABLE CUSTOMERS 
WITH NOCHECK ADD CONSTRAINT AgeConstBelow CHECK (Age<=18)

Örnek:
UNIQUE*************

ALTER TABLE Customers
ADD CONSTRAINT TCUniConst UNIQUE (TCKimlik); 






TSQL- DDL (DATA DEFINATION LANGUAGE)


-----------------------------------------------------*--------------------------------------------------------------------

CREATE 

Yeni bir Veri tabanı ekler.

CREATE DATABASE testDB;

-----------------------------------------------------*--------------------------------------------------------------------

DROP

Mevcut veritabanını siler.
DROP DATABASE testDB;


Mevcut tabloyu siler.
DROP TABLE testTable;

Mevcut Constrainti Siler
ALTER TABLE TableName
DROP CONSTRAINT MyConnstraits


 
-----------------------------------------------------*--------------------------------------------------------------------

TRUNCATE

Mevcut  tablo içerisndeki verileri siler.
TRUNCATE TABLE testDB;



-----------------------------------------------------*--------------------------------------------------------------------

BACKUP

Mevcut veritabanını belirtilen yola yedekler
.
BACKUP DATABASE databasename
TO DISK = 'filepath'



BACKUP DATABASE databasename
TO DISK = 'filepath'
WITH DIFFERENTIAL;  



USE MotherShip
BACKUP DATABASE MotherShip
TO DISK ='C:\Users\HABILGUR\Desktop\Cat\MotherShip.bak'



 -----------------------------------------------------*--------------------------------------------------------------------

CREATE TABLE

Mevcut Veritabanına tablo ekler.........................

CREATE TABLE table_name (
    column1 datatype,
    column2 datatype,
    column3 datatype,
   ....
); 




CREATE TABLE Customers (

CustomerID int Primary Key Identity(1,1) ,
FirstName nvarchar(40) NOT NULL,
LastName nvarchar(50),
Title varchar(4),
[Last Visit] datetime,



-----------------------------------------------------*--------------------------------------------------------------------

ALTER TABLE

Mevcut Tabloya yeni bir kolon eklemek ,değiştirmek yada silmek için kullanılır.

ALTER TABLE table_name
ADD column_name datatype


ALTER TABLE CUSTOMERS
ADD Email nvarchar(50)


 ---------

ALTER TABLE table_name
DROP COLUMN column_name;

ALTER TABLE CUSTOMERS
DROP COLUMN Email 


 --------------------


ALTER TABLE table_name
ALTER COLUMN column_name datatype;


ALTER TABLE CUSTOMERS
ALTER COLUMN Email nvarchar(50)



--------------------

Mevcut Constrainti Siler 

ALTER TABLE TableName
DROP CONSTRAINT MyConstraits





8 Eylül 2019 Pazar

STORED PROCEDURES


STORED PROCEDURE

Parametresiz Procedure

CREATE PROC SelectAllCustomers
AS
SELECT * FROM Customers
GO;

.
.
.
.

EXEC SelectAllCustomers;



Parametreli Str. Procedure

CREATE PROC SelectAllCustomers
(
  @City nvarchar(30)
)
AS
SELECT * FROM Customers WHERE City = @City
GO;

.
.
.
.
EXEC  SelectAllCustomers City='Berlin'


ÖRNEK:

create PROCEDURE sp_CustSatisToplamBwDates 
(
@DateBegin datetime
@DateEnd datetime
)
AS
SELECT SUM(SD.BirimFiyati*SD.Miktar) AS TOTALSATIS FROM Personeller P
INNER JOIN Satislar S ON S.PersonelID=P.PersonelID
INNER JOIN [Satis Detaylari] SD ON SD.SatisID= S.SatisID
WHERE S.SatisTarihi>=@DateBegin and s.SatisTarihi<=@DateEnd
GO



ÇAĞIRILIŞI:


exec CustSatisToplamBwDates @DateBegin='1989-01-01',@DateEnd='2000-01-01' 

 

7 Eylül 2019 Cumartesi

DATEADD() Function

The DATEADD() function adds a time/date interval to a date and then returns the date.


DATEADD(interval, number, date)


Select DATEADD(Year,1,'2017/08/01')

Select DATEADD(Year,1,'2017-08-01')

Select FirstName, BirthDate, DATEADD(Year,18,BirthDate) From Employees



Parameter Description
interval Required. The time/date interval to add. Can be one of the following values:
  • year, yyyy, yy = Year
  • quarter, qq, q = Quarter
  • month, mm, m = month
  • dayofyear = Day of the year
  • day, dy, y = Day
  • week, ww, wk = Week
  • weekday, dw, w = Weekday
  • hour, hh = hour
  • minute, mi, n = Minute
  • second, ss, s = Second
  • millisecond, ms = Millisecond
number Required. The number of interval to add to date. Can be positive (to get dates in the future) or negative (to get dates in the past)
date Required. The date that will be modified

CURRENT_TIMESTAMP


The CURRENT_TIMESTAMP function returns the current date and time, in a 'YYYY-MM-DD hh:mm:ss.mmm' format.

Select CURRENT_TIMESTAMP    //Sonuç 2019-09-07 11:45:38.000

DATEFROMPARTS() Function


The DATEFROMPARTS() function returns a date from the specified parts (year, month, and day values).

DATEFROMPARTS(year, month, day)

Select DATEDIFF(year,DateFromParts(2012,08,1), DATEFROMPARTS(2019,08,31)) //Sonuç 7 

Parameter Description
year Required. Specifies a year (4 digits)
month Required. Specifies a month (from 1 to 12)
day Required. Specifies a day (from 1 to 31)

5 Eylül 2019 Perşembe

SQL KEYWORDS


USE
Kullanılacak VeriTabanını Belirleme

USE  "Database"
USE Northwind


-----------------------------------------------------*--------------------------------------------------------------------

SELECT 

 Belirli Propertiesleri yada Tüm Propertiesi Listeleme

SELECT Column1,   Column2    FROM "DataBase
SELECT MusteriID, MusteriAdi FROM Musteriler

SELECT * FROM "DataBase"
SELECT * FROM  Musteriler

-----------------------------------------------------*--------------------------------------------------------------------

WHERE

Filtreleme yapar.

SELECT * FROM "DataBase" WHERE (filter)
SELECT * FROM Musteriler WHERE Age>20

Fonkisyonu filtre olarak kullanma

Select * From Employees Where YEAR( Employees.HireDate)>=1994 and Month(HireDate)>3

-----------------------------------------------------*-----------------------------------------------------------------

INSERT 

Yeni kayıt Ekler.

INSERT (Column1, Column2, Column3) SET ('Value1, Value2, Value3)

INSERT Employees( LastName,FirstName,Title) VALUES('Habil','Gür','Manager')

* Null alanlar için mutlaka null değer yollanmalıdır.
* Kolonun veri tipinde ve uzunluğunda veri gönderilmelidir.
* Idendity kolonlarına değer gönderilemez.

-----------------------------------------------------*--------------------------------------------------------------------

ORDER BY

Kayıtları sıralar...

SELECT * FROM "DataBase" ORDER BY (Column1, Column2)  ASC | DESC

SELECT * FROM Employees  WHERE City IS NOT NULL ORDER BY City,PostalCode ASC

-----------------------------------------------------*--------------------------------------------------------------------

UPDATE  *** WHERE yazmadan kullanılmaz!! Aksi Halde Tüm Kayıtlar Updatelenir!!!

Kayıtlara yeni alanlar ekler....

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;


UPDATE Employees
SET TitleOfCourtesy='Mr', BirthDate='1978/08/28',HireDate='2012/07/02',City='İstanbul'
WHERE EmployeeID=10

-----------------------------------------------------*--------------------------------------------------------------------

DELETE  *** WHERE yazmadan kullanılmaz!! Aksi Halde Tüm Kayıtlar Updatelenir!!!

Kayıtlara yeni alanlar ekler....

DELETE FROM table_name  
WHERE condition;

DELETE FROM  Employees
WHERE EmployeeID=10

-----------------------------------------------------*--------------------------------------------------------------------

SELECT TOP

Bir Tabloda ki en üst kayıtları sıralar...


SELECT TOP number|percent column_name(s)
FROM table_nameWHERE condition;  


SELECT TOP 3 * FROM Employees

SELECT TOP 50 PERCENT * FROM Employees  



-----------------------------------------------------*--------------------------------------------------------------------

 AVG,  MIN, MAX, COUNT

SELECT COUNT -  SUM - AVG - MIN - MAX (column_name)
FROM table_name



SELECT
 AVG(o.ProfitLoss) AvgPL,
 SUM(o.ProfitLoss) SumPL,
 MIN(o.ProfitLoss) MınPL,
 MAX(o.ProfitLoss) MaxPL,
 Count(o.ProfitLoss) ClosedORder

FROM [Order] o 



-----------------------------------------------------*--------------------------------------------------------------------

 LIKE

SELECT column1, column2, ...
FROM table_name
WHERE columnN LIKE pattern;  




LIKE Operator Description
WHERE CustomerName LIKE 'a%' Finds any values that start with "a"
WHERE CustomerName LIKE '%a' Finds any values that end with "a"
WHERE CustomerName LIKE '%or%' Finds any values that have "or" in any position
WHERE CustomerName LIKE '_r%' Finds any values that have "r" in the second position
WHERE CustomerName LIKE 'a__%' Finds any values that start with "a" and are at least 3 characters in length
WHERE ContactName LIKE 'a%o' Finds any values that start with "a" and ends with "o"


-----------------------------------------------------*--------------------------------------------------------------------

 IN

Where içerisinde birden fazla parametre kullanılmasını sağlar


SELECT column1, column2, ...
FROM table_name
WHERE columnName IN (column1, cloumn2)  


SELECT * FROM IsGucu
WHERE Ad IN ('Mehmet','Habil','Günay')
ORDER BY Ad ASC



-----------------------------------------------------*--------------------------------------------------------------------

 BETWEEN

Belirli bir aralıkta seçilen değerleri verir. Numara, text yada tarih olabilir.  Belirtilen değerleride sonuca dahil eder.

SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2; 
--BOYLARI 1.60 VE 1.70 ARASINDA OLAN ÇALIŞANLAR
SELECT * FROM IsGucu
WHERE Boy BETWEEN 165 AND 170

--BOYLARI 170 VE 171 HARİCİNDE Kİ TÜM ÇALIŞANLAR
SELECT * FROM ISGUCU
WHERE BOY NOT BETWEEN 170 AND 171

--BOYLARI 170 VE 180 ARASINDA OLAN VE BEDENİ 42, 43 OLMAYAN ÇALIŞANLAR
SELECT * FROM ISGUCU
WHERE BOY BETWEEN 170 AND 180
AND NOT BEDEN IN(42,44)

-- DOĞUM TARİHİ 78 VE 80 ARASINDA OLMAYAN ÇALIŞANLAR
SELECT * FROM ISGUCU
WHERE DogumTarihi NOT BETWEEN '1978-01-01' AND '1980-01-01' 





-----------------------------------------------------*--------------------------------------------------------------------

GROUP BY

Genellikle select kısmında bir kolon ve  bir Aggregate fonksiyonu  var ise kullanılır. Aynı türden verilerin gruplanmasına yarar.

SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)ORDER BY column_name(s); 

-- Kategorilere göre Ürünlerin Toplam Stok Düzeyi
SELECT U.KategoriID, SUM(U.HedefStokDuzeyi) FROM Urunler U
GROUP BY U.KategoriID


-----------------------------------------------------*--------------------------------------------------------------------

HAVING

The HAVING clause was added to SQL because the WHERE keyword could not be used with aggregate functions.

SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)HAVING conditionORDER BY column_name(s);


SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
HAVING COUNT(CustomerID) > 5;


-----------------------------------------------------*--------------------------------------------------------------------

INNER JOIN 

İki yada daha fazla tablonun ilişkili kolonu üzerinden kesişimi, ortak kümesini verir.
Üç tablo birleştirirken önce ilişkisel olan iki tablo birleştirilir, oluşan bu tablo ile de üçüncü tablo birleştirilir. Sonrasında bu tablo üzerinden Where GroupBy, Having ve OrderBy komutları ile filtreleme uygulanır.

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

INNER JOIN table2
ON table1.column_name = table2.column_name;



-- Nancy adlı personelin 1997 yılından sonraki satış yaptığı Müşteri Listesi

SELECT P.Adi,S.SatisID,S.SatisTarihi,M.MusteriAdi FROM  Personeller P
INNER JOIN Satislar S ON P.PersonelID=S.PersonelID
INNER JOIN Musteriler M ON M.MusteriID= S.MusteriID
WHERE P.Adi='NANCY' AND YEAR(S.SatisTarihi)>=1997 


Alternatif olarak inner Joın yapısını kullanmdan tabloların kesişim noktasını aşağıdaki gibi alabiliriz.

SELECT P.Adi,P.SoyAdi, SUM(SD.BirimFiyati*SD.Miktar) Total FROM Personeller P
JOIN Satislar S ON S.PersonelID= P.PersonelID
JOIN [Satis Detaylari] SD ON SD.SatisID= S.SatisID
GROUP BY P.Adi,P.SoyAdi


SELECT P.Adi,SUM(SD.BirimFiyati*SD.Miktar) FROM Personeller P, [Satis Detaylari] SD, Satislar S 

WHERE P.PersonelID=S.PersonelID AND SD.SatisID=S.SatisID
GROUP BY P.Adi

 

-----------------------------------------------------*--------------------------------------------------------------------

LEFT JOIN  

İfadenin solunda kalan tablonun tüm elemanlarını getirir ve ifadenin sağındaki tablodan da eşleşenleri getirirken, eşleşmeyen satırlarda ise 'null' döndürür.

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;


-----------------------------------------------------*--------------------------------------------------------------------

RIGHT JOIN  

İfadenin sağında kalan tablonun tüm elemanlarını getirir ve ifadenin solundaki tablodan da eşleşenleri getirirken , eşleşmeyen satırlarda ise 'null' döndürür.

SELECT column_name(s)
FROM table1

RIGHT JOIN table2
ON table1.column_name = table2.column_name;



-----------------------------------------------------*--------------------------------------------------------------------

UNION 

UNION operator  bir yada daha fazla Select sorgusunun sonuçlarını alt alta  getirmek için kullanılır.
Union sadece tekrar etmeyen değerleri döndürür.
Joınler tabloları yanyan UNIONLAR alt alta getirir.
  • Her bir select tablosunun KOLON sayıları aynı olmalı
  • Kolonlar aynı data tipine sahip olmalıdır.
  • Select ifadelerindeki kolonların sıralaması aynı olmalıdır.
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2



UNION ALL ise tekrarlayan kayıtlarıda döndürür.

SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2


-----------------------------------------------------*--------------------------------------------------------------------

EXISTS

EXIST, bir sorgudan sonucun dönüp dönmediğini belirten bir sql cümleciğidir. "EXIST" kullanımı "IN" kullanımı ile aynı sonucu verir. Ancak "EXIST" kullanımı performans açısından çok hızlıdır. EXIST cümleciğinin geri dönüş tipi True veya False şeklindedir. İçerisine aldığı subquery'den herhangi bir sonuç geriye dönüyorsa TRUE hiç bir kayıt geri dönüşü yoksa False döndürür. Yani karşılaştırma yaparken True sonucunu aldığı anda döngüden çıkar. IN ise, ana sorgudan gelen her kaydı kontrol etmek için IN içerisinde bulunan alt sorgudaki tüm kayıtları kontrol eder.

SELECT column_name(s)
FROM table_name
WHERE EXISTS
(SELECT column_name FROM table_name WHERE condition); 


SELECT * FROM Tedarikciler T
WHERE EXISTS( SELECT * FROM Urunler U WHERE T.TedarikciID=U.TedarikciID AND BirimFiyati<20)


-----------------------------------------------------*--------------------------------------------------------------------

ANY

ANY ve ALL operatörleri genellikle WHERE yada HAVING ile kullanılırlar.
ANY operatörü herhangi bir SubQuery değeri şart ile uyumlu ise true döner
ALL operatörü eğer tüm SubQuery değerleri şart ile uyumlu ise true döner

SELECT column_name(s)
FROM table_name
WHERE column_name operator ANY / ALL
(SELECT column_name FROM table_name WHERE condition);  



SELECT U.UrunAdi
FROM Urunler U
WHERE U.UrunID = ANY (SELECT SD.UrunID  FROM [Satis Detaylari] SD WHERE SD.Miktar = 10);

-----------------------------------------------------*--------------------------------------------------------------------

SELECT INTO

Select Into ile bir tabloyu yeni bir tabloya tüyle aktarabiliriz..
Fakat bu yöntem ile aktarılan verilerde bir Primary Key kolonu yoksa , ayrıca bir Primary key oluşturulmaz

SELECT *
INTO newtable
FROM oldtableWHERE condition


SELECT * INTO CustomersBackUpTable
FROM Customers 


Yada sadece belirli alanları aktarabilriz...


SELECT C.Id, C.Name, C.Surname INTO CustomersBackUpTable
FROM Customers  C


Birden fazla tablodan dönen sonuçları aktarabiliriz.

SELECT Customers.CustomerName, Orders.OrderID
INTO CustomersOrderBackup2017
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;  



-----------------------------------------------------*--------------------------------------------------------------------

CASE WHEN THEN END

 Kolon çekilirken belirlenen filtre yada şarta göre kolon düzenlenir.


CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    WHEN conditionN THEN resultN
    ELSE result
END



SELECT P.Adi,P.SoyAdi,
CASE
WHEN P.UnvanEki= 'Mr.' THEN 'Bay'
WHEN P.UnvanEki= 'Mrs.' OR P.UnvanEki= 'Ms.' THEN 'Bayan'
ELSE P.UnvanEki
END AS Unvan
FROM Personeller P


-----------------------------------------------------*--------------------------------------------------------------------

WITH

Karmaşık sorguları çekerken with komutu ile sorguyu bir değişkene atayıp sorgudan gelen ve lazım olan kolonları tanımlamak süreti ile yeni bir tablo gibi kullanmaya yarar.

(?) Bu özelliğin çalışması için The Importance of Database Compatibility Level in SQL Server set to 90 olması gerek 2017 'de çalışmıyor.


-----------------------------------------------------*--------------------------------------------------------------------

IF
Eğer sorguda aranan true dönerse etkilenen row'lar olacağı için  etkilenen row sayısını kontrol edip IF döngülerini buna göre kurgulayabiliriz.


-- TABLODA HABİL GUR İSİMLİ BİR KAYIT VAR MI KONTROL ET . YOK İSE VT'NA KAYDET..

DECLARE @ISIM nvarchar(max) = 'HABIL'
DECLARE @SOYISIM nvarchar(max) = 'GUR'

SELECT P.Adi FROM PERSONELLER P WHERE P.Adi=@ISIM AND P.SoyAdi=@SOYISIM
IF(@@ROWCOUNT>0)  *(etkilenen satır var mı bak)
    PRINT 'VAR'
ELSE
    BEGIN
        PRINT 'YOK'
        INSERT Personeller (Adi,SoyAdi) VALUES(@ISIM,@SOYISIM)
    END

















MVC LOADING TOO SLOW ISSUE