Процесори :: Дънни платки :: Видео :: Мултимедия :: Носители :: Периферия
Комуникации :: Софтуер :: Технологии :: Links & Downloads :: Форум
 
 
Въведение в SQL
       

SQL (Structured Query Language - структурен език за заявки) е основната технология за обработка на бази данни. Практически всяко средство за разработка на бази данни поддържа SQL. Delphi и Visual Studio също предоставят компоненти за обработка на бази данни чрез SQL. На практика всяка една база данни се контролира чрез SQL. Той определя какво да бъде изведено от базата, а не как да се осъществи това, което го прави платформено-независим. Макар различните реализации да имат определени различия, в основата си всички реализации на SQL са еднакви, така че чрез него могат еднакво добре да се обработват бази данни в Microsoft Access и в Оracle; както и в още много други приложения. Той прави възможно и създаването на собствени приложения за работа с бази данни, създадени чрез някой от гореспоменаите продукти. Като най-разпространено средсвто за обработка на бази данни, той е задължителен за всеки, който иска сериозно да се занимава с бази данни, независимо дали ще ползва готови продукти за обработката им или ще разработва приложения за работа с бази данни

- Някои основни неща за SQL

Всяка база данни се състои от таблици, всяка от които има име. Всяка таблица се състои от отделни колони; всяка колона има име. В основата на обработката на бази данни е извеждането на определена информация от определени колони на определени таблици. Нека разгледаме една таблица:

Books
title format language size
Thinking in C++ HTML english 1 033KB
Using Visual C++ 4.2 HTML english 364 KB
Learn Visual Basic 6 DOC english 1 405KB
CGI Programming 101 PDF english 188 KB
Inprise MIDAS DOC russian 383 KB

Това е една малка таблица - в практиката може да се сблъскате с таблици със десетки колони и хиляди редове. Но за целите на това ръководство тя е подходяща. И така - в основата на обработката на базите данни е заявката. Тя може да е за извеждане на информация, за промяна на информацията или друга. Всяка команда в SQL е заявка. А основната заявка е за избор на информация за обработка.

Основната и най-често срещана команда в SQL е SELECT. Тя определя условието, по което се определя каква информация да бъде изведена. Нашата таблица се казва books и има 4 колони - title (заглавие), format, language (език) и size (размер). Можем да изведем цялата таблица, като използваме следната команда:

SELECT * FROM books

Но много по-често ни трябват определени колони. Ако не ни интересува нито формата, нито размера на книгата? Тогава използваме командата

SELECT title, language FROM books

Резултатът е следната таблица:
title language
Thinking in C++ english
Using Visual C++ 4.2 english
Learn Visual Basic 6 english
CGI Programming 101 english
Inprise MIDAS russian

Това ни показва базовия синтаксис на командата SELECT. Тя има много повече възможности, но най-важното и задължително за да бъде използване, е:

SELECT rows FROM table

Какво се получава, ако трябва да изведем всички книги, които са на английски език? SELECT ни дава възможност да извеждаме само редове, отговарящи на определено условие. В случая условието е в колоната language на съответния ред да е вписано english. Можем да го направим със следната команда:

SELECT * FROM books WHERE language = 'english'

- Използване на WHERE

WHERE предоставя множество възможности. Освен равенството, той ви позволява да използвате всички оператори за сравнение:

!= или <> за различно от
>= за по-голямо или равно
<= за по-малко или равно
> за по-голямо
< за по-малко

WHERE успешно сравнява думи, като използва ASCII кода на символите. Трябва да имате предвид обаче, че макар и самите команди в SQL да не са чуствителни към главни/редовни букви (тук са дадени с главни но това не е задължително), имената на колоните, таблиците, както и стойностите в техните полета са. Т.е. командата SELECT * FROM books WHERE language = 'English' няма да изведе нищо

Едно от големите предимства на командата WHERE е възможността на използването на логически оператори AND и OR за определяне на повече от едно условие. Нека приемем, че трябва да изведете заглавието на всички книги, които са на английски и са в HTML формат:

SELECT title FROM books WHERE language = 'english' AND format = 'HTML'

Резултатът е:
Thinking in C++
Using Visual C++ 4.2

- Използване на аритметика и LIKE, преименуване на колони

За целите на по-нататъчното ни обучение ще използваме една по-голяма таблица:

