Ідентифікатор (ім'я об'єкта) - це слово, що складається з букв, цифр, і знаків підкреслення (_), що починається з букви або знака (_). У INFORMIX-4GL не розрізняються маленькі і великі літери. Тому i_Un1023Tt і I_UN1023TT - одне і теж ім'я.
Ім'я бази даних не довше 10.
Імена інших об'єктів SQL - таблиць, стовпців, view (псевдотабліц). синонімів - не довше 18.
Оператори опису даних призначені для опису (створення), зміни опису та знищення об'єктів бази даних.
У SQL розрізняються наступні види об'єктів:
Кожен об'єкт має власне ім'я - ідентифікатор. Кожен об'єкт має власника - тобто того користувача, який його створив. Ім'я об'єкта можна уточнювати за допомогою імені його власника (owner-name) в такій формі: moshkow.table1
Нижче наводяться приклади використання всіх операторів опису даних. Повний же їх синтаксис можна знайти в "Короткому довіднику по 4GL", або в "Довідковому посібнику з INFORMIX-4GL".
Створення бази даних.
У будь-який момент часу ви можете мати доступ до об'єктами тільки однієї - ПОТОЧНОГО (CURRENT) - бази даних. Оператор DATABASE робить нову базу поточної, закриваючи при цьому доступ до об'єктів попередньої поточної бази. Оператор CLOSE DATABASE просто закриває поточну базу даних.
Створюються таблиці kadry і ceh, що містять стовпці різних типів.
У вже існуючої таблиці ми можемо поміняти тип стовпця, додати новий, знищити старий.
Зміна структури таблиці призводить до фізичного перетворення даних в ній. Якщо змінений тип стовпця, то дані в ньому перетворюються до нового типу, і якщо це неможливо здійснити, то оператор ALTER "валиться" з кодом помилки, а таблиця залишається в незмінному стані.
View - "псевдо" таблиця, базується на існуючих таблицях.
Поводиться точно так само, як справжня таблиця, тільки місце на диску під неї не відводяться, оскільки дані, що лежать в ній насправді зберігаються в таблиці, на якій це view базується.
Індекс - додаткова структура до стовпців таблиці, потрібен для прискорення пошуку значень в стовпці.
Ми можемо фізично впорядкувати таблицю відповідно до індексу. У кластерізованний таблиці SELECT працює швидше.
Імена стовпців в різних таблицях можуть збігатися. Якщо в будь-якому операторі SQL згадуються два стовпці з однаковими назвами, то їх потрібно уточнювати іменами таблиць, їх містять. Перед ім'ям будь-якого об'єкта можна (а іноді і необхідно) вказати ім'я його власника (owner-name) - вхідне ім'я користувача, який створив (CREATE) цей об'єкт.
Синонім для імені таблиці використовується для скорочення запису.
Тепер всюди можна (хоча і не обов'язково) замість імені petrow.sostoqnie_postow використовувати ім'я t1.
База даних може мати системний журнал транзакцій (logfile).
Якщо немає журналу транзакцій для всієї бази даних, то для окремих таблиць в базі з тією ж метою можна створити audit trail.
Природно, що будь-який створений в базі даних об'єкт можна знищити. Треба тільки пам'ятати, що оператори опису даних не відкочуються назад, а тому якщо ви знищили таблицю, або базу даних то знайте, що це назавжди.
Якщо ваш оператор намагається записати в блокований іншим користувачем рядок, то оператор "звалюється". Ви можете встановити для своєї програми режим "Чекати розблокування рядків".
У базі даних, яка не має системного журналу неможливе виконання транзакцій і відновлення до поточної контрольної точки.
Оскільки за все хороше доводиться платити, наявність системного журналу у бази даних викликає помітне зростання накладних витрат і уповільнення роботи запитів. До того ж при активній роботі з базою системний журнал швидко "розпухає". За ним потрібно стежити і періодично чистити.
Вказати базі новий системний журнал.
Відновлюють зруйновану (наприклад через збій обладнання) базу даних так:
У середовищі UNIX
Якщо під час транзакції програма "звалилася" то INFORMIX автоматично зробить відкатку.
В результаті зі списків будуть викреслені працівники 4-го цеху "Петров", "Іванов", "Сидоров" і т.п Як бачимо, INFORMIX надає націоналістично стурбованим керівникам потужні засоби для втілення в життя своїх ідей.
А цей оператор знищить ВСЕ рядки в таблиці kadry, власником якої є moshkow, але не саму таблицю
Найпростіша форма оператора SELECT.
Третій приклад вибирає прізвища працівників з таблиці кадри, а назви цехів, в яких вони працюють, з таблиці ceh.
Якщо ми хочемо, щоб при вставлянні рядки в стовпець типу SERIAL автоматично заносилося чергове значення лічильника, потрібно вставляти в цей стовпець константу 0. Якщо не в усі стовпці вставляється рядки вноситься значення (як це зроблено в третьому операторі), то незаповнені стовпці заповнюються значенням NULL .
У таблиці ceh в цехах номер 3,4,5 а так само в токарному і ливарному перші чотири символи в коді цеху будуть замінені на подстроку поля nameceh з тієї ж рядки.
Пропозиція WHERE може бути присутнім в будь-якому з операторів DELETE, UPDATE, SELECT, коли потрібно задати умови на рядки, які потрібно обробити (відповідно, знищити, змінити або вибрати). Розглянемо структуру та приклади використання пропозицій WHERE.
У реченні WHERE пишеться логічне умова, яке виходить з'єднанням за допомогою логічних операторів AND, OR і NOT елементарних порівнянь типу:
а так же елементарних порівнянь спеціального виду:
Можна з'ясувати, чи підходить символьний рядок під певний шаблон, чи ні. Для цього використовуються дві операції порівняння за шаблоном - LIKE і MATCHES.
LIKE має більш простий шаблон. У ньому використовуються тільки два спецсимволи: (%) заміщає будь-яку кількість символів, (_) заміщає рівно один символ. Всі інші символи в шаблоні позначають самі себе. Якщо ми хочемо включити в шаблон% або _ скасувавши їх спеціальний сенс, то перед ними треба поставити ESC-символ (за замовчуванням це (\)).
Припустимо нам потрібно вибрати з таблиці tab8 всі рядки, в яких символьний стовпець string1 містить символ "+" а передостання буква в ньому - "И". Оператор вибірки буде виглядати так:
MATCHES використовує такі спецсимволи шаблону: *. [,], ^, -.
Якщо ви хочете скористатися спецсимволами як звичайними, застосуєте escape-char. Якщо escape-char = "", то \? позначає просто символ. \ * Позначає просто символ *, \\ позначає просто символ \. Зате знак лапки ( ") всередині шаблону потрібно позначати двома лапками (" ").
Вибрати всі дані про замовників в назві компанії яких друга буква не лежить в інтервалі від G до L, а третя буква c. (До речі, коди російських букв на Бест йдуть підряд, але на відміну від латинських букв, росіяни не впорядковані за алфавітом.)
Вибрати всі дані про замовників в назві компанії яких присутній знак питання.
В даному прикладі використовувався ESC-символ "Я" для скасування спецсмисла символу "?".
то застосовуйте умови з підзапитом.
Тут підзапит повертає єдине значення - максимальне значення зарплати. А зовнішній SELECT оператор знаходить прізвища володарів оной.
Тут запит виводить дані про керівників, які отримали фінансування і працюють на Уралі.
Цей запит (використовуючи пов'язаний підзапит) виводить список всіх виробів, чия загальна ціна не менше ніж в два рази перевершує мінімальну ціну виробів перерахованих в цьому ж ордері.
Ви можете поєднувати будь-яку кількість вищеперелічених умов разом, використовуючи логічні оператори NOT, AND, OR.
Оператор UNLOAD скидає дані з таблиці в файл в друкованому поданні. Кожен рядок перетвориться в окрему запис, значення з стовпців поділяються символом "|".
Після виконання оператора
в файлі kadry19.unl можна буде знайти наступне:
Пропозиції INTO, INTO TEMP, FROM.
Вибирати можна з декількох таблиць. При цьому беруться всі можливі комбінації рядків з першої таблиці з другої. Припустимо, що таблиці tab1 6 рядків а в tab2 - 7 рядків. Результат нижченаведеного прикладу - таблиця, яка містить три стовпці і 7 * 6 = 42 рядки.
Ми зараз не будемо уточнювати, куди саме результуюча таблиця поміщається. Але використовувати її можна по різному: її можна перегнати (INTO TEMP) в тимчасову таблицю, її можна віддати на обробку іншого оператора (якщо вибірку здійснював підзапит), для неї можна створити курсор ( "буфер" з покажчиком на поточний рядок), а можна покласти її (INTO) в просту програмну змінну (якщо обрано не більше одного рядка).
Вибрані рядки можна впорядкувати по зростанню (зменшенням) значення в стовпці (стовпцях)
У ORDER BY пропозиції замість імені стовпця можна вказувати його порядковий номер у списку вибірки (select-list). Вищенаведені оператори еквівалентні.
Помістити значення з стовпців в змінні: (Оскільки lname використовується і як ім'я змінної, і як ім'я стовпця, то ім'я стовпця передує знаком (@)
До обраним рядках можна застосовувати агрегатні функції COUNT (*) - кількість, MAX (column) і MIN (column) - максимальне і мінімальне значення в стовпці, SUM (column) - сума всіх значень в стовпці, AVG (column) - середнє значення в стовпці.
Помістити в змінну num кількість рядків в таблиці orders, в яких стовпець customer_num дорівнює 101:
Приклад з використанням з'єднання таблиць. Знаходиться середнє значення зарплати перевищує 300 (стовпець zarplata належить одній з таблиць), за умови збігу стовпців dolvnost в двох таблицях.
Отримати кількість працюючих і їх середню зарплату по кожній посаді з штатного розкладу.
Еквівалентна запис.
Пропозиція HAVING накладає додаткові умови на групу.
Цей запит повертає номера ордерів і середнє значення total_price в заявках для всіх ордерів, що мають не менше двох заявок.
Зовнішнє з'єднання таблиць.
Запит знаходить назви компаній і номера ордерів, які вони послали. Якщо ж компанія ордерів не присилає, то її назва все одно буде вибрано, а номер ордера в цьому рядку буде дорівнює NULL. (А якщо б ми запустили запит без параметра OUTER, то назви цих компаній взагалі б не потрапили у вибірку.)
Оператори маніпуляції даними - найпотужніша складова SQL.
Наступний приклад ліквідує однакові рядки в таблиці kadry.
Наступний приклад змінює інформацію в рядках за значенням ключа:
Ту ж саму операцію можна виконати за допомогою одного оператора UPDATE, що використовує підзапит:
Приклад змінює інформацію в рядках за значенням ключа при виконанні умов. накладених на змінювані рядки: