PostgreSQL Підручник для початківців: вивчіть основи PSQL за 3 дні
PostgreSQL — це система управління базами даних із відкритим вихідним кодом для додатків баз даних корпоративного класу. Він підтримує як SQL, так і JSON для реляційних та нереляційних запитів для забезпечення розширюваності та відповідності SQL. Він також пропонує розширені типи даних та функції оптимізації продуктивності для зберігання та масштабування складних робочих навантажень баз даних. Він також відомий як Postgres.
PostgreSQL Короткий опис уроку
Ці PostgreSQL підручник для початківців призначений для вивчення PostgreSQL основи для вивчення таких тем, як створення бази даних, створення таблиці, видалення бази даних, видалення таблиці, вибір таблиці, вставка запису, оновлення запису, видалення запису, упорядкування, угруповання, тригери, підстрока, ключі бази даних, команди PSQL тощо. буд. Це PostgreSQL посібник з навчання допоможе вам з PostgreSQL навчання та PostgreSQL основи. Додаткові можливості, такі як з'єднання, уявлення, тригери і т.п. д., також розглядаються в цьому посібнику з PSQL.
Що я маю знати?
Цей посібник з бази даних Postgres призначений для новачків з мінімальними знаннями або взагалі без них. PostgreSQL Досвід. Цей PostgreSQL навчання допоможе вам зрозуміти всі основи PostgreSQL.
PostgreSQL Програма курсу
Вступ
| 👉 Lessна 1 |
Що таке PostgreSQL? - Вступ, переваги та недоліки |
| 👉 Lessна 2 |
Встановіть PostgreSQL on Windows — Як завантажити та встановити PostgreSQL |
| 👉 Lessна 3 |
Встановіть PostgreSQL on Ubuntu - Як встановити PostgreSQL on Ubuntu |
| 👉 Lessна 4 |
PostgreSQL Типи даних - Персонаж | Числовий | Двійковий | логічне значення |
Розширений матеріал
| 👉 Lessна 1 |
PostgreSQL/Postgres Створити базу даних - Як створити приклад |
| 👉 Lessна 2 |
PostgreSQL ВИДАЛЕННЯ/ВИДАЛИТИ БАЗУ ДАНИХ - Приклад команди PSQL |
| 👉 Lessна 3 |
Як створити та видалити таблицю в PostgreSQL — Навчайтеся на прикладі |
| 👉 Lessна 4 |
PostgreSQL ВСТАВИТИ — Вставка даних у таблицю |
| 👉 Lessна 5 |
Створити користувача в PostgreSQL — Як додати, змінити та видалити КОРИСТУВАЧА? |
| 👉 Lessна 6 |
ВІДМІННІ в PostgreSQL - Вибрати | Впорядкувати і обмежити [Приклади] |
| 👉 Lessна 7 |
PostgreSQL масив - Функції, Тип, Приклад |
| 👉 Lessна 8 |
PostgreSQL МІЖ — Навчайтеся на прикладі |
| 👉 Lessна 9 |
PostgreSQL В, не В — Навчайтеся на прикладі |
| 👉 Lessна 10 |
PostgreSQL Подобається, Не подобається, Підстановочні знаки (%, _ ) — Навчайтеся на прикладі |
| 👉 Lessна 11 |
PostgreSQL ІСНУЄ - Що таке, Прімери |
| 👉 Lessна 12 |
PostgreSQL Видалити рядок, що відповідає 1/2 умові — Навчайтеся на прикладі |
| 👉 Lessна 13 |
PostgreSQL ЗМІНИТИ таблицю - ДОДАТИ стовпець, перейменувати приклади стовпця/таблиці |
| 👉 Lessна 14 |
PostgreSQL ПІДСТАВКА () - Що PostgreSQL Підрядок? з прикладом |
| 👉 Lessна 15 |
PostgreSQL Союз, Союз ВСІХ — Навчайтеся на прикладі |
| 👉 Lessна 16 |
PostgreSQL Граючи - внутрішній, зовнішній, лівий, правий, природний з прикладами |
| 👉 Lessна 17 |
PostgreSQL Створити виставу - Що PostgreSQL вигляд? і приклад |
| 👉 Lessна 18 |
PostgreSQL Викликати — Приклад створення та видалення |
| 👉 Lessна 19 |
PostgreSQL обмеження - Типи з прикладом |
СТАТТІ ЗА ТЕМОЮ
Мушу знати!
Як встановити PostgreSQL
Нижче наведено кроки щодо завантаження та встановлення. PostgreSQL:
- Крок 1) Перейдіть на https://www.postgresql.org/download і виберіть потрібну операційну систему
- Крок 2) Щоб розпочати інсталяцію, відкрийте файл інсталятора .exe.
- Крок 3) Виберіть потрібну мову
- Крок 4) Знайдіть шлях для встановлення PostgreSQL програмне забезпечення у вашій системі
- Крок 5) Виберіть компоненти, які потрібно встановити.
- Крок 6) Встановіть пароль суперкористувача та запишіть його.
- Крок 7) Вкажіть номер порту за замовчуванням
- Крок 8) Натисніть кнопку «Далі», щоб розпочати інсталяцію.
Як почати PostgreSQL
Нижче наведено кроки, щоб почати використовувати PostgreSQL:
- Крок 1) Перейдіть в меню «Пуск» та знайдіть pgAdmin 4.
- Крок 2) Відкриється домашня сторінка pgAdmin.
- Крок 3) Натисніть Сервери > PostgreSQL 10 у лівому дереві
- Крок 4) Введіть пароль суперкористувача, встановлений під час встановлення, і натисніть кнопку «ОК».
- Крок 5) Команда PostgreSQL панель керування відкриється
використовує в PostgreSQL
Нижче наведено популярні варіанти використання PostgreSQL:
- Фінансова промисловість:PostgreSQL - ідеальна система СУБД для фінансової галузі.
- Дані державної ДВС:PostgreSQL пропонує потужну ГІС під назвою «PostGIS», яка надає сотні функцій для обробки геометричних даних у різних форматах.
- Виробництво:PostgreSQL також використовується у промисловому виробництві для прискорення загального бізнес-процесу.
- Веб-технології та NoSQL:PostgreSQL чудово працює з усіма сучасними веб-фреймворками, такими як Django, Node.js, Hibernate, PHP і т.д. Він пропонує можливості реплікації для масштабування багатьох серверів баз даних.
- Наукові дані:PostgreSQL пропонує чудові аналітичні можливості та потужний механізм SQL. Це допоможе вам легко керувати великим обсягом даних.
Курс «PostgreSQL для початківців»: #1 - Основи SQL
Цим постом я запускаю публікацію розширених транскриптів лекційного курсу PostgreSQL для початківців, підготовленого мною в рамках Школи backend-розробника в Тензорі.
У програмі: розповідь про основи SQL, можливості простих та складних SELECT, аналіз продуктивності запитів, розбір [не]ефективного застосування індексів та особливостей роботи транзакцій та блокувань у цій СУБД.
Курс не претендує на лаври "увійти в айти", тому має на увазі наявність у слухача досвіду програмування або роботи з іншими СУБД, і, головне, бажання самостійно вивчати тему роботи з PostgreSQL глибше.
Для тих, кому комфортніше дивитися та слухати, а не читати – доступний відеозапис та слайди:
Що таке SQL
Сьогодні у нас перша лекція із серії "PostgreSQL для початківців", і говорити на ній ми будемо про самі основи SQL – ось цього "хвостика" у назві PostgreSQL, тому комусь частина інформації із сьогоднішньої лекції може здатися очевидною та загальновідомою. На жаль, це зовсім так.
Мене звуть Боровиков Кирило, і в "Тензорі" я займаюся всім, що стосується баз даних – як SQL, так і NoSQL – різних. Але сьогодні ми говоритимемо саме про SQL.
По-перше, SQL - це Structured Query Language - "мова структурованих запитів", ось визначення з wiki:
SQL (МФА: [ˈɛsˈkjuˈɛl]; аббр. від англ. Structured Query Language — «мова структурованих запитів») — декларативна мова програмування, що використовується для створення, модифікації та управління даними в реляційній базі даних, що керується відповідною системою управління базами даних.
У ньому відзначимо три ключові моменти: SQL – це декларативний мова, яка використовується для управління даними в реляційних бази. Подивимося, що це означає…
Декларативна мова
Що взагалі таке "декларативна" мова програмування і на противагу їй "імперативна"?
Імперативні ЯП, до яких належить більшість тих, які ви знаєте, з якими вам доводилося стикатися, змушують вас чітко описати "як" досягти потрібного результату: булочку розрізати навпіл, покласти на неї котлету, далі соус, сир, … і на виході у вас, мабуть, вийде гамбургер, якщо ви ніде у процесі не помилилися.
На відміну від них декларативні ЯП (яких вам, напевно, зустрічалося всього два, зате вони відомі: HTML і SQL), дозволяють просто описати "що" ми хочемо отримати. Наприклад, просто під'їхати до вікна замовлення та сказати "Хочу гамбургер!" І в цей момент нас не цікавить ні за якої температури, ні скільки часу він готуватиметься, ні хто конкретно його готуватиме - вся ця інформація нам нецікава, ми просто замовляємо конкретний результат.
Безумовно, обидва підходи мають плюси та мінуси – наприклад, імперативні мови дозволяють краще оперувати машинними ресурсами на "низовому" рівні: ми можемо "відрізати" собі шматочок пам'яті, завантажити процесор конкретним завданням, зате доводиться сильно постаратися, щоб десь не проїхати по "чужій" пам'яті або не "спіткнутися" про Null Pointer Exception.
Декларативні мови, як правило, дозволяють вам істотно коротше описати те, що ви хочете отримати. Але, на жаль, лише у тій області, під яку вони "заточені".Наприклад, згадуваний HTML добре пристосований під відображення даних (в основному, текстових), а це означає, що все інше на ньому робити буде зовсім неможливо, або дуже складно і некомфортно.
А ось SQL "заточений" під.
Управління даними
Більшість імперативних мов програмування взаємодіють із якимись атомарними, "штучними" речами: станами системи чи подіями, що у ній відбуваються.
На відміну від них, SQL працює з великими наборами даних - записів чи "рядок". Рядки групуються в таблиці, які, будучи пов'язані деякими відносинами між собою утворюють базу даних.
Реляційні бази
Слово "відносини" тут ключове, оскільки саме воно визначає, що ваша СУБД є реляційної - тобто в такій базі будуть пов'язані таблиці.
Тому що існує досить багато видів нереляційних СУБД, перевага яких полягає у можливості, хоч і жертвуючи універсальністю, під кожну конкретну прикладну задачу підібрати найбільш підходящий з них: Key-Value, документарні, графові, пошукові ("заточені" під повнотекстовий або фразовий пошук) або навіть мультипарадигмальні, що наближаються по можливості до традиційних SQL-баз.
Всі ці види нереляційних СУБД ніяк не змушують нас конкретизувати структуру зберігання даних у нашій базі, і поряд з ключем-числом можна покласти ключ-рядок або зовсім динамічно замінити скалярне значення на список.
На відміну від них, у реляційних базах, структура жорстко задається на момент розробки, і її не можна швидко "перетрусити" в динаміці - це досить складний процес. Безперечним стандартом роботи з ними зараз є саме SQL, універсальний за своїми можливостями, його підтримують всі провідні enterprise-СУБД.
Хоча, звісно, не обійшлося і без "ложки дьогтю". Як і будь-яку мову, SQL виробив згодом певні "діалекти", і кожна СУБД намагається "відростити" свою, щоб зробити використання саме своїх особливостей ще зручніше.
Тому, якщо у вас стоїть завдання писати максимально переносимий між СУБД софт, Що буде всі запити формувати однаково зрозумілими всім СУБД, те чи це буде дуже складним процесом або ви отримаєте вкрай неефективні запити, що не використовують хоч якусь специфіку можливостей конкретної бази. Тобто будь-який універсальний запит на SQL однаково виконуватиметься на всіх таких базах, але на всіх - не настільки ефективно, наскільки можна було б зробити з урахуванням специфіки.
Зберігання даних у реляційних базах
Всі бази потрібні для того, щоб зберігати якісь прикладні дані, і в SQL-орієнтованих певний клас об'єктів - наприклад, "документи" (папірець з підписом), з атрибутами "номер" та "дата" - буде представлений окремою таблицею.
Атрибути об'єкта будуть її стовпцями, екземпляри об'єктів - рядками, а на перетині - у полі конкретного рядка - зберігатиметься значення даного атрибуту для конкретного екземпляра (Номер = 123, Дата = 01.01.2000).
Тому всі рядки однієї таблиці мають той самий формат, на відміну нереляційних баз.
Між собою таблиці пов'язуються якимись відносинами, які визначаються ключами.
Як правило, будь-яка таблиця має первинний ключ (Primary Key, PK), і він необхідний, щоб унікально ідентифікувати будь-який рядок цієї таблиці.
Звичайно, бувають ситуації, коли у вас у таблиці з цілком певних прикладних причин може не бути первинного ключа. Наприклад, ви пишете якусь систему зберігання логів, і запис даних у неї відбувається настільки часто, що навіть 1 секунда не є унікальним ідентифікатором – коли у вас таких подій відбувається за секунду 10, ви їх все пишете, а час відрізнити між ними ніяк не можете. І тоді вам або доведеться додати в таблицю як первинний сурогатний ключ, або взагалі варто його не робити – якщо окремі записи не потрібно унікально ідентифікувати, а на неї ніхто не посилається.
Тому що первинні ключі, класично, використовуються саме для того, щоб мати можливість послатися на конкретний запис або провзаємодіяти з ним. А саме щоб "послатися" з боку підлеглої таблиці використовуються зовнішні ключі (Foreign Keys, FK) - вони визначають за відповідністю значень яких полів у дочірній та батьківській таблиці встановлюється зв'язок.
В принципі, зовнішній ключ може посилатися не обов'язково на первинний, а й на будь-який унікальний ключ (Unique Key), яких на таблиці, на відміну від первинного, може бути кілька. Наприклад, у таблиці, куди ви записуєте всіх своїх клієнтів, первинним ключем може виступати сурогатний ідентифікатор, а додатковим унікальним ключем - його ІПН.
Розвиток стандарту SQL
Ми говоримо про SQL, маючи на увазі, що це загальноприйнятий стандарт, затверджений ANSI та ISO, за яким навіть різні сертифікати видаються йому вже 40 років. Але, незважаючи на такий поважний, за мірками IT-технологій, вік, це не якась замшала скрижаль, на якій все давно висічено рунами.
Ні, це цілком живий організм, який активно розвивається, і раз на 3-5 років з'являється нове розширення стандарту. І "біг" за підтримкою цього стандарту якраз і визначає шлях розвитку сучасних СУБД.
Наприклад, якщо глянути на стандарт 2016 року, то. роботу з JSON намагалися зарелізувати в PostgreSQL 16, яка вийшла цього жовтня, Row Level Security зробили ще у версії 15, якщо не раніше, у ось pattern matching тільки зараз намагаються доопрацювати для майбутньої версії 17, так само як і JSON, оскільки фінальний варіант патчів у v16 не увійшов.
Тобто на даний момент стандарт SQL зі свого опрацювання випереджає можливості реальних СУБД. Це та сама різниця між декларативним описом у стандарті "як має бути" і фактичною реалізацією імперативними мовами "всередині" движка бази "як це має працювати".
Особливості PostgreSQL
Поки ми всі говорили про SQL в цілому, давайте тепер торкнемося особливостей безпосередньо PostgreSQL.
По-перше, на відміну від деяких інших СУБД, PostgreSQL сповідує клієнт-серверну архітектуру. Це означає, що ми завжди маємо деякого клієнта, який формує запит і за власним протоколом "поверх" TCP/IP відправляє його серверу. Як правило, цей текстовий запит і містить якісь SQL-команди. А у відповідь ми отримуємо певний код результату та, можливо, вибірку.
Для того, щоб мати можливість послати це все серверу і отримати назад, потрібна або клієнтська програма, або якась бібліотека, необхідна для вашої програми.
Спілкування з PostgreSQL базою
Якщо ви розвиватиметеся у сфері роботи з PostgreSQL, то рано чи пізно станете хардкорним розробником або адміном, або DBA, ви точно користуватиметеся утилітою psql - це нативний консольний клієнт, який входить до складу стандартного дистрибутива самого PostgreSQL-сервера, тому "є скрізь" ".
Але поки ви не досягли таких вершин або просто не любите консоль, можете використовувати будь-яку з кількох десятків GUI-утиліт.
Якщо ж вам необхідно інтегрувати роботу з PostgreSQL у свою програму, то вам необхідно знайти відповідну до вашої мови програмування клієнтську бібліотеку - їх понад 30 варіантів, включаючи екзотичні у наших широтах Haskel, Erlang або Rust.
Навіть офісні продукти на кшталт Access, Excel і навіть 1C можна змусити працювати як PostgreSQL-клієнта, якщо використовувати ODBC-драйвер. Тому можливості якось повзаємодіяти з PostgreSQL обмежені виключно вашою фантазією.
Базові SQL-команди
Так з чого ж складатиметься ваше життя, коли ви активно писатимете на SQL? На 99% - це буде команда SELECT:
А разом усі оператори, що наведені на цьому слайді, покривають 99.9% усіх типових завдань. Тобто 99% - SELECT, а 0.9% - всякі CREATE, ALTER, INSERT,. Тому що найголовніше завдання будь-якої бази даних - це не так зберігання даних або їх прийом, скільки віддача.
Правильно попросити її "віддати", що ми хочемо, щоб вона зробила це ефективно, не перевантажилася при цьому, і повернула саме ті дані, які були нам потрібні – це ми й намагатимемося навчитися робити в рамках цього курсу.
Створюємо демо-базу
Але, перш ніж говорити, як ми з бази щось візьмемо, треба спочатку ці дані в базі якось отримати.
«Щоб продати
прочитати щось непотрібне, потрібно спочатку купити
записати щось непотрібне, а в нас грошей
бази ні.»
майже кіт Матроскін, "Троє з Простоквашино"
Тому давайте почнемо зі створення найпростішої бази. А для того, щоб щось створити в SQL, нам необхідна команда CREATE - вона відповідає за створення SQL будь-якого типу об'єктів:
Але нас поки що цікавитимуть лише дві: CREATE DATABASE, щоб створити базу, і CREATE TABLE, щоб створити таблицю в ній:
CREATE DATABASE tst; CREATE TABLE tbl(k - ім'я поля integer - тип поля, v text);
Повну специфікацію цих команд я наводити не буду, вона доступна в документації за посиланнями вище і навіть російською, завдяки колегам з PostgresPro.
Зауважу лише, що при створенні таблиці нам треба заздалегідь визначити імена та типи полів – тобто формат записів, які там зберігатимуться – прямо відповідно до визначення реляційної бази даних.
Базовий синтаксис
Якщо раптом хтось не здогадався, то два мінуси в попередньому прикладі означають однорядковий коментар, прямо як "дві косі" у звичних мовах програмування на кшталт C або JavaScript, а багаторядковий так і зовсім виглядає так само.
-- це однорядковий коментар / * а це -- багаторядковий * / fld -- це поле / стовпець Fld -- це те саме поле FLD -- . і це - все воно ж (наводиться до lower case) "Fld" - а ось це - теж поле, але зовсім інше (лапки дають регістрозалежність) 'str' - це рядок 'st''r' - це рядок з одинарним апострофом E'st'' - . і це - вона ж $ $ st'r $ $ -. і навіть ось це $abcd$st'r$abcd$
І якщо ми торкнулися теми синтаксису, то тим, хто працював з іншими СУБД, деякі речі можуть бути незвичні.
По-перше, все поля реєстронезалежні – як би і де ви його не написали, воно буде приведено до нижнього регістру.Якщо ж вам хочеться вказати для поля «дивне» ім'я – наприклад, з пробілом, російською, китайською, або просто зберегти його регістр, то вказувати його треба скрізь у звичайних подвійних лапках - ніяких дивно на кшталт квадратних дужок чи зворотних апострофів.
Натомість, по-друге, звичайні рядкові літерали бувають як у апострофах, і у вигляді ескейп-послідовностей чи навіть «$-quoting-string».
Базові типи даних
Під час створення таблиці вище ми вказували імена полів та його типи. Якими можуть бути імена, ми вже обговорили, погляньмо тепер на те, якими можуть бути їхні типи.
Всі типи в PostgreSQL можна розділити на базові (числові, символьні, дати/часу та логічний тип) та розширені.
Числові типи
Числові типи в PostgreSQL визначаються своєю розрядністю: 2-, 4- і 8-байтні цілочисельні, 4- і 8-байтові зі змінною точністю (з плаваючою точкою) і numeric/decimal із зазначеною точністю (зберігається посимвольно).
Вибір між цілими типами досить простий: якщо всі очікувані значення в межах сотні, то не треба резервувати під них 8-байтовий bigint. Як правило, стандартного 4-байтового integer достатньо для більшості завдань.
numeric варто використовувати для різних "грошових" речей, де неприпустимо "втратити копійку на округленнях":
SELECT 3.1415926::real; -- 3.1415925 - трохи втратили SELECT 3.1415926::numeric; - 3.1415926 - а тут все чітко
Ще пара речей може викликати подив у людей з досвідом програмування:
- serial -псевдотипи (аналог AUTO_INCREMENT / IDENTITY з інших СУБД), які дозволяють визначити поля з автоматично формованим зростаючим значенням "за замовчуванням": 1, 2, 3, .
- ні unsigned - всі числові типи знакові, тому "чесно" покласти діапазон [0x00000000..0xFFFFFFFF] в integer не вийде, тільки зі зміщенням "наполовину"
Символьні типи
Символьні/рядкові типи представлені парою описаних у стандарті char/varchar та парою PostgreSQL-специфічних bpchar/text.
Якщо ви не припускаєте перенесення вашої програми на іншу СУБД, то можете спокійно використовувати тип скрізь, оскільки вказівка обмеження довжини не дає жодних бонусів. Звичайно, за винятком випадків, коли вам дійсно потрібно обмежити довжину записуваного в полі - наприклад, для 2-літерного коду країни.
Типи дати/часу
Дата та час у PostgreSQL, технічно, зберігаються як цілочисленні, зі значенням від POSTGRES_EPOCH (01.01.2000) у відповідних одиницях (мікросекундах чи добах):
У цьому їх відмінність від деяких інших СУБД, де timestamp може зберігатися як текстовий рядок.
А якщо це просто числа, то арифметичні операції над ними теж допустимі, у тому числі перетворення до Unix time (час від 01.01.1970):
SELECT '2024-01-01'::date - 1; -- 2023-12-31 - за день до SELECT '2024-01-01'::date - 8 * '1 hour'::interval; -- 2023-12-31 16:00:00 - за 8 годин до SELECT extract(epoch from '2024-01-01'::timestamp); -- 1704067200 - перетворили timestamp на double precision SELECT '1970-01-01 00:00:00'::timestamp + 1704067200 * '1 second'::interval; -- 2024-01-01 00:00:00 -- . і назад
Опціонально, в часовому значенні можна використовувати часовий пояс (with time zone) або вказувати точність, що зберігається (timestamp(0) означає зберігання "до секунд").
Логічний тип
Логічні значення представлені типом boolean:
Він може приймати значення TRUE/FALSE і, з урахуванням SQL-специфіки, значення NULL , як і будь-який інший тип.
Спеціальні типи даних
Крім базових типів, "з коробки" PostgreSQL надає масу інших, більш спеціалізованих типів:
двійкові дані, перерахування, геометричні, мережеві адреси, бітові рядки, вектор текстового пошуку, UUID, XML, JSON, масиви, діапазони
Наприклад, будь-які картографічні сервіси люблять використовувати геометричні типи даних з розширенням PostGIS, а слабоструктуровані дані можна зберігати в JSON, причому анітрохи не гірше якийсь MongoDB, а ідентифікатори в розподілених системах - в UUID.
Якщо раптом і цих типів виявиться мало - можна створити свій і працювати з ним як з будь-яким іншим полем. Головне, правильно його описати, задати відповідні функції введення-виведення, зберігання та обробки.
Взагалі, PostgreSQL дуже добре розширюємо, тому EXTENSION'и, які для нього можна знайти та підключити, становлять досить вагому частину його переваг щодо інших СУБД.
Базові SQL-команди (#2)
Давайте знову повернемось до нашої демо-бази і нарешті додамо туди хоч якісь дані.
INSERT
За додавання даних, за їх вставку в таблицю, SQL відповідає команда INSERT:
INSERT INTO tbl( -- куди вставлятимемо дані k -- імена полів , v ) VALUES -- перераховуємо рядки, що вставляються (1, '1st string') , (102, 'another string') , (3, NULL); - зовсім не ''
Ми вказуємо, в яку таблицю і в які поля повинні бути додані дані, і в найпростішій формі INSERT … VALUES прямо перераховуємо ті рядки, які хочемо вставити. Значення у яких позиційно відповідають зазначеним полям таблиці.
Та ось біда - рука у нас здригнулася, і замість "2" у нас вставилося "102", а третій рядок у нас вставився взагалі без даних у текстове поле ... Зауважу, що порожній рядок і NULL - зовсім різні значення.
UPDATE
Давайте ми ці дані виправимо. А за зміну якихось даних у SQL відповідає команда UPDATE:
UPDATE tbl SET k = k - 100 - правила зміни значень полів, v = '2nd string' WHERE k = 102; - Умова відбору рядків
У ній ми вказуємо, у якій таблиці (а таблиця - це ключовий момент роботи з SQL, і практично все, що доведеться робити, ми робитимемо саме з таблицею) і як ми хочемо змінити поля.
При цьому полів можна міняти одразу кілька. Тобто якщо в деяких імперативних мовах програмування деструкція об'єктів тільки займає своє місце в стандартах, то в SQL це було завжди - "у такого-то набору полів задай нові значення ось так-то".
І, додатково, описуємо умову, яку має відібрати лише ті рядки, для яких наша операція має відпрацювати. В даному випадку ми для рядка з k = 102 (зверніть увагу на одинарну рівність при порівнянні) хочемо змінити рядкове значення v на нове, а від значення k відняти 100 (присвоєння так само описується одинарним символом рівності).
DELETE
А останній рядок, в який у нас "просочився" NULL замість текстового рядка, нам взагалі не потрібний. Давайте її просто видалимо – для цього є команда DELETE:
DELETE FROM tbl WHERE v IS NULL;
Зверніть увагу, що з значеннями NULL не можна користуватися звичайними операторами типу "рівно"/"не рівно", для них є свої оператори IS . У даному випадку ми використовуємо IS NULL, щоб перевірити на збіг з значенням NULL.
NULL-логіка
Тому що базові оператори ( =, <>, NOT ) видають значення NULL якщо його має хоча б один з аргументів. А при наведенні типів в умові воно перетворюється на "брехню", і жодного запису ви не відберете.
Тому для порівнянь NULL і з ним (у конкретному полі або для всього рядка відразу) варто використовувати оператори IS/IS NOT або IS DISTINCT FROM/IS NOT DISTINCT FROM. Деякі речі не завжди очевидні, тому ось шпаргалка, якою можна користуватися:
. RETURNING
А якщо ми хотіли не просто видалити записи, але й дізнатися, які саме були видалені.
Щоб СУБД відповіла нам не просто.я вставила / оновила / видалила два рядки", а"я обробила два ось такі рядки", необхідно скористатися ключовим словом RETURNING та перерахувати ті поля, які ми хочемо побачити:
DELETE FROM tbl WHERE v IS NULL RETURNING *;
В даному випадку ми використовуємо "*", яка в SQL означає "всі поля". В даному випадку ми побачимо, що видаляється один рядок зі значенням 3 у полі k:
k | v integer | Text 3 |
SELECT
І, нарешті, ми можемо зробити те, заради чого ми базу і створювали - щось з неї взяти, обравши з нашої таблиці якісь записи.
Для цього скористаємося командою SELECT, про яку говорили раніше, знову ж таки, вказавши "*" замість списку полів:
І ми побачимо те, що залишилось у таблиці після всіх наших маніпуляцій:
k | v integer | Text 1 | 1st string 2 | 2nd string
Ми бачимо два рядки, які відповідають умові, яку ми задали для вибірки. Тільки щось жодної умови у запиті ми при цьому не бачимо. і це ми обговоримо на наступній лекції.
А поки що ви познайомилися з абсолютним мінімумом, який вам буде необхідний для роботи з SQL у PostgreSQL або в інших SQL-орієнтованих СУБД.