SQL

**SQL** (, «құрылымдық сұрау тілі») — тиісті дерекқорды басқару жүйесімен басқарылатын реляциялық дерекқорда деректерді құру, өзгерту және басқару үшін қолданылатын декларативті бағдарламалау тілі.  

Бұл, ең алдымен, реляциялық мәліметтер базасында сақталған деректерді сипаттауға, өзгертуге және алуға арналған ақпараттық-логикалық тіл. Жалпы жағдайда, SQL (бірқатар заманауи кеңейтімдерсіз) тьюрингте толық емес бағдарламалау тілі болып саналады, бірақ сонымен бірге SQL/PSM спецификациясының тіл стандарты оның процедуралық кеңейтілу мүмкіндігін қарастырады. 

Бастапқыда SQL пайдаланушының дерекқормен жұмыс істеуінің негізгі әдісі болды және келесі операциялар жиынтығын орындауға мүмкіндік берді: 
* деректер базасында жаңа кесте құру;
* кестеге жаңа жазбалар қосу;
* жазбаларды өзгерту;
* жазбаларды жою;
* бір немесе бірнеше кестеден жазбаларды іріктеу (берілген шартқа сәйкес);
* кесте құрылымдарын өзгерту.

Уақыт өте келе SQL күрделене түсті — жаңа конструкциялармен байытылды, жаңа сақталған объектілерді сипаттауға және басқаруға мүмкіндік берді (мысалы, индекстер, көріністер, триггерлер және сақталған процедуралар) — және бағдарламалау тілдеріне тән белгілерді ала бастады.

Барлық өзгерістерімен SQL қолданбалы бағдарламалық жасақтаманың мәліметтер базасымен өзара әрекеттесуінің ең кең таралған лингвистикалық құралы болып қала береді. Сонымен қатар, қазіргі заманғы ДҚБЖ, сондай-ақ ДҚБЖ қолданатын Ақпараттық жүйелер пайдаланушыға сұраныстарды визуалды құрудың дамыған құралдарын ұсынады.

## Тарихы
### Алғашқы әзірлемелер
Дональд Чемберлин (Дональд Д. Чемберлин) және Раймонд Бойс 1972 жылы Нью-Йорктегі симпозиумда кездескеннен кейін Э.Коддтан реляциялық модель туралы білгеннен кейін реляциялық мәліметтер базасының тілінде жұмыс істей бастады. Чемберлиннің естеліктеріне сәйкес, бұл «аян» болды. Авторлар күрделі сұрауларды ұсыну үшін Э.Кодд ұсынған реляциялық алгебра мен реляциялық есептеудің экспрессивтілігі мен компамдылығына таң қалды. Код операциялардың математикалық белгілері бар символдық жазбаны қолданды, бірақ Чемберлен мен Бойс тілді кез-келген қолданушы тіпті бағдарламалау дағдылары мен математика білімі жоқ адамдар қолдана алатындай етіп жасағысы келді.

Кодда симпозиумынан кейін Чемберлин мен Бойс келесі жылды тіл дизайнындағы эксперименттерде өткізді. Олардың алғашқы әрекеті SQUARE тілі болды (Relational Environment - тегі арнайы сұраулар), бірақ ол жоғарғы және төменгі математикалық белгілерге байланысты практикалық қолдануда күрделі болды.

1973 жылы Сан-Хосе ғылыми-зерттеу зертханасына көшкеннен кейін Чемберлин мен Бойс SEQUEL деп аталатын мүлдем жаңа тілде жұмыс істей бастады (құрылымдық *Structured English QUEry Language* ағылшын тілінен, «құрылымдық сұраныстардың ағылшын тілі»). Авторлар кішкене тәжірибеден кейін тіпті қарапайым қолданушылар (мысалы, бухгалтерлер, инженерлер, сәулетшілер, қала жоспарлаушылар) сұраныстарды қарапайым ағылшын тілінде жазылғандай оқи алады деп үміттенді. Тіл «декларативті» деп аталды, өйткені ол осы ақпаратты іздеудің егжей-тегжейлі жоспарын емес, қажетті нәтижені сипаттады. Декларативті сұранысты егжей-тегжейлі орындау жоспарына аударумен арнайы оңтайландырушы компилятор айналысуы керек еді.

