MSSQL ile Sistem Sorguları Ve Sorgu Yapıları

   Merhaba arkadaşlar bu makalemde programlamanın büyük ve önemli bölümlerinde yer alan veri tabanına ve sorgu yapılarına değinmeye çalışacağım. Bu makalemde MsSQL veri tabanında bazı sorgu ve sorgu yapılarına bir sonraki makalemde de Acess veri tabanını ele  almaya çalışacağım umarım işinizi görecek bir makale olacaktır...




   1 : Bağlı olunan sunucuda yüklü bulunan veritabanlarına ait bazı temel bilgilerin elde edilmesi 



 select   database_id [Id] ,name [Database Name]  ,create_date [Create Date]  ,Case [compatibility_level]   when '60' then 'SQL Server 6.0'   when '65' then 'SQL Server 6.5'  when '70' then 'SQL Server 7.0'  when '80' then 'SQL Server 2000'  when '90' then 'SQL Server 2005' when '100' then 'SQL Server 2008'  else 'unknown'  end as [Compatibility Level]  ,collation_name [Collation]   ,Case is_fulltext_enabled   when 1 then 'Enabled'  else 'Disabled'   end as [FullText]   ,user_access_desc [User Access]  ,state_desc [State]    ,snapshot_isolation_state_desc [Snapshot Isolation]   ,Case is_read_only when 1 then 'Yes'  else 'No'   end as [Read Only]  ,Case is_broker_enabled  when 1 then 'Yes'    else 'No'  end as [Service Broker]  from sys.databases order by [Database Name]

2 : Sistemde kullanıcı tanımlı ne kadar tablo,stored procedure, function, view , trigger varsa, şema adları ile birlikte elde edilmeleri  




select 
    S.name+'.'+O.name [Object]
    ,object_id [Id]
    ,type
    ,type_desc
    ,create_date [Create Date]
    ,modify_date [Modify Date]
from sys.all_objects O 
join sys.schemas S on O.schema_id=S.schema_id 
where type in ('U','V','TR','FN','P') 
order by [Object]

3: Sistemde yer alan tablolarda kullanılan toplam Field sayılarının tespit edilmesi 



select 
    T.Name
    ,Count(C.column_id) [Total Column Count] 
    from sys.tables T 
    join sys.columns C on T.object_id=C.object_id 
    where T.type='U' 
group by T.Name
order by Count(C.Column_id) desc

4 : İçeriğinde örneğin @@IDENTITY komutunu içeren Stored Procedure' lerin bulunması 





Use Rapor
Go
select 
SPECIFIC_CATALOG
,SPECIFIC_SCHEMA+'.'+SPECIFIC_NAME [SP NAME]
,ROUTINE_DEFINITION
 from INFORMATION_SCHEMA.ROUTINES Routines 
 where ROUTINE_TYPE='PROCEDURE' and ROUTINE_DEFINITION like '%UPDATE%'


5 : sp_spaceused ile bir tablonun boyutsal olarak kullanım alan bilgilerinin elde edilmesi 




Use Rapor
Go
sp_spaceused 'Production.Product'


6 : Tablolar arasında en çok yer tutanların tespit edilmesi 



Use Rapor
Go

EXEC sp_MSforeachtable @command1="EXEC sp_spaceused '?'"




 Ama işi daha da ,ileri götürebiliriz. Özellikle yukarıda çalışan sorgunun ekran çıktısı hoşumuza gitmediyse





Use Rapor
Go
declare @TableName nvarchar(100)
create table #TempTable
(
    [Table Name] nvarchar(100),
    [Row Count] varchar(100),
    [Reserved Size] varchar(50),
    [Data Size] varchar(50),
    [Index Size] varchar(50),
    [Unused Size] varchar(50)
)
declare tableCursor cursor forward_only
for 
    select S.name+'.'+T.[name] 
    from sys.tables T 
    join sys.schemas S on T.Schema_id=S.Schema_id 
    where T.type='U'