inventory
title language format subject size archived
CGI Developer's Guide english HTML Perl 1268 243
Codebook 1 english DOC Game Maker 418 39
CPP russian DOC C++ 2397 405
Database Developer's Guide width Visual C++ 4 english HTML Visual C++ 2579 436
Database in VB5 in 21 days english HTML Visual Basic 2219 381
GLspecification 1.4 english PDF OpenGl 1850 984
HTML Cource english PDF HTML 1307 1155
Learn Visual Basic 6 english DOC Visual Basic 25029 1405
Programming in Java russian HTML Java 1283 527
Programming in VB5 english HTML Visual Basic 1013 584
Programming Perl english HTML Perl 2682 683
Teach Yourself Java 1.1 Programming english HTML Java 815 195
Teach yourself Borland Delphi 4 english HTML Delphi 1943 432
Teach yourself Internet Game Programming with Java english HTML Java 1148 275
Teach yourself Visual J++ english HTML Visual J++ 4043 2788
Thinking in C++ english HTML C++ 8256 1033
Using Visual C++ 4.2 english HTML Visual C++ 1699 364
Learn Visual C++ english HTML Visual C++ 676 412
Visual C++ in 12 Easy Lessons english HTML Visual C++ 1679 687
Visual Basic 5 Night School english HTML Visual Basic 1903 374


SQL съдържа всички аритметични оператори. Преди да разберем как и за какво се използват, нека видим кои са:

+ събиране
- изваждане
* умножение
/ деление
% остатък от делението

Първото и най-очевидно място за използване на аритметика е в клаузата WHERE. Нека предположим че трябва да изведем всички книги, заедно с формата им, за които архива е не-повече от 20% от оригиналния размер. Как ще изглежда заявката?

SELECT title, format, size, archived
FROM inventory
WHERE size*20/100 <= archive

Резултатът е следната таблица:
title format size archived
CGI Developer's Guide HTML 1268 243
Codebook 1 DOC 418 39
CPP DOC 2397 405
Database Developer's Guide width Visual C++ 4 HTML 2579 436
Database in VB5 in 21 days HTML 2219 381
Learn Visual Basic 6 DOC 25029 1405
Thinking in C++ HTML 8256 1033
Visual Basic 5 Night School HTML 1903 374

Но защо да не покажем в таблицата, какъв процент е архива от оригиналния размер. Как? Тук идва второто приложение на аритметиката - в клаузата SELECT. Там можем да създаваме нови колони, на базата на вече съществуващите. Това са виртуални колони, които не се запазват в базата данни, но могат да ни бъдат полезни. Ето как се използва аритметика в клаузата SELECT:

SELECT title, format, archived/size*100
FROM inventory
WHERE archived/size*100 <= 20

Резултатът е следната таблица:
title format archived/size*100
CGI Developer's Guide HTML 19
Codebook 1 DOC 19
CPP DOC 9
Database Developer's Guide width Visual C++ 4 HTML 17
Database in VB5 in 21 days HTML 17
Learn Visual Basic 6 DOC 6
Thinking in C++ HTML 13
Visual Basic 5 Night School HTML 20

Тук възниква въпроса не може ли да се преименува колоната. И тук е мястото, в което трябва да споменем за няколко от основните свойства на командата SELECT. На първо място, колоните се извеждат в този ред, в който са определени в клаузата SELECT, а не в реда, вкойто са дефинирани в таблицата. Така бихме могли да изведем първо размера, а после формата. Името на всяка колона може да бъде сменено за конкретната таблица, като просто след колоната се напише новото име (в някои реализации на SQL се слага знак = между двете. Така можем да направим нашата таблица по-разбираема, просто като напишем

SELECT title, format, archived/size*100 ratio
FROM inventory
WHERE archived/size*100 <= 20
title format ratio
CGI Developer's Guide HTML 19
Codebook 1 DOC 19
CPP DOC 9
Database Developer's Guide width Visual C++ 4 HTML 17
Database in VB5 in 21 days HTML 17
Learn Visual Basic 6 DOC 6
Thinking in C++ HTML 13
Visual Basic 5 Night School HTML 20

Ще разгледаме още един елемент от клаузата WHERE. Какво ще стане, ако трябва да изведем всички книги, отнасящи се до Visual Studio? Бихме могли да напишем:

SELECT * FROM inventory
WHERE subject = 'Visual C++'
OR subject = 'Visual Basic'
OR subject = 'Visual J++'

В много случаи обаче подобен подход е нерационален. Вместо това напомощтани идва операторът LIKE. Чрез него могат да бъдат избрани всички елементи, съдържащи даден елемент. В оператора LIKE могат да се използват символите _, който обозначава един произволен символ, и %, обозначаващ произволно количество произволни символи. Така нашата заявка ще бъде:

SELECT * FROM inventory
WHERE subject LIKE 'Visual%'

Това ще изведе всеки запис, за който полето subject започва с Visual. Ако искаме да изведем книгите, отнасящи се за Visual C++ или Visual J++ можем да напишем:

SELECT * FROM inventory
WHERE subject LIKE 'Visual _++'

- Основни функцииЗа целите на по-нататъчните ни упражнения ще използваме следните две таблици:

programbooks
title language format subject size
CGI Developer's Guide english HTML Perl 243
Codebook 1 english DOC Game Maker 39
CPP russian DOC C++ 405
Database Developer's Guide width Visual C++ 4 english HTML Visual C++ 436
Database in VB5 in 21 days english HTML Visual Basic 381
GLspecification 1.4 english PDF OpenGl 984
Learn Visual Basic 6 english DOC Visual Basic 1405
Learn Visual C++ english HTML Visual C++ 412
Programming in Java russian HTML Java 527
Programming in VB5 english HTML Visual Basic 584
Programming Perl english HTML Perl 683
Teach yourself Borland Delphi 4 english HTML Delphi 432
Teach yourself Internet Game Programming with Java english HTML Java 275
Teach Yourself Java 1.1 Programming english HTML Java 195
Teach yourself Visual J++ english HTML Visual J++ 2788
Thinking in C++ english HTML C++ 1033
Using Visual C++ 4.2 english HTML Visual C++ 364
Visual Basic 5 Night School english HTML Visual Basic 374
Visual C++ in 12 Easy Lessons english HTML Visual C++ 687

webbooks
title language format subject size
Barebones english HTML HTML 24
CGI Developer's Guide english HTML Perl 243
Complete Itiot's Guide to JavaScript english HTML JavaScript 228
DHTML(small) english HTML HTML 272
HTML Course english PDF HTML 1 155
HTMLTutor bulgarian EXE HTML 1 147
HTML Tutorial english HTML HTML 30
Programming in Java russian HTML Java 527
Programming Perl english HTML Perl 683
Teach Yourself Java 1.1 Programming english HTML Java 195
Teach yourself Internet Game Programming with Java english HTML Java 275
Writing HTML english HTML HTML 1 520

= UNION и UNION ALL

UNION връща резултата от две заявки без повтарящите се полета. UNION ALL връща резултата от двете заявки, включително и повтарящите се полета
Пример:

SELECT title FROM programbooks
UNION
SELECT title FROM webbooks

Резултатът е следния:
title
CGI Developer's Guide
Codebook1
CPP
Database Developer's Guide with Visual C++ 4
Database in VB5 in 21 days
GLSpecification 1.4
Learn Visual Basic 6
Learn Visual C++
Programming in Java
Programming in VB5
Programming Perl
Teach yourself Borland Delphi 4
Teach yourself Internet Game Programming with Java
Teach yourself Java1.1 Programming
Teach yourself Visual J++
Thinking in C++
Using Visual C++ 4.2
Visual Basic 5 Night School
Visual C++ in 12 Easy Lessons
Barebones
Complete Idiot's Guide to JavaScript
DHTML(small)
HTML Course
HTMLTutor
HTML Tutorial
Writing HTML

= INTERSECT

INTERSECT връща само записите, намерени и при двете заявки.
Пример:

SELECT * FROM programbooks
INTERSECT
SELECT * FROM webbooks

Резултатът е:
title language format subject size
CGI Developer's Guide english HTML Perl 243
Programming in Java russian HTML Java 527
Programming Perl english HTML Perl 683
Teach Yourself Java 1.1 Programming english HTML Java 195
Teach yourself Internet Game Programming with Java english HTML Java 275

= MINUS

MINUS връща записите от първата заявка, които не са намерени при втората
Пример:

SELECT * FROM webbooks
MINUS
SELECT * FROM programbooks

Резултатът е:
title language format subject size
Barebones english HTML HTML 24
Complete Itiot's Guide to JavaScript english HTML JavaScript 228
DHTML(small) english HTML HTML 272
HTML Course english PDF HTML 1 155
HTMLTutor bulgarian EXE HTML 1 147
HTML Tutorial english HTML HTML 30
Writing HTML english HTML HTML 1 520

= SUM

SUM Връща сумата от всички стойности в колоната. Тя може да се прилага само върху колони, съдържащи числа.
Пример:

SELECT SUM(size) FROM programbooks

Резултатът е:
12247

= AVG

Тази функция връща средно аритметичното от стойностите в колоната. Може да се използва само с колони, съдържащи числови стойности
Пример:

SELECT AVG(size) FROM programbooks

Резултатът е
644,578947

= MAX

За разлика от предишните функции, тази може да работи и със символни низове. Тя връща най-големия елемент от колоната. Когато става въпрос за символен низ - връща последния в азбучен ред
Пример

SELECT MAX(size) FROM programbooks

Резултатът е:
2788

= MIN

Тази функция връща най-малкия елемент от колоната. Както и предишната, тя може да работи и със символни низове
Пример

SELECT MIN(size) FROM programbooks

Резултатът е:
39

= COUNT

Тази функция връща броя на записите, отговарящи на клаузата WHERE. Да предположим, че искате да разберете колко са книгите за Visual C++

SELECT COUNT(*) FROM programbooks
WHERE subject = 'Visual C++'

Резултатът е:
4

= ABS

Тази функция връща абсолютната стойност на дадените числа

= CEIL и FLOOR

CEIL връща най-малкото цяло число, по-голямо или равно на подаденото. FLOOR връща най-голямото цяло число, по-малко или равно на подаденото

= COS, SIN и TAN

Тези функции връщат съответно косинус, синус или тангес от подадените им стойности. Имайте предвид, че те работят с радиани

= LN и LOG

LN връща натурален логаритъм на подадените й стойности. LOG приема два аргумента, като първия е базата. Функцията връща логаритъм от втория аргумент при база първия

= POWER

POWER приема два аргумента и връща първия на степен втория

= SIGN

Тази функция връща -1, ако аргументът е по-малък от 0; 0, ако аргументът е равен на нула; или 1, ако аргуметът е по-голям от 0

= SQRT

Тази функция връща корен квадратен от подадените й стойности

- Редактиране на данните

Чрез SQL можете да променяте информацията в база данни, използвайки три основни процедури: добавяне, изтривне и промяна. За целите на по-нататъчните ни разглеждания, ще използваме следната таблица:

inventory

title language format subject size archived
CGI Developer's Guide english HTML Perl 1268 243
Codebook 1 english DOC Game Maker 418 39
CPP russian DOC C++ 2397 405
Database Developer's Guide width Visual C++ 4 english HTML Visual C++ 2579 436
Database in VB5 in 21 days english HTML Visual Basic 2219 381
GLspecification 1.4 english PDF OpenGl 1850 984
HTML Cource english PDF HTML 1307 1155
Learn Visual Basic 6 english DOC Visual Basic 25029 1405
Programming in Java russian HTML Java 1283 527
Programming in VB5 english HTML Visual Basic 1013 584
Programming Perl english HTML Perl 2682 683
Teach Yourself Java 1.1 Programming english HTML Java 815 195
Teach yourself Borland Delphi 4 english HTML Delphi 1943 432
Teach yourself Internet Game Programming with Java english HTML Java 1148 275
Teach yourself Visual J++ english HTML Visual J++ 4043 2788
Thinking in C++ english HTML C++ 8256 1033
Using Visual C++ 4.2 english HTML Visual C++ 1699 364
Learn Visual C++ english HTML Visual C++ 676 412
Visual C++ in 12 Easy Lessons english HTML Visual C++ 1679 687
Visual Basic 5 Night School english HTML Visual Basic 1903 374

- Добавяне на информация

Добавянето на информация в базата данни е изключително лесно - за целта служи командата INSERT. Можете да добавите нов ред към дадена таблица като използвате:

INSERT INTO tablename
(col1, col2...)
VALUES(value1, value2...)

Това ви позволява да добавите един ред към дадена таблица. Броя на стойностите трябва да отговаря на броя на колоните, като данните се попълват в реда, в който сте определили колоните, а не в реда, в който са колоните в оригиналната таблица. Т.е. можете да попълните реда отзад-напред като просто определите имената на колоните в обратен ред. Ако не определите колони, данните се попълват подред в колоните от оригиналната таблица, започвайки от първата и продължавайки до последната.

Това е изключително лесен и удобен начин да прибавим информация към базата данни. Но какво става ако трябва да добавим десетки или дори стотици нови редове? Напрактика, командата INSERT има две форми - INSERT ... VALUES, която разгелдахме, и INSERT ... SELECT. При втория вид, към таблицата се прибавя информацията, върната от стандартна заявка чрез командата SELECT. Отново, синтаксисът е:

INSERT INTO tablename
(col1, col2, ...)
SELECT col1, col2, ...
FROM sourcetable
WHERE search-condition

- Изтриване

Изтриването на елемент е също толкова лесно, колкото и прибавянето му. Нещо повече - можете да изтриете един или множество елементи по един и същи начин. Използването на клаузата WHERE при триене е изключително важно за определяне на това, което да бъде изтрито. В противен случай ще изтриете цялата информация от таблицата, но таблицата ще продължи да съществува. Командата, използвана за изтриване на данни е DELETE а нейния синтаксис:

DELETE FROM tablename
WHERE search_condition

Тази команда изтрива всички редове от посочената таблица, отговарящи на условието search_condition. Ако не използвате клаузата WHERE ще изтриете всички редове от таблицата.

Нека разгледаме един пример-ще премахнем от нашата таблица книгите за Perl и Java, тъй като те се отнасят за web програмиранме и ще бъдат отделени от тази база данни.

DELETE FROM inventory
WHERE subject = 'Perl' OR subject = 'Java'

Сега нашата таблица изглежда така:

inventory
title language format subject size archived
Codebook 1 english DOC Game Maker 418 39
CPP russian DOC C++ 2397 405
Database Developer's Guide width Visual C++ 4 english HTML Visual C++ 2579 436
Database in VB5 in 21 days english HTML Visual Basic 2219 381
GLspecification 1.4 english PDF OpenGl 1850 984
HTML Cource english PDF HTML 1307 1155
Learn Visual Basic 6 english DOC Visual Basic 25029 1405
Programming in VB5 english HTML Visual Basic 1013 584
Teach yourself Borland Delphi 4 english HTML Delphi 1943 432
Teach yourself Visual J++ english HTML Visual J++ 4043 2788
Thinking in C++ english HTML C++ 8256 1033
Using Visual C++ 4.2 english HTML Visual C++ 1699 364
Learn Visual C++ english HTML Visual C++ 676 412
Visual C++ in 12 Easy Lessons english HTML Visual C++ 1679 687
Visual Basic 5 Night School english HTML Visual Basic 1903 374

Но да предположим, че сме конвертирали всички .doc файлове в PDF. Как да отразим тази промяна? Би било твърде нерационално да изтрием всички записи, съдържащи DOC за формат и да ги прибавим с нужната корекция. SQL предоставя за целта командата UPDATE, имаща следния синтаксис:

UPDATE tablename
SET col1=value1
(,col2=value2, ...)
WHERE search_condition

Отново тук е важно използването на клаузата WHERE за определяне на това, кои записи да бъдат променени. С col1, col2 и т.н. се обозначават имената на колоните, които се променят, а с value1, value2 и т.н. - съответните стойности. За да променим формата в нашата таблица, ще използваме следната команда:

UPDATE inventory
SET format = 'PDF'
WHERE format = 'DOC'

Сега таблицата изглежда така:

inventory
title language format subject size archived
Codebook 1 english PDF Game Maker 418 39
CPP russian PDF C++ 2397 405
Database Developer's Guide width Visual C++ 4 english HTML Visual C++ 2579 436
Database in VB5 in 21 days english HTML Visual Basic 2219 381
GLspecification 1.4 english PDF OpenGl 1850 984
HTML Cource english PDF HTML 1307 1155
Learn Visual Basic 6 english PDF Visual Basic 25029 1405
Programming in VB5 english HTML Visual Basic 1013 584
Teach yourself Borland Delphi 4 english HTML Delphi 1943 432
Teach yourself Visual J++ english HTML Visual J++ 4043 2788
Thinking in C++ english HTML C++ 8256 1033
Using Visual C++ 4.2 english HTML Visual C++ 1699 364
Learn Visual C++ english HTML Visual C++ 676 412
Visual C++ in 12 Easy Lessons english HTML Visual C++ 1679 687
Visual Basic 5 Night School english HTML Visual Basic 1903 374

 

Материалът е публикуван на: 03.11.2002 г.

Автор: Максим Крижановски
адрес за кореспонденция

Начало на материала :: Процесори :: Дънни платки :: Видео :: Мултимедия :: Носители
Периферия :: Комуникации :: Софтуер :: Технологии :: Links & Downloads :: Форум
© 2001-2006 Macrolevel, Inc. Правила и условия.
При цитиране на материала линк към сайта и посочване на автора са задължителни.
За контакти използвайте адреса ни за електронна поща