Категория ‘DB’

* Заключване на данните при транзакция

Публикувано на 18 април 2009 от Филип Петров. Записано в DB.


Синхронизацията на данните е изключително важна. За да демонстрираме това нека покажем първо един пример. Нека проверим първо колко пари има в акаунт с id = 1:

mysql> USE banks;
Database changed

mysql> SELECT amount FROM accounts
WHERE id = 1;
+--------+
| amount |
+--------+
| 306.38 |
+--------+
1 row in set (0.00 sec)

Сега нека напишем заявка UPDATE, с която искаме да изтеглим 500 лева, но така, че ако искаме да няма такава наличност, то заявката да не се изпълни: Прочети още…

.



* Транзакции

Публикувано на 18 април 2009 от Филип Петров. Записано в DB.


Транзакция наричаме последователност от SQL заявки, която трябва да изпълняват условието или всичките да бъдат изпълнени или нито една от тях да не бъде изпълнена. Може да дадем класически пример с банковите транзакции. Например ако искаме да прехвърлим 50 лева от акаунт 1 в акаунт 2, то трябва да изпълним следните две заявки: Прочети още…

.



* Настройки на MySQL server

Публикувано на 08 април 2009 от Филип Петров. Записано в DB.


MySQL сървърите са изключително лесни за настройка – повечето от опциите се контролират от един текстов файл. Под Linux/BSD той е /etc/my.cnf, а под Windows файлът се казва my.ini и се намира в инсталационната директория на MySQL.

По настройките има някои съществени разлики между Linux-базираните платформи и Windows варианта. Понеже MySQL се използва по-често под Linux и FreeBSD, то ще разгледаме предимно настройки за тези платформи. Някои от тях може би не са валидни под Windows.

В MySQL има изключително много променливи за настройка. Някои от тях обаче са изключително важни за общото бързодействие на системата. За да видите списък на променливите и техните стойности използвайте следната команда: Прочети още…

.



* Индекси

Публикувано на 08 април 2009 от Филип Петров. Записано в DB.


Индексите са обекти в базата данни, които ни осигуряват бърз достъп до редовете на базова таблица, чрез физическото представяне (адреси в паметта) на данните. Индексите се създават върху колони на таблиците.

Присъствието или отсъствието на индекс няма ефект върху крайния резултат на заявките. Единствената разлика е в евентуалното повишено бързодействие (при по-големи таблици може разликата да е огромна). Важно е обаче да създаваме индексите правилно, защото от това зависи дали системата ще ги използва или не.

За да демонстрираме повишеното бързодействие сме изпълнили една проста заявка на доста бавен компютър.: Прочети още…

.



* Виртуални таблици (view)

Публикувано на 07 април 2009 от Филип Петров. Записано в DB.


Виртуалните таблици са още познати с директния си превод от английски език като „изгледи“. На практика виртуалната таблица е съхранен SQL SELECT оператор, който си има собствено име в базата данни. Използва се когато често използваме едни и същи SELECT заявки.

Виртуалните таблици имат и редица други предимства:
- Различните потребители в системата могат да виждат едни и същи данни по различен начин;
- Удобни са за ограничаване се достъпа на потребителите до базовата таблица и така те могат да достъпват само данните, които извежда виртуалната таблица.

Виртуална таблица се създава чрез операторът CREATE VIEW: Прочети още…

.



* Заявки Delete

Публикувано на 06 април 2009 от Филип Петров. Записано в DB.


Подобно на INSERT, заявките от тип DELETE са с изключително прост синтаксис:

DELETE FROM <таблица>
WHERE <условие>;

Нека демонстрираме един пример с базата данни „banks“. Нека видим първо списък на акаунтите: Прочети още…

.



* Заявки Update

Публикувано на 30 март 2009 от Филип Петров. Записано в DB.


Заявките от тип UPDATE се използват за обновяване на данни. Базовият синтаксис е:

UPDATE <име на таблица>
SET <правило за обновяване>
WHERE <условие>;

От примера с базата данни „banks“ можем да направим следните задачи: Прочети още…

.



* Псевдоними на колони и таблици

Публикувано на 19 март 2009 от Филип Петров. Записано в DB.


Псевдонимите на колони ни улесняват да пишем по-ясни записи на заявките. Нeка разгледаме пример от предишната статия:

Задача: Изведете името на банката и средната сума на акаунтите в нея, но само за банките, които имат буквата “M” някъде в името на банковия клон:

mysql> SELECT banks.name, AVG(amount)
FROM banks LEFT JOIN accounts
	ON accounts.customer_id IN(
		SELECT id FROM customers WHERE branch_id IN(
			SELECT id FROM branches WHERE bank_code = banks.code
		)
	)
WHERE banks.code IN(
	SELECT bank_code
	FROM branches
	WHERE name LIKE '%M%'
)
GROUP BY banks.name;
+-----------------+-------------+
| name            | AVG(amount) |
+-----------------+-------------+
| Societe General | 2821.020000 |
| Wells Fargo     | 2775.247500 |
+-----------------+-------------+
2 rows in set (0.00 sec)

Виждате, че резултатът е таблица с две колони. Имената им са съответно „name“ и „AVG(amount)“. Въпреки, че от гледна точка на програмиста това е напълно достатъчно, то не е лошо да ги наименоваме с по-описателни имена. Например: Прочети още…

.



* Клауза HAVING

Публикувано на 17 март 2009 от Филип Петров. Записано в DB.


Понякога се налага да филтрираме данните след като вече сме направили дадена калкулация. Фразата HAVING се използва за прилагане на условия върху групи (обикновено оформени чрез GROUP BY).

Ще демонстрираме това с пример. Вече знаем как можем да изкараме списък на клиентите и средните суми на техните сметки: Прочети още…

.



* Групиране на данни

Публикувано на 17 март 2009 от Филип Петров. Записано в DB.


Когато имаме повтарящи се данни в дадена колона, то можем да ги „групираме“. За целта се използва фразата „GROUP BY“. Почти винаги този оператор се използва в комбинация с агрегатни функции. Следващите примери ще използват базата данни за банки от миналата статия.

1. Да се изведе сумата на акаунти от тип 1 и сумата на акаунти от тип 2: Прочети още…

.