for read only
open tableCursor
    while (1=1)
    begin
        fetch next from tableCursor into @TableName
            if(@@FETCH_STATUS<>0)
                break;
            insert #TempTable exec sp_spaceused @TableName
    end
close tableCursor
deallocate tableCursor
select * from #TempTable Order by [Table Name] drop table #TempTable

7 : Sistemdeki kullanıcı tanımlı tablo adlarını tek bir hücre içerisinde aralarında virgül koyarak elde etmek 



DECLARE @Names VARCHAR(8000)
SELECT @Names = COALESCE(COALESCE(@Names + ',', '') + Name, @Names) 
    FROM sys.tables
    where type='U'
select @Names

 8 : Sistem yer alan veritabanlarından hangilerinin en son ne zaman yenilendiğinin ve hangilerinin hiç yedeklenmediğinin öğrenilmesi 



SELECT 
    D.name [Database Name]
    ,case when MAX(b.backup_finish_date) is NULL 
    then 'Bakcup Yok' 
    else Convert(varchar(100), MAX(b.backup_finish_date)) 
    end AS [Last Backup Time]
FROM sys.databases D
LEFT JOIN msdb.dbo.backupset B ON D.name = B.database_name AND B.type = 'D'
WHERE D.database_id NOT IN (2)
GROUP BY D.name
ORDER BY [Database Name] DESC


9 : Bir tablodan rastgele alanlar çekmek. Örneğin günün hediye dağıtılacak şanslı üyelerinin bulunmasında kullanabilir.



Select 
    Top 5 NewId() id,kod
from bilgi
order by 1

Select 
    Top 5 NewId() id,kod
from bilgi
order by 1

Select 
    Top 5 NewId() id,kod
from bilgi
order by 1

Select 
    Top 5 NewId() id,kod
from bilgi
order by 1

10 : Kullanıcı tanımlı tablolarda Clustered Index kullanılmayanların öğrenilmesi.




select
    S.name+'.'+T.name AS [TableName]
from sys.tables T
inner join sys.schemas S
on S.schema_id = T.schema_id 
where OBJECTPROPERTY(OBJECT_ID,'TableHasClustIndex') =0 and T.Type='U'
order by[TableName] ASC




11 : Çevresel sunucu bilgilerinin elde edilmesi.



Select
    server_id Id
    ,name [Server Name]
    ,product [Product Type]
    ,provider [Provider Name]
    ,data_source [Data Source]
    ,catalog
    ,case is_data_access_enabled
    when 1 then 'Enabled'
    else 'Disabled'
    end as [Data Access]
 from sys.servers




12 : Ürünleri alt kategori adları ile birlikte listeyelim



Select 
u.id,u.adi,k.kategori
from urunler u
join kategori k
on u.kat_id=k.id
order by k.kategori,u.adi 

13 : Sistem Sorguları






select * from sys.tables -- sql instance üzerindeki tüm tablolar ve bunlara ait bilgiler
select * from sys.databases -- sql instance üzerindeki tüm veritabanları ve bunlara ait bilgiler
select * from sys.columns -- sistemdeki tablolarda yer alan tüm kolonlar ve bunlara ait bilgiler
select * from sys.objects -- tablo, stored procedure, function gibi ne kadar nesne varsa sistemde onlara ait bilgiler

14 : Kolon adında Name geçen alanları içeren tabloları bulalım



Select 
T.name [Table Name]
,C.name [Category Name]
from sys.tables T
join sys.columns C
on T.object_id=C.object_id
where C.name like '%Name%'
order by T.name,C.name


 15 : Hangi tabloda kaç adet kolon vardır?




Select
T.name
,COUNT(c.name) [Total Column Count]
From sys.tables T
join sys.columns C
on T.object_id=C.object_id
group by T.name
order by COUNT(c.name) desc




16 : Her bir tablonun identity alanlarını tablo adı bilgisi ile yazdıralım



select 
T.name [Table Name]
,C.name [Column Name]
from sys.columns C
join sys.tables T
on T.object_id=C.object_id
where C.is_identity=1
order by 1,2


17 : SQL ile acess veri tabanına nasıl erişip istenilen sorguları nasıl çalıştırabiliriz...



EXEC sp_configure 'show advanced options',1
reconfigure
EXEC sp_configure 'Ad Hoc Distributed Queries',1
reconfigure 
go


EXEC sp_configure 'Ad Hoc Distributed Queries',1
reconfigure 
EXEC sp_configure 'show advanced options',0
reconfigure
go


   Öncelikle SQL üzerinden acesse erişebilmemiz için yukardaki gibi bi ayar yapmamız lazım bu ayar başarılı olduktan sonra artık aşağıdaki gibi sql erişebiliriz...


Select *   FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'D:\YAZILIM\OFİCE\Acces\Kutuphane.mdb'; 'admin';'','select * from yazar')

aynı şekilde insert, update ve delete sorgularında çalıştırabilir.

insert into OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'D:\YAZILIM\OFİCE\Acces\Kutuphane.mdb'; 'admin';'','select * from yazar') (alanlar) values (değerler)

delete from OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'D:\YAZILIM\OFİCE\Acces\Kutuphane.mdb'; 'admin';'','select * from yazar') where şart

update OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'D:\YAZILIM\OFİCE\Acces\Kutuphane.mdb'; 'admin';'','select * from yazar') set bilgiler where şart


Şimdide okul yıllarında kendime aldığım notları sizle paylaşmak istiyorum. Kendim için faydalı bulduğum ve unutmamak için kullanım şeklini not aldığım bilgiler. bunlara örnek göstermicem ama zaten basit terimler oldukları için siz anlicaksınız..


SQL NOTLARI

1)  Kod ile belirtilen yolda dosya olusturma
 
CREATE database kullanici1
on primary(name='kullanici1',
filename='D:\kullanici1.mdf',
size=50 MB,
maxsize = 1GB,
filegrowth=20%)

log on(name='kullanici2',
filename='D:\kullanici1_log.ldf',
size=50 MB,
maxsize = 1GB,
filegrowth=20%)


2)       Type olusturma…

use servis
create type tckimlik from char(11) not null
select * from sys.types    // Tüm Veri Tiplerini Listeleme


3)       Geçici Tablo Oluşturma…

create table #deneme(tc_no varchar(11) primary key,ad varchar(21),sad varchar(21)) 
create table tempdb.. deneme1(tc_no varchar(11) primary key,ad varchar(21),sad varchar(21))


4)       Rastgele Kayıt Getirme

use servis
select top(15) id,tur from bkm order by (id)
select top(15) percent id,tur from bkm order by (id)


5)       Tabloda Alan Sınırlama…

create table deneme(tc_no varchar(11),check(len(tc_no)=11),isim varchar(22),
check(len(isim)>2),email varchar(50),check(charindex('@',email)>0))


6)       Benzeersiz Alanları Bulma…

   use pravda
   select distinct(uye) from siparis


7)       Login ve Tabloda Kullanıcı Olusturma

use cagri
create login lezgin23 with password='112233'
create user lezgin for login lezgin23


8)       Login Ve Tablodaki İzinlerin Düzenlenmesi…

deny delete on Tablo_Adı to lezgin24
deny insert on Tablo_Adı to lezgin24
revoke all on mert to lezgin24


9)       Veri Ekleme, Silme Ve Güncelleme

Insert into iller (il_kod,il_adi) values (83,”Ankara”)
Update iller Set il_adi=”Lezgin” where il_kodu=83
Delete from iller where il_kodu=83


10)    Tablo Ekleme,Silme Ve Güncelleme

Create table deneme(tc_no varchar(11),isim varchar(22),email varchar(50))
ALTER table isim add alan_adi veri_tipi à tabloye yeni alan ekleme
ALTER table isim drop column alan_adi à tablodan alan silme
ALTER table isim alter column alan_adi veri_tipi à tablodaki alani güncelleme
ALTER table isim add primary key( alan_adi , alan_adi) à tabloya birincil anahtar ekleme
DROP table Tablo_Adi


11)    Datepart fonksiyonunukullanma

select *,datepart(y,datih) from kullanici


12)    İç içe select fonksiyonu

   select * from urun where marka_kodu=(select marka_kodu from marka where urun_adi='Vestel')

   select * from urun where marka_kodu in (select marka_kodu from marka where urun_kod<10)


13)    En fazla urunu olan markayı secmek

select max(grup.adet) from (select marka_kodu,count(*) from urun group by marka_kodu) as grup(marka_kodu,adet)


14)    EXISTS ve NOT EXISTS komutları

select u_kodu,u_adi,fiyat from urun where exists(select * from siparis where siparis.urun_kodu=urun.urun_kodu)

select u_kodu,u_adi,fiyat from urun where not exists(select * from siparis where siparis.urun_kodu=urun.urun_kodu)


15)    İnner Join fonksiyon kullanımı

select u.u_adi,u.fiyat,m.marka from urun u inner join marka m on m.marka_kodu=u.marka_kodu


16)    Left,Right,Full … Join fonksiyon kullanımı

select kul_kodu,kul_adi,kul_soyad from kullanici left join siparis on kullanici.kul_kodu=siparis.kul_kodu

select kul_kodu,kul_adi,kul_soyad from kullanici right join siparis on kullanici.kul_kodu=siparis.kul_kodu

select kul_kodu,kul_adi,kul_soyad from kullanici full alter join siparis on kullanici.kul_kodu=siparis.kul_kodu


17)    Having Fonksiyonu Kullanımı

select m.marka_kod,m.marka,avg(u.fiyat) from marka as m inner join urun as u on where u.fiyat>50 group by marka_kod,marka having count(*)>10



18)    View Olusturma Ve özellikleri

create view vw_adi
as
select * from urunler
   with check option à Tabloya kayıt girilemesin
with shemobinding à Tablo üzerinde değişiklik yapılamaz
with encyrption   à Şifreleme



19)    View ile 2 farklı tabloyu birleştirmek

create view vw_adi
as
select * from urunler
union all
select * from urunler


20)    Değişken Tanımlama

declare @a int,b varchar
set @a=2
set @b='Lezgin'
print @a




21)    Case,if ve while Mantığı

Case Yapısı  
 While Yapısı
İf   Yapısı

select marka_kod,yildiz=
case
when count(urun_kod)>9 then '***'

when count(urun_kod)>4 then '**'

when count(urun_kod)>0 then '*'
end,
count(*) as Adet from urun Group By marka_kod


declare @a int
set @a=5

while(@a>0)
begin
set @a=@a-1
print @a
end


declare @a int
set @a=5

if(@a>=5)
print 'Sayi Büyük'
else
print 'Sayi Küçük'






22)    Restore  Database

RESTORE DATABASE servis FROM DISK = N'D:\xDB\pus_db\servis.bak' WITH FILE = 1, MOVE N'servis' TO N'D:\servis.mdf', MOVE N'servis_log' TO N'D:\servis_log.LDF', NOUNLOAD, STATS = 10


23)    Sql connection mdf c# ile

SqlConnection baglanti=new SqlConnection(@"DataSource=.\SQLEXPRESS; AttachDbFilename =C:\MyWorkers.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");


25)    Sql Attach mdf. 

CREATE DATABASE bastek ON ( FILENAME = N'D:\xDB\BASTEK.mdf' ), ( FILENAME = N'D:\xDB\BASTEK_log.ldf' ) FOR ATTACH; ALTER DATABASE bastek SET READ_WRITE;






Bu uzun ve yorucu makalemin faydalı olacağına inanıyorum ki buna inanmasam bu kadar uzun tutmazdım makalemi :). Elimden geldiği kadar önemli alanlara değinmeye çalıştım. umarım  faydalı bir makale olmuştur sizin içinde bir sonraki makalemde görüşmek dileği ile :)



Hiç yorum yok:

Yorum Gönder