Проект

Общее

Профиль

SQL » История » Версия 1

Александр Александров, 22.04.2019 00:13

1 1 Александр Александров
h1. SQL
2
3
h2. Вопросы
4
5
# Что такое SQL?
6
# Какие есть типы JOIN'ов. Кратко опишите каждый из типов.
7
# Что такое LEFT JOIN, RIGHT JOIN? Чем они отличаются?
8
# Для чего используется слово HAVING?
9
# Что такое DDL?
10
# Что такое DML?
11
# Что такое TCL?
12
# Что такое DCL?
13
# Какой общий синтаксис команди SELECT?
14
# Про NULL в SQL.
15
# Если вы собираетесь соединить несколько таблиц в запросе (например, n таблиц), сколько условий соединения вам нужно использовать?
16
# Какое практическое применение временных таблиц?
17
# Как оператор GROUP BY обрабатывает значение NULL? Ли это общем трактовке таких значений?
18
# В чем разница между COUNT (*) и COUNT (столбец)?
19
# В чем разница между операторами DISTINCT и GROUP BY?
20
# Есть таблица table1 с колонками id и datetime написать запрос который вернет максимальное значение id и значение даты для этого id.
21
# Для чего нужны операторы UNION, INTERSECT, EXCEPT?
22
# Что лучше использовать соединение или подзапросы?
23
# Что делает функция EXISTS?
24
# Использование оператора PIVOT.
25
# Опишите разницу типов данных DATETIME и TIMESTAMP.
26
# Для каких числовых типов недопустимо использовать операцию сложения (вычитания), а значит и функцию SUM()?
27
# Что такое хранимые процедуры?
28
# Функции ранжирования что это и какие существует?
29
# Может ли значение в столбце(ах), на который наложено ограничение foreign key, равняться null?
30
# Назовите основные свойства транзакции.
31
# Как удалить повторяющиеся строки с использованием ключевого слова Distinct?
32
# Когда полное сканирование таблицы выгоднее доступа по индексу? Опишите вкратце общие принципы, как оптимизатор выбирает производить ли полное сканирование таблицы или доступ по индексу.
33
# Имеет ли смысл индексировать поля таблицы, имеющих тип boolean или подобные им - с небольшим количеством возможных значений?
34
# Что такое агрегатная функция? Приведите примеры агрегатных функций в SQL.
35
# Дайте определение третьей нормальной форме БД.
36
# Что такое денормализация БД? Для чего она нужна?
37
# Что такое триггер?
38
# Что такое курсоры в базах данных?
39
# Какие компромиссы предлагает использование индексов?
40
# Что делает SQL операция MERGE?
41
# В чем различие между выражениями HAVING и WHERE?
42
# Что такое целостность данных? Объясните, что такое ограничения.
43
# В чем отличие между кластерными индексами и некластерными?
44
# Какие отличия между ограничениями primary и unique?
45
46
h2. Ответы
47
48
h3. Что такое SQL?
49
50
SQL (structured query language - "язык структурированных запросов") - формальный непроцедурный язык программирования, применяемый для создания, модификации и управления данными в произвольной
51
реляционной базе данных, управляемой соответствующей системой управления базами данных (СУБД). SQL основывается на исчислении кортежей.
52
53
h3. Какие есть типы JOIN'ов. Кратко опишите каждый из типов.
54
55
*(INNER)JOIN* - внутреннее соединение. В результирующем наборе присутствуют только записи, значения связанных полей в которых совпадают.
56
*LEFT JOIN* - левое внешнее соединение. В результирующем наборе присутствуют все записи из Table1 и соответствующие им записи из Table2. Если соответствия нет, поля из Table2 будут пустыми.
57
*RIGHT JOIN* - правое внешнее соединение. В результирующем наборе присутствуют все записи из Table2 и соответствующие им записи из Table1. Если соответствия нет, поля из Table1 будут пустыми.
58
*FULL JOIN* - полное внешнее соединение. Комбинация двух предыдущих. В результирующем наборе присутствуют все записи из Table1 и соответствующие им записи из Table2. Если соответствия нет - поля из Table2 будут пустыми. Записи из Table2, которым не нашлось пары в Table1, тоже будут присутствовать в результирующем наборе. В этом случае поля из Table1 будут пустыми.
59
*CROSS JOIN* - Cartesian product. Результирующий набор содержит все варианты комбинации строк из Table1 и Table2. Условие соединения при этом не указывается.
60
61
h3. Что такое LEFT JOIN, RIGHT JOIN? Чем они отличаются?
62
63
Проиллюстрируем каждый тип примерами. Модель данных:
64
65
{{dmsf_image(251)}}
66
67
<pre>
68
SELECT Table1.Field1, Table2.Field2 FROM Table1 LEFT JOIN Table2 ON Table1.Key1 = Table2.Key2
69
</pre>
70
71
{{dmsf_image(252)}}
72
73
<pre>
74
SELECT Table1.Field1, Table2.Field2 FROM Table1 RIGHT JOIN Table2 ON Table1.Key1 = Table2.Key2
75
</pre>
76
77
{{dmsf_image(253)}}
78
79
LEFT JOIN - левое внешнее соединение. В результирующем наборе присутствуют все записи из Table1 и соответствующие им записи из Table2. Если соответствия нет, поля из Table2 будут пустыми.
80
RIGHT JOIN - правое внешнее соединение. В результирующем наборе присутствуют все записи из Table2 и соответствующие им записи из Table1.
81
82
Если соответствия нет, поля из Table1 будут пустыми.
83
84
h3. Для чего используется слово HAVING?
85
86
Секция HAVING определяет условие, которое затем применяется к групам строк. Следовательно, это предложение имеет тот же смысл для группы строк, что и предложение WHERE в отношении соодержимого соответствующей таблицы. Синтаксис предложения HAVING HAVING condition где condition содержит агрегатные функции или константы. Важно понимать, что секции HAVING и WHERE взаимно дополняют друг друга. Сначала с помощью ограничений WHERE формируется итоговая выборка, затем выполняется разбивка на группы по значениям полей, заданных в GROUP BY. Далее по каждой группе вычисляется групповая функция и в заключение накладывается условие HAVING.
87
88
Пример:
89
90
{{dmsf_image(254)}}
91
92
<pre>
93
SELECT DeptNum, MAX(SALARY) FROM Employees GROUP BY DeptNum HAVING MAX(SALARY) > 1000
94
</pre>
95
96
В приведенном примере в результат попадут только отделы, максимальная зарплата в которых превышает 1000.
97
98
h3. Что такое DDL?
99
100
DDL(Data Definition Language) - Команды определения структуры данных. В состав DDL-группы входят команды, позволяющие определять внутреннюю структуру базы данных. Перед тем, как сохранять данные в БД, необходимо создать в ней таблицы и, возможно, некоторые другие сопутствующие объекты
101
102
Пример некоторых DDL-команд:
103
104
{{dmsf_image(255)}}
105
106
h3. Что такое DML?
107
108
DML(Data Manipulation Language) - Команды манипулирования данными. DMLгруппа содержит команды, позволяющие вносить, изменять, удалять и извлекать данные из таблиц.
109
110
Примеры DML-команд:
111
112
{{dmsf_image(256)}}
113
114
h3. Что такое TCL?
115
116
TCL(Transaction Control Language) - TCL-команды используются для управления изменениями данных, производимыми DML-командами. С их помощью несколько DML-команд могут быть объединены в единое логическое целое, называемое транзакцией. При этом все команды на изменение данных в рамках одной транзакции либо завершаются успешно, либо все могут быть отменены в случае возникновения каких-либо проблем с выполнением любой из них.
117
118
TCL-команды:
119
120
{{dmsf_image(257)}}
121
122
h3. Что такое DCL?
123
124
DCL(Data Control Language) - Команды управления доступом. DCL-команды управляют доступом пользователей к БД и отдельным объектам:
125
126
{{dmsf_image(258)}}
127
128
h3. Какой общий синтаксис команди SELECT?
129
130
В общем виде синтаксис команды SELECT выглядит следующим образом:
131
132
{{dmsf_image(259)}}
133
134
В квадратных скобках указаны необязательные элементы команды. Ключевые слова SELECT и FROM должны присутствовать всегда.
135
136
h3. Про NULL в SQL.
137
138
Необходимо отметить, что язык SQL, в отличие от языков программирования, имеет встроенные средства поддержки факта отсутствия каких-либо данных. Осуществляется это с помощью NULL-концепции. NULL не является каким-то фиксированным значением, хранящимся в поле записи вместо реальных данных. Значение NULL не имеет определенного типа. NULL — это индикатор, говорящий пользователю (и SQL) о том, что данные в поле записи отсутствуют. Поэтому его нельзя использовать в операциях сравнения. Для проверки факта наличия-отсутствия данных в SQL введены специальные выражения.
139
140
h3. Если вы собираетесь соединить несколько таблиц в запросе (например, n таблиц), сколько условий соединения вам нужно использовать?
141
142
Тогда нужно использовать n-1 условий соединения чтоб исключить декартовой соединения, может быть и такое, что потребуется больше чем n-1 условий соединения, и совсем другие условия соединения для дальнейшего сокращения результирующего набора данных.
143
144
h3. Какое практическое применение временных таблиц?
145
146
Временная таблица - это объект базы данных, который хранится и управляется системой базы данных на временной основе. Они могут быть локальными или глобальными. используется для сохранения результатов
147
вызова хранимой процедуры, уменьшение числа строк при соединениях  агрегирование данных из различных источников или замена курсоров и параметризованных представлений.
148
149
h3. Как оператор GROUP BY обрабатывает значение NULL? Ли это общем трактовке таких значений?
150
151
При использовании GROUP BY все значения NULL считаются равными. Значение NULL - это специальное значение, которое можно присвоить ячейке таблицы. Это значение обычно применяется, когда информация в ячейке неизвестна или неприемлема.
152
153
h3. В чем разница между COUNT (*) и COUNT (столбец)?
154
155
форма COUNT (столбец) подсчитывает количество значений в "столбец". При подсчете количества значений столбца эта форма функции COUNT не принимает во внимание значение NULL. функция COUNT (*) подсчитывает количество строк в таблице, не игнорирует значение NULL, поскольку эта функция оперирует строками, а не столбцами.
156
157
h3. В чем разница между операторами DISTINCT и GROUP BY?
158
159
DISTINCT - указывает, что для вычислений используются только уникальные значения столбца. NULL считается как отдельное значение. Если нужно удалить только дубликаты лучше использовать DISTINCT. GROUP BY группирует выбранный набор строк для получения набора сводных строк по значениям одного или нескольких столбцов или выражений. GROUP BY создает отдельную группу для всех возможных значений (включая значение NULL). GROUP BY лучше использовать для определения групп выходных строк, к которым могут применяться агрегатные функции (COUNT, MIN, MAX, AVG и SUM).
160
161
h3. Есть таблица table1 с колонками id и datetime написать запрос который вернет максимальное значение id и значение даты для этого id.
162
163
Есть множество решений - самое простое - это получать max значение для id и потом вывести значения:
164
165
<pre><code class="sql">
166
SELECT id,datetime FROM table1 WHERE id = (SELECT max(id) FROM table1);
167
</code></pre>
168
169
или
170
171
<pre><code class="sql">
172
SELECT id,datetime FROM table1 WHERE id in (SELECT max(id) FROM table1);
173
</code></pre>
174
175
можно и так (mysql)
176
177
<pre><code class="sql">
178
SELECT id,datetime FROM table1 ORDER BY id DESC LIMIT 1;
179
</code></pre>
180
181
h3. Для чего нужны операторы UNION, INTERSECT, EXCEPT?
182
183
Оператор UNION - применяется для объединения результатов двух SQLзапросов в единую таблицу, состоящую из похожих срок. Оба запроса Должны возвращать одинаковое число столбцов и совместимые типы данных в соответствующих столбцах.
184
185
Оператор INTERSECT - используется для нахождения пересечения двух множеств. Результатом его выполнения будет множество строк, которые присутствуют в обоих множествах.
186
187
Оператор EXCEPT - используется для нахождения разности двух множеств. Результатом выполнения является множество строк из множества 1, которые отсутствуют в множестве 2.
188
189
Приоритет выполнения операторов над множествами:
190
191
<pre>
192
INTERSECT -> EXCEPT -> UNION
193
</pre>
194
195
h3. Что лучше использовать соединение или подзапросы?
196
197
Обычно лучше использовать JOIN, поскольку в большинстве случаев он понятен, и лучше оптимизируется с помощью Database Engine. но не всегда. Соединение имеет преимущество над подзапросов в случае, когда список выбора SELECT в запросе содержит столбцы более чем одной таблицы. Подзапросы лучшие тогда, когда нужно вычислять агрегатные значение и использовать их во внешних запросах для сравнений.
198
199
h3. Что делает функция EXISTS?
200
201
Аргументом функции EXISTS есть внутренний запрос. она возвращает истину, если запрос возвращает один или более строк, и возвращает ложь если запрос вернет ноль строк.
202
203
h3. Использование оператора PIVOT.
204
205
Реляционный оператор PIVOT можно использовать для изменения возвращающего табличное значение выражения в другой таблице. Оператор PIVOT разворачивает возвращающее табличное значение выражение, преобразуя уникальные значения одного столбца выражения в несколько выходных столбцов, а также, в случае необходимости, объединяет оставшиеся повторяющиеся значения столбца и отображает их в выходных данных.
206
207
h3. Опишите разницу типов данных DATETIME и TIMESTAMP.
208
209
*DATETIME* предназначен для хранения целого числа: YYYYMMDDHHMMSS. И это время не зависит от временной зоны настроенной на сервере.Хранит: 8 байт
210
211
*TIMESTAMP* хранит значение равное количеству секунд, прошедших с полуночи 1 января 1970 года по усреднённому времени Гринвича. При получении из базы отображается с учётом часового пояса. Хранит: 4 байта
212
213
h3. Для каких числовых типов недопустимо использовать операцию сложения (вычитания), а значит и функцию SUM()?
214
215
В качестве операндов операций сложения и вычитания допустимо любое корректное выражение любого типа данных числовой категории, кроме типа данных bit.
216
217
h3. Что такое хранимые процедуры?
218
219
Хранимая процедура - компилируемый набор SQL-инструкций, являющийся частью базы данных и хранимый на сервере. Есть много общего между ХП и обычными процедурами языков программирования: они могут иметь входные параметры и выходной результат, они могут как выполнять различные численные вычисления, так и выполнять стандартные операции с БД. Как и в процедурах других языков программирования, в них могут быть циклы и ветвления.
220
221
h3. Функции ранжирования что это и какие существует?
222
223
Ранжирующие функции возвращают ранжирующее значение для каждой строки в секции. В зависимости от используемой функции значения некоторых строк могут совпадать. Ранжирующие функции являются недетерминированными. Transact-SQL содержит следующие ранжирующие функции:
224
225
* RANK
226
* NTILE
227
* DENSE_RANK
228
* ROW_NUMBER
229
230
h3. Может ли значение в столбце(ах), на который наложено ограничение foreign key, равняться null?
231
232
Может, если на данный столбец не наложено ограничение not null, пример: при построении таблицы дерева файловой системы, где столбец foreign key - ссылка на эту же самую таблицу, на кортеж с информацией о родительской директории, тогда для корневой директории файловой системы в столбце родительской директории будет - null.
233
234
h3. Назовите основные свойства транзакции.
235
236
*ACID* - atomicity (атомарность), consistency (непротиворечивость), isolation (изолированность), durability (устойчивость).
237
238
* Свойство атомарности гарантирует неделимость набора операторов, которые изменяют данные в базе данных и являются частью транзакции. Это означает, что или выполняются все изменения данных в транзакции, или в случае любой ошибки все уже выполненные изменения отменяются.
239
* Согласованность гарантирует, что транзакция не даст возможности базе данных содержать несогласованные данные. Другими словами, трансформация данных в рамках одной транзакции переводит базу данных из одного согласованного состояния в другое согласованное состояние.
240
* Свойство изолированности разделяет все одновременно выполняющиеся транзакции. Другими словами, ни одна активная транзакция не может видеть изменения данных, выполненные в параллельной, но не завершенной транзакции. Это означает, что для обеспечения изолированности для некоторых транзакций может быть выполнен откат.
241
* Устойчивость - после своего завершения транзакция сохраняется в системе, которую ничто не может вернуть в исходное (до начала транзакции) состояние, т.е. происходит фиксация транзакции, означающая,
242
что ее действие постоянно даже при сбое системы.
243
244
h3. Как удалить повторяющиеся строки с использованием ключевого слова Distinct?
245
246
<pre>
247
SELECT DISTINCT columnsName FROM tableName;
248
</pre> 
249
250
где:
251
252
* columnsName - одно или несколько реальных имен столбцов,перечисленных через запятую;
253
* tableName - имя той таблицы, из которой выбираются эти столбцы.
254
255
Если в предложение SELECT DISTINCT включить более одного столбца, то в результате уникальность любой строки будет определяться уникальностью соответствующей комбинации всех значений столбцов, включенных в предложение, на этой самой строке среди аналогичных комбинаций, соответствующих другим строкам.
256
257
Несмотря на то что значения null никогда не бывают равны друг другу (поскольку считаются неизвестными), предложение DISTINCT , напротив, считает их дубликатами. Поэтому команда SELECT DISTINCT вернет только одно значение null, независимо от того, сколько значений null она встретит.
258
259
h3. Когда полное сканирование таблицы выгоднее доступа по индексу? Опишите вкратце общие принципы, как оптимизатор выбирает производить ли полное сканирование таблицы или доступ по индексу.
260
261
Полное сканирование производится многоблочным чтением. Сканирование по индексу - одноблочным. Также, при доступе по индексу сначала идет сканирование самого индекса, а затем чтение блоков из таблицы. Число блоков, которые надо при этом прочитать из таблицы зависит от фактора кластеризации. Если суммарная стоимость всех необходимых одноблочных чтений больше стоимости полного сканирования многоблочным чтением, то полное сканирование выгоднее и оно выбирается оптимизатором. Таким образом, полное сканирование выбирается при слабой селективности предикатов зароса и/или слабой кластеризации данных, либо в случае очень маленьких таблиц.
262
263
h3. Имеет ли смысл индексировать поля таблицы, имеющих тип boolean или подобные им - с небольшим количеством возможных значений?
264
265
Индекс по логическим полям имеет смысл, только в случае, если значения ИСТИНА и ЛОЖЬ распределены примерно равномерно по таблице. Предельный случай - две трети и одна треть.
266
267
h3. Что такое агрегатная функция? Приведите примеры агрегатных функций в SQL.
268
269
Агрегатная функция - это функция, которая возвращает одиночное значение на основании множества записей.
270
271
Вот список некоторых агрегатных функций SQL:
272
273
* COUNT(*) - Возвращает количество строк источника записей
274
* COUNT - Возвращает количество значений в указанном столбце
275
* SUM - Возвращает сумму значений в указанном столбце
276
* AVG - Возвращает среднее значение в указанном столбце
277
* MIN - Возвращает минимальное значение в указанном столбце
278
* MAX - Возвращает максимальное значение в указанном столбце
279
280
h3. Дайте определение третьей нормальной форме БД.
281
282
Определение третьей нормальной форме БД.
283
284
* Любое поле любой записи хранит только одно значение. (1NF) Например, если в поле хранится список идентификаторов, разделённых запятыми, то это нарушение данного определения.
285
* Выполняется условие 1NF и любое неключевое поле полностью зависит от ключа. (2NF) Например, у нас есть запись с полями (Идентификатор, Название CD-Диска, Название группы), где ключом является поле «Идентификатор». При этом, очевидно, что поле «Название группы» зависит не только от «Идентификатора» но и от поля «Название CDДиска». Поэтому такая БД не находится во второй нормальной форме.
286
* Выполняется условие 2NF и нет неключевых полей зависящих от значения других неключевых полей. Например у нас в записи хранятся код региона и его название. Понятно, что название региона зависит от кода, и наоборот, поэтому такая БД не будет находиться в третьей нормальной форме.
287
288
h3. Что такое денормализация БД? Для чего она нужна?
289
290
Денормализация - это процесс осознанного приведения базы данных к виду, в котором она не будет соответствовать правилам нормализации. Обычно это необходимо для повышения производительности и скорости извлечения данных, за счет увеличения избыточности данных. Если приложению необходимо часто выполнять выборки, которые занимают слишком много времени (например, объединение данных из множества таблиц), то следует рассмотреть возможность проведения денормализации Возможное решение следующее: вынести результаты выборки в отдельную таблицу. Это позволит увеличить скорость выполнения запросов, но также означает появление необходимости в постоянном обслуживании этой новой таблицы. Прежде чем приступать к денормализации, необходимо убедится, что ожидаемые результаты оправдывают издержки, с которыми придется столкнуться.
291
292
h3. Что такое триггер?
293
294
Триггер - это SQL процедура, которая срабатывает при каком-нибудь событии (INSERT, DELETE или UPDATE). Триггеры хранятся и управляются СУБД. Триггеры используются для поддержания ссылочной целостности данных в одинаковый манер реагируя на события изменения этих данных. Триггер не может быть вызван или выполнен вручную, СУБД автоматически вызывает его после модификации данных в соответствующей таблице. В этом и есть его отличие от хранимых процедур, которые нужно выполнять вручную вызовом CALL. Также триггер может вызывать другие процедуры. Триггер также может содержать вызовы INSERT, DELETE и UPDATE внутри себя, таким образом вызывая другой триггер. Такие триггеры называются вложенными (nested).
295
296
h3. Что такое курсоры в базах данных?
297
298
Курсор - это объект базы данных, который позволяет приложениям работать с записями "по-одной", а не сразу с множеством, как это делается в обычных
299
SQL командах.
300
301
Порядок работы с курсором такой:
302
303
* Определить курсор (DECLARE)
304
* Открыть курсор (OPEN)
305
* Получить запись из курсора (FETCH)
306
* Обработать запись
307
* Закрыть курсор (CLOSE)
308
309
h3. Какие компромиссы предлагает использование индексов?
310
311
Некоторые из них:
312
313
* Более быстрые выборки, но более медленные изменения. (При изменениях тратиться время на перестройку индекса). 
314
* Для хранения индексов необходимо дополнительное дисковое пространство.
315
316
h3. Что делает SQL операция MERGE?
317
318
Операция MERGE официально появилась в стандарте ANSI SQL:2008. Она позволяет одновременно вставлять или изменять записи таблицы согласно критерию. При выполнении критерия строки изменяются, иначе - вставляются. Ее можно заменить последовательным вызовом INSERT и UPDATE. В некоторых базах данных похожая операция называется UPSERT.
319
320
h3. В чем различие между выражениями HAVING и WHERE?
321
322
*WHERE* - это ограничивающее выражение. Оно выполняется до того, как будет получен результат операции.
323
*HAVING* - фильтрующее выражение. Оно применяется к результату операции и выполняется уже после того как этот результат будет получен, в отличии от where.
324
325
Выражения WHERE используются вместе с операциями SELECT, UPDATE, DELETE, в то время как HAVING только с SELECT и предложением GROUP BY. Например, WHERE нельзя использовать таким образом:
326
327
<pre><code class="sql">
328
SELECT name, SUM(salary) FROM Employees WHERE SUM(salary) > 1000 GROUP BY name;
329
</code></pre>
330
331
В данном случае больше подходит HAVING:
332
333
<pre><code class="sql">
334
SELECT name, SUM(salary) FROM Employees GROUP BY name HAVING (salary) > 1000;
335
</code></pre>
336
337
То есть, использовать WHERE в запросах с агрегатными функциями нельзя, для этого и был введен HAVING.
338
339
h3. Что такое целостность данных? Объясните, что такое ограничения.
340
341
Целостность данных - важное свойство SQL. При правильном использовании оно обеспечивает корректность и валидность хранимых данных в любой момент времени. Также, с их помощью можно обнаруживать ошибки в приложениях, которые тяжело найти другими способами. Целостность данных поддерживается с помощью ограничений. В SQL стандарта ANSI есть 4 основных ограничения: PRIMARY KEY, CHECK, UNIQUE и FOREIGN KEY. Они не являются обязательными для таблицы.
342
343
* PRIMARY KEY - набор полей (1 или более), значения которых образуют уникальную комбинацию и используются для однозначной идентификации записи в таблице. Для таблицы может быть создано только одно такое ограничение. Данное ограничение используется для обеспечения целостности сущности, которая описана таблицей.
344
* CHECK используется для ограничения множества значений, которые могут быть помещены в данный столбец. Это ограничение используется для обеспечения целостности предметной области, которую описывают таблицы в базе.
345
* Ограничение UNIQUE обеспечивает отсутствие дубликатов в столбце или наборе столбцов. Разница между PRIMARY KEY и UNIQUE описана в primary и unique ключи
346
* Ограничение FOREIGN KEY защищает от действий, которые могут нарушить связи между таблицами. FOREIGN KEY в одной таблице указывает на PRIMARY KEY в другой. Поэтому данное ограничение нацелено на то, чтобы не было записей FOREIGN KEY, которым не отвечают записи PRIMARY KEY. Таким образом, FOREIGN KEY поддерживает ссылочную целостность данных.
347
348
h3. В чем отличие между кластерными индексами и некластерными?
349
350
Некластерные индексы создаются СУБД по умолчанию. Данные физически расположены в произвольном порядке, но логически упорядочены согласно индексу. Такой тип индексов подходит для таблиц, где часто изменяются значения.
351
352
При кластерном индексировании данные физически упорядочены, что серьезно повышает скорость выборок данных (но только в случае последовательного доступа к данным). Для одной таблицы может быть создан только один кластерный индекс
353
354
h3. Какие отличия между ограничениями primary и unique?
355
356
Ограничения primary и unique призваны обеспечить уникальность значений столбца, на котором они определены. Но по умолчанию ограничение primary создает кластерный индекс на столбце, а unique - некластерный. Другим отличием является то, что primary не разрешает NULL записей, в то время как unique разрешает только одну NULL запись.
Go to top