Skip to content

Instantly share code, notes, and snippets.

@kirilkirkov
Last active March 23, 2016 09:44
Show Gist options
  • Save kirilkirkov/3c105b8bf0df6aeaffb8 to your computer and use it in GitHub Desktop.
Save kirilkirkov/3c105b8bf0df6aeaffb8 to your computer and use it in GitHub Desktop.
SQL. Индекси. Агрегатни функций . Други лесни команди
1. Релационна база от данни
Това е БД, която организира структурите данни в отделни двуизмерни таблици, които имат взаимовръзка (релация) между тях. Двуизмерна таблица означава, че даните са групирани в редове и колони: всяка колона репрезентира атрибут или свойство на запазеният обект, а всеки ред е отделен обект или инстанция на данните (запис, туплет). Релацията се дефинира като данни, които имат еднакви атрибути. Има множество различни имплементации на РБД като MySQL, PostgreSQL, OracleDB, Microsoft SQL Server и др. като се вижда, че обединяващ фактор във всички е наличието на съкращението SQL.
2. Агрегатни функций
Предназначение
Те позволяват да се пресмятат обобщения за множества от кортежи
COUNT(*) - връща броя на кортежите; COUNT(attribute) : връща броя на стойностите на атрибута (без NULL стойностите).
SUM(attribut) - връща сумата на стойностите на атрибута.
AVG(attribut) - връща средната стойност на стойностите на атрибута.
MIN(attribut), MAX(attribut) - връщат минималната и максималната на стойност на атрибута
VARIANCE(attribut) - връща вариацията на стойностите на атрибута.(VAR en ACCESS)
Често се използват в комбинация с GROUP BY .
Пример:
Връща най-голямата стойност на избраната колона от редовете
SELECT MAX(column_name) FROM table_name
3. Какво е индекс ?
Индексите са обекти в базата данни, които ни осигуряват бърз достъп до редовете на базова таблица, чрез физическото представяне (адреси в паметта) на данните. Индексите се създават върху колони на таблиците.
Присъствието или отсъствието на индекс няма ефект върху крайния резултат на заявките. Единствената разлика е в евентуалното повишено бързодействие (при по-големи таблици може разликата да е огромна). Важно е обаче да създаваме индексите правилно, защото от това зависи дали системата ще ги използва или не.
Употреба
Индексите се слагат на колони които често участват в WHERE клаузата за да се постигне по бързо намиране на резултатите при SELECT или за полета които трябва да са уникални
MySQL индекси:
PRIMARY KEY - Колоната на която е сложен трябва да има уникални стойности, не може да са null, всяка таблица може да има само 1 такъв ключ
UNIQUE - Работи като primary key, но може да се слага на повече от 1 колона
INDEX - Обикновен индекс който структорира данните за по бързо търсене в тях, дублирани записи са позволени
FULLTEXT - Те са създадени да се слагат на полета от тип (char, varchar или text) за по бързо търсене на текст. Използва се в MyISAM, от версия MySQL 5.6.4 и на горе се поддържа и в InnoDB Engine-а. Wildcard търсене не се поддържа за полета с този индекс
Индексите може да намалят скоростта при Insert, Delete, Update защото след променяне по таблицата се налага преструкториране на индекса и !
4. Видове заявки
SELECT & WHERE
Командата SELECT се използва да се извлича информация от MySQL база данни.
Синтаксис
SELECT field1, field2,...fieldN table_name1, table_name2...
[WHERE Clause]
[OFFSET M ][LIMIT N]
могат да се извличат няколко данни с една заявка
със звезда * се означава когато искаме да извлечем всички полета
В много случаи SELECT се използва заедно с WHERE клаузата. WHERE изпълнява ролята на условие, което трябва да се изпълни и SELECT да върне само този резултат/резултати.
Синтаксис
SELECT field1, field2,...fieldN table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....
С WHERE клаузата могат да бъдат използвани следните оператори →=, !=, >, <, >=, <=
INSERT
INSERT добавя нов запис в базата от данни.
Синтаксис
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
Важно
Добра практика е преди да се променя или трие запис от база данни, да се използва SELECT клаузата за да сме сигурни, че ще работим над правилната информация
UPDATE
UPDATE променя запис в база от данни
Синтаксис
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
DELETE
С DELETE можем да изтрием запис от база данни
Синтаксис
DELETE FROM table_name [WHERE Clause]
JOIN
С JOIN можем да съединим колони от две или повече таблици като взимаме резултите там където условието от колоните се изпълни (table1.id=table2.CustomerID).
Синтаксис
SELECT table1.id, table1.name, table2.country FROM table1 INNER JOIN table2 ON table1.id=table2.CustomerID
LEFT JOIN
LEFT JOIN връща всички редове от лявата таблица с всички съвпадения от дясната таблица. Ако няма съвпадение ще върне NULL за полетата от дясната.
Синтаксис
SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name=table2.column_name
RIGHT JOIN
RIGHT JOIN е същото като LEFT JOIN ,но взима резултатите първо от дясната таблица.
FULL JOIN
FULL JOIN връща резултатите от двете таблици като дава NULL там където няма съвпадения
Синтаксис
SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name=table2.column_name
UNION
С UNION връщаме резултатите от две или повече таблици едновременно като условието е двете таблици да имат еднакъв брой колони също така типът на колоните да е еднакъв
Синтаксис
SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2
Използване на WHERE
Синтаксис
WHERE column_name operator value
Използване на ORDER BY
Синтаксис
ORDER BY column_name ASC
ASC / DESC - в зависимост от сортирането което искаме.
5. Storage Engine-и
Storage Engine е основния компонент, който системите за управление на бази данни (СУБД) използват, за да създават, четат, актуализират и изтриват данни от база данни. Когато използвате Storage Engine можете да изберете той да се използва за целия сървър, за отделна база данни или за определена таблица. По подразбиране MySQL има Storage Engines за съхранение на данни, които са предварително конфигурирани и се поддържат от MySQL сървъра.
MySQL има голям брой енджини, които предлагат различни видове свойства. Най-използваните са MyISAM и InnoDB. Основната разлика между тях е, че InnoDB поддържа Транзакции. Други енджини и техните разлики:
InnoDB може да се възстанови по-бързо при срив като за целта използва логовете си. MyISAM трябва изцяло да обнови данните си, не предлага компресия както MyISAM, така че може да се наложи повече кеширане в RAM паметта и върху твърдия диск
MyISAM използва операционната система за кеширането на четенето и писането от базата данни, докато InnoDB има интегрирана тази функционалност
Memory - При Memory Storage Engine-a (или както е познат като Heap Engine) основната разлика от другите два е, че запазва данните в RAM паметта. Това осигурява голямо бързодействие, но крие и риска, че при рестарт на MySQL-а при предвидени или непредвидени обстоятелства :), се губи информация. Подходящ е да се използва при собствени кеширащи алгоритми, като в Memory Storage Engine-a да се пазят временни таблици с кеширани данни, които при загубата, могат да се възстановят от реалните. Този начин на кеширане, обаче, е сравнително слабо разпространен и при такива ситуации обикновено се използва memcache.
@kirilkirkov
Copy link
Author

Видове SQL Join-ове:
joins

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment