MySQL Fonksiyonlar: String, Sayısal, Kullanıcı Tanımlı, Saklanan

⚡ Akıllı Özet

MySQL Fonksiyonlar, veriler depolanmadan veya alınmadan önce onları dönüştürerek tek bir hesaplanmış sonuç döndürür. Bu makale, yerleşik dize, sayısal ve tarih fonksiyonlarını açıklamakta, ardından depolanmış ve kullanıcı tanımlı fonksiyonların veritabanı motorunu nasıl genişlettiğini göstermektedir.

  • 🔤 Dize Fonksiyonları: UCASE, LCASE ve CONCAT, sorgu zamanında metni yeniden şekillendirir; sonuç kümesinin okunabilir bir başlık taşıması için hesaplanan sütunu AS ile takma adlandırın.
  • 🔢 Sayısal Operator: DIV operatörü tam sayı bölmesi yapar, / operatörü ondalık bölümü döndürür ve % (veya MOD) operatörü bölme işleminden kalanı döndürür.
  • 📅 Tarih Fonksiyonları: DATE_FORMAT, saklanan YYYY-MM-DD değerini, uygulama kodunda tek bir satır değişiklik yapmadan %d-%m-%Y gibi herhangi bir görüntüleme biçimine dönüştürür.
  • Saklı Fonksiyonlar: CREATE FUNCTION, sunucu içinde yeniden kullanılabilir mantığı kaydeder; gövde CURDATE() veya NOW() işlevini çağırdığında NOT DETERMINISTIC olarak tanımlayın.
  • ⚙️ Kullanıcı Tanımlı Fonksiyonlar: C dilinde yazılmış harici rutinler veya C++ Bunlar sunucuya derlenir ve daha sonra tıpkı yerel fonksiyonlar gibi davranırlar.
  • ???? Performans Etkisi: Hesaplamaları veritabanına taşımak, her istemci uygulamasındaki tekrarlanan mantığı ortadan kaldırır ve ağ gidiş gelişlerini azaltır.

All ON XNUMX İmplant Tedavisi Nasıl Uygulanır? MySQL Fonksiyonlar?

MySQL verileri depolamak ve almaktan çok daha fazlasını yapabilir. Aynı zamanda can veriler üzerinde manipülasyonlar gerçekleştirmek Onu geri almadan veya kaydetmeden önce. İşte o zaman MySQL Fonksiyonlar burada devreye giriyor. Fonksiyonlar, basitçe bir işlem gerçekleştiren ve ardından bir sonuç döndüren kod parçalarıdır. Bazı fonksiyonlar parametre kabul ederken, diğerleri hiçbir parametre kabul etmez.

Şimdi kısaca bir örneğe bakalım. Varsayılan olarak, MySQL Tarih veri türlerini “YYYY-MM-DD” biçiminde kaydeder. Diyelim ki bir uygulama geliştirdik ve kullanıcılarımız tarihin “DD-MM-YYYY” biçiminde döndürülmesini istiyor. Bunu şu şekilde sağlayabiliriz: MySQL Bunu gerçekleştirmek için yerleşik DATE_FORMAT fonksiyonu kullanılır. DATE_FORMAT, en çok kullanılan fonksiyonlardan biridir. MySQLBu konuyu dersin ilerleyen bölümlerinde detaylı olarak ele alacağız.

Türü ne olursa olsun, bir fonksiyon her zaman tek bir değer döndürür, sıfır veya daha fazla parametre kabul edebilir. parantez içinde ve İfade kullanımına izin verilen her yerde kullanılabilir. — bir SELECT listesinde, bir WHERE yan tümcesinde veya bir ORDER BY yan tümcesinde.

Neden kullan MySQL Fonksiyonlar?

Artık fonksiyonun ne olduğunu bildiğimize göre, bir sonraki soru bu işi neden veritabanına aktarmamız gerektiğidir.

Neden kullanım MySQL fonksiyonlar

Yukarıdaki şemada gösterildiği gibi, bir fonksiyon bir girdi değeri alır, veritabanı motoru içinde mantığı bir kez uygular ve bunu isteyen her uygulamaya tek bir sonuç döndürür.

Programcılar şöyle düşünüyor olabilirler: "Neden bununla uğraşayım ki?" MySQL Fonksiyonlar mı? Aynı etkiyi bir betik veya programlama diliyle de elde edebiliriz. Uygulama programında bir prosedür yazarak bunu başarabileceğimiz doğrudur.

Tarih örneğimize geri dönersek, kullanıcılarımızın verileri istedikleri formatta alabilmeleri için, iş katmanının gerekli işlemleri kendisinin yapması gerekecektir.

Uygulamanın diğer sistemlerle entegre olması gerektiğinde bu durum sorun haline gelir. Kullandığımızda MySQL DATE_FORMAT gibi fonksiyonlar, bu işlevselliği veritabanına entegre eder ve veriye ihtiyaç duyan herhangi bir uygulama, veriyi gerekli biçimde alır. İş mantığındaki tekrarları azaltır ve veri tutarsızlıklarını düşürür..

Dikkate alınması gereken başka bir neden MySQL Bu işlevlerin bir diğer özelliği de istemci/sunucu uygulamalarında ağ trafiğini azaltmaya yardımcı olabilmeleridir.İş katmanının, verileri işlemek için ağ üzerinden ham satırları çekmeye gerek kalmadan, yalnızca depolanmış fonksiyonu çağırması yeterlidir. Ortalama olarak, fonksiyonların kullanımı genel sistem performansını büyük ölçüde artırabilir.

Tipleri MySQL fonksiyonlar

"Ne" ve "neden" soruları çözüldüğüne göre, artık fonksiyonların üç ailesine bakabiliriz. MySQL Sunulan özellikler: yerleşik fonksiyonlar, kayıtlı fonksiyonlar ve kullanıcı tanımlı fonksiyonlar.

Dahili işlevler

MySQL Birçok yerleşik fonksiyonla birlikte gelir; bu fonksiyonlar zaten uygulamada mevcuttur. MySQL Sunucular, veriler üzerinde birçok farklı işlem yapmamıza olanak tanır ve yaygın olarak kullanılan aşağıdaki gruplara ayrılırlar.

  • Dize işlevleri – dize veri türleri üzerinde çalışır
  • sayısal fonksiyonlar – sayısal veri türleri üzerinde çalışın
  • Tarih işlevleri – tarih veri türlerinde çalışın
  • Toplama işlevleri – yukarıdaki tüm veri türleri üzerinde çalışın ve özetlenmiş sonuç kümeleri üretin.
  • diğer fonksiyonlar - MySQL Ayrıca diğer yerleşik işlev türlerini de destekler, ancak bu derste yukarıda adı geçen gruplarla sınırlı kalacağız.

Şimdi yukarıda bahsedilen grupların her birini ayrıntılı olarak inceleyelim. En çok kullanılan fonksiyonları "Myflixdb" örnek veritabanımızı kullanarak açıklayacağız.

Dize işlevleri

Dize fonksiyonları metin değerleri üzerinde çalışır. Filmler tablomuzda, başlıklar büyük ve küçük harflerin bir karışımı kullanılarak saklanır. Başlıkları büyük harflerle döndüren bir sorgu istediğimizi varsayalım. "UCASE" fonksiyonu, parametre olarak bir dize alır ve aşağıdaki kodda gösterildiği gibi her harfi büyük harfe dönüştürür.

SELECT `movie_id`, `title`, UCASE(`title`) AS `upper_case_title` FROM `movies`;

İŞTE

  • UCASE(`başlık`) Bu, başlığı parametre olarak alan ve büyük harflerle döndüren yerleşik bir fonksiyondur.
  • AS `upper_case_title` Hesaplanan sütuna bir takma ad verilir, böylece sonuç kümesi ham ifade yerine okunabilir bir başlık taşır.

Yukarıdaki betiğin çalıştırılması MySQL Workbench'in Myflixdb'ye karşı yaptığı karşılaştırma aşağıdaki sonuçları vermektedir.

film_id başlık büyük harfli başlık
16 %67 Suçlu %67 SUÇLU
6 melekler ve seytanlar MELEKLER VE ŞEYTANLAR
4 Code İsim Siyah KOD ADI SİYAH
5 Babamın Küçük Kızları BABANIN KÜÇÜK KIZLARI
7 Da Vinci Code DAVINCI KODU
2 Sarah Marshal'ı unutmak SARAH MARSHAL'I UNUTMAK
9 Honey mooners BAL MOONERS
19 film 3 FİLM 3
1 Karayip Korsanları 4 KARAYİP KORSANLARI 4
18 örnek film ÖRNEK FİLM
17 Büyük Diktatör BÜYÜK DİKTATÖR
3 X-Men X MEN

UCASE'in yanı sıra hatırlanması gereken iki önemli isim daha var: LVASE Bir dizeyi küçük harfe dönüştürür ve BİRLEŞTİR İki veya daha fazla dizeyi tek bir dizeye birleştirir. Tam liste için, ilgili bölüme bakın. MySQL dize fonksiyonu referansı.

sayısal fonksiyonlar

Daha önce de belirtildiği gibi, sayısal fonksiyonlar sayısal veri tipleri üzerinde çalışır. Ayrıca SQL sorgularımızda doğrudan sayısal veriler üzerinde matematiksel hesaplamalar da yapabiliriz.

Aritmetik operatörler

MySQL SQL sorgularında hesaplamalar yapmak için kullanılabilen aşağıdaki aritmetik operatörleri destekler.

İsim Açıklama
DIV Tam sayı bölümü
/ Bölünme
- Alttracyon
+ Ek
* Çarpma
% veya MOD modül

Aşağıda her bir operatöre ait örnekler verilmiştir.

Tam sayı bölme (DIV) — DIV işlemi kesirli kısmı atar ve yalnızca tam sayıyı döndürür.

SELECT 23 DIV 6;

Yukarıdaki komut dosyasını çalıştırmak bize şunu verir: 3.

Bölme operatörü (/) — DIV işleminden farklı olarak, bölme operatörü sonucun ondalık kısmını korur.

SELECT 23 / 6;

Yukarıdaki komut dosyasını çalıştırmak bize şunu verir: 3.8333.

Alttraction operatörü (-)

SELECT 23 - 6;

Yukarıdaki komut dosyasını çalıştırmak bize şunu verir: 17.

Toplama operatörü (+)

SELECT 23 + 6;

Yukarıdaki komut dosyasını çalıştırmak bize şunu verir: 29.

Çarpma operatörü (*)

SELECT 23 * 6 AS `multiplication_result`;

Sonuç:

çarpma_sonucu
138

Modulo operatörü (% veya MOD)

Modül operatörü, N'yi M'ye böler ve bize kalanı verir. Önceki örneklerdekiyle aynı değerleri kullanarak modül operatörü örneğine bakalım.

SELECT 23 % 6;
-- OR, equivalently:
SELECT 23 MOD 6;

Bu komut dosyalarından herhangi birini çalıştırmak bize şunu verir: 5.

Şimdi bazı yaygın sayısal işlevlere bakalım. MySQL.

ZEMİN – Bu fonksiyon, bir sayının ondalık basamaklarını kaldırır ve en yakın tam sayıya yuvarlar. Aşağıdaki kod parçası kullanımını göstermektedir.

SELECT FLOOR(23 / 6) AS `floor_result`;

Sonuç:

kat_sonucu
3

YUVARLAK – Bu fonksiyon bir sayıyı en yakın tam sayıya yuvarlar. 23 / 6'nın sonucu 3.8333 olduğundan, ROUND fonksiyonu 4, FLOOR fonksiyonu ise 3 döndürür; bu iki fonksiyon birbirinin yerine kullanılamaz.

SELECT ROUND(23 / 6) AS `round_result`;

Sonuç:

tur_sonucu
4

RAND – Bu fonksiyon rastgele bir sayı üretir. Değeri, fonksiyon her çağrıldığında değişir. Aşağıdaki kod parçası kullanımını göstermektedir.

SELECT RAND() AS `random_result`;

Tarih işlevleri

Tarih fonksiyonları tarih ve tarih-saat veri tipleri üzerinde çalışır. DATE_FORMAT fonksiyonu, giriş bölümünde açıklanan "YYYY-MM-DD ile DD-MM-YYYY" arasındaki sorunu çözer.

TARİH FORMATI Bu komut dosyası iki parametre alır: biçimlendirilecek tarih değeri ve yer tutuculardan oluşturulmuş bir biçimlendirme dizesi. Aşağıdaki komut dosyası, kullanıcılarımızın istediği gün-ay-yıl biçiminde her yayın tarihini döndürür.

SELECT `title`, DATE_FORMAT(`date_released`, '%d-%m-%Y') AS `formatted_date`
FROM `movies`;

En sık kullanılan format yer tutucuları aşağıda listelenmiştir.

Yer Tutucu anlam Örnek çıktı
%d Ayın günü, iki rakamlı 04
%m Ay, iki rakamlı 08
%Y Yıl, dört rakamlı 2012
%M Ayın adını tam olarak yazın. Ağustos
%Onun Hoursdakika, saniye 14:35:09