SEQUEL туралы алғашқы жалпыға қол жетімді мақала 1974 жылы жарық көрді. Бір айдан кейін Рэй Бойс қайтыс болды. Ол қайтыс болғаннан кейін SEQUEL тілі IBM System R жобасының бөлігі ретінде дамуын жалғастырды. Пэт Селингер (Pat Selinger) құндылық оптимизаторын (cost-based optimizer) әзірлеумен айналысты, Раймонд Лори (Raymond Lorie) сұраныстарды құрастырумен айналысты.

1977 жылы авторлар Ұлыбританияның Hawker Siddeley авиакомпаниясының заңгерінен осы компанияның «SEQUEL» сауда маркасына иелік ететіндігі туралы хат алды. Тіл атауын SQL-ге дейін қысқарту туралы шешім қабылданды (*Structured Query Language*, «құрылымдық сұрау тілі»). Дегенмен, SEQUEL-дің бастапқы атауы SQL аббревиатурасының қазіргі айтылуына әсер етті.

Жаңа тілді қолдайтын алғашқы ДҚБЖ 1979 жылы Relational Software компаниясының (кейіннен компаниейacle компаниясы болған) VAX машиналары үшін Oracle V2 және System/R негізіндегі IBM фирмасының system/38 болды.

Бастапқыда SQL термині аббревиатура болды, бірақ 1986 жылғы ANSI бірінші ресми стандартында «құрылымдық тіл» деген тіркес еш жерде айтылмаған және тіл «Database Language — SQL» деп аталған. Келесі ISO/IEC 9075:1989 және ISO/IEC 9075:1992 стандарттарында «Database Language — SQL» орнына «Database Language SQL» немесе жай «language SQL» атауы қолданылған. Алайда ISO/IEC 9075-1:2011 стандартының сипаттамасында ISO сайтында «ISO/IEC 9075 defines Structured Query Language (SQL)» көрсетілген.

SQL мұндай мақсаттағы жалғыз тіл емес еді. Калифорния Беркли университетінде Коммерциялық емес Ingres ДҚБЖ (қазіргі уақытта танымал коммерциялық емес PostgreSQL ДҚБЖ-ның алыс атасы) әзірленді, ол реляциялық ДҚБЖ болды, бірақ өзінің QUEL тілін қолданды, ол SQL тілімен салыстырғанда оны қолдайтын ДҚБЖ саны бойынша бәсекелестікке төтеп бере алмады. Пайдаланушының дерекқорға қол жетімділігін қамтамасыз етудің балама тәсілі ретінде 1970 жылдары пайда болған QBE әдісі де қарастырылды, кейіннен бірқатар интеграцияланған деректерді басқару орталарында модификацияланған түрде пайда болды, бірақ ешқашан АЛМАСТЫРЫЛМАДЫ, тек SQL-ді толықтырды.

### Стандарттау
1980 жылдардың басында әр түрлі өндірушілердің ДҚБЖ-нің бірнеше нұсқалары болғандықтан, олардың әрқайсысының сұраныс тілін өзіндік жүзеге асыруы болғандықтан, бір ДҚБЖ-дан екіншісіне ауысуға кепілдік беретін тіл стандартын әзірлеу туралы шешім қабылданды (егер олар осы стандартты қолдайтын болса).

1983 жылы Халықаралық стандарттау ұйымы (ISO) және Американдық ұлттық стандарттар институты (ANSI) SQL тілінің стандартын жасауға кірісті. Көптеген консультациялар мен бірнеше алдын — ала нұсқалардан бас тартқаннан кейін, 1986 жылы ANSI ANSI X3.135-1986 құжатында сипатталған «Database Language-SQL» (SQL мәліметтер базасының тілі) деп аталатын стандарттың алғашқы нұсқасын ұсынды. Бейресми түрде бұл SQL-86 стандарты sql1 деп аталды. Бір жылдан кейін ISO 9075-1987 стандартының сол атаумен нұсқасы аяқталды. Бұл стандартты әзірлеу TC97 Техникалық комитетінің (ағылш. Technical Committee tc97), оның қызметі ақпаратты есептеу және өңдеу процестері болды (ағылш. Computing and Information Processing). Бұл SC21 кіші комитеті деп аталатын оның бөлімшесі (ағылш. Subcommittee SC21), стандарттың дамуын қадағалады, бұл SQL1 (SQL-86) үшін ISO және ANSI стандарттарының сәйкестігінің кепілі болды.

Sql1 стандарты екі деңгейге бөлінді. Бірінші деңгей бүкіл құжатты сипаттайтын екінші деңгейдің ішкі жиыны болды. Яғни, мұндай құрылым SQL1 стандартының барлық сипаттамалары 1 деңгейге жатпайтындығын қарастырды. Осылайша, осы стандартты қолдайтынын мәлімдеген жеткізуші оның SQL тілін іске асыруына сәйкес келетін деңгейді талап етуі керек еді. Бұл стандартты қабылдау мен қолдауды едәуір жеңілдетті, өйткені өндірушілер оны қолдауды екі кезеңде жүзеге асыра алды.

Уақыт өте келе стандартқа бірнеше ескертулер мен тілектер жинақталды, әсіресе деректердің тұтастығы мен дұрыстығын қамтамасыз ету тұрғысынан, нәтижесінде 1989 жылы бұл стандарт sql89 атауын ала отырып кеңейтілді. Атап айтқанда, оған бастапқы және сыртқы кілттер тұжырымдамасы қосылды. Құжаттың ISO нұсқасы ISO 9075:1989 «database language SQL with Integrity Enhancements» деп аталды (SQL мәліметтер базасының тілі тұтастықты бақылауды қосады). Сонымен қатар, ANSI нұсқасы да аяқталды.

1987 жылы sql1 стандартында жұмыс аяқталғаннан кейін бірден sql89 стандартын алмастыратын стандарттың жаңа нұсқасында жұмыс басталды, ол sql2 деп аталды, өйткені сол кезде құжаттың қабылданған күні белгісіз болды. Осылайша, іс жүзінде sql89 және sql2 қатар дамыды. Стандарттың жаңа нұсқасы 1992 жылы sql89 стандартын ауыстыру арқылы қабылданды. Sql92 деп аталатын жаңа стандарт негізінен sql1 стандартының кеңеюі болды, ол Нұсқаулықтың алдыңғы нұсқаларында бар көптеген толықтыруларды қамтыды.

SQL1 сияқты, SQL92 де бірнеше деңгейге бөлінді, бірақ біріншіден, деңгейлер саны екіден үшке дейін өсті, екіншіден, олар реттік сандардың орнына атаулар алды: бастапқы (ағылш. entry), орта (ағылш. Intermediate), толық (ағылш. full). «Толық» деңгей, sql1-дегі 2-деңгей сияқты, бүкіл стандартты білдіреді. «Бастапқы» деңгей «орташа» деңгейдің ішкі жиыны болды, өз кезегінде «толық» деңгейдің ішкі жиыны болды. «Бастапқы» деңгей sql1 стандартының 2 деңгейімен салыстырылды, бірақ бұл деңгейдің сипаттамалары біршама кеңейтілді. Осылайша, стандарттар деңгейлерін қосу тізбегі келесідей болды: SQL1 1 деңгей → SQL1 2 деңгей → sql92 «бастапқы»→ Sql92 «орташа» → Sql92 «толық».

Sql92 стандартын қабылдағаннан кейін оған тілдің функционалдығын кеңейтетін тағы бірнеше құжаттар қосылды. Сонымен, 1995 жылы SQL/CLI стандарты қабылданды (Call Level Interface, қоңырау деңгейінің интерфейсі), кейіннен CLI95 деп өзгертілді. Келесі жылы PSM-96 деп аталатын SQL/PSM (Persistent Stored Modules, үнемі сақталатын Модульдер) стандарты қабылданды.[12]

Келесі стандарт SQL болды: 1999 (SQL3). Қазіргі уақытта 2003 жылы қабылданған стандарт бар (SQL:2003) кейінірек енгізілген шағын модификациялармен (SQL:2008). Стандарт нұсқаларының тарихы:

### Үйлесімділік мәселелері
Дәстүр бойынша, IT индустриясындағы көптеген стандарттар сияқты, SQL тілінде де проблема туындады: белгілі бір кезеңде SQL қолданатын бағдарламалық жасақтаманың көптеген өндірушілері стандарттың Қазіргі (сол кездегі) нұсқасындағы функционалдылық жеткіліксіз деп шешті және оны кеңейткен жөн. Нәтижесінде мәліметтер базасын басқару жүйелерінің (ДҚБЖ) әр түрлі өндірушілері әр түрлі SQL диалектілерін қолдана бастады, жалпы жағдайда бір-біріне сәйкес келмейді.

1996 жылға дейін SQL коммерциялық енгізулерінің стандартқа сәйкестігі мәселелерімен негізінен ұлттық стандарттар және технологиялар институты (NIST) айналысқан, ол стандартқа сәйкестік деңгейін белгілеген. Кейінірек ДҚБЖ-мен айналысатын бөлімше таратылды және қазіргі уақытта ДҚБЖ-ны стандартқа сәйкестігін тексеру бойынша барлық күш-жігер оны өндірушіге жүктеледі.

Алғаш рет «сәйкестік деңгейі» ұғымы SQL-92 стандартында ұсынылды. Атап айтқанда, ANSI және NIST осы стандартқа сәйкестіктің төрт деңгейін анықтады:
# Entry (негізгі);
# Transitional (өтпелі) — тек NIST осы деңгейге сәйкестігін тексерді;
# Аралық (аралық);
# Толық (толық);

Әрбір келесі сәйкестік деңгейі алдыңғы деңгейге сәйкестікті білдіретінін оңай түсінуге болады. Әрі қарай, стандарттардың осы «баспалдағына» сәйкес, Entry деңгейіне сәйкес келетін кез келген ДҚБЖ өзін «SQL-92 compliant» (SQL-92 үйлесімді) деп жариялай алады, дегенмен шын мәнінде портативтілік пен стандартқа сәйкестік осы деңгейге кіретін мүмкіндіктер жиынтығымен шектелді.

SQL:1999 стандартының енгізілуімен жағдай өзгерді. Бұдан былай стандарт модульдік құрылымға ие болды-стандарттың негізгі бөлігі «SQL/Foundation» бөліміне енгізілді, қалғандары бөлек модульдерге шығарылды. Тиісінше, үйлесімділіктің бір ғана деңгейі қалды-Core, бұл негізгі бөлікті қолдауды білдіреді. Қалған мүмкіндіктерді қолдау ДҚБЖ өндірушілеріне қалдырылды. Ұқсас позиция стандарттың кейінгі нұсқаларында да орын алды.

### No SQL
2000-шы жылдардың екінші жартысындағы NoSQL қозғалысы, оның атауында «SQL теріске шығаруды» тіркеді, бұл тілден бас тарту емес, көлденең масштабтау және басқа да бірқатар қасиеттер үшін реляциялық модельден және қатаң консистенция принциптерінен бас тартқан ДҚБЖ-ны біріктірді. Сонымен қатар, ерте NoSQL жүйелерінде SQL қолдауы болмады, уақыт өте келе мұндай ДҚБЖ-лардың кейбіреулері SQL-ге ұқсас сұраныс тілдерін (CQL, N1QL, AQL[en] және басқалары) алды. 2010 жылдары бірқатар ДҚБЖ өзін NewSQL санатына жатқызды, оларда NoSQL жүйелерінің масштабталу қасиеттерін сақтай отырып, SQL қолдауы да жүзеге асырылды, әртүрлі жүйелерде-стандарттармен үйлесімділіктің әртүрлі дәрежесі. Сонымен қатар, 2010 жылдары SQL қолдауы тек ДҚБЖ-да ғана емес, сонымен қатар Hadoop экожүйесінде (Spark SQL, Phoenix, Impala), сондай-ақ байланыстырушы бағдарламалық жасақтамада (Kafka хабарлама брокері, Flink ағынды өңдеу жүйесі) пайда болды, осылайша тіл біртіндеп қол жетімділіктің нақты стандартына айналуда реляциялық сипатта ғана емес, өңделетін кез келген деректер.

## Элементтер
SQL тілі-операторлар, нұсқаулар, есептелген функциялар жиынтығы.

Жалпы қабылданған бағдарламалау стиліне сәйкес, SQL-дегі операторлар (және басқа сақталған сөздер) әдетте бас әріптермен жазылуы ұсынылады.

**SQL операторлары бөлінеді:**
* деректерді анықтау операторлары (data Definition Language, DDL) :

*CREATE дерекқор нысанын жасайды (Дерекқордың өзі, кесте, көрініс, пайдаланушы және т. б.),*

*ALTER нысанды өзгертеді,*

*DROP нысанды жояды;*

* деректерді манипуляциялау операторлары (data Manipulation Language, DML) :

*SELECT берілген шарттарды қанағаттандыратын деректерді таңдайды,*

*INSERT жаңа деректерді қосады,*

*Жаңарту бар деректерді өзгертеді,*

*DELETE деректерді жояды;*

* деректерге қол жеткізуді анықтау операторлары (Data Control Language, DCL) :

*Грант пайдаланушыға (топқа) объектімен белгілі бір операцияларға рұқсат береді,*

*REVOKE бұрын берілген рұқсаттарды қайтарып алады,*

*DENY рұқсатқа басымдық беретін тыйым салады;*

* транзакцияны басқару операторлары (transaction Control Language, TCL) :

*COMMIT транзакцияны қолданады,*

*ROLLBACK ағымдағы транзакция контекстінде жасалған барлық өзгерістерді қайтарады,*

*SAVEPOINT транзакцияны кішігірім бөлімдерге бөледі.*

## Артықшылықтары мен кемшіліктері
**Артықшылықтары**

**Нақты ДҚБЖ-дан Тәуелсіздік**

Диалектілер мен синтаксистегі айырмашылықтарға қарамастан, көбінесе DDL және DML бар SQL сұрау мәтіндері бір ДҚБЖ-дан екіншісіне оңай тасымалдануы мүмкін. Әзірлеушілер бастапқыда кем дегенде бірнеше ДҚБЖ қолдануға бағытталған жүйелер бар (мысалы: Documentum электрондық құжат айналымы жүйесі Microsoftacle Database және Microsoft SQL Server және DB2-мен жұмыс істей алады). Әрине, іске асыруға тән кейбір мүмкіндіктерді қолданған кезде мұндай төзімділікке қол жеткізу өте қиын.

**Стандарттардың болуы**

SQL-дің белгілі бір іске асырылуының жалпы қабылданған стандартқа сәйкестігі мен сәйкестігін анықтау үшін стандарттар мен тесттер жиынтығының болуы тілдің «тұрақтануына» ықпал етеді. Рас, стандарттың өзі кейбір жерлерде тым рәсімделіп, көлемі ұлғайғанына назар аударған жөн (мысалы, SQL:2003 стандартының негізгі бөлігі 1300 беттен астам мәтіннен тұрады).

**Декларативтілік**

SQL көмегімен бағдарламашы тек қандай деректерді алу немесе өзгерту керектігін сипаттайды. Мұны қалай жасау керек, SQL сұрауын өңдеу кезінде ДҚБЖ шешеді. Дегенмен, бұл толығымен әмбебап принцип деп ойламаңыз — бағдарламашы іріктеу немесе өзгерту үшін деректер жиынтығын сипаттайды, бірақ ДҚБЖ оның сұрау мәтінін қалай талдайтынын елестету пайдалы. Сұраныс неғұрлым күрделі болса, соғұрлым ол орындалу жылдамдығы бойынша әр түрлі, бірақ жиынтық мәліметтер жиынтығында бірдей емле нұсқаларына мүмкіндік береді.

**Кемшіліктері**

**Реляциялық деректер моделінің сәйкес келмеуі**

Реляциялық деректер моделін жасаушылар Эдгар Кодд, Кристофер Дейт және олардың жақтастары SQL шынайы реляциялық тіл емес екенін көрсетеді. Атап айтқанда, олар реляциялық теория тұрғысынан келесі SQL ақауларын көрсетеді:

* реляциялық деректер моделі шеңберінде мүмкін емес және жол берілмейтін кестелерде және іріктеме нәтижелерінде қайталанатын жолдарға жол беру;
* нақты көп мәнді логиканы құратын анықталмаған мәндерді қолдау (NULL);
* бағандар ретінің маңыздылығы, бағандарға сандар бойынша сілтеме жасау мүмкіндігі (реляциялық модельде бағандар тең болуы керек);
* атаусыз бағандардың, қайталанатын баған атауларының болжамы.

Кристофер дейт пен Хью Дарвен жариялаған үшінші манифестте олар келесі буын ДҚБЖ принциптерін белгілейді және шынайы реляциялық болып табылатын Tutorial d тілін ұсынады.

**Күрделілігі**

SQL соңғы пайдаланушының жұмыс құралы ретінде ойластырылғанымен, кейінірек ол соншалықты күрделі болды, ол бағдарламашы құралына айналды.

**Стандарттардан ауытқу**

ANSI SQL-92 халықаралық стандартының болуына қарамастан, көптеген ДҚБЖ әзірлеушілері әзірленіп жатқан ДҚБЖ-да қолданылатын SQL тіліне өзгерістер енгізеді, осылайша стандарттан ауытқиды. Осылайша, әрбір нақты ДҚБЖ-ға тән SQL тілінің диалектілері пайда болады.

**Иерархиялық құрылымдармен жұмыс істеудің күрделілігі**

Бұрын көптеген ДҚБЖ-нің SQL диалектілері ағаш құрылымдарын манипуляциялау әдісін ұсынбаған. Кейбір ДҚБЖ жеткізушілері өз шешімдерін ұсынды (мысалы, CONACLE Database CONNECT by өрнегін пайдаланады). Қазіргі уақытта ANSI - де SQL DB2 диалектісінен with рекурсивті дизайны стандартталған. Microsoft SQL серверінде рекурсивті сұраулар (recursive Common Table Expressions) 2005 нұсқасынан пайда болды.

## Процедуралық кеңейтімдер
SQL әдеттегі процедуралық бағдарламалау тілі болмағандықтан (яғни циклдарды, тармақтарды және т.б. құруға қаражат бермейді), әр түрлі өндірушілер енгізген кеңейтімдер ең алдымен процедуралық кеңейтімдерге қатысты болды. Бұл сақталған процедуралар (stored procedures) және процедуралық тілдер — «қондырмалар». Әрбір дерлік ДҚБЖ өзінің процедуралық тілін қолданады, атап айтқанда Oracle Database PL/SQL қолданады (DB2 және Timesten[поддерж]-де де қолдау көрсетіледі), Interbase және Firebird — PSQL, DB2-SQL PL, Microsoft SQL Server және Adaptive Server Enterprise — Transact-SQL, PostgreSQL — PL/pgSQL.

## Оқылуы
SQL аббревиатурасы ресми түрде «es-Kew-el» ([ˈɛsˈkjuˈɛl]) деп айтылуы керек болса да, тілдің қысқартылған атауының бастапқы нұсқасы — SEQUEL — sequel сөзімен емле бойынша сәйкес келді және әлі күнге дейін «жалғасы» (/ˈsiːkwəl/) деп жиі айтылады.

Айтылуындағы айырмашылықтар тіпті мамандар арасында да байқалады. Сонымен, тіл авторларының бірі Д. Чемберлин «эс-кью-эл» айтылымын, ал К.Дат — «жалғасы». Microsoft SQL Server жарнамалайтын бейнеде Билл Гейтс 16-шы секундта «жалғасы» опциясын, ал 38 — ші секундта «эс-кью-эл» опциясын пайдаланады.

MySQL ДҚБЖ-нің ресми айтылуы, құжаттамаға сәйкес,«may-es-Kew-el», PostgreSQL — «Postgres-Kew-el», ал Microsoft SQL Server және Oracle әзірлеушілері PL/SQL және T сияқты терминдерде «жалғасын» айтуды жөн көреді-SQL.

## Дереккөздер

## Әдебиет
* *Джеймс Р. Грофф, Пол Н. Вайнберг, Эндрю Дж. Оппель.* SQL: полное руководство, 3-е издание = SQL: The Complete Reference, Third Edition. — М.: «Вильямс», 2014. — 960 с. — .
* *Крис Фиайли.* SQL: Руководство по изучению языка. — М.: Peachpit Press, 2003. — 456 с.
* *Аллен Тейлор.* SQL для чайников, 8-е издание = SQL For Dummies, 8th edition. — М.: «Диалектика», 2014. — 416 с. — .
* *К. Дж. Дейт.* Введение в системы баз данных / Пер. с англ. — 8-е изд. — М.: Вильямс, 2005. — 1328 с.
* Chamberlin, Donald D. Early history of SQL. // IEEE Annals of the History of Computing 34.4 (2012): 78-82. (англ.)

Санат:Бағдарламалау тілдері
Санат:Дерекқор
Санат:Ақпараттану
Санат:SQL