Archive

Archive for İ

Installing MySQL 5.6 on CentOS 6.4 using YUM

Bildiyimiz kimi EL-6 Linux-lar üçün MySQL official repo yox idi.
Hər OS özü MySQL-i build edirdi və öz native repo-sunda yerləşdirirdi.
Lakin Oracle Official YUM repo-nu təqdim edib.
Biz də onu indi sizlərlə test edəcik.

İlk öncə rəsmi repo-nu əlavə etməliyik. Bu məqsədlə repo faylını downlaod edirik:

Download

Daha sonra onu install edirik:

[root@localhost Downloads]# yum localinstall mysql-community-release-el6-3.noarch.rpm
.
.
.
  Installing : mysql-community-release-el6-3.noarch                         1/1 
  Verifying  : mysql-community-release-el6-3.noarch                         1/1 

Installed:
  mysql-community-release.noarch 0:el6-3                                        

Complete!

Enable olduğunu test edirik:

[root@localhost ~]# yum repolist enabled | grep "mysql-community"
mysql-community                  MySQL Community Server                      18

MySQL-in install-ına keçməmişdən əvvəl mütləq şəkildə köhnə mysql-libs paketini silmək lazımdır:

[root@localhost ~]# yum remove mysql-libs
Loaded plugins: fastestmirror, refresh-packagekit, security
Setting up Remove Process
.
.
.
Removed:
  mysql-libs.x86_64 0:5.1.69-1.el6_4                                            

Dependency Removed:
  cronie.x86_64 0:1.4.4-7.el6                                                   
  cronie-anacron.x86_64 0:1.4.4-7.el6                                           
  crontabs.noarch 0:1.10-33.el6                                                 
  postfix.x86_64 2:2.6.6-2.2.el6_1                                              
  redhat-lsb-core.x86_64 0:4.0-7.el6.centos                                     
  redhat-lsb-graphics.x86_64 0:4.0-7.el6.centos                                 
  redhat-lsb-printing.x86_64 0:4.0-7.el6.centos                                 
  sysstat.x86_64 0:9.0.4-20.el6                                                 

Complete!

Və MySQL-in ən son versiyası olan 5.6.14-ü install edirik:

[root@localhost ~]# yum install mysql-server
.
.
Installed:
  mysql-community-server.x86_64 0:5.6.14-3.el6                                  

Dependency Installed:
  mysql-community-client.x86_64 0:5.6.14-3.el6                                  
  mysql-community-common.x86_64 0:5.6.14-3.el6                                  
  mysql-community-libs.x86_64 0:5.6.14-3.el6                                    

Complete!

MySQL-i start edirik:

[root@localhost ~]# service mysqld start
Initializing MySQL database:  2013-10-28 20:39:24 0 
.
.
                                                           [  OK  ]
Starting mysqld:                                           [  OK  ]

Və ən sonda production server-lərdə istifadəsi məsləhət görülən mysql_secure_installation scriptini çalışdırırıq.

[root@localhost ~]# /usr/bin/mysql_secure_installation
.
.
All done!  If you've completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!

Və Connect oluruq:

[root@localhost ~]# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 5.6.14 MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Çox sadə yolla artıq həm də MySQL-i update etmək olacaq.
Təşəkkürlər 😉

Exploring JOINs in MySQL and Oracle(part2 OUTER JOIN)

Bugün hər iki DB-də Outer Join-lərə baxırıq.

xatırladaq ki bizim nümunə cədvəllər daha əvvəlki yazımızda var
pure-natural-join

İndi isə testlərimizə başlayaq.Left Join

-- Oracle

-- Left Join
-- 2 syntax 2si də doğrudur:

-- *
select * from t2 left join t1 using(name_id);

-- *
select * from t2 left outer join t1 using(name_id);

-- MySQL

-- Left Join

-- *
select * from t2 left outer join t1 using(name_id);

-- *
select * from t2 left join t1 using(name_id);

İkinci olaraq Right Join:

-- Oracle
-- Right Join

-- *
select * from t1 right join t2 using(name_id);

-- *
select * from t1 right outer join t2 using(name_id)