Günlük işlerde sürekli olarak karşımıza çıkan üç farklı tarih işlevi daha vardır:

  • CURDATE () Geçerli tarihi YYYY-MM-DD formatında döndürür.
  • NOW () Geçerli tarihi döndürür hem de Zaman.
  • DATEDIFF(d1, d2) İki tarih arasındaki gün sayısını döndürür; bu da herhangi bir kira gecikme raporunun temelini oluşturur.

Tam liste için bakınız. MySQL tarih ve saat fonksiyonu referansı.

Saklanan işlevler

Dahili fonksiyonlar yaygın durumları kapsar. Bir iş kuralı daha spesifik olduğunda, kendi kurallarımızı yazarız ve işte bu yüzden saklı fonksiyonlar kullanılır.

Saklı fonksiyonlar, yerleşik fonksiyonlarla aynı şekilde davranır, tek farkı onları kendinizin tanımlamasıdır. Oluşturulduktan sonra, saklı bir fonksiyon SQL sorgularında diğer herhangi bir fonksiyon gibi kullanılabilir. Temel sözdizimi aşağıda gösterilmiştir.

CREATE FUNCTION sf_name ([parameter(s)])
RETURNS data_type
[DETERMINISTIC | NOT DETERMINISTIC]
BEGIN
    -- procedural statements
END

İŞTE

  • “CREATE FUNCTION sf_name ([parameter(s)])” zorunludur ve şunu belirtir: MySQL Sunucu, parantez içinde tanımlanmış isteğe bağlı parametrelerle `sf_name` adında bir fonksiyon oluşturacaktır.
  • “Veri türünü döndürür” Bu parametre zorunludur ve fonksiyonun döndüreceği veri türünü belirtir.
  • “DERMİNİSTİK” Bu fonksiyon, aynı argümanlar verildiğinde her seferinde aynı değeri döndüreceğini belirtir. “BELİRLENMİŞ DEĞİL” Tam tersini iddia ediyor.
  • “BAŞLANGIÇ … SON” Fonksiyonun yürüttüğü prosedürel kodu sarmalar.

Diyelim ki kiraladığımız filmlerden hangilerinin iade tarihini geçtiğini öğrenmek istiyoruz. İade tarihini parametre olarak alan ve sunucudaki geçerli tarihle karşılaştıran bir saklı fonksiyon oluşturabiliriz. Geçerli tarih iade tarihinden büyükse, film gecikmiştir ve "Evet" döndürürüz; aksi takdirde "Hayır" döndürürüz.

DELIMITER |
CREATE FUNCTION sf_past_movie_return_date (return_date DATE)
RETURNS VARCHAR(3)
NOT DETERMINISTIC
BEGIN
    DECLARE sf_value VARCHAR(3);
    IF CURDATE() > return_date THEN
        SET sf_value = 'Yes';
    ELSEIF CURDATE() <= return_date THEN
        SET sf_value = 'No';
    END IF;
    RETURN sf_value;
END|
DELIMITER ;

⚠️ Uyarı — bu işlevi BELİRLİ olarak etiketlemeyin. Kod gövdesi CURDATE() fonksiyonunu çağırır, bu nedenle aynı argüman bugün "Hayır", yarın "Evet" döndürebilir. Zamana bağlı bir fonksiyonu DETERMINISTIC olarak tanımlamak, optimizasyon aracını yanıltır ve ifade tabanlı çoğaltma için güvenli değildir. Bunun yerine şunu kullanın: DETERMİNİST DEĞİL Gövde CURDATE(), NOW() veya RAND() fonksiyonlarını çağırdığı her zaman.

Yukarıdaki komut dosyasını çalıştırmak, `sf_past_movie_return_date` adlı kayıtlı fonksiyonu oluşturur. Şimdi bunu test edelim.

SELECT `movie_id`, `membership_number`, `return_date`, CURDATE(),
       sf_past_movie_return_date(`return_date`) AS `is_overdue`
FROM `movierentals`;

Yukarıdaki betiğin çalıştırılması MySQL Workbench'in myflixdb'ye karşı yaptığı test bize aşağıdaki sonuçları veriyor.

film_id Üye numarası dönüş tarihi CURDATE () vadesi geçmiş
1 1 NULL 04-08-2012 NULL
2 1 25-06-2012 04-08-2012 Evet
2 3 25-06-2012 04-08-2012 Evet
2 2 25-06-2012 04-08-2012 Evet
3 3 NULL 04-08-2012 NULL

İki NULL satırına dikkat edin. `return_date` NULL olduğunda, her iki karşılaştırma da TRUE veya FALSE yerine NULL olarak değerlendirilir, bu nedenle hiçbir IF dalı çalışmaz ve fonksiyon NULL döndürür; bu da beklenen sonuçtur, çünkü geri dönmeyen bir filmin karşılaştırılacak bir geri dönüş tarihi yoktur.

Kullanıcı tanımlı işlevler

SQL tek başına yeterince hızlı olmadığında, MySQL Üçüncü bir seçeneğe olanak tanır. Kullanıcı tanımlı fonksiyonlar (UDF'ler), derlenmiş bir dilde yazılır, örneğin: C or C++Kullanıcı tanımlı fonksiyonlar (UDF'ler), paylaşımlı bir kütüphaneye entegre edilir ve sunucuya kaydedilir. Eklendikten sonra, diğer tüm fonksiyonlar gibi çağrılırlar. Bir UDF, sunucu işlemi içinde yerel kod olarak çalıştığı için yoğun hesaplamalar için uygundur; ancak bir UDF'deki hata sunucunun çökmesine neden olabilir, bu nedenle UDF'ler, depolanmış fonksiyonlara göre çok daha az kullanılır.

Dahili Fonksiyonlar, Saklı Fonksiyonlar ve Kullanıcı Tanımlı Fonksiyonlar: Hangisini Kullanmalısınız?

Her üç aile de tek bir değer döndürür ve herhangi bir SQL sorgusundan çağrılabilir, ancak yazarları, çalıştıkları yer ve taşıdıkları risk açısından farklılık gösterirler. Aşağıdaki tablo bu farklılıkları özetlemektedir.

Kriter Dahili işlevler Saklanan işlevler Kullanıcı tanımlı fonksiyonlar (UDF'ler)
Bunu kim yazıyor? İle sevk edilir MySQL Siz, SQL'de Siz, C'de veya C++
Nerede yaşıyor Sunucunun içinde Veritabanının içinde, CREATE FUNCTION komutuyla oluşturulmuştur. Sunucu tarafından yüklenen derlenmiş paylaşımlı kütüphane
Tipik kullanım Biçimlendirme, matematik, toplama Gecikmiş ödeme çeki gibi tekrar kullanılabilir iş kuralları SQL'in ifade edemediği, işlemci gücü yoğun veya özel mantık.
Ana risk Hayır Büyük bir tabloda satır satır çağrıldığında yavaş çalışır. Kütüphanede meydana gelen bir çökme sunucunun çalışmasını durdurabilir.

Genel bir kural olarak, yerleşik bir fonksiyonla başlayın. Hiçbiri uygun değilse, kuralın tek bir yerde bulunması için saklanmış bir fonksiyon yazın. Saklanmış bir fonksiyonun ölçülebilir derecede yavaş olduğu durumlarda ancak kullanıcı tanımlı bir fonksiyona (UDF) başvurun.

SSS

Bir fonksiyon yalnızca bir değer döndürmelidir ve SELECT, WHERE veya ORDER BY ifadesinin içinde kullanılabilir. Saklı prosedür ise sıfır veya birden fazla sonuç kümesi döndürebilir, bir ifadeye yerleştirilemez ve CALL ifadesiyle çağrılır.

DROP FUNCTION IF EXISTS sf_name; komutunu çalıştırın, ardından yeniden oluşturun. MySQL CREATE OR REPLACE işlevi bulunmamaktadır ve ALTER FUNCTION işlevi yalnızca yorum veya güvenlik türü gibi özellikleri değiştirir, asla gövdeyi değiştirmez.

Yapabilirler. WHERE yan tümcesinde indekslenmiş bir sütunun etrafına sarılmış bir fonksiyon bunu engeller. MySQL Bu indeksi kullanmaktan kaçınarak tam tarama yapılmasını sağlayın. Ham sütun üzerinde filtre uygulayın ve işlevi yalnızca SELECT listesinde uygulayın.

Evet. Yapay zeka asistanları, basit bir İngilizce kuraldan CREATE FUNCTION kodu oluşturabilir. Üretim sunucusunda çalıştırmadan önce, oluşturulan kodun gövdesini her zaman doğru DETERMINISTIC özelliği, NULL işleme ve parametre veri tipleri açısından gözden geçirin.

Hayır. Yapay zeka modelleri fonksiyon adları uydurabilir, NULL durumlarını gözden kaçırabilir veya sürüm farklılıklarını dikkate almayabilir. Oluşturulan her fonksiyonu verilerin bir kopyası üzerinde test edin ve sonuçları kendiniz yazdığınız ve doğruladığınız bir sorguyla karşılaştırarak teyit edin.

Bu yazıyı şu şekilde özetleyin: