Короткий посібник з мови sql

Короткий посібник з мови SQL

Угоди про мову SQL і початкові поняття.

Ідентифікатори INFORMIX.

Ідентифікатор (ім'я об'єкта) - це слово, що складається з букв, цифр, і знаків підкреслення (_), що починається з букви або зна ка (_). У INFORMIX-4GL не розрізняються маленькі і великі бук- ви. Тому i_Un1023Tt і I_UN1023TT - одне і теж ім'я. Ім'я бази даних не довше 10. Імена інших об'єктів SQL - таблиць, стовпців, view (псевдотабліц). синонімів - не довше 18.

    * Групи оператори мови SQL *.

SQL містить 4 групи операторів: - Оператори опису даних: CREATE, DROP, ALTER і ін. - Оператори маніпуляції даними: INSERT, DELETE, SELECT, UPDATE і ін. - Оператори завдання прав доступу в базі даних: GRANT / REVOKE. LOCK / UNLOCK. SET LOCK MODE - Оператори захисту, відновлення даних та інші оператори. Їх оглядом ми зараз і займемося, по порядку.

    1. ОПЕРАТОРИ ОПИСУ ДАНИХ *.

Оператори опису даних призначені для опису (созда- ня), зміни опису та знищення об'єктів бази даних. У SQL розрізняються наступні види об'єктів: база даних (database); таблиця (table); стовпець (column); індекс (index); знімок (view); синонім (synonym). Кожен об'єкт має власне ім'я - ідентифікатор. Кожен об'єкт має власник - тобто того користувача, який його створив. Ім'я об'єкта можна уточнювати за допомогою імені його володів- ца (owner-name) в такій формі: moshkow.table1 Нижче наводяться приклади використання всіх операторів опису даних. Повний же їх синтаксис можна знайти в "Короткому довіднику по 4GL" (див. Додатки), або в "Довідковому посібнику з Informix-4GL". Створення бази даних. -------------------------------------------------- ------------- CREATE DATABASE zawod ---------------------------------- ----------------------------- У будь-який момент часу ви можете мати доступ до об'єктами толь до однієї - ПОТОЧНОГО (CURRENT) - бази даних. Оператор DATABASE робить нову базу поточної, закриваючи при цьому доступ до об'єктів попередньої поточної бази. Оператор CLOSE DATABASE просто закри- кість поточну базу даних. -------------------------------------------------- ------------- DATABASE zawod. # Поточної є база zawod DATABASE stanciq. # Поточної є база stanciq CLOSE DATABASE # поточної бази немає --------------------------------------- ------------------------ Створюються таблиці kadry і ceh, що містять стовпці різних типів. -------------------------------------------------- ------------- CREATE TABLE kadry (nomerceh INT, tabnom SERIAL. fio CHAR (20) UNIQUE, zarplata MONEY (16,2), datarovd DATE, pribytie DATETIME year TO minute) CREATE TABLE ceh (nomerceh int, nameceh char (20)) ---------------------------------------- ----------------------- В уже існуючої таблиці ми можемо поміняти тип стовпця, доба- вити новий, знищити старий. -------------------------------------------------- ------------- ALTER TABLE kadry ADD (dolvnostx CHAR (20) BEFORE zarplata), DROP (pribytie), ADD CONSTRAINT UNIQUE (tabnom, fio) CONSTRAINT tabnomfio ALTER TABLE items MODIFY (manu_code char ( 4)) ----------------------------------------------- ---------------- Зміна структури таблиці призводить до фізичного перетворень нию даних в ній. Якщо змінений тип стовпця, то дані в ньому перетворюються до нового типу, і якщо це неможливо здійснити, то оператор ALTER "валиться" з кодом помилки, а таблиця залишається в незмінному стані. View - "псевдо" таблиця, базується на існуючих таблицях. -------------------------------------------------- ------------- CREATE VIEW poor AS SELECT tabnom, fio, datarovd FROM kadry WHERE zarplata = вираженіе2, і т.п. а так же елементарних порівнянь спеціального виду: column-name IS [NOT] NULL висловлю [NOT] BETWEEN вираж1 AND вираж2 висловлю [NOT] IN (вираж1. [.]) Можна з'ясувати, чи підходить символьний рядок під певний шаблон, чи ні. Для цього використовуються дві операції порівняння за шаблоном - LIKE і MATCHES. симв-вираз MATCHES "шаблон" симв-вираз LIKE "шаблон" LIKE має більш простий шаблон. У ньому використовуються тільки два спецсимволи: (%) заміщає будь-яку кількість символів, (_) заміщає рівно один символ. Всі інші символи в шаблоні позначають самі себе. Якщо ми хочемо включити в шаблон% або _ скасувавши їх спеціальний сенс, то перед ними треба поставити ESC- символ (за замовчуванням це (\)). Припустимо нам потрібно вибрати з таблиці tab8 всі рядки, в кото яких символьний стовпець string1 містить символ "+" а предпос- Ледньов буква в ньому - "И". Оператор вибірки буде виглядати так: -------------------------------------------- ------------------- SELECT * FROM tab8 WHERE string1 LIKE "% +% И_" ------------------ --------------------------------------------- MATCHES використовує такі спецсимволи шаблону : *,? , [,], ^, -. * Замінює будь-яку кількість символів. замінює один будь-який символ [. ] Замінює один символ з перерахованих в дужках можливо вказівку від і до (-), і не (^) [abH] - будь-який із символів a, b, H [^ dz] - будь-який символ, крім d, e, f, g . y, z \ скасовує спецсмисл спецсимволов *. [,] Якщо ви хочете скористатися спецсимволами як звичайними, застосуєте escape-char. Якщо escape-char = "", то \? позначає просто символ. \ * Позначає просто символ *, \\ позначає просто символ \. Зате знак лапки ( ") всередині шаблону потрібно позначати двома лапками (" "). Вибрати всі дані про замовників в назві компанії яких друга буква не лежить в інтервалі від G до L, а третя буква c. (До речі, коди українських літер на Бест йдуть підряд, але на відміну від латинських букв, українці не алфавітний.) --------------------------------- ------------------------------ SELECT * FROM customer WHERE company MATCES "? [^ GL] c *" ---- -------------------------------------------------- --------- Вибрати всі дані про замовників в назві компанії яких присутній знак питання. ---------------------------- ----------------------------------- SE LECT * FROM customer WHERE company MATCHES "* Я? *" ESCAPE "Я" --------------------------------- ------------------------------ В даному прикладі використовувався ESC-символ "Я" для скасування спецс- думок символу "?" Якщо в ви хочете. Порівняти вираз з результатом іншого SELECT оператора висловлю? сравн (SELECT-statement) ?. Визначити, чи належить вираз результатами іншого SELECT оператора. висловлю? [NOT] IN (SELECT-statement) ?. З'ясувати, чи вибрав хоч що-небудь інший SELECT оператор. ? [NOT] EXISTS (SELECT-statement)? то застосовуйте умови з підзапитом.

    * УМОВИ З підзапитів *

--------------------------------------------------------------- SELECT fio FROM kadry WHERE zarplata = (SELECT MAX (zarplata) FROM kadry) ---------------------------------- ----------------------------- Тут підзапит повертає єдине значення - максимальне значення зарплати. А зовнішній SELECT оператор знаходить прізвища володарів оной. -------------------------------------------------- ------------- SELECT fio, shifr, organizaciq FROM zaqwki WHERE denxgi_rek is not NULL and gorod in (SELECT gorod FROM regiony WHERE region = "Урал") --------- -------------------------------------------------- ---- Тут запит виводить дані про керівників, які отримали финан- сірованіе і працюють на Уралі. -------------------------------------------------- ------------- SELECT order_num, stock_num, manu_code, total_price FROM items x WHERE total_price> (SELECT 2 * MIN (total_price) FROM items WHERE order_num = x.order_num) ------ -------------------------------------------------- ------- Цей запит (використовуючи пов'язаний підзапит) виводить список всіх виробів, чия загальна ціна не менше ніж в два рази перевершує ми- мінімальними ціну виробів перерахованих в цьому ж ордері. Ви можете поєднувати будь-яку кількість вищеперелічених умов разом, використовуючи логічні оператори NOT, AND, OR.

    оператор UNLOAD

Оператор UNLOAD скидає дані з таблиці в файл в друкованому поданні. Кожен рядок перетвориться в окрему запис, значення з стовпців поділяються символом "|". Після виконання оператора ----------------------------------------------- ---------------- UNLOAD TO "kadry19.unl" SELECT * FROM kadry ----------------------- ---------------------------------------- в файлі kadry19.unl можна буде знайти наступне: -------------------------------------------------- ------------- 5 | 5 | Туєв | завгосп | 100.0 | 31.12.1946 | 4 | 6 | Петунін | комірник | 80.0 ||. -------------------------------------------------- -------------

    оператор LOAD

Оператор LOAD виконує зворотну операцію - зчитує рядки з файлу і вставляє їх в таблицю. Природно, що типи і кількість значень в рядках файлу повинні відповідати стовпцях таблиці. -------------------------------------------------- ------------- LOAD FROM "kadry20.unl" INSERT INTO kadry --------------------------- ------------------------------------

    * 5. ЗНОВУ ОПЕРАТОР SELECT *.

    Пропозиції INTO, INTO TEMP, FROM.

Вибрати всі рядки (немає пропозиції WHERE) з таблиці kadry, взяти в них все стовпчики (замість перерахування стовпців варто *), залишити тільки різні рядки (ключове слово UNIQUE) і по- местить результат в тимчасову таблицю (INTO TEMP) x, яка буде при цьому створена з такими ж стовпчиками, що і у kadry. -------------------------------------------------- ------------- SELECT UNIQUE * FROM kadry INTO TEMP x ----------------------------- ---------------------------------- Вибирати можна з декількох таблиць. При цьому беруться всі можливі комбінації рядків з першої таблиці з другої. Припустити жим, що таблиці tab1 6 рядків а в tab2 - 7 рядків. Результат ні- жепріведенного прикладу - таблиця, яка містить три стовпці і 7 * 6 = 42 рядки. -------------------------------------------------- ------------- SELECT tab1.a-tab2.b, tab1.a, tab2.b FROM tab1, tab2 ----------------- ---------------------------------------------- Ми зараз не будемо уточнювати, куди саме результуюча таблиця поміщається. Але використовувати її можна по різному: її можна пе- регнать (INTO TEMP) в тимчасову таблицю, її можна віддати на обробку іншого оператора (якщо вибірку здійснював подзап- рос), для неї можна створити курсор ( "буфер" з покажчиком на те- кущую рядок), а можна покласти її (INTO) в просту програмну змінну (якщо обрано не більше одного рядка). Вибрані рядки можна впорядкувати по зростанню (зменшенням) значення в стовпці (стовпцях) ----------------------------------- ---------------------------- SELECT a, b, c, d + e FROM tabl ORDER BY b, c SELECT a, b, c, d + e FROM tabl ORDER BY 2,3 -------------------------------------- ------------------------- в ORDER BY пропозиції замість імені стовпця можна вказувати його порядковий номер у списку вибірки (select-list). Вишепріведен- ні оператори еквівалентні. Помістити значення з стовпців в змінні: (Оскільки lname використовується і як ім'я змінної, і як ім'я стовпця, то ім'я стовпця передує знаком (@) --------------------- ------------------------------------------ SELECT customer_num, @ lname, city INTO cnum, lname, town FROM customer ------------------------------------------- --------------------

    Агрегатні функції.

До обраним рядках можна застосовувати агрегатні функції COUNT (*) - кількість, MAX (column) і MIN (column) - максимальне і міні мальное значення в стовпці, SUM (column) - сума всіх значень в стовпці, AVG (column) - середнє значення в стовпці. Помістити в змінну num кількість рядків в таблиці orders, в яких стовпець customer_num дорівнює 101: --------------------------------- ------------------------------ SELECT COUNT (*) INTO num FROM orders WHERE customer_num = 101 ------- -------------------------------------------------- ------ Приклад з використанням з'єднання таблиць. Знаходиться середнє значення зарплати перевищує 300 (стовпець zarplata принадле- жит однієї з таблиць), за умови збігу стовпців dolvnost в двох таблицях. -------------------------------------------------- ------------- SELECT AVG (zarplata) FROM table1, table2 WHERE table1.dolvnost = table2.dolvnost and zarplata> 300 ---------------- -----------------------------------------------

    Угруповання GROUP BY.

Угруповання використовується для для "сплющивания" групи (рядків) в одну. Результат запиту містить один рядок для кожного безлічі рядків, що задовольняють WHERE пропозицією і містять одне і те ж значення в зазначеному стовпці. -------------------------------------------------- ------------- SELECT dolvnostx, COUNT (*), AVG (zarplata) FROM kadry GROUP BY dolvnostx -------------------- ------------------------------------------- Отримати кількість працюючих і їх середню зарплату по кожній посаді з штатного розкладу. -------------------------------------------------- ------------- SELECT dolvnostx, COUNT (*), AVG (zarplata) FROM kadry GROUP BY 1 -------------------- ------------------------------------------- Еквівалентна запис. Пропозиція HAVING накладає додаткові умови на групу. -------------------------------------------------- ------------- SELECT order_num, AVG (total_priece) FROM items GROUP BY order_num HAVING COUNT (*)> 2 ------------------ --------------------------------------------- Цей запит повертає номера ордерів і середнє значення total_price в заявках для всіх ордерів, що мають не менше двох заявок.

    Зовнішнє з'єднання таблиць.

Рядки з таблиці, приєднаної зовнішнім чином (на зовнішнє з'єднання вказує ключове слово OUTER) будуть вибиратися не дивлячись на те, задовольняють вони умовам WHERE пропозиції чи ні. У деяких випадках це корисно, коли у вас є головна таблиця і є допоміжна, і дані з головної таблиці вам потрібно отримати в будь-якому випадку. Приклад зовнішнього з'єднання: ---------------------------------------------- ----------------- SELECT company, order_num FROM customer c, OUTER orders o WHERE c.customer_num = o.customer_num -------------- ------------------------------------------------- Запит знаходить назви компаній і номера ордерів, які вони послали. Якщо ж компанія ордерів не присилає, то її назва все одно буде вибрано, а номер ордера в цьому рядку буде ра- вен NULL. (А якщо б ми запустили запит без параметра OUTER, то назви цих компаній взагалі б не потрапили у вибірку.)