[БЕЗ_ЗВУКА] Всем привет. В этом видео мы изучим теоретические основы создания баз данных и таблиц в них с помощью языка SQL, а также разберем синтаксис. Мы не будем вдаваться во все подробности создания таблиц, потому что нюансов очень много. Более подробно можно будет посмотреть в документации, она, в общем, не такая уж и сложная. Начнем с сознания и удаления баз данных. Проще всего удалить базу данных. Для этого достаточно написать DROP DATABASE и имя базы данных. Если такая база данных есть — она удалится, если такой базы данных нет — мы получим ошибку. Но если дописать DROP DATABASE [IF EXISTS] и имя базы данных db_name, то в случае отсутствия ее — ошибки не будет. То есть [IF EXISTS] просто предотвращает ошибку, если мы пытаемся удалить несуществующую базу данных. Создать базу данных можно с помощью CREATE DATABASE и имя базы данных db_name. Также можно указать дополнительные опции при создании базы данных — это кодировка по умолчанию, обычно это UTF-8 или UTF-8MB4, и способ сравнения строковых данных. Как правило, это UTF-8 или UTF-8MB general CI, то есть сравнение без учета регистра. CI — это case insensitive. Эти будут значения установлены по умолчанию. Но вы можете выбрать другие кодировки, например CP-1251 и другие способы сравнения, например, с учетом регистра. Точно так же, если написать CREATE TAPE DATABASE [IF NOT EXISTS], то при попытке выполнить этот оператор с именем уже существующей базы данных, ошибки не будет. Если этого не написать — то будет. Перейдем к созданию таблиц внутри базы данных. Для этого используется оператор CREATE TABLE. Существует несколько видов создания таблиц, несколько способов использования CREATE TABLE, мы рассмотрим два из них: CREATE TABLE, имя таблицы tbl_name, (create_definition,...) [table_options] [partition_options]. Это создание таблицы как бы с нуля, но с перечислением всех ее настроек, а также существует CREATE TABLE, имя таблицы tbl_name, LIKE old_tbl_name, когда он, по сути просто копирует структуру одной таблицы, под новым именем создавая другую таблицу на основе первой. При этом, правда, теряются некоторые ограничения. То есть переносятся названия колонок, переносятся индексы, но теряются связи с другими таблицами. Это надо помнить. Давайте разберем все-таки более сложный вариант. CREATE TABLE, также можно указать CREATE [TEMPORARY] TABLE, и будет создана временная таблица. Временная таблица отличается от обычной тем, что она создается как бы внутри сессии, из других сессий ее не видно, а при завершении сессии она удаляется вместе со всеми данными. Так вот, если написать CREATE TABLE имя таблицы tbl_name, дальше мы можем включить (create_definiton,...) — это названия колонок, индексов и так далее, после чего мы можем указать [table_options], там можно указывать, например, движок таблицы, способы как раз кодировок по умолчанию и так далее. И [partition_options] мы не будем рассматривать, это разбиение таблиц на партиции, это нужно только для уже каких-то больших таблиц, очень больших. Когда вы до этого доберетесь, я думаю, что вы уже будете хорошо знать MySQL, и эти знания вы уже сможете почерпнуть в документации. Давайте рассмотрим, что же такое (create_definition,...), который идет у нас после имени таблицы. create_definition — это либо перечисление колонок, либо перечисление индексов или ключей, либо перечисление ограничений. Все это может находиться друг за другом в произвольном порядке. Давайте посмотрим, что такое column_definition, определение колонки. Определение колонки состоит из, по сути, типа данных, то есть перечисляя колонки таблицы, вы перечисляете их имена и column_definition, то есть описание колонки. Так вот, описание колонки состоит из описания типа данных этой колонки, может ли оно содержать пустые значения, или не может (NULL или NOT NULL), значение по умолчанию, которое присвоится этому полю, если вставляя новый ряд, вы не укажете значения для конкретно этой колонки, также является ли эта колонка автоинкрементной, то есть увеличивает ли она автоматически свое значение, если не передать конкретное, является ли она уникальной, является ли она первичным ключом, также можно добавить комментарий для колонки, что полезно для последующих, когда вы будете читать свою базу данных, смотреть в дальнейшем, поможет вам вспомнить, что же это за колонка. Также может содержать [reference_definition], его мы разберем позже. Давайте посмотрим, какие типы данных у колонок бывают. Бывают, во-первых, числовые типы данных, прежде всего это целочисленные данные TINYINT, SMALLINT, MEDIUMINT, INT и BIGINT. Соответственно 1 байт, 2 байта, 3 байта, 4 байта или 8 байт. Также они бывают SIGNED и UNSIGNED, то есть знаковые и беззнаковые. Существует также тип данных с фиксированной точкой — это DECIMAL, или NUMERIC, он используется, как правило, в операциях с валютами. Также существуют типы данных с плавающей точкой — это FLOAT и DOUBLE, соответственно FLOAT — 4 байта, DOUBLE — 8 байт. Существуют много типов данных для хранения различных дат — это DATE, DATETIME, TIMESTAMP, TIME, YEAR. Также существуют строковые типы данных. Это, во-первых, CHAR и VARCHAR, соответственно CHAR имеет фиксированную длину, независимо от того, сколько фактически символов вы храните, остальные как бы будут просто забиваться пустыми значениями, но длина зарезервированная будет всегда одинаковая. VARCHAR — она, действительно, изменяется в зависимости от того, сколько символов вы сохраните. Также есть BINARY и VARBINARY, отличаются только тем, что там хранятся двоичные данные в отличие от CHAR, где хранят текстовые. Также существуют BLOB для хранения больших двоичных данных, TEXT для хранения больших текстовых данных. И тоже есть вариации BLOB'а и TEXT'а, на самом деле, различной длины. Существует ENUM — это перечисление, в этой колонке может храниться одно из перечисленных заранее значений. Существует SET, который похож на перечисление, но только может хранить одновременно несколько из перечисленных значений, а также существует JSON и различные геотипы. Давайте посмотрим еще, что у нас может быть в create_definition. А там у нас могут быть индексы и ограничения. Например, мы можем указать первичный ключ с различными типами и опциями для первичного ключа, также можем указать обычный ключ, то есть index, также у вот этих индексов бывают типы: он может быть b3 — это b дерево, или hash, различные типы индексирования, и различные опции, например, комментарии к индексу можно добавить. Также можно указать уникальный ключ и ограничения связи с другими таблицами, например, внешние ключи. Все это же можно указать, на самом деле, прямо при определении колонки, то есть можно указать при определении какой-то колонки сразу, является ли она, например, уникальным ключом или нет, а можно отдельно сначала перечислить просто все колонки, а потом указать, какие из них уникальные, какие из них индексы. Возможно это даже более удобно, то есть в одном месте у вас перечисляются как бы колонки, а в другом месте перечисляются все ограничения, индексы и так далее. Также у ключей бывает reference_definition, то есть когда это внешний ключ, он может ссылаться на таблицу — это мы указываем в reference_definition. Указываем, на какую таблицу он ссылается, по каким колонкам сопоставляются данные у двух таблиц и что делать в случае удаления связанных данных. Это указывается в reference_option. Можно запретить удалять данные связанных таблиц, если данные одной таблицы используются в другой, можно запретить удалять эти данные. Или можно также удалять данные из связанных таблиц при удалении данных из исходных и так далее. Также при создании таблицы можно указать table_options. Ну там их, на самом деле много, но основные — это AUTO_INCREMENT, можно указать начальные значения для AUTO_INCREMENT'а, можно указать кодировку по умолчанию, сравнение по умолчанию, точно так же, как это делается для всей базы данных, можно у отдельных таблиц поменять какую-то кодировку. Ну вот кодировка бывает UTF, UTF-8MB4, CP1251, и никогда не используйте LATIN1, потому что русский язык там не поддерживается. Также бывают способы сопоставления различных строковых данных между собой, также можно указать комментарии ко всей таблице, пояснить, что это за таблица, зачем она нужна, и движок таблицы — это с помощью какого движка сохраняются данные в этой таблице. Есть InnoDB который поддерживает транзакции, внешние ключи, есть устаревший MyISAM, раньше он часто использовался, сейчас уже вряд ли вы его встретите, как правило, все таблицы в InnoDB. MyISAM раньше был как бы слегка быстрее, но за счет того, что у него не было как раз транзакций и всех нужных сейчас вещей. Также существует движок MEMORY, когда таблица сохраняется в памяти, и движок BLACKHOLE — это когда вы можете записать данные в таблицу, но прочитать обратно их уже нельзя. Затрудняюсь сказать, зачем это может вам пригодиться. Давайте подведем итоги. Мы быстренько пробежались по теории синтаксиса MySQL для создания баз данных и таблиц в них. Ну я понимаю, что это все довольно-таки скучно, поэтому постарался так бегло пройти, просто чтобы показать, а вот в следующем видео будет гораздо интереснее. Там мы, воспользовавшись вот этими знаниями, будем создавать на практике таблицы и пытаться с ними что-то делать. [БЕЗ_ЗВУКА]