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>