# SQL

### от Уикипедия, свободната енциклопедия

ВНИМАНИЕ: Тази статия се нуждае от частичен или цялостен превод. Ако имате познания по използвания език, не се колебайте! Благодарим Ви, че помагате на Уикипедия!

SQL
Парадигма: | multi-paradigm: обектно ориентиран, functional, процедурен
Излиза през: | 1969
Разработен от: | Edgar F. Codd & IBM
Система типове: | static, strong
Главни реализации: | много
Диалекти: |
Повлиян от: |
Повлиял: |
Сайт: | {{{сайт}}}

SQL (най-често се използва за съкращение на Език за структурирани запитвания (Structured Query Language) — виж История за повече информация) е най-популярния език за програмиране, използван за създаване, модифициране, извличане и манипулиране на данни от релационни системи за управление на бази от данни(relational database management system). Той е еволюирал отвъд оригиналното си предназначение и поддържа обектно-релационни системи за управление на бази от данни. Стандартизиран е от ANSI/ISO.

SQL обикновено се произнася ес кю ел (ess-cue-el) (виж Английската азбука) — или секуъл (sequel). Относно имената на продукти съдържащи SQL, всеки от тях си има свое произношение, например: MySQL официално се произнася ""Май Ес Кю Ел" ("My Ess Cue El"); PostgreSQL - постгрес (postgres); и Microsoft SQL Server като Майкрософт секуъл сървър (Microsoft-sequel-server).

## [редактиране] История

Повлиян от академична публикация, (англ.)"A Relational Model of Data for Large Shared Data Banks", на Доктор Едгар Ф. Код, публикувана през юни 1970 в списанието Association for Computing Machinery (ACM) , Communications of the ACM, като черновите бяха разпространявани вътрешно в IBM през 1969. моделът на Код беше приет като "базов" модел за релационна система за управление на бази от данни.

През 70-те, група от центъра за разработки на IBM в Сан Хосе разработи система за бази от данни "System R" базирана на, но не много стриктно на модела на Код. Структурираният Английски Език за Запитвания (Structured English Query Language) ("SEQUEL") беше разработен да манипулира и извлича данни съхранени в System R. Акронимът Секуел (SEQUEL) след това е съкратен до SQL, защото думата 'SEQUEL' е търговска марка на Hawker-Siddeley- авиационна компания от Обединеното кралство. Докато SQL беше повлиян от работата на Код, Доналд Д. Чамберлин и Рейнолд Ф. Бойс от IBM бяха авторите на дизайна на езика SEQUEL.[1] тяхната концепция беше публикувана за да се повиши интересът към SQL.

Първата некомерсиална, релационна, не-SQL база от данни, Ingres, беше разработена през 1974 в U.C. Berkeley.

През 1978, методично тестване започна в клиентски тестови центрове. Демонстрирайки ползата и практичността на системата това тестване беше един успех за IBM. В резултат на това IBM започна да разработва комерсиални продукти базирани на прототипа на тяхната System R осъществяваща SQL, като System/38 (известена през 1978 и достъпна от август 1979), SQL/DS (представена през 1981), и DB2 (през 1983).[1]

По същото време Relational Software, Inc. (сега Oracle Corporation) забеляза потенциала на концепцията описана от Чембърлейн (Chamberlin) и Бойс (Boyce) и разработи тяхна версия на РСУБД за флота на САЩ, ЦРУ и др. През лятото на 1979 Relational Software, Inc. представи Oracle V2 (Версия 2) за VAX миникомпютри като първото достъпно на пазара осъществяване на SQL. Oracle често погрешно е похвалвана че е изпреварила IBM с две години, докато всъщност те са изпреварили представянето на IBM - System/38 с няколко седмици. Следвайки големия интерес на обществеността много скоро и други доставчици разработиха свои версии, но бъдещето на Oracle беше осигурено.

### [редактиране] Стандартизация

SQL беше приет като стандарт от ANSI (American National Standards Institute) през 1986 и от ISO (Международна организация по стандартизация) през 1987. ANSI декларира че официалното произношение на SQL е /ɛs kjuː ɛl/(ес-кю-ел), докато много англоговорящи професионалисти по бази от данни все още го произнасят като секуел (sequel).