-- MySQL
-- Right Join 

-- *
select * from t1 right join t2 using(name_id);

-- *
select * from t1 right outer join t2 using(name_id);

Output-lara diqqətlə nəzər salsaq görərik ki, Oracle Join-li sorğumuzda hansı sıra ilə yazdığımıza diqqət yetirir və result-ı ona uyğun qaytarır.
MySQL isə Join-in hansı cədvələ uyğun olduğuna əsasən result qaytarır.

Indi isə Outer Join:
Full outer join — bir növü left join + right join-dir. Bunu daha aydın göstərmək üçün gəlin t1 cədvəlinə yeni məlumatlar əlavə edək:

-- Oracle 

insert into t1(id1, name1, name_id) values(10,'elvin',12);
insert into t1(id1, name1, name_id) values(11,'ehmed',13);
insert into t1(id1, name1, name_id) values(12,'ziya',14);

-- Full outer join

-- *
select * from t1 full join t2 using(name_id);

-- *
select * from t1 full outer join t2 using(name_id);

Və möcüzəli şəkildə aşkarlayırıq ki, MySQL-də FULL JOİN = İNNER JOİN, FULL OUTER JOİN isə yoxdur.

-- MySQL

-- Full Join = İnner Join

select * from t1 full join t2 using(name_id);

select * from t1 inner join t2 using(name_id);


Bonus:
Cartesioan Product generation

-- Oracle

-- Cross Join

select * from t1 cross join t2;

-- MySQL

-- Cross Join

select * from t1 cross join t2;

Təşəkkürlər 😉

Exploring JOINs in MySQL and Oracle(part1 PURE NATURAL JOIN)

Bu və ardıcıl yazılarda JOIN-lərə baxacıq. MySQL və Oracle-da JOİN-ləri araşdıracıq.
Birinci yazı həsr olunur PURE NATURAL JOİN-e
Oracle üçün Mənbə : Oracle 11g SQL Fundamentals Chapter 7

Oracle üçün nümunə cədvəl və məlumatlar:

create table t1(
id1 number,
name1 varchar2(25),
name_id number
);

create table t2(
id2 number,
name2 varchar(25),
name_id number
);

insert into t2(id2,name2,name_id) values(1,'farid',1);
insert into t2(id2,name2,name_id) values(2,'arif',2);
insert into t2(id2,name2,name_id) values(3,'zulfugar',3);
insert into t2(id2,name2,name_id) values(4,'xxx',4);
insert into t2(id2,name2,name_id) values(5,'yyy',5);
insert into t2(id2,name2,name_id) values(6,'zzz',6);

insert into t1(id1,name1,name_id) values(1,'shahriyar',1);
insert into t1(id1,name1,name_id) values(2,'orxan',2);
insert into t1(id1,name1,name_id) values(3,'elvin',3);

MySQL üçün nümunə cədvəl və məlumatlar:

CREATE TABLE `t1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(25) DEFAULT NULL,
  `name_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

CREATE TABLE `t2` (
  `id2` int(11) NOT NULL AUTO_INCREMENT,
  `name2` varchar(25) DEFAULT NULL,
  `name_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id2`)
)

insert into t1(name,name_id) values('shahriyar',1),('orxan',2),('elvin',3);

insert into t2(name2,name_id) values('farid',1),('arif',2),('zulfugar',3);
insert into t2(name2,name_id) values('xxx',4);
insert into t2(name2,name_id) values('yyy',5);
insert into t2(name2,name_id) values('zzz',6);

The NATURAL JOİN clause:

Hər iki RDBMS-dəki cədvəllərdəki məlumatlar aşağıdakı kimidir:

MariaDB [join_test]> select * from t2;
+-----+----------+---------+
| id2 | name2    | name_id |
+-----+----------+---------+
|   1 | farid    |       1 |
|   2 | arif     |       2 |
|   3 | zulfugar |       3 |
|  10 | xxx      |       4 |
|  11 | yyy      |       5 |
|  12 | zzz      |       6 |
+-----+----------+---------+
6 rows in set (0.00 sec)

MariaDB [join_test]> select * from t1;
+----+-----------+---------+
| id | name      | name_id |
+----+-----------+---------+
|  1 | shahriyar |       1 |
|  2 | orxan     |       2 |
|  3 | elvin     |       3 |
+----+-----------+---------+
3 rows in set (0.00 sec)

Oracle 11g SQL Fundamentals kitabından page 319-dakı query-ləri sınayaq:

-- Oracle

select * from t1 natural join t2;
>>>
+---------+----+-----------+-----+----------+
| NAME_İD |İD1 | NAME1     | İD2 | NAME2    |
+---------+----+-----------+-----+----------+
|       1 |  1 | shahriyar |   1 | farid    |
|       2 |  2 | orxan     |   2 | arif     |
|       3 |  3 | elvin     |   3 | zulfugar |
+---------+----+-----------+-----+----------+

-- MySQL

MariaDB [join_test]> select * from t1 natural join t2;
+---------+----+-----------+-----+----------+
| name_id | id | name      | id2 | name2    |
+---------+----+-----------+-----+----------+
|       1 |  1 | shahriyar |   1 | farid    |
|       2 |  2 | orxan     |   2 | arif     |
|       3 |  3 | elvin     |   3 | zulfugar |
+---------+----+-----------+-----+----------+
3 rows in set (0.01 sec)

Eyni nəticə çıxdı.
Davam edək:

-- Oracle

select * from t1,t2
where t1.name_id = t2.name_id;
>>>

+----+-----------+---------+-----+----------+---------+
|İD1 | NAME1     | NAME_İD | İD2 | NAME2    | NAME_İD_1
+----+-----------+---------+-----+----------+---------+
|  1 | shahriyar |       1 |   1 | farid    |       1 |
|  2 | orxan     |       2 |   2 | arif     |       2 |
|  3 | elvin     |       3 |   3 | zulfugar |       3 |
+----+-----------+---------+-----+----------+---------+

-- MySQL

MariaDB [join_test]> select * from t1,t2
     where t1.name_id = t2.name_id;
+----+-----------+---------+-----+----------+---------+
| id | name      | name_id | id2 | name2    | name_id |
+----+-----------+---------+-----+----------+---------+
|  1 | shahriyar |       1 |   1 | farid    |       1 |
|  2 | orxan     |       2 |   2 | arif     |       2 |
|  3 | elvin     |       3 |   3 | zulfugar |       3 |
+----+-----------+---------+-----+----------+---------+
3 rows in set (0.00 sec)

Gördüyümüz kimi Syntax eynidir və nəticələr də eynidir.

NATURAL join üçün maraqlı məqamlardan biri,
Əgər natural join şərti zamanı eyni adlı column-lar tapılmazsa o zaman Cartesian join result geri dönəcək:

-- Oracle

-- Nümunə cədvəlimizi yaradaq

create table t3(
id3 number,
name3 varchar2(25),
name_id1 number
);

insert into t3 select * from t2;

Gördüyümüz kimi bu cədvəldə t1 və t2 (yuxarıdakı cədvəllər) ilə eyni adlı column yoxdur.
Və az əvvəl söylədiyimiz iddiani test edək:

select * from t2 natural join t3;
>>> 
.
.
36 rows

Niyə məhz 36?

select count(*) from t2;
>>> 6

select count(*) from t3;
>>> 6

Cartesian Join zamanı isə bildiyimiz kimi t2xt3 qədər row qayıtmalıdır və 6×6=36.
Eyni hal MySQL üçün də geçərlidir:

create table t3(
id3 int not null auto_increment,
name3 varchar(25),
name_id1 int,
primary key(id3)
);

MariaDB [join_test]> insert into t3 select * from t2;
Query OK, 6 rows affected (0.04 sec)
Records: 6  Duplicates: 0  Warnings: 0

MariaDB [join_test]> select * from t3 natural join t2;

.
.
36 rows in set (0.00 sec)

Dolayısı ilə hər 2 RDBMS üçün column match-i tapmayan natural join, Cartesian join result qaytarır və bu aşağıdakı sorğuya bərabərdir:

-- Oracle

select * from t2,t3;
>>> 
36 rows fetched

-- MySQL

select * from t2,t3;
>>>
36 rows in set (0.00 sec)

Ən sonda hər iki RDBMS-də NATURAL LEFT JOİN və NATURAL RİGHT JOİN-ə baxaq.
Xatırladıram ki t1 və t2 cədvəlində aşağıdakı məlumatlar var:
t1:

t2:

-- Oracle
-- NATURAL LEFT JOİN

select * from t1 natural left join t2;

-- Oracle
-- NATURAL RIGHT JOİN

select * from t1 natural right join t2;

Nəticə MySQL-də də eynidir. Fərq yalnız ondadır ki,
MySQL right join-dirsə adına uyğun ilk öncə sağdakı cədvəldən məlumatları sıralayır.

-- MySQL
-- NATURAL LEFT JOİN

select * from t1 natural left join t2;

-- MySQL
-- NATURAL RIGHT JOİN

select * from t1 natural right join t2;

NATURAL JOİN haqqında bu qədər..
Təşəkkürlər 😉

Insert procedure with incremental session variable

Bu MySQL prosedur daxilinde biz 1 сədvəldən cursor vasitəsilə məlumatı çəkib digər bir cədvələ session variable increment etməklə insert edirik.
Şəxsi task-ım olan bu prosedur kodunu paylaşıram:

DELIMITER $$
 
CREATE  PROCEDURE insert_it()
BEGIN
    declare var_match int;
	declare v_last_row_fetched int default 0;
	
     
    declare cursor1 cursor for
    select id from wd_matches;
 
    declare continue handler for not found set v_last_row_fetched=1;
 
    set v_last_row_fetched=0;
    open cursor1;
    cursor_loop: loop
    fetch cursor1 into var_match;
            if v_last_row_fetched=1 then
                    leave cursor_loop;
            end if;
			
			set @matcher = var_match;
			set @counter=0;

			inserting: loop
				if @counter > 17 then
					leave inserting;
				end if;

				set @counter = @counter+1;
				
				insert into wd_squads(`match`,player,ord,`status`) values(@matcher,0,@counter,'0');
				
			end loop inserting;
    end loop cursor_loop;
    close cursor1;
    set v_last_row_fetched=0;
end $$

Təşəkkürlər 😉

Kateqoriyalar: My Stored Routines

MySQL’s Group by vs. Oracle’s Group by

Group by məntiqini yəqin ki hər kəs bilir. Fundamental SQL-ə daxildir.
MySQL-in default Group by behave-inə Oracle-ın default-u ilə birlikdə baxacıq.
Ən sonda da MySQL-in Oracle-a (Oracle like MySQL) oxşar şəkildə işlədilməsinə baxacıq.

İLk öncə default sql_mode ilə çalışan MySQL server-ə baxaq:

mysql> select @@global.sql_mode;
+------------------------+
| @@global.sql_mode      |
+------------------------+
| NO_ENGINE_SUBSTITUTION |
+------------------------+
1 row in set (0.00 sec)

Və çox maraqlı bir sorğu ))

-- MySQL
select * from employees group by DEPARTMENT_ID;

Möcüzəli şəkildə görürük ki, normal qaydada result gəldi.
indiki halda sorğumuz hər DEPARTMENT_ID-yə aid 1-ci EMPLOYEE_İD-li işçiləri çıxardır.
Oracle üçün eyni sorğu:

-- Oracle
select * from employees group by department_id;
>>> ORA-00979: not a GROUP BY expression
00979. 00000 -  "not a GROUP BY expression"

Əlbəttə bu belə də olmalı idi ))

Davam edək. İkinci sorğumuz da eyni dərəcədə məntiqsizdir necə deyərlər:

-- MySQL
mysql> select department_id, salary from employees group by department_id;
+---------------+--------+
| department_id | salary |
+---------------+--------+
|             1 |  89949 |
|             2 |  99178 |
|             3 |  53465 |
|             4 |  42566 |
|             5 |  57778 |
|             6 |  80147 |
|             7 |  69412 |
.
.

Yenə default MySQL-də result gəlir. Burda da group by şərtimizə uyğun olaraq hər department_id-yə uyğun 1-ci salary qayıdır.

-- Oracle
select department_id, salary from employees group by department_id;
>>> ORA-00979: not a GROUP BY expression
00979. 00000 -  "not a GROUP BY expression"

Belə tip ERROR-ların gəlməsi bizi daha düzgün sorğu məntiqi qurmağa məcbur edir. Bu çox gözəldir.

Davam edək və daha bir sorğuya baxaq.

-- MySQL

mysql> select DEPARTMENT_ID,employee_id, sum(salary) from employees group by DEPARTMENT_ID;
+---------------+-------------+-------------+
| DEPARTMENT_ID | employee_id | sum(salary) |
+---------------+-------------+-------------+
|             1 |           2 |     3696222 |
|             2 |          53 |     6434950 |
|             3 |          16 |     6802927 |
|             4 |          35 |     7087003 |
|             5 |          20 |     7663093 |
|             6 |           6 |     7987810 |

Gördüyümüz kimi employee_id yuxarıdakı qaydaya uyğun olaraq yenə, department_id-yə uyğun olaraq birincilər gəldi. salary sum() isə düzgün olaraq hesablandı.

Eyni sorğu Oracle-da:

-- Oracle

select DEPARTMENT_ID,employee_id, sum(salary) from employees group by DEPARTMENT_ID;
>>> ORA-00979: not a GROUP BY expression
00979. 00000 -  "not a GROUP BY expression"

Yenidən Oracle bizə ERROR çıxartdır. Çox gözəl.

Eyni sorğu üzərindən employee_id-ni də group by-a salaq.

-- MySQL
mysql> select DEPARTMENT_ID,employee_id, sum(salary) from employees group by DEPARTMENT_ID,employee_id order by DEPARTMENT_ID;
+---------------+-------------+--------+
| DEPARTMENT_ID | employee_id | salary |
+---------------+-------------+--------+
|             1 |           2 |  89949 |
|             1 |          10 |  86809 |
|             1 |          15 |  63270 |
|             1 |          21 |  98654 |
|             1 |          81 |  63036 |
|             1 |         106 |  41379 |
|             1 |         109 |  93638 |
|             1 |         178 |  44590 |
|             1 |         211 |  48328 |
|             1 |         242 |  91293 |


-- Oracle
select DEPARTMENT_ID, employee_id, sum(salary) from employees group by DEPARTMENT_ID, employee_id order by department_id;
>>>
DEPARTMENT_İD     EMPLOYEE_İD     SUM(SALARY)
10	          200	          4400
20	          201 	          13000
20	          202	          6000
30	          114	          11000
30	          115	          3100
30	          116	          2900
30	          117	          2800

Eyni nəticəni çıxartdılar. Hər bir departamenti ayrıca sıralamaqla hər bi işçinin salary-sini ayrı-ayrı çıxadır. Dolayısı ilə burda SUM məntiqsizlik üzündən öz qüvvəsini itirir.
Hər bir departamantə uyğun hər bir işçinin maaşının cəmini tapmaq olmur 😉

NƏTİCƏ:
MySQL-dən əgər default konfiqurasiyalı istifadə edəciksə hər bir yazdığımız sorğunu dəfələrlə test etməli, ən azından group by məntiqini düzgün qurmalıyıq.
Oracle-da isə düzgün yazmasanız onszu da ERROR çıxacaq. Təbrik edəcək ))

MySQL-i məhz bu GROUP BY halında Oracle-a bənzər şəkildə ERROR-lar verib bizi xəbərdar etməsini necə təmin edə bilərik.
Bunun üçün MySQL SQL_MODE-da dəyişiklik etməliyik.
my.cnf faylına aşağıdakı sətri [mysqld] kataloqu altında qeyd edirik:

sql_mode = ONLY_FULL_GROUP_BY

MySQL-ə restart veririk.
Indi isə əvvəl düzgün işləyən hər sorğunu sınayaq:

-- 1
mysql> select * from employees group by department_id;
ERROR 1055 (42000): 'mysqlspp.employees.EMPLOYEE_ID' isn't in GROUP BY

-- 2
mysql> select department_id, salary from employees group by department_id;
ERROR 1055 (42000): 'mysqlspp.employees.SALARY' isn't in GROUP BY

-- 3
mysql> select DEPARTMENT_ID,employee_id, sum(salary) from employees group by DEPARTMENT_ID;
ERROR 1055 (42000): 'mysqlspp.employees.EMPLOYEE_ID' isn't in GROUP BY

Gördüyümüz kimi daha əvvəl düzgün işləyən sorğular indi ERROR verir.
Bu şəkildə etməklə biz MySQL-in daha strict şəkildə Oracle kimi çalışmasını təmin etmiş oluruq.

* ƏLAVƏ *
Having-i də test edib bura yazmağa qərar verdim.
sql_mode = ” etdikdən sonra
Bərabər şəkildə düzgün işləyən sorğular:

-- Oracle

select DEPARTMENT_ID,
avg(salary),
count(*)
from employees
group by DEPARTMENT_ID
having avg(salary) > 10000;

-- MySQL

select DEPARTMENT_ID,
avg(salary),
count(*)
from employees
group by DEPARTMENT_ID
having avg(salary) > 70000;

Lakin ALİAS verdikdə fərqlilik ortaya çıxır:


-- Oracle

select DEPARTMENT_ID,
avg(salary) as avgx,
count(*)
from employees
group by DEPARTMENT_ID
having avgx > 10000;

>>> ORA-00904: "AVGX": invalid identifier
00904. 00000 -  "%s: invalid identifier"

-- MySQL

select DEPARTMENT_ID,
avg(salary) as avgx,
count(*)
from employees
group by DEPARTMENT_ID
having avgx > 70000;

+---------------+------------+----------+
| DEPARTMENT_ID | avgx       | count(*) |
+---------------+------------+----------+
|             1 | 71081.1923 |       52 |
|             5 | 72293.3302 |      106 |
|             6 | 73282.6606 |      109 |
|             8 | 70504.3158 |       95 |
|             9 | 73321.0227 |       88 |
|            13 | 71513.8165 |      109 |
|            15 | 70468.3707 |      116 |
|            16 | 70079.0294 |      102 |
|            17 | 70019.2455 |      110 |
|            20 | 72301.6667 |       57 |
+---------------+------------+----------+

Yenə də əgər istəsək ki, məhz bu davranışın da qarşısını alaq o zaman sql_mode-da dəyişiklik etməliyik:

mysql> set @@sql_mode = 'ONLY_FULL_GROUP_BY';
Query OK, 0 rows affected (0.00 sec)


mysql> select DEPARTMENT_ID,
avg(salary) as avgx,
count(*)
from employees
group by DEPARTMENT_ID
having avgx > 70000;

ERROR 1463 (42000): Non-grouping field 'avgx' is used in HAVING clause

Təşəkkürlər ))

Oracle general functions in MySQL

Oktyabr 17, 2013 1 şərh

“General functions simplify working with columns that potentially contain null values.
These functions accept input parameters of all types”

Və bu siyahıya NVL, NVL2, NULLİF, COALESCE daxildir.

NVL
Funksiya məqsədi qısa olaraq:
The NVL function evaluates whether a column or expression of any data type is null
or not. If the term is null, an alternative not null value is returned; otherwise, the
initial term is returned.

Əyani olaraq test edək. commission_pct-də null qiymətlər var bu səbəblə count() az çıxardır:

select count(commission_pct) from employees;
>>> 35

Gördüyümüz kimi az çıxartdı çünki null-ları exclude etdi. Çıxış yolu kimi NVL istifadə edəcik:

select count(nvl(commission_pct,0)) from employees;
>>> 107

Burda NVL funksiyası commission_pct-də NULL gördüyü yerlərdə 0 atdı və count da öz növbəsində
düzgün hesabladı.
Daha aydın sadə bir misal:

select nvl(null,0) from dual;
>>> 0

MySQL-də NVL-i əvəzləyən funksiya IFNULL()-dur.
Bu məqsədlə nümunə cədvəlimizi yaradaq:

create table nulling(
id int not null auto_increment,
first_name varchar(25),
last_name varchar(25),
commission double(8,2),
primary key(id)
);

insert into nulling(first_name,last_name,commission) 
values('x','y',0.5),('x','y',0.5),
('x','y',0.5),('x','y',0.5),
('x','y',null),('x','y',null),('x','y',null),('x','y',null);

mysql> select * from nulling;
+----+------------+-----------+------------+
| id | first_name | last_name | commission |
+----+------------+-----------+------------+
|  1 | x          | y         |       0.50 |
|  2 | x          | y         |       0.50 |
|  3 | x          | y         |       0.50 |
|  4 | x          | y         |       0.50 |
|  5 | x          | y         |       NULL |
|  6 | x          | y         |       NULL |
|  7 | x          | y         |       NULL |
|  8 | x          | y         |       NULL |
+----+------------+-----------+------------+
8 rows in set (0.00 sec)

Test edək:

mysql> select count(commission) from nulling;
+-------------------+
| count(commission) |
+-------------------+
|                 4 |
+-------------------+
1 row in set (0.03 sec)

mysql> select count(ifnull(commission,0)) from nulling;
+-----------------------------+
| count(ifnull(commission,0)) |
+-----------------------------+
|                           8 |
+-----------------------------+
1 row in set (0.00 sec)

Yuxarıdakına bənzər sadə misal:

mysql> select ifnull(null,0) from dual;
+----------------+
| ifnull(null,0) |
+----------------+
|              0 |
+----------------+
1 row in set (0.00 sec)

Lakin Oracle-da NVL funksiyasının önəmli şərtlərindən biri NVL(original,
ifnull) şərtində The data types of the original and ifnull
parameters must always be compatible.
Yəni data tiplər uyğun olmalıdır.

select first_name, last_name, nvl(commission_pct,'Null qiymet') from employees;
>>> ORA-01722: invalid number
01722. 00000 -  "invalid number"

Lakin MySQL-də belə bir məhdudiyyət yoxdur:

mysql> select last_name, first_name, ifnull(commission,'Null qiymet') from nulling;
+-----------+------------+----------------------------------+
| last_name | first_name | ifnull(commission,'Null qiymet') |
+-----------+------------+----------------------------------+
| y         | x          | 0.50                             |
| y         | x          | 0.50                             |
| y         | x          | 0.50                             |
| y         | x          | 0.50                             |
| y         | x          | Null qiymet                      |
| y         | x          | Null qiymet                      |
| y         | x          | Null qiymet                      |
| y         | x          | Null qiymet                      |
+-----------+------------+----------------------------------+
8 rows in set (0.00 sec)

NVL2
It evaluates whether a column or expression of any data type is null or not.
If the first term is not null, the second parameter is returned, else the third parameter is
returned.

NVL-ə oxşar olan bu funksiya 3 parametr qəbul edir. Əgər 1-ci NULL deyilsə 2-ci parametr qaytarılır, əgər 1ci NULL-dursa 3-cü.

select nvl2(null,'NULL deyil','NULL-dur') from dual;
>>> NULL-dur

select nvl2(1,'NULL deyil','NULL-dur') from dual;
>>> NULL deyil

MySQL-də belə bir funksiya yoxdur onun əvəzinə İF() istifadə edəcik:

mysql> select if(null,'NULL deyil','NULL-dur') from dual;
+----------------------------------+
| if(null,'NULL deyil','NULL-dur') |
+----------------------------------+
| NULL-dur                         |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select if(1,'NULL deyil','NULL-dur') from dual;
+-------------------------------+
| if(1,'NULL deyil','NULL-dur') |
+-------------------------------+
| NULL deyil                    |
+-------------------------------+
1 row in set (0.00 sec)

NULLIF
Oracle və MySQL-də mövcuddur eyni funksionallığı yerinə yetirir:

-- Oracle
select nullif(1,1) from dual;
>>> NULL

select nullif(1,2) from dual;
>>> 1

-- MySQL

mysql> select nullif(1,1) from dual;
+-------------+
| nullif(1,1) |
+-------------+
|        NULL |
+-------------+
1 row in set (0.00 sec)

mysql> select nullif(1,2) from dual;
+-------------+
| nullif(1,2) |
+-------------+
|           1 |
+-------------+
1 row in set (0.00 sec)

COALESCE
Eyni adlı funksiya hər 2 RDBMS-də var və eyni işi görürlər.

-- Oracle

select coalesce(null,null,null) from dual;
>>> NULL

select coalesce(null,1,2) from dual;
>>> 1

select coalesce(3,1,2) from dual;
>>> 3

-- MySQL

mysql> select coalesce(null,null,null) from dual;
+--------------------------+
| coalesce(null,null,null) |
+--------------------------+
|                     NULL |
+--------------------------+
1 row in set (0.00 sec)

mysql> select coalesce(null,1,2) from dual;
+--------------------+
| coalesce(null,1,2) |
+--------------------+
|                  1 |
+--------------------+
1 row in set (0.00 sec)

mysql> select coalesce(3,1,2) from dual;
+-----------------+
| coalesce(3,1,2) |
+-----------------+
|               3 |
+-----------------+
1 row in set (0.00 sec)

Təşəkkürlər 😉

Installing Oracle 11g client on Fedora 19 and Ubuntu 12.04

Fedora üçün Göstərilən əməliyyatlar bütün Red Hat based sistemlər üçün, həmçinin Ubuntu üçün göstərilənlər də bütün Debian based sistemlər üçün geçərlidir.

Oracle client-in install-ı mənim 2 GB ram-lıq Netbook-umdan remote olaraq Oracle DB-yə qoşulmaq istəyimdəndir.

Bunun üçün ilk öncə Instant Client kitabxanalarını download edirik. Download linki:
Instant Client Downloads
* Fedora *

Aşağıdakı 3 paket lazımdır:

oracle-instantclient11.2-basic-11.2.0.4.0-1.i386.rpm
oracle-instantclient11.2-devel-11.2.0.4.0-1.i386.rpm
oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.i386.rpm

Daha sonra bu paketləri install edirik:

[root@sh-fedora Downloads]# rpm -ivh oracle-instantclient11.2-basic-11.2.0.4.0-1.i386.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:oracle-instantclient11.2-basic-11################################# [100%]
[root@sh-fedora Downloads]# rpm -ivh oracle-instantclient11.2-devel-11.2.0.4.0-1.i386.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:oracle-instantclient11.2-devel-11################################# [100%]
[root@sh-fedora Downloads]# rpm -ivh oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.i386.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:oracle-instantclient11.2-sqlplus-################################# [100%]

sqplus-i çağırdıqda aşağıdakı error-u görürük:

[root@sh-fedora ~]# sqlplus
sqlplus: error while loading shared libraries: libsqlplus.so: cannot open shared object file: No such file or directory

Həlli üçün oracle.conf faylı yaradırıq və onun daxilinə qeyd edirik:

-- 1
[root@sh-fedora ~]# nano /etc/ld.so.conf.d/oracle.conf

-- 2 yuxarıdakı fayla yazırıq
/usr/lib/oracle/11.2/client/lib

--3
[root@sh-fedora ~]# ldconfig

Daha sonra sqlplus-ı işlədirik:

[root@sh-fedora ~]# sqlplus

SQL*Plus: Release 11.2.0.4.0 Production on Thu Oct 17 02:17:10 2013

Copyright (c) 1982, 2013, Oracle.  All rights reserved.


* Ubuntu *

Debian based sistemlərdə sadəcə fərqlilik .rpm paketlərin .deb-ə çevirərək qurulmasındadır. Bunun üçün bizə alien paketi lazım olduğundan ilk öncə onu qurmalıyıq:

--1
apt-get install alien

-- 2
alien -i oracle-instantclient11.2-basic-11.2.0.4.0-1.i386.rpm

-- 3
alien -i oracle-instantclient11.2-devel-11.2.0.4.0-1.i386.rpm

--4
alien -i oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.i386.rpm

Təşəkkürlər 😉

Kateqoriyalar: Linux, Oracle