Səhifələr

Blogroll

19 July 2014

SQL SERVER Built-in functions

SQL SERVER bir neçə yüz əvvəlcədən quraşdırılmış funksiyalara malikdir. Bu funksiyalar kateqoriyalar üzrə qruplaşmış halda  istənilən Database altında Programmability - Functions - System Functions  qovluğunda saxlanılır.

sys-func



Siz istədiyiniz zaman öz funksiyalarınızı da yaza bilərsiniz, amma əgər sizin işinizi görəcək funksiya artıq yazılıbsa yenidən vaxt itirməyə dəyərmi? Bu mövzuda Siz SQL funksiyalarının bəziləri ilə tanış ola bilərsiniz. Nümunə Database kimi AdventureWorks2012 məlumatlar bazası istifadə olunacaq.

String Functions - Sorğu nəticəsində qayından məlumat üzərində müxtəlif manipulyasiyalar aparmaq üçün istifadə olunur.

Lower(sütun adı) - Sorğu nəticəsində qayıdan hər hansı sütunu və ya sütun qrupunu kiçik hərflərlə göstərmək üçün istifadə olunur. 

Aşağıdakı sorğu şəkildəki kimi nəticə qaytarır.

[highlight]SELECT TOP 1000 [ProductID] ,[Name] ,[ProductNumber] ,[Color] FROM [AdventureWorks2012].[Production].[Product];[/highlight]

lower



Sorğunu aşağıdakı kimi dəyişsək və funksiya əlavə etsək, nəticə dəyişəcək.

[highlight]SELECT TOP 1000 [ProductID] ,LOWER([Name]) ,[ProductNumber] ,[Color] FROM [AdventureWorks2012].[Production].[Product];[/highlight]

lower-2



Şəkildə gördüyünüz kimi Name sütunu adsız sütün kimi görsəndi və həmin sütunda olan bütün məlumatlar kiçik hərfə çevrildi. Sütün adının düzgün görsənməsi üçün sorğunu aşağıdakı kimi dəyişək.

[highlight]SELECT TOP 1000 [ProductID] ,LOWER([Name]) AS [Name after Lower() function] ,[ProductNumber] ,[Color] FROM [AdventureWorks2012].[Production].[Product];[/highlight]

lower-3



Nəzərə alın ki, Lower() funksiyası yalnız hərflərə tətbiq edilir.

Upper(sütun adı) - Lower() funksiyasının əksidir. Sorğu nəticəsində qayıdan məlumatları BÖYÜK hərflərlə göstərmək üçün istifadə olunur. 

Bu funksiyanın nümunəsi üçün eyni sorğudan istifadə edərək sadəcə Lower sözünü Upper ilə əvəz edib nəticəyə baxaq.

[highlight] SELECT TOP 1000 [ProductID] ,UPPER([Name]) AS [Name after Upper() function] ,[ProductNumber] ,[Color] FROM [AdventureWorks2012].[Production].[Product];[/highlight]

Aldığımız nəticə eyni olacaq, dəyişən yalnız Name sütununda olan nəticələrin böyük hərflə olmasıdır. upper



Left(sütun adı, ədəd) - Mötərizə daxilində göstərilən sütunda olan məlumatın solundan, ikinci parametrdə göstərilmiş qədər simvol qaytarır. 

Bu funksiya üçün də eyni sorğudan istifadə edək və aşağıdakı kimi dəyişək. LEFT([ProductNumber],2) yazmaqla biz ProductNumber sütunundan yalnız sol 2 simvolu göstər komandası veririk.

[highlight]SELECT TOP 1000 [ProductID], [Name], LEFT([ProductNumber],2) AS [Pr.Number after Left() func] ,[Color]
FROM [AdventureWorks2012].[Production].[Product];[/highlight]

left



Həmçinin bu funksiyalardan WHERE açar sözündən sonra da istifadə edə bilərik. Yuxarıdakı sorğunu dəyişək və ProductNumber sütununda ilk 2 hərfi CA olan sətirləri göstərək.

[highlight]SELECT TOP 1000 [ProductID] ,[Name] ,LEFT([ProductNumber],2) AS [Pr.Number after Left() func] ,[Color] FROM [AdventureWorks2012].[Production].[Product] WHERE LEFT([ProductNumber],2) LIKE 'CA';[/highlight]

Sorğunun nəticəsi.

left-2



Right(sütun adı, ədəd) - Mötərizə daxilində göstərilən sütunda olan məlumatın sağından, ikinci parametrdə göstərilmiş qədər simvol qaytarır. 

Bu funksiya Left() funksiyasının əksidir və adından da görsəndiyi kimi sütunda olan simvolları sağ tərəfdən sayaraq qaytarır.

Nümunə üçün eyni sorğudan istifadə edək. Bu sorğuda ProductNumber sütunundan yalnız sağdakı 4 rəqəmi göstərək.

[highlight]SELECT TOP 1000 [ProductID] ,[Name] ,RIGHT([ProductNumber],4) AS [Pr.Number after Right() func] ,[Color] FROM [AdventureWorks2012].[Production].[Product];[/highlight]
right

Sorğunu dəqiqləşdirmək üçün WHERE açar sözündən sonra da funksiyanı istifadə edək və ProductNumber yalnız 2 rəqəmi ilə başlayan sətirləri axtaraq.

[highlight]SELECT TOP 1000 [ProductID] ,[Name] ,RIGHT([ProductNumber],4) AS [Pr.Number after Right() func] ,[Color] FROM [AdventureWorks2012].[Production].[Product] WHERE RIGHT([ProductNumber],4) LIKE '2%';[/highlight]
right-2

Left və Right funksiyalarını eyni sorğuda istifadə edək və ProductNumber CA ilə başlayan sətirlərdə yalnız sağdan 4 simvolu göstərək.

[highlight]SELECT TOP 1000 [ProductID] ,[Name] ,RIGHT([ProductNumber],4) AS [Pr.Number after Right() func] ,[Color] FROM [AdventureWorks2012].[Production].[Product] WHERE LEFT([ProductNumber],2) LIKE 'CA';[/highlight]

right-3

REVERSE(sütun adı) - Göstərilmiş sütunda olan məlumatları arxadan əvvələ göstərir. 

Aşağıdakı sorğuda Color sütununda olan məlumatı tərsinə çevirmək üçün Reverse() funksiyasından istifadə edilib. NULL xanalara Reverse funksiyası tətbiq olunmadığına görə onları siyahıdan çıxaraq.

[highlight]SELECT TOP 1000 [ProductID] ,[Name] ,[ProductNumber] ,REVERSE([Color]) AS [Color after Reverse() func] FROM [AdventureWorks2012].[Production].[Product] WHERE Color IS NOT NULL;[/highlight]

reverse

REPLACE(sütun adı, əvəzlənəcək simvollar,yeni simvollar ) - Hər hansı sütunda olan xanalardakı müəyyən simvol arıdıcılləğını başqa simvollarla əvəzləmək üçün istifadə olunur. 

Yuxarıda istifadə etdiyimiz sorğunu dəyişərək ProductNumber sütununda CA ilə başlayan sətirləri RZ ilə əvəz edək. Daha aydın olması üçün ProductNumber sütünunun əslini də göstərə bilərik.

[highlight]SELECT TOP 1000 [ProductID] ,[Name] ,REPLACE([ProductNumber],'CA','RZ') AS [Pr.Numb after Replace() func] ,ProductNumber ,[Color] FROM [AdventureWorks2012].[Production].[Product];[/highlight]

replace

Mathematical Functions - Riyazi əməliyyatlar aparmaq üçün istifadə olunur. 

CEILING(sütun adı) - Funksiya tətbiq edilmiş ədəd özündən böyük ilk tam ədədə qədər yuvarlaqlaşdırılır. 

Aşağıdakı sorğudan istifadə edərək funksiyanı daha da aydın başa düşmək olar.

[highlight]SELECT TOP 1000 [PurchaseOrderID] ,PP.Name ,[UnitPrice] ,[LineTotal] ,[ReceivedQty] FROM [AdventureWorks2012].[Purchasing].[PurchaseOrderDetail] AS POD LEFT JOIN Production.Product AS PP ON POD.ProductID=PP.ProductID;[/highlight]

ceiling

Sorğunu aşağıda göstərilən formada dəyişək. Müqayisə üçün UnitPrice sütununun əsli də göstərilib.

[highlight]SELECT TOP 1000 [PurchaseOrderID] ,PP.Name ,CEILING([UnitPrice]) AS [UnitPrice after Ceiling() func] ,UnitPrice ,[LineTotal] ,[ReceivedQty] FROM [AdventureWorks2012].[Purchasing].[PurchaseOrderDetail] AS POD LEFT JOIN Production.Product AS PP ON POD.ProductID=PP.ProductID;[/highlight]

ceiling-2

Floor(sütun adı) - Ceiling() funksiyasının əksinə olaraq tətbiq edildiyi ədədi özündən ən kiçik tam ədədə qədər yuvarlaqlaşdırır. 

Nümunə üçün eyni sorğudan istifadə edək. Sorğunu dəyişərək Floor() funksiyasından istifadə edək.

[highlight]SELECT TOP 1000 [PurchaseOrderID] ,PP.Name ,FLOOR([UnitPrice]) AS [UnitPrice after FLOOR() func] ,UnitPrice ,[LineTotal] ,[ReceivedQty] FROM [AdventureWorks2012].[Purchasing].[PurchaseOrderDetail] AS POD LEFT JOIN Production.Product AS PP ON POD.ProductID=PP.ProductID;[/highlight]

floor

Şəkildən gördüyünüz kimi Ceiling() funksiyasının əksinə olaraq ədədlər ilk ən kiçik ədədə qədər yuvarlaqlaşdırırlıb.

ROUND(sütun adı, vergüldən sonrakı ədəd sayı) - Yuvarlaqlaşdırma funksiyası. 

Daha aydın olması üçün eyni sorğu üzərində nümunə göstərək. ROUND([UnitPrice],1) - Round funksiyasını tətbiq edərək UnitePrice sütununda olan qiymətləri yuvarlaqlaşdırıb yalnız 1 ədəd saxlayırıq.

[highlight]SELECT TOP 1000 [PurchaseOrderID] ,PP.Name ,ROUND([UnitPrice],1) AS [UnitPrice after ROUND() func] ,UnitPrice ,[LineTotal] ,[ReceivedQty] FROM [AdventureWorks2012].[Purchasing].[PurchaseOrderDetail] AS POD LEFT JOIN Production.Product AS PP ON POD.ProductID=PP.ProductID;[/highlight]

 round



Aggregate Functions - Bu funksiyalar bir qrup məlumat üzərində hesablama aparır və yalnız bir cavab qaytarır. Bu funksiyalar əsasən SELECT ifadəsinin GROUP BY bəndi ilə istifadə olunur. 

MIN(sütun adı) - Göstərilmiş sütun içindən ən kiçik ədədi taparaq göstərir. 

Nümunə üçün aşağıdakı sorğudan istifadə edək. Bu sorğu HL Road Rim adlı malın sifarişlərini qaytarır. Sorğunun qaytardığı cavabdan eyni mal üçün müxtəlif qiymətlər olduğunu görə bilərik.

[highlight]SELECT TOP 1000 PP.Name ,[UnitPrice] FROM [AdventureWorks2012].[Purchasing].[PurchaseOrderDetail] AS POD LEFT JOIN Production.Product AS PP ON POD.ProductID=PP.ProductID WHERE PP.Name LIKE 'HL Road Rim';[/highlight]
MIN

Bu sifarişlər arasında ən aşağı qiymətli sifarişi tapmaq üçün MİN() funksiyasından istifadə edək və sorğunu dəyişək.

[highlight]SELECT  PP.Name ,MIN([UnitPrice]) AS [UnitPrice after MIN() func] FROM [AdventureWorks2012].[Purchasing].[PurchaseOrderDetail] AS POD LEFT JOIN Production.Product AS PP ON POD.ProductID=PP.ProductID WHERE PP.Name LIKE 'HL Road Rim' GROUP BY PP.Name;[/highlight]

min-2

Sorğu nəticəsi kimi yalnız bir cavab qayıtdığını və bunun ən minimal qiymət olduğunu görə bilərik.

MAX() - MIN() funksiyasının əksinə olaraq ən böyük ədədi qaytarır. 

Eyni sorğunu dəyişərək MAX() funksiyasından istifadə edək.

[highlight] SELECT PP.Name ,MAX([UnitPrice]) AS [UnitPrice after MAX() func] FROM [AdventureWorks2012].[Purchasing].[PurchaseOrderDetail] AS POD LEFT JOIN Production.Product AS PP ON POD.ProductID=PP.ProductID WHERE PP.Name LIKE 'HL Road Rim' GROUP BY PP.Name;[/highlight]
Nəticə dəyişərək maksiməl məbləği göstərir.

max

AVG() - MAX() və MİN() funksiyalarından fərqli olaraq AVG verilmiş qiymətlərin ortalamasını hesablayır. 

Nümunə üçün sorğumuzu dəyişərək aşağıdakı formada verək.

[highlight]SELECT  PP.Name ,AVG([UnitPrice]) AS [UnitPrice after AVG() func] FROM [AdventureWorks2012].[Purchasing].[PurchaseOrderDetail] AS POD LEFT JOIN Production.Product AS PP ON POD.ProductID=PP.ProductID WHERE PP.Name LIKE 'HL Road Rim' GROUP BY PP.Name;[/highlight]

avg

COUNT() - Bu funksiya verilmiş sütunda olan sətirlərin sayını hesablayır. 

Nümunə üçün aşağıdakı sorğudan istifadə edək.

[highlight]SELECT Name, Color FROM [AdventureWorks2012].[Production].[Product];[/highlight]

Bu sorğu malların adını və onların rəngini göstərir.

count

Sorğunu dəyişək və mallar rənglər üzrə qruplaşdıraraq hər rəng üçün nə qədər mal olduğunu tapaq.

[highlight]SELECT Color, Count(Name) AS [Count() func] FROM [AdventureWorks2012].[Production].[Product] GROUP BY Color;[/highlight]

count-2

Əgər cədvəldə təkrarlanan məlumatlar varsa Count() funksiyası ilə bərabər  DISTINCT açar sözünü istifadə edərək  unikal dəyərləri tapa bilərsiniz. Aşağıdakı sorğuda cədvəlimizdəki malların rəng çeşidlərinin sayını göstərən sorğu var. Cəmi 9 rəng.

[highlight]SELECT Count(DISTINCT Color) AS [Count() func] FROM [AdventureWorks2012].[Production].[Product];[/highlight]

count-3

SUM() - verilmiş sütundakı ədədlərin cəmini toplayır. 

Aşağıdakı sorğu ilə hər mala uyğun olaraq sifarişlər cədvəlində UnitePrice sütununun cəmini toplayırıq.

[highlight]SELECT PP.Name ,SUM(UnitPrice) AS [SUM of UnitePrice] FROM [AdventureWorks2012].[Purchasing].[PurchaseOrderDetail] AS POD LEFT JOIN Production.Product AS PP ON POD.ProductID=PP.ProductID GROUP BY PP.Name;[/highlight]

SUM

DATE Functions - Tarix üzərində manipulyasiya aparmaq üçün istifadə olunan funksiyalar. 

DATEPART(tarix parçası, tarix) - Daxil edilmiş tarixin qeyd etdiyiniz parçasını göstərir və aşağıdakı parametrləri qəbul edir. 

Tarix hissəsiDaxil edilən parametr
yearyy , yyyy
quarterqq , q
monthmm , m
dayofyeardy , y
daydd , d
weekwk , ww
weekdaydw
hourhh
minutemi, n
secondss , s
millisecondms
microsecondmcs
nanosecondns
TZoffsettz
ISO_WEEKisowk , isoww

Tarix funksiyaları üçün aşağıdakı sorğudan istifadə edək. Bu sorğu şirkət işçiləri barədə məlumat qaytarır.

[highlight]SELECT FirstName ,LastName ,Gender ,BirthDate ,MaritalStatus ,HireDate FROM [AdventureWorks2012].[Person].[Person] AS PP LEFT JOIN [AdventureWorks2012].[HumanResources].[Employee] AS HE ON PP.BusinessEntityID = HE.BusinessEntityID ORDER BY BirthDate DESC;[/highlight]

datepart

Bu sorğunu dəyişərək aldığımız cavabda yalnız işçilərin doğum illərinin görsənməsini təmin edək.

[highlight]SELECT FirstName ,LastName ,Gender ,DATEPART(yy,BirthDate) AS [BirthDate after DATEPART() func] ,MaritalStatus ,HireDate FROM [AdventureWorks2012].[Person].[Person] AS PP LEFT JOIN [AdventureWorks2012].[HumanResources].[Employee] AS HE ON PP.BusinessEntityID = HE.BusinessEntityID ORDER BY BirthDate DESC;[/highlight]

Nəticə aşağıdakı kimi olacaq.
datepart-2

DATEPART() funksiyasını COUNT() funksiyası ilə birgə istifadə edərək işçiləri doğulduqları ilə görə qruplaşdıra bilərik.

[highlight]SELECT COUNT(*) AS [Worker Count] ,DATEPART(yy,BirthDate) AS [BirthDate after DATEPART() func] FROM [AdventureWorks2012].[Person].[Person] AS PP LEFT JOIN [AdventureWorks2012].[HumanResources].[Employee] AS HE ON PP.BusinessEntityID = HE.BusinessEntityID GROUP BY DATEPART(yy,BirthDate) ORDER BY 2 DESC;[/highlight]

datepart-3

Eyni sorğunu dəyişib hər ay üzrə doğulan işçilərin sayını da tapmaq olar.

[highlight]SELECT COUNT(*) AS [Worker Count] ,DATEPART(mm,BirthDate) AS [BirthDate after DATEPART() func] FROM [AdventureWorks2012].[Person].[Person] AS PP LEFT JOIN [AdventureWorks2012].[HumanResources].[Employee] AS HE ON PP.BusinessEntityID = HE.BusinessEntityID GROUP BY DATEPART(mm,BirthDate) ORDER BY 2 DESC;[/highlight]

datepart-4

DATENAME() - funksiyası vasitəsi ilə sorğumuzda tarixdəki ayların adını göstərə bilərik. 

Eyni sorğunu dəyişərək aşağıdakı formada verək.

[highlight]SELECT COUNT(*) AS [Worker Count] ,DATENAME(mm,BirthDate) AS [BirthDate after DATEPART() func] FROM [AdventureWorks2012].[Person].[Person] AS PP LEFT JOIN [AdventureWorks2012].[HumanResources].[Employee] AS HE ON PP.BusinessEntityID = HE.BusinessEntityID GROUP BY DATENAME(mm,BirthDate) ORDER BY 2 DESC;[/highlight]

datename


GETDATE() - Hal - hazırkı tarixi qaytarır.  Heç bir parametr tələb etmir. 

[highlight]SELECT GETDATE();[/highlight]

CONVERT() funksiyasının köməkliyi ilə GETDATE() funksiyasının qaytardığı tarixi istənilən formaya sala bilərik. Aşağıdakı cədvəldə CONVERT() funksiyası ilə istifadə edəbiləcəyiniz parametrlərlə tanış ola bilərsiniz.

ValueValueInput/OutputStandard
(century yy)(century yyyy)
-0 or 100mon dd yyyy hh:miAM (or PM)Default
1101mm/dd/yyUSA
2102yy.mm.ddANSI
3103dd/mm/yyBritish/French
4104dd.mm.yyGerman
5105dd-mm-yyItalian
6106dd mon yy
7107Mon dd, yy
8108hh:mm:ss
-9 or 109mon dd yyyy hh:mi:ss:mmmAM (or PM)Default+millisec
10110mm-dd-yyUSA
11111yy/mm/ddJapan
12112yymmddISO
-13 or 113dd mon yyyy hh:mi:ss:mmm (24h)
14114hh:mi:ss:mmm (24h)
-20 or 120yyyy-mm-dd hh:mi:ss (24h)
-21 or 121yyyy-mm-dd hh:mi:ss.mmm (24h)
-126yyyy-mm-ddThh:mi:ss.mmm (no spaces)ISO8601
-130dd mon yyyy hh:mi:ss:mmmAMHijiri
-131dd/mm/yy hh:mi:ss:mmmAMHijiri

Daha aydın anlamaq üçün aşağıdakı nümunələrdən istifadə etmək olar.

[highlight]SELECT CONVERT(VARCHAR(19),GETDATE());[/highlight]
[highlight]SELECT CONVERT(VARCHAR(10),GETDATE(),10);[/highlight]
[highlight]SELECT CONVERT(VARCHAR(10),GETDATE(),110);[/highlight]
[highlight]SELECT CONVERT(VARCHAR(11),GETDATE(),6);[/highlight]
[highlight]SELECT CONVERT(VARCHAR(11),GETDATE(),106);[/highlight]
[highlight]SELECT CONVERT(VARCHAR(24),GETDATE(),113);[/highlight]

DATEDİFF() - İki tarix arasındakı fərqi təpmaq üçün istifadə edilir. 

Aşağıdakı sorğu işçilərin Doğum tarixlərini və GETDATE() funksiyasının köməkliyi ilə bu günkü tarixi göstərir.

[highlight]SELECT FirstName ,LastName ,Gender ,CONVERT(varchar,BirthDate,103) AS BirthDate ,CONVERT(varchar,GETDATE(),103) AS ToDay FROM [AdventureWorks2012].[Person].[Person] AS PP LEFT JOIN [AdventureWorks2012].[HumanResources].[Employee] AS HE ON PP.BusinessEntityID = HE.BusinessEntityID ORDER BY BirthDate DESC;[/highlight]

datediff

Sorğuya yeni sütun əlavə edərək DATEDİFF() funksiyasının köməkliyi ilə işçilərin yaşını göstərək.

[highlight]SELECT FirstName ,LastName ,Gender ,CONVERT(varchar,BirthDate,103) AS BirthDate ,CONVERT(varchar,GETDATE(),103) AS ToDay ,DATEDIFF(yy,BirthDate,GETDATE()) AS Age FROM [AdventureWorks2012].[Person].[Person] AS PP LEFT JOIN [AdventureWorks2012].[HumanResources].[Employee] AS HE ON PP.BusinessEntityID = HE.BusinessEntityID ORDER BY BirthDate DESC;[/highlight]

Nəticə aşağıdakı kimi olacaq.

datediff-2



SQL funksiyalarının sayı çox olduğuna görə hər biri haqqında məlumat vermək çətindir. Bu mövzuda ən çox istifadə olunanlar haqqında az da olsa məlumat verməyə çalışdım.

Database Administrator

Yusif Yusifov

0 şərh.:

Post a Comment