SQL стандарта премина през няколко версии:

Година | Име | Псевдоним | Коментари
--- | --- | --- | ---
1986 | SQL-86 | SQL-87 | Първо публикуван от ANSI. Одобрен от ISO през 1987.
1989 | SQL-89 |  | Въведе механизмите за налагане на отношения при външните ключове.
1992 | SQL-92 | SQL2 | Доста промени. Нови функции
1999 | SQL:1999 | SQL3 | Добави "regular expression" сравнения, рекурсивни запитвания(recursive queries), тригери (triggers), "non-scalar" типове о някои обектно ориентирани възможности. (Последните две са спорни и все още не са широко поддържани.)
2003 | SQL:2003 |  | Въведе XML възможности, window функции, стандартизирани последователности (sequences) и колони (columns) с автоматично създаване на значения (включително "identity-columns").

Стандарта на SQL не е свободно достъпен. SQL:2003 може да бъде закупен от ISO или ANSI. Една от последните чернови е достъпна като zip архив от Whitemarsh Information Systems Corporation. Zip архива съдържа много PDF файлове дефиниращи части от спецификацията на SQL:2003.

## [редактиране] Цел(Scope)

Докато SQL е дефиниран от ANSI и ISO, има още много негови разширения (extensions) и вариации на версията на езика дефинирана от стандартизиращите организации. Много от тези разширения за със затворен характер, например като Oracle PL/SQL, IBM SQL PL (SQL Procedural Language) и Sybase / Microsoft Transact-SQL. Общо за повечето комерсиални изпълнения е да пропускат поддръжката на основни възможности заложени в стандарта, като `DATE` или `TIME` типове данни, предпочитайки техен собствен вариант. Като резултат за разлика от ANSI C или ANSI Fortran, които могат да се "пренасят" между различни архитектури без големи промени, SQL кода много рядко може да бъде "пренесен" без да се модифицира и то значително. Има няколко причини за това:

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

SQL е създаден със специфична, ограничена цел — запитвания към данни в релационна база от данни. Като такъв той е множествено-базиран, декларативен език за програмиране отколкото процедурен език като C или BASIC които, бъдейки неспециализирани, са направени да разрешават по-голям обхват от проблеми. Разширения на езика като PL/SQL намаляват разликата добавяйки процедурни елементи, като контролни структури. Друг подход е да се позволи вграждане на кода. Например Oracle и други включват Java в базата данни, докато PostgreSQL позволява функциите за бъдат написани на различни езици, като Perl, Tcl, и C.

Шега относно SQL е че "SQL не е структуриран, нито ограничен до запитвания, нито език (is not structured, nor is it limited to queries, nor is it a language)." Основа за това е че чистия SQL не е класически програмен език тъй като не отговаря на Дефиницията на Тюринг. От друга страна обаче той е език за програмиране защото има: граматика, синтаксис и е предназначен за програмиране. Тази шега наподобява забележката на Волтер относно Свещената римска империя е била "нито свещена, нито Римска, нито империя"/"not holy, nor Roman, nor an empire."/

SQL е в контраст с по-мощните езици за програмиране от четвърта генерация ориентирани към бази от данни като Focus или SAS с неговата относителна функционална простота и по-прости команди. Това намалява с много трудностите по поддържането на изходния код на SQL, но също прави програмирането на въпроси като 'Кой имаше 10-те най-високи резултата?' по-трудно, водещо до разработката на процедурни разширения. Обаче то прави възможно изходния SQL код да се създава (и оптимизира) от програма, водещо до разработката на "естествени" езици за запитвания към бази от данни, и 'довлечи и пусни' пакети за програмиране на бази от данни с 'обектно ориентирани' интерфейси. Често те позволяват преглед на резултатния SQL изходен код за подобряване, с образователна цел или за да се използва в друга среда.

## [редактиране] SQL ключови думи

ключовите думи на SQL попадат в няколко групи.

### [редактиране] Извличане на данни

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

- `SELECT` се използва за извличането на нула или повече реда от една или повече таблици в базата данни. В повечето приложения, `SELECT` е най-често използваната команда. При специфицирането на `SELECT` запитване, потребителят специфицира описание на желания резултат, но той не специфицира какви операции трябва да се извършат за да се постигне той. Прехвърлянето на запитване в ефективно подреждане за запитвания (query plan) е оставено на системата или по-специално на оптимизатора на запитвания(query optimizer).
  - Често срещани ключови думи свързани със `SELECT` са:
    - `FROM` се използва за индикация от кои таблици се взимат данни както и как тези таблици се свързват (JOIN).
    - `WHERE` - идентифицира кои редове да се извлекат и след това групират `GROUP` `BY`.
    - `GROUP` `BY` - комбинира/групира редове със сходни данни в елементи с по-малко редове.
    - `HAVING` - кои от "комбинираните редове" (комбинираните редове се получават от запитване включващо `GROUP` `BY` или когато частта `SELECT` съдържа съединения /aggregates/), трябва да се извлекат. `HAVING` функционира общо взето като `WHERE`, но използва резултата от `GROUP` `BY` и може да използва съединяващи функции (aggregate functions).
    - `ORDER` `BY` - идентифицира кои колони се използват за сортиране на резултата.

    Пример 1:
      SELECT * FROM books
      WHERE price > 100.00
      ORDER BY title

Това е пример при който резултата е списък от скъпи книги. Извличат се данни от таблицата books имащи price по-голяма от 100.00. Резултата е сортиран по азбучен ред на заглавието. Звездичката (*) означава - покажи всички колони на таблицата books. Има възможност за указване на специфични колони.

     Пример 2:
       SELECT books.title, count(*) AS Authors
       FROM books
       JOIN book_authors
         ON books.book_number = book_authors.book_number
       GROUP BY books.title

Пример 2 показва използването на "връзки" (joints) между таблици и групиране. В този пример се показва колко автора има всяка книга. Ето и примерен резултат:

     Title                   Authors
     ----------------------  -------
     SQL Examples and Guide     3
     The Joy of SQL             1
     How to use Wikipedia       2
     Pitfalls of SQL            1
     How SQL Saved my Dog       1

### [редактиране] Манипулиране на данни

Има няколко стандартни групи в SQL една от тях е Език за манипулиране на данни (DML). Той се използва за добавяне, модифициране и изтриване на данни.

- `INSERT` - добавя нула или повече редове към съществуваща таблица.
- `UPDATE` - модифицира данните в съществуващ ред.
- `MERGE` - комбинира данни от множество таблици. Нещо като комбинация от `INSERT` и `UPDATE`. Дефинирана е в стандарта SQL:2003; преди това някои бази от данни имаха същата функционалност използвайки друг синтаксис понякога наречени "upsert".
- `TRUNCATE` - изтрива всички данни от таблица (нестандартна, но често срещана SQL команда).
- `DELETE` - премахва нула или повече от съществуващите редове в таблица.

    Примери:
    INSERT INTO my_table (field1, field2, field3) VALUES ('test', 'N', NULL);
    UPDATE my_table SET field1 = 'updated value' WHERE field2 = 'N';
    DELETE FROM my_table WHERE field2 = 'N';

### [редактиране] Транзакции

Транзакциите могат да бъдат използвани за осигуряване на цялосста на данните.

- `START TRANSACTION` (или `BEGIN WORK`, в зависимост от SQL диалекта) - маркира началото на транзакция, която завъшва или не.
- `COMMIT` - всички промени се записват.
- `ROLLBACK` - отказва всички промени след последния `COMMIT` или `ROLLBACK`, така че данните са въстановени в състоянието в което са били.

`COMMIT` и `ROLLBACK` комуникират с контрола на транзакции и "заключване" (transaction control and locking). И двете команди завършват транзакция и отключват данните. При липса на `START TRANSACTION` действието зависи от разраборчика на продукта.

    Пример:
    START TRANSACTION;
    UPDATE inventory SET quantity = quantity - 3 WHERE item = 'pants';
    COMMIT;

### [редактиране] Дефиниране на данни

Втората група е Езика за дефиниране на дани (DDL) позволява на потребителя да дефинира нови таблици и асоциирани елементи. Повечето комерсиални SQL бази от данни имат собствени разширения на DDL, позволяващи контрол на възможностите на системата които не са вклучени в стандарта.

Основни кодови думи са `CREATE` и `DROP`.

- `CREATE` - създава обект (например таблица) в базата данни.
- `DROP` - изтрива съществуващ обект от базата данни.

Някои бази от данни имат `ALTER` команда, позволяваща на потребителя да модифицира съществуващ обект -- например добавяне на колона в съществуваща таблица.

    Пример:
    CREATE TABLE my_table (
    my_field1   INT          UNSIGNED,
    my_field2   VARCHAR (50),
    my_field3   DATE         NOT NULL,
    PRIMARY KEY (my_field1, my_field2)
    )

### [редактиране] Контролиране на данни

Третата група от SQL запазени думи е Език за контролиране на данни (DCL). DCL - оторизира достъпа до данни и потребителските позволения за преглед и мнипулиране на данни в базата данни.

Има две основни ключови думи:

- `GRANT` — оторизира един или повече потребителя за извършване на операции върху обект.
- `REVOKE` — премахва или ограничава позволенията дадени на потребител.

    Пример:
    GRANT SELECT, UPDATE ON my_table TO some_user, another_user

### [редактиране] Други

- ANSI-стандарта на SQL поддържа `--` като идентификатор на коментар за един ред (някои разширения използват фигурни скоби или C-подобни `/* коментари */` за коментари на повече редове).

    Пример:
    SELECT * FROM inventory -- Retrieve everything from inventory table

- Някои SQL сървъри позволяват функции дефинирани от потребителя

## [редактиране] Критики относно SQL

Технически SQL е декларативен език за програмиране за използване с "SQL бази от данни". Теоретици и някои практици отбелязват, че много от оригиналните възможности на SQL са вдъхновени от, но са в нарушение на релационния модел за управление на бази от данни и неговата реализация на векторни изчисления(tuple calculus).

## [редактиране] SQL алтернативи

Има разлика между алтернативи на релационни и SQL бази от данни. Този списък съдържа SQL алтернативи, но те са(обикновено) релационни. Виж навигационна база от данни за алтернативи на релационния модел.

- IBM Business System 12 (IBM BS12)
- Tutorial D
- TQL - Luca Cardelli (Може да бъде и не рационална)
- Top's Query Language - чернова на език вдъхновен от IBM BS12. Нарочно преименуван на SMEQL за да се избегне объркване с подобен проект наречен TQL.
- Hibernate Query Language[2] (HQL) - Java-базиран използва модифициран SQL
- Quel представен през 1974 от U.C. Berkeley Ingres проекта.
- Стандарт за обектно представяне на данни - Object Data Management Group.
- Object Query Language - Object Data Management Group.
- Datalog
- EJB Query Language - JSR 220
- LINQ

## [редактиране] Референции

1. ↑ Donald D. Chamberlin and Raymond F. Boyce, 1974. "SEQUEL: A structured English query language", International Conference on Management of Data, Proceedings of the 1974 ACM SIGFIDET (now SIGMOD) workshop on Data description, access and control, Ann Arbor, Michigan, pp. 249–264

1. Discussion on alleged SQL flaws (C2 wiki)
2. Web page about FSQL: References and links.
3. Galindo J., Urrutia A., Piattini M., "Fuzzy Databases: Modeling, Design and Implementation". Idea Group Publishing Hershey, USA, 2005.

Взето от „http://bg.wikipedia.org../../../s/q/l/SQL_9778.html“.

Категории: Текущи преводи | Езици за програмиране

##### Views

- Статия
- Беседа
- Текуща версия

##### Търсене

##### На други езици

- العربية
- Bosanski
- Català
- Česky
- Dansk
- Deutsch
- English
- Esperanto
- Español
- Euskara
- فارسی
- Suomi
- Français
- Gaeilge
- עברית
- Magyar
- Interlingua
- Bahasa Indonesia
- Íslenska
- Italiano
- 日本語
- Kurdî / كوردي
- Lietuvių
- Nederlands
- ‪Norsk (bokmål)‬
- Polski
- Português
- Română
- Русский
- Slovenčina
- Slovenščina
- Српски / Srpski
- Svenska
- ไทย
- Türkçe
- Українська
- Tiếng Việt
- 中文