11. • любую версию базы данных можно обновить до любой (обычно,
самой последней) версии;
• набор SQL-запросов, реализующих миграцию между любыми двумя
версиями, можно было получить как можно быстрее и проще;
• всегда можно создать с нуля базу данных со структурой самой
последней версии
• в случае работы над разными ветками, при последующем их слиянии
ручное редактирование файлов БД было сведено к минимуму;
• откатить БД на более раннюю версию так же просто, как и обновить на
более новую
13. • Быстрое и удобное выполнение миграции до последней версии;
• Механизм нумерации версий. Номер текущей версии хранится прямо в
БД;
• Для максимального удобства нужны средства автоматизации
выполнения миграций;
• Неудобно добавлять комментарии к структуре БД.;
• Возникают проблемы в процессе параллельной разработки в
нескольких ветках репозитория.
14. •Database
|- 3.01
| |- Baseline.sql
| | - Changes.sql
|
| - 3.02
|- Baseline.sql
|- Changes.sql
IF NOT EXISTS
(
SELECT *
FROM information_schema.tables
WHERE table_name = 'myTable'
AND table_schema = 'myDb'
)
THEN
CREATE TABLE myTable
(
id INT(10) NOT NULL,
myField VARCHAR(255) NULL,
PRIMARY KEY(id)
);
END IF;
15. • Очень удобное выполнение миграций с любой промежуточной версии
до последней — нужно всего лишь выполнить на базе данных один
файл (Changes.sql);
• Потенциально возможны ситуации, в которых будут теряться данные,
за этим придется следить.
• Для того, чтобы изменения были идемпотентными, нужно потратить
больше времени (и кода) на их написание.
16. Удобно наблюдать изменения в структуре между версиями при помощи
средств системы контроля версий;
Как и любой исходный код, структуру БД удобно комментировать;
Для того, чтобы с нуля создать чистую базу данных последней версии,
нужно выполнить всего лишь один файл;
Скрипты-миграции более надежны, чем в других методах, так как
генерируются автоматически;
Мигрировать с новых версий на старые почти так же просто, как со старых
на новые (проблемы могут возникнуть только с пресловутыми изменениями
данных);
В случае слияния двух веток репозитория, merge структуры БД
осуществляется проще, чем при использовании других подходов;
17. Изменения данных придется хранить отдельно, и затем вручную
вставлять в сгенерированные скрипты-миграции;
Вручную выполнять миграции очень неудобно, необходимы
автоматизированные средства.
18. 1. Есть ли у вас разрешение на выполнение
выражения?
2. Есть ли у вас разрешения на доступ к необходимым
данным?
3. Правилен ли синтаксис выражения?
4. Оптимизация
5. План выполнения
6. Результирующий набор
19. charac
A
B
C
D
E
mysql> select * from charac procedure analyse()G
************************ 1. row ************************
Field_name: world.charac.charac
Min_value: A
Max_value: E
Min_length: 1
Max_length: 1
Empties_or_zeros: 0
Nulls: 0
Avg_value_or_avg_length: 1.0000
Optimal_fieldtype: ENUM('A','B','C','D','E') NOT NULL
22. 1. =
2. !=, <>
3. >, <, >=, <=
4. BETWEEN
5. IN
6. LIKE (_, %)
1. OR
2. AND
3. NOT
23. SELECT DISTINCT v.fname, v.lname, i.year, i.location, i.report_file
FROM Incident AS i
LEFT JOIN V(ictim?)... -- presumably v.incident_id = i.id
LEFT JOIN Keyword AS k ON k.incident_id = i.id
WHERE i.year BETWEEN 1947 AND 1966
AND i.type = 'HOMICIDE'
AND v.sex = 'F'
AND i.status = 'UNSOLVED'
AND ...
OR v.fname IN ('Mari', 'Magda')
OR SUBSTR ...
AND (k.keyword IN ('rape', 'decapitation', 'dismemberment',
'fire', 'altar', 'priest', 'prostitute')
...
AND SUBSTR(v.fname, 1, 1) = 'R' AND SUBSTR(v.lname, 1, 1) =
'L');
24. fname lname year location report_file
Anna Wedin 1956Mark FULL POLICE REPORT NOT DIGITIZED
Linda Janson 1955Mariestad FULL POLICE REPORT NOT DIGITIZED
Simone Grau 1958Goteborg FULL POLICE REPORT NOT DIGITIZED
Lea Persson 1962Uddevalla FULL POLICE REPORT NOT DIGITIZED
Kajsa Severin 1962Dals-Ed FULL POLICE REPORT NOT DIGITIZED
25. CASE case_value
WHEN when_value
THEN statement_list
[WHEN when_value
THEN statement_list] ...
[ELSE statement_list]
END CASE
Or:
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE
IF (EXP1, EXP2, EXP3)
26. 1. Группировка по одному столбцу
2. Группировка по нескольким столбцам
3. Группировка по средствам выражений
4. WITH ROLLUP
27. Name Description
AVG() Return the average value of the argument
BIT_AND() Return bitwise and
BIT_OR() Return bitwise or
BIT_XOR() Return bitwise xor
COUNT(DISTINCT) Return the count of a number of different values
COUNT() Return a count of the number of rows returned
GROUP_CONCAT() Return a concatenated string
MAX() Return the maximum value
MIN() Return the minimum value
STD() Return the population standard deviation
STDDEV() Return the population standard deviation
SUM() Return the sum
VARIANCE() Return the population standard variance
32. INSERT INTO tbl_temp2 (fld_id)
SELECT
tbl_temp1.fld_order_id
FROM
tbl_temp1
WHERE
tbl_temp1.fld_order_id > 100;
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
33. UPDATE [LOW_PRIORITY] [IGNORE] table_reference
SET col_name1={expr1|DEFAULT} [,
col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
UPDATE [LOW_PRIORITY] [IGNORE] table_references
SET col_name1={expr1|DEFAULT} [,
col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
34. DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
tbl_name[.*] [, tbl_name[.*]] ...
FROM table_references
[WHERE where_condition]
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
FROM tbl_name[.*] [, tbl_name[.*]] ...
USING table_references
[WHERE where_condition]
35. DELETE
t1, t2
FROM
t1 INNER JOIN t2
INNER JOIN t3
WHERE
t1.id=t2.id AND t2.id=t3.id;
DELETE FROM
t1, t2
USING
t1 INNER JOIN t2
INNER JOIN t3
WHERE
t1.id=t2.id AND t2.id=t3.id;