dm 3 týždňov pred
rodič
commit
e2a2ed5ac7

+ 36 - 22
.obsidian/workspace.json

@@ -8,49 +8,63 @@
         "type": "tabs",
         "children": [
           {
-            "id": "b62f3271b7105629",
+            "id": "a4fa9ec978e9f875",
             "type": "leaf",
             "state": {
               "type": "markdown",
               "state": {
-                "file": "Python/venv.md",
+                "file": "hardcore web development/11. SQL/Сортировка данных.md",
                 "mode": "source",
                 "source": false
               },
               "icon": "lucide-file",
-              "title": "venv"
+              "title": "Сортировка данных"
             }
           },
           {
-            "id": "2907b0590172d3db",
+            "id": "4e4597387393b561",
             "type": "leaf",
             "state": {
               "type": "markdown",
               "state": {
-                "file": "English/words.md",
+                "file": "hardcore web development/11. SQL/Задание.md",
                 "mode": "source",
                 "source": false
               },
               "icon": "lucide-file",
-              "title": "words"
+              "title": "Задание"
             }
           },
           {
-            "id": "a4fa9ec978e9f875",
+            "id": "f733a4caf650106a",
             "type": "leaf",
             "state": {
               "type": "markdown",
               "state": {
-                "file": "English/homework 2.md",
+                "file": "hardcore web development/11. SQL/Типы данных.md",
                 "mode": "source",
                 "source": false
               },
               "icon": "lucide-file",
-              "title": "homework 2"
+              "title": "Типы данных"
+            }
+          },
+          {
+            "id": "b535845df52ceaee",
+            "type": "leaf",
+            "state": {
+              "type": "markdown",
+              "state": {
+                "file": "Комментарии.md",
+                "mode": "source",
+                "source": false
+              },
+              "icon": "lucide-file",
+              "title": "Комментарии"
             }
           }
         ],
-        "currentTab": 2
+        "currentTab": 3
       }
     ],
     "direction": "vertical"
@@ -73,7 +87,7 @@
                 "autoReveal": false
               },
               "icon": "lucide-folder-closed",
-              "title": "Файловый менеджер"
+              "title": "Files"
             }
           },
           {
@@ -173,16 +187,21 @@
   },
   "left-ribbon": {
     "hiddenItems": {
-      "switcher:Меню быстрого перехода": false,
-      "graph:Граф": false,
-      "canvas:Создать новый холст": false,
-      "command-palette:Открыть палитру команд": false,
-      "markdown-importer:Импорт Markdown-файлов": false
+      "switcher:Open quick switcher": false,
+      "graph:Open graph view": false,
+      "canvas:Create new canvas": false,
+      "command-palette:Open command palette": false,
+      "markdown-importer:Open format converter": false
     }
   },
-  "active": "c7584343712d3d31",
+  "active": "b535845df52ceaee",
   "lastOpenFiles": [
+    "hardcore web development/11. SQL/Типы данных.md",
+    "Комментарии.md",
+    "hardcore web development/11. SQL/Задание.md",
+    "hardcore web development/11. SQL/Сортировка данных.md",
     "English/words.md",
+    "hardcore web development/11. SQL/Создание таблиц.md",
     "English/homework 2.md",
     "Python/venv.md",
     "todo/Разное.md",
@@ -195,9 +214,6 @@
     "English/img/16-1.JPEG",
     "ROTEK/BT_6714.md",
     "proGit.md",
-    "hardcore web development/11. SQL/Сортировка данных.md",
-    "hardcore web development/11. SQL/Создание таблиц.md",
-    "hardcore web development/11. SQL/Задание.md",
     "hardcore web development/11. SQL/SQL настройка.md",
     "hardcore web development/11. SQL/NULL, coalecse.md",
     "todo/Тренировки и занятия.md",
@@ -218,8 +234,6 @@
     "hardcore web development/Список литературы.md",
     "English/img/13-5.JPEG.~tmp",
     "English/img/13-4.JPEG.~tmp",
-    "network/ethernet.md",
-    "Кодинг.md",
     "docs/sniffers_texto.pdf",
     "English/img/9-4.jpg.~tmp",
     "English/img/9-9.jpg.~tmp",

+ 62 - 0
docs/Script-1.sql

@@ -119,5 +119,67 @@ create schema tests;
 select format('Птичка: %s', species_name) as "птичка" from species
 order by species_name;
 
+update species
+set species_name='Древесный дрозд'
+where species_name='Дрозд лесной'
 
+update species
+set species_name='Дрозд лесной'
+where species_name='Древесный дрозд'
 
+-- Создание схемы
+drop schema if exists birds cascade;
+create schema birds;
+
+table genus;
+select genus_id as crows_id from genus where genus_name='Ворон';
+select * from species;
+
+create table crows as 
+select * from species where genus_id=(select genus_id from genus where genus_name='Ворон');
+
+table crows;
+truncate table crows;
+drop table crows;
+
+
+create table smth (a int);
+insert into smth(a) values (1), (2), (3);
+table smth;
+update smth set a=a*2;
+
+select pg_column_size('привеееет');
+
+create temp table game_genre (
+    genre_id bigint primary key,
+    genre_name text
+);
+
+create temp table game (
+    game_id int generated always as identity primary key,
+    genre_id int not null references game_genre(genre_id)
+);
+
+insert into game_genre(genre_id, genre_name) values (1234567890123456789, 'шутер');
+
+insert into game(genre_id) values (1234567890123456789);
+
+comment on table family is 'Семейство птиц';
+comment on column family.family_id is 'Уникальный идентификатор семейства';
+comment on column family.family_name is 'Название семейства';
+comment on column family.description is 'Описание семейства';
+
+comment on table genus is 'Род птиц';
+comment on column genus.genus_id is 'Уникальный идентификатор рода';
+comment on column genus.genus_name is 'Название рода';
+comment on column genus.family_id is 'Ссылка на семейство';
+comment on column genus.description is 'Описание рода';
+
+comment on table species is 'Вид птиц';
+comment on column species.species_id is 'Уникальный идентификатор вида';
+comment on column species.species_name is 'Название вида';
+comment on column species.genus_id is 'Ссылка на род';
+comment on column species.description is 'Описание вида';
+comment on column species.average_length is 'Средняя длина в см';
+comment on column species.average_weight is 'Средний вес в г';
+comment on column species.primary_color is 'Цвет оперения';

+ 37 - 0
hardcore web development/11. SQL/Задание.md

@@ -1,3 +1,40 @@
+Создание простой таблицы и обновление значений
+```sql
+create table smth (a int);
+insert into smth(a) values (1), (2), (3);
+table smth;
+update smth set a = a * 2;
+```
+
+Хитрое создание таблицы без указания ее столбцов
+```sql
+create table crows as select * from species where genus_id=(
+    select genus_id from genus where genus_name='Ворон'
+)
+```
+или
+```sql
+select * into crows from species s where s.genus_id=(
+    select genus_id from genus g where g.genus_name='Ворон'
+);
+```
+
+Удалить таблицу
+```sql
+drop table something;
+drop table if exists something;
+drop table if exists something cascade;
+```
+
+Варианты не идентичны, конечно. Первый удаляет таблицу и команда падает с ошибкой, если таблицы нет, или если на таблицу ссылается другая таблица. Второй вариант не падает, если таблицы нет, но падает, если на таблицу кто-то ссылается. Последний вариант не падает, если таблицы нет, и не падает, если на таблицу ссылается другая таблица.
+Обновление данных в базе
+
+```sql
+update species
+set species_name='Древесный дрозд'
+where species_name='Дрозд лесной'
+```
+
 ~={green}Пример хранения данных в текстовом файлу в формате ключ=значение:=~
 ```
 название=Тихий Дон

+ 5 - 2
hardcore web development/11. SQL/Сортировка данных.md

@@ -152,7 +152,7 @@ delete from tests.author where name='Михаил Шолохов';
 ~={yellow}Очистка таблицы. Быстрый способ.=~
 
 ```sql
-truncate tabel book;
+truncate table book;
 
 --- Медленный способ
 delete from book where true;
@@ -184,4 +184,7 @@ table books_with_isbn;
 ```
 
 ~={yellow}Форматированный вывод=~
-
+```sql
+select format('Птичка: %s', species_name) as "птичка" from species
+order by species_name;
+```

+ 48 - 0
hardcore web development/11. SQL/Типы данных.md

@@ -0,0 +1,48 @@
+Типы данных помогают нам поддерживать целостность данных. Например, если мы тип колонки укажем как целое число, то вставить туда строку «тыща» не получится:
+
+```sql
+create temp table book_tmp(name text, pages int);
+-- ok
+insert into book_tmp (name, pages) values ('Python к вершинам мастерства', '898');
+-- error
+insert into book_tmp (name, pages) values ('Python к вершинам мастерства', 'тыща');
+```
+
+И благодаря этому наши данные будут целостными.
+
+Плюс в зависимости от используемого типа можно настраивать дополнительные ограничения, поддерживающие целостность данных, например, у книги не может быть отрицательного или нулевого количества страниц:
+
+```sql
+drop table book_tmp;
+create temp table book_tmp(name text, pages int check (pages>=1));
+-- error
+insert into book_tmp (name, pages) values ('Python к вершинам мастерства', -898);
+```
+
+Теперь не получится сохранить книгу с отрицательным количеством страниц. Для типа данных строка или дата такого ограничения выставить не удастся, но для этих типов можно устанавливать свои ограничения, на длину строки или на допустимый диапазон дат, например.
+
+Помимо целостности и предоставления разных возможностей типы данных служат оптимизации хранения. Скажем, как мы можем сохранить значение 333? В виде разных типов чисел и в виде разных типов строк. Давайте посмотрим, сколько байт займет это значение для разных типов данных.
+
+Мы можем использовать два двоеточия для приведения типов друг к другу, то есть чтобы значение одного типа привести к другому типу, когда это возможно. А встроенная в PostgreSQL функция `pg_column_size` возвращает размер в байтах, который займёт указанное значение конкретного типа.
+
+```sql
+SELECT pg_column_size('333'::text); -- 7
+SELECT pg_column_size('333'::varchar(3)); -- 7
+SELECT pg_column_size('333'::char(3)); -- 7
+
+SELECT pg_column_size('333'::char(255)); -- 259
+
+SELECT pg_column_size(333::bigint); -- 8
+SELECT pg_column_size(333::int);  -- 4
+SELECT pg_column_size(333::smallint);  -- 2
+
+SELECT pg_column_size(333::numeric(3)); -- 8
+```
+
+Мы видим, что одно и то же значение может занимать в базе данных как 2 байта, так и 259 байт. В мире книг около 130 миллионов всего. Если мы храним 2 байта по каждой книге, то получаем 260 мегабайт займёт эта колонка на диске.
+
+Если вместо 2 байт по каждой книге храним 259 байт, то для 130 млн книг это уже около 33 гигабайт.
+
+То есть, храня эти данные правильно, мы экономим на диске 32 с хвостиком гигабайта. Если эта колонка будет еще в индексе где-то участвовать, то ещё больше места мы сэкономим, потому что информация в индексе дублирует информацию в основной таблице для ускорения поиска.
+
+Ну и помимо оптимизации хранения мы также получаем оптимизацию производительности, потому что меньше данных нам надо считывать с диска и так далее. Считать 260 мегабайт значительно быстрее, чем 33 гигабайта.

+ 19 - 0
Комментарии.md

@@ -0,0 +1,19 @@
+```sql
+COMMENT ON TABLE author IS 'Авторы книг, писатели';
+COMMENT ON COLUMN author.author_id IS 'Уникальный идентификатор писателя';
+COMMENT ON COLUMN author.name IS 'Имя и фамилия писателя';
+COMMENT ON COLUMN author.description IS 'Краткая информация-знакомство с писателем, заполняется при наличии';
+
+COMMENT ON TABLE book_category IS 'Классификатор книжных категорий';
+COMMENT ON COLUMN book_category.category_id IS 'Уникальный идентификатор книжной категории';
+COMMENT ON COLUMN book_category.name IS 'Название книжной категории';
+
+COMMENT ON TABLE book IS 'Книги';
+COMMENT ON COLUMN book.book_id IS 'Уникальный идентификатор книги в нашей системе';
+COMMENT ON COLUMN book.name IS 'Название книги';
+COMMENT ON COLUMN book.author_id IS 'Уникальный идентификатор писателя, написавшего книгу';
+COMMENT ON COLUMN book.description IS 'Краткое описание книги, заполняется при наличии';
+COMMENT ON COLUMN book.cover IS 'URL изображения-обложки книги, заполняется при наличии';
+COMMENT ON COLUMN book.category_id IS 'Уникальный идентификатор книжной категории';
+```
+