HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>В этом уроке мы поработаем с таблицами: будем создавать их, добавлять, модифицировать и удалять данные. Также разберем типы данных таблицы.</p>
1 <p>В этом уроке мы поработаем с таблицами: будем создавать их, добавлять, модифицировать и удалять данные. Также разберем типы данных таблицы.</p>
2 <h2>Создание базы данных</h2>
2 <h2>Создание базы данных</h2>
3 <p>Прежде чем создать таблицу, создадим базу данных hexlet с помощью SQL (если вы еще этого не сделали). Для этого подключитесь к СУБД через psql. При этом не указывайте базу данных, чтобы подключиться к базе по умолчанию. Далее выполните следующие запросы:</p>
3 <p>Прежде чем создать таблицу, создадим базу данных hexlet с помощью SQL (если вы еще этого не сделали). Для этого подключитесь к СУБД через psql. При этом не указывайте базу данных, чтобы подключиться к базе по умолчанию. Далее выполните следующие запросы:</p>
4 <p>В примере выше два SQL запроса:</p>
4 <p>В примере выше два SQL запроса:</p>
5 <ul><li><p>DROP DATABASE hexlet - удаляет базу данных с именем hexlet</p>
5 <ul><li><p>DROP DATABASE hexlet - удаляет базу данных с именем hexlet</p>
6 </li>
6 </li>
7 <li><p>CREATE DATABASE hexlet - создает базу данных с таким же именем</p>
7 <li><p>CREATE DATABASE hexlet - создает базу данных с таким же именем</p>
8 </li>
8 </li>
9 </ul><p>Базовые правила построения запросов:</p>
9 </ul><p>Базовые правила построения запросов:</p>
10 <ul><li><p>Каждый запрос должен заканчиваться точкой с запятой. Иначе psql будет думать, что вы продолжаете вводить команды</p>
10 <ul><li><p>Каждый запрос должен заканчиваться точкой с запятой. Иначе psql будет думать, что вы продолжаете вводить команды</p>
11 </li>
11 </li>
12 <li><p>Регистр не важен. Можно было написать drop database hexlet;. По традиции принято использовать верхний регистр для ключевых слов самого SQL. Это позволяет визуально разделять структуру запроса от данных внутри него. Последнее в примере - это имя базы данных, которое может быть произвольным</p>
12 <li><p>Регистр не важен. Можно было написать drop database hexlet;. По традиции принято использовать верхний регистр для ключевых слов самого SQL. Это позволяет визуально разделять структуру запроса от данных внутри него. Последнее в примере - это имя базы данных, которое может быть произвольным</p>
13 </li>
13 </li>
14 </ul><p>Если подключиться к той же базе данных, которую вы хотите удалить или пересоздать, то во время попытки удаления СУБД будет ругаться, что к базе есть активное соединение - ваше соединение. Поэтому важно подключиться к любой другой базе данных.</p>
14 </ul><p>Если подключиться к той же базе данных, которую вы хотите удалить или пересоздать, то во время попытки удаления СУБД будет ругаться, что к базе есть активное соединение - ваше соединение. Поэтому важно подключиться к любой другой базе данных.</p>
15 <p>Команды createdb и createuser, которые мы разобрали в прошлых уроках, выполняют SQL-запросы внутри СУБД. Их сделали ради удобства первоначальной настройки, и чтобы использовать в скриптах автоматизации.</p>
15 <p>Команды createdb и createuser, которые мы разобрали в прошлых уроках, выполняют SQL-запросы внутри СУБД. Их сделали ради удобства первоначальной настройки, и чтобы использовать в скриптах автоматизации.</p>
16 <p>SQL поддерживает<strong>комментарии</strong>- строчка, которая начинается с двух дефисов. Комментарии игнорируются СУБД при построении запросов:</p>
16 <p>SQL поддерживает<strong>комментарии</strong>- строчка, которая начинается с двух дефисов. Комментарии игнорируются СУБД при построении запросов:</p>
17 <p>Нам удалось создать базу данных hexlet, поэтому можно переходить к созданию таблицы. Подключитесь к созданной базе данных</p>
17 <p>Нам удалось создать базу данных hexlet, поэтому можно переходить к созданию таблицы. Подключитесь к созданной базе данных</p>
18 <h2>Создание таблиц</h2>
18 <h2>Создание таблиц</h2>
19 <p>Таблица создается с помощью запроса CREATE TABLE:</p>
19 <p>Таблица создается с помощью запроса CREATE TABLE:</p>
20 <p>Чтобы создать таблицу, необходимо указать ее имя, набор полей и их типы. В примере выше названия полей - это name, slug, lessons_count и body, а varchar(255), integer и text - их типы.</p>
20 <p>Чтобы создать таблицу, необходимо указать ее имя, набор полей и их типы. В примере выше названия полей - это name, slug, lessons_count и body, а varchar(255), integer и text - их типы.</p>
21 <h3>Типы данных</h3>
21 <h3>Типы данных</h3>
22 <p>У каждого поля в PostgreSQL определенный тип, который задается на этапе создания таблицы. Это значит, что значением этого поля могут быть только определенные данные. Если поле имеет числовой тип, то в него невозможно вставить строку, и наоборот. База данных выдаст ошибку при попытке выполнить подобный запрос.</p>
22 <p>У каждого поля в PostgreSQL определенный тип, который задается на этапе создания таблицы. Это значит, что значением этого поля могут быть только определенные данные. Если поле имеет числовой тип, то в него невозможно вставить строку, и наоборот. База данных выдаст ошибку при попытке выполнить подобный запрос.</p>
23 <p>В PostgreSQL встроено много различных типов данных, но на практике используются не все. Ниже мы разбираем только самые популярные типы.</p>
23 <p>В PostgreSQL встроено много различных типов данных, но на практике используются не все. Ниже мы разбираем только самые популярные типы.</p>
24 <h4>Строки</h4>
24 <h4>Строки</h4>
25 <p>Для строк в базах данных в основном используются два типа:</p>
25 <p>Для строк в базах данных в основном используются два типа:</p>
26 <ul><li><em>varchar</em>- для строк с ограничением максимальной длины</li>
26 <ul><li><em>varchar</em>- для строк с ограничением максимальной длины</li>
27 <li><em>text</em>- для строк без ограничения. Как правило, это полноценные тексты</li>
27 <li><em>text</em>- для строк без ограничения. Как правило, это полноценные тексты</li>
28 </ul><p>В базах данных нельзя оставить первый тип без указания длины. Это связано с производительностью и эффективностью. Данные в базах данных физически хранятся на дисках в файлах. Быстрый доступ к этим данным возможен только тогда, когда у данных фиксированный размер. Это позволяет быстро перемещаться по ним и считать смещения.</p>
28 </ul><p>В базах данных нельзя оставить первый тип без указания длины. Это связано с производительностью и эффективностью. Данные в базах данных физически хранятся на дисках в файлах. Быстрый доступ к этим данным возможен только тогда, когда у данных фиксированный размер. Это позволяет быстро перемещаться по ним и считать смещения.</p>
29 <p>Если размер данных не известен, то придется просматривать весь файл в поисках нужного значения. Чтобы избежать подобной ситуации, тип<em>text</em>хранится отдельно. Это тоже негативно влияет на скорость, но уже не так сильно. Если размер строки известен или он меньше какого-то значения, то предпочтительнее использовать<em>varchar</em>.</p>
29 <p>Если размер данных не известен, то придется просматривать весь файл в поисках нужного значения. Чтобы избежать подобной ситуации, тип<em>text</em>хранится отдельно. Это тоже негативно влияет на скорость, но уже не так сильно. Если размер строки известен или он меньше какого-то значения, то предпочтительнее использовать<em>varchar</em>.</p>
30 <ul><li><p><em>varchar</em>. Полное название типа<em>character varying</em>(<em>varchar</em>может использоваться как псевдоним). Размер строки с таким типом указывается в скобках после названия типа, например,<em>varchar(10)</em>. Это значит, что в поле с таким типом можно записать строку длиной до 10 символов.</p>
30 <ul><li><p><em>varchar</em>. Полное название типа<em>character varying</em>(<em>varchar</em>может использоваться как псевдоним). Размер строки с таким типом указывается в скобках после названия типа, например,<em>varchar(10)</em>. Это значит, что в поле с таким типом можно записать строку длиной до 10 символов.</p>
31 </li>
31 </li>
32 <li><p><em>text</em>. Не требует указания размера и может содержать текст произвольной длины</p>
32 <li><p><em>text</em>. Не требует указания размера и может содержать текст произвольной длины</p>
33 </li>
33 </li>
34 </ul><p>Пример создания таблицы с такими типами:</p>
34 </ul><p>Пример создания таблицы с такими типами:</p>
35 <h4>Числа</h4>
35 <h4>Числа</h4>
36 <p>Для чисел в основном используются два типа данных:<em>integer</em>и<em>bigint</em>. Какой конкретно указывать тип, зависит от потенциального потолка значения. Ниже указаны диапазоны, допустимые в рамках этих типов:</p>
36 <p>Для чисел в основном используются два типа данных:<em>integer</em>и<em>bigint</em>. Какой конкретно указывать тип, зависит от потенциального потолка значения. Ниже указаны диапазоны, допустимые в рамках этих типов:</p>
37 <p>Пример создания таблицы с такими типами:</p>
37 <p>Пример создания таблицы с такими типами:</p>
38 <h4>Даты</h4>
38 <h4>Даты</h4>
39 <p>Типы для хранения дат отличаются друг от друга очень сильно, в первую очередь по решаемой задаче. Нам надо хранить день без конкретного времени? Это тип<em>date</em>. Нужно конкретный момент времени, тогда<em>timestamp</em>. Просто время без даты? Тогда<em>time</em>.</p>
39 <p>Типы для хранения дат отличаются друг от друга очень сильно, в первую очередь по решаемой задаче. Нам надо хранить день без конкретного времени? Это тип<em>date</em>. Нужно конкретный момент времени, тогда<em>timestamp</em>. Просто время без даты? Тогда<em>time</em>.</p>
40 <p>Пример создания таблицы с такими типами:</p>
40 <p>Пример создания таблицы с такими типами:</p>
41 <p>Хорошей практикой считается добавление и заполнение полей<em>created_at</em>и<em>updated_at</em>в каждую таблицу базы данных. С их помощью всегда можно узнать, когда запись создалась и обновилась.</p>
41 <p>Хорошей практикой считается добавление и заполнение полей<em>created_at</em>и<em>updated_at</em>в каждую таблицу базы данных. С их помощью всегда можно узнать, когда запись создалась и обновилась.</p>
42 <p>Значения даты и времени принимаются практически в любом известном формате. Вот несколько примеров того, как можно задавать дату:</p>
42 <p>Значения даты и времени принимаются практически в любом известном формате. Вот несколько примеров того, как можно задавать дату:</p>
43 <h4>Логический тип</h4>
43 <h4>Логический тип</h4>
44 <p>Содержит всего два значения: true и false. Этот тип используется для флагов:</p>
44 <p>Содержит всего два значения: true и false. Этот тип используется для флагов:</p>
45 <p>Пример создания таблицы с такими типами:</p>
45 <p>Пример создания таблицы с такими типами:</p>
46 <p>Состояние "true" может задаваться следующими значениями:</p>
46 <p>Состояние "true" может задаваться следующими значениями:</p>
47 <p>TRUE 't' 'true' 'y' 'yes' 'on' '1'</p>
47 <p>TRUE 't' 'true' 'y' 'yes' 'on' '1'</p>
48 <p>Для состояния "false" можно использовать следующие варианты:</p>
48 <p>Для состояния "false" можно использовать следующие варианты:</p>
49 <p>FALSE 'f' 'false' 'n' 'no' 'off' '0'</p>
49 <p>FALSE 'f' 'false' 'n' 'no' 'off' '0'</p>
50 <h4>NULL</h4>
50 <h4>NULL</h4>
51 <p>Помимо типов данных для реальных значений, в базе существует специальное значение NULL, чтобы обозначать пустоту. Оно используется, когда у конкретного поля нет значения. Тип поля при этом не важен. Подробнее с NULL мы разберемся в следующих уроках.</p>
51 <p>Помимо типов данных для реальных значений, в базе существует специальное значение NULL, чтобы обозначать пустоту. Оно используется, когда у конкретного поля нет значения. Тип поля при этом не важен. Подробнее с NULL мы разберемся в следующих уроках.</p>
52 <h2>Анализ структуры базы данных</h2>
52 <h2>Анализ структуры базы данных</h2>
53 <p>Чтобы исследовать структуру таблиц в визуальном режиме, используется<em>PgAdmin</em>:</p>
53 <p>Чтобы исследовать структуру таблиц в визуальном режиме, используется<em>PgAdmin</em>:</p>
54 <p>SQL для анализа структуры базы данных не существует. Если вы хотите посмотреть список таблиц и их структуру в базе данных, то придется использовать команды самого psql:</p>
54 <p>SQL для анализа структуры базы данных не существует. Если вы хотите посмотреть список таблиц и их структуру в базе данных, то придется использовать команды самого psql:</p>
55 <p><strong>Просмотр списка таблиц базы данных hexlet</strong></p>
55 <p><strong>Просмотр списка таблиц базы данных hexlet</strong></p>
56 <p>Здесь мы видим список таблиц в базе данных<em>hexlet</em>. Все что здесь отображается, было создано в этом уроке выше.</p>
56 <p>Здесь мы видим список таблиц в базе данных<em>hexlet</em>. Все что здесь отображается, было создано в этом уроке выше.</p>
57 <p>В первом столбце видим новое для нас понятие -<em>schema</em>. Это пространство имен, которое позволяет группировать таблицы в различных ситуациях. На практике эта возможность используется редко, поэтому мы не обращаем на нее внимание. По умолчанию все таблицы публикуются в общей схеме<em>public</em>, которую можно не указывать.</p>
57 <p>В первом столбце видим новое для нас понятие -<em>schema</em>. Это пространство имен, которое позволяет группировать таблицы в различных ситуациях. На практике эта возможность используется редко, поэтому мы не обращаем на нее внимание. По умолчанию все таблицы публикуются в общей схеме<em>public</em>, которую можно не указывать.</p>
58 <p><strong>Просмотр структуры таблицы courses</strong></p>
58 <p><strong>Просмотр структуры таблицы courses</strong></p>
59 <p>В этом выводе показана структура таблицы<em>courses</em>. Здесь мы видим все имена полей и их типы.</p>
59 <p>В этом выводе показана структура таблицы<em>courses</em>. Здесь мы видим все имена полей и их типы.</p>
60 <p>Кроме перечисленных полезными могут оказаться следующие команды:</p>
60 <p>Кроме перечисленных полезными могут оказаться следующие команды:</p>
61 <ul><li>\l - список всех баз данных</li>
61 <ul><li>\l - список всех баз данных</li>
62 <li>\dt - список всех таблиц</li>
62 <li>\dt - список всех таблиц</li>
63 <li>\? - вывод справки</li>
63 <li>\? - вывод справки</li>
64 </ul><h2>Удаление таблиц</h2>
64 </ul><h2>Удаление таблиц</h2>
65 <p>Чтобы удалить таблицу, выполняется запрос DROP:</p>
65 <p>Чтобы удалить таблицу, выполняется запрос DROP:</p>
66 <p>Будьте внимательны, так как удаление таблицы приводит к безвозвратной потере данных.</p>
66 <p>Будьте внимательны, так как удаление таблицы приводит к безвозвратной потере данных.</p>
67 <h2>Выводы</h2>
67 <h2>Выводы</h2>
68 <p>В этом уроке мы разобрали работу с таблицами: создавали базу данных и таблицу, устанавливали типы данных и анализировали структуру базы. Еще мы показали, как удалять таблицу. Попрактикуйтесь создавать таблицы - проходите каждый шаг, описанный в уроке, и со временем для вас это станет легкой задачей.</p>
68 <p>В этом уроке мы разобрали работу с таблицами: создавали базу данных и таблицу, устанавливали типы данных и анализировали структуру базы. Еще мы показали, как удалять таблицу. Попрактикуйтесь создавать таблицы - проходите каждый шаг, описанный в уроке, и со временем для вас это станет легкой задачей.</p>