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.

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.
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.

