Деректер қорынан аұпаратты алудың негізгі құралы— сұраныстар , демек SELECT командасы. Бұл команданың негізгі мүмкіндіктері осы тарауда қарастырылады, басқалары
күрделірек мүмкіндіктері — қалған тарауларда қарастырылады. Әр тарауда Microsoft SQL Serverдің аналогтық мүмкіндіктерімен салыстырмалы өзгешеліктері көрсетіледі.
Барлық негізгі деректер қорында ANSI SQL стандарты болғандықтан, Oracle мен басқа деректер қорында (Microsoft SQL Server, IBM DB2, Informix, Sybase, Microsoft Access) ұқсас болып келеді.Өзгешелігі — SQL стандарты анықтамайтын бөлектігінде, басқа деректер қорына сұраныстар жасап үйренумен олар пайдаланушыларға қиындық туғызуы мүмкін.
Oracle-да SELECT командасы қорының синтаксисі келесі түрде болады:
SELECT [DISTINCT] список_столбцов FROM источник WHERE фильтр ORDER BY выражение_сортировки
Осындай сұраныстың мысалын келтіреміз:
SELECT employee_id, first_name, last_name, hire_date FROM hr.employees WHERE hire_date < '01.01.2000' ORDER BY last_name
Көріп тұрғандай сұраныста арнайы мүмкіндіктер қолданбаған кезде, ол абсолютті стандартты және аналогты сұраныстарға толық ұқсас болып келеді, мысалы SQL Server-ге. Егер бізге деректер қорынан немесе ұсыныстардан барлық бағандарды алсақ, баған тізімінің орнына жұлдызшаны көрсетсек болады:
SELECT * FROM hr.employees WHERE hire_date < '01.01.2000' ORDER BY last_name
Бағанның аталуын (alias) жасырын ат арқылы өзгертуге болады. Ол үшін баған атынан кейін жасырын атты жазу немесе AS кілттік сөзін қолдану жеткілікті(екі синтаксис те толығымен әр түрлі мәнді):
SELECT last_name Фамилия FROM hr.employees SELECT last_name AS Фамилия FROM hr.employees
Әсіресе алдын ала ат қарастырылмаған есептеу бағандарына жасырын аттар қолданған ыңғайлы:
SELECT last_name AS Фамилия, salary*12 AS "Бір жылдық жалақы " FROM hr.employees
Егер жасырын атта бос орындар мен басқа да қызмет символдары кездессе, онда мұндай жасырын атты тырнақшаға алу керек.
Oracle- дағы бағандар тізімімен байланысты кейбір негіздерін белгілейік. Егер SQL Server-де бағандардың "проблемалы" аттарын тік жақшаларға қоятын болсақ, онда Oracle- екеуі де қате деп қарастырылады.
Oracle-да бағандар тізіміне литералдарды (literals) қосуға болады. Литералдар— бағандар тізіміне кіретін, сонымен қатар баған аты, жасырын аты емес кез келген бағандық мән, күн. Литералдар әрбір қайтып оралатын бағанға қайталанып отырады. Әдетте олар нәтиженің қайтып оралу жиынтығына түсініктемелер жасау үшін қолданады:
SELECT last_name AS Фамилия, 'Бір жылдық жалақы: ', salary*12 FROM hr.employees Бұл мысалда 'Бір жылдық жалақы: ' — әрбір жазуда шығып тұратын литерал.
Бағандық литералдар мен куні жазылған литералдар бір бір тырнақшаға жазылу керек. Сан түрінде литералдар тырнақшаға алынбайды.
Литералдар көп жағдайда деректер қорындағы конкатенация (||) операторының көмегімен қайта оралған мәндерді шығару нәтижелеріне қосылады. Oracle операторлары 2.2, 2.3, 2.4 тарауларында қарастырылады.
Кей кезде литералдармен жұмыс жасағанда, литералдар резервтелген символсыз болып мәселе туындайды. Oracle, мысалы, SQL Serverден ерешелігі пайдаланушыға тырнақша орнына қолданатын символды өз бетінше анықтауға мүмкіндік береді. Мысалы:
select department_name, q'[It's assigned manager ID: ]', manager_id from departments
Қарапайым бір тырнақшаларды литералдарда пайдалану қате болады, өйткені тырнақша литералдың символдық мағынасының түбінде жатады. Сондықтан бұл мысалда тырнақшалар орнына тік жақшалар қолданылады.
q' операторының қолданылуының бірнеше негіздерін атап өтейік:
Оны кіші әріппен q, сонымен қатар үлкен әріппен (Q);
q- дан кейін бір тырнақша болу керек. Келесі бір тырнақша q операторының қызметінің аяқталуын анықтайды;
Пайдаланушымен таңдалған тырнақша орнына қолданатын бір тырнақшадан кейін символ жүруі керек. Бұл символ бос орыннан, жол немесе табуляцияны ауыстырудан басқа кез келген символ болуы мүмкін (сонымен қатар бір тырнақша). Егер пайдаланушы (, {, [ немесе <, онда тырнақшалар оған сәйкес символмен бекітілуі тиіс ), }, ] және>. Басқа жағдайларда тырнақшалардың жабылуы, олардың ашылуына қолданылған символ көмегімен жүзеге асады.
Соңғы кезең сұраныстар қорының синтаксисімен байланысты. Сұраныстың параметріне сәйкес үндемес сұранысы деректер қорынан барлық мәндерді қайтарады. Мысалы, сұраныс
SELECT salary FROM hr.employees
мәндердің негізгі бөліктерінің қайталануына қарамастан 107 жолды қайтарады.
Тек уникалды мәнді қайтару үшін (мәндер жиынын, егер бірнеше бағандар қайта оралса), сұраныста DISTINCT кілттік сөзін қолдануға болады:
SELECT DISTINCT salary FROM hr.employees
Мұндай сұраныс 57 мәнін қайтарады , сонымен қатар олардың барлығы уникалды болады. Oracle-дың ерекшеліг DISTINCT пен бірге UNIQUE кілттік сөзін қолдануға болады.
Oracle SQL-да көптеген операторлар қарастырылады, жиі кездесетіндер (мысалы, арифметикалық немесе логикалық), сонымен бірге экзотикалық (иерархиялық тізімнің жиынымен, MULTISET көптеген жазуларымен қызметі).Сонымен қатар пайдаланушыға өздерінің операторларын анықтауға рұқсат беріледі. Операторлардың әр типі өздеріне арнайы тарауларда қарастырылады. Бұл тарауда оператордың ең қарапайым арифметикалық түрі қарастырылады.
Oracle SQL барлық операторларын екі негізгі бөліктерге бөлуге болады: унарлы және бинарлы. Унарлы операторлар тек бір мәнмен жұмыс жасайды. Мысалы, унарлы операторларға (-) операторы жатады: егер оған тек бір мәнді қолдансақ, ол сан мәнін өзгертеді.
Бинарлы операторлар екі мәнмен жұмыс жасайды. Мысалы, 10-7 бөліктерінде (-) операторы — есептеуді жүргізетін бинарлы оператрлар.
Oracle SQL-да бізге бұрыннан белгілі арифметикалық операторлардың жиыны қарастырылады:
Оператор
|
қызметі
|
+
|
қосу
|
-
|
азайту
|
Арифметикалыққа сонымен қатар санның белгісін анықтайтын (+) және (-) унарлы опрераторлары жатады. Арифметикалық опрераторлардың артықшылығы: ең жоғарғы артықшылығы унарлы операторларда, содан кейін көбейту мен қосу, ал содан кейін- қосу мен азайту орындалады.
Операторларды қолдану тәртібі жақшаларға алынумен реттеледі.
NULL тип мәніне унарлы операторды қолдану NULL нәтижесінде көрінеді.
Әрине екі операторды тізбектей қолдануға болмайды (бинарлы, содан кейін унарлы оператор) — символдардың мұндай тізбектелуі SQL түсінігінде кейінге сақталған.
Арифметикалық операторларды мүлдем бағандарды қолданбайтын сұраныстарда қолдануға болады:
SELECT 10*15 FROM hr.employees;
Бірақ бұл жағдайда нәтиже 107рет қайталанады, ол әрине бізге қажет емес. Деректер қорындағы бағандар мүлдем қолданбайтын сұраныстарды орындау үшін Oracle-да арнайы DUAL кестесі көрсетілген. (SQL Server де ол қарастырылмаған). Бұл кестеде тек бір баған DUMMY жалғыз x мәнімен қолданылады. Осы қызмет кестесін қолданған біздің сұранысымыз келесі түрде болады:
SELECT 10*15 FROM DUAL;
Нақты жұмыста көп жағдайда бағандық мағыналардың бірігуін жүргіземіз. Мұндай операция конкатенация деп аталады.
Oracle SQL-да ерекше оператор (SQL Server жұмысшыларының айтуы бойынша) конкатенация операторы қарастырылады— (||) екі вертикалды сызықтар. Отметим, что в некоторых версиях сервера Oracle серверінің кейбір версияларында, мысалы, IBM мэйнфреймдарында жұмыс жасау үшін басқа конкатенация операторы қолданады.
Сондықтан Oracle SQL-ге тағы конкатенцияны құратын және кез келген платформада жұмыс жасайтын CONCAT орнықты функциясы қарастырылады.
Конкатенция операторын қолдану мысалы келесі түрде болады:
SELECT first_name || ' ' || last_name FROM hr.employees;
Бұл мысалда үш мағына туындап тұр: аты, бос орын (литерал түрінде) және фамилия.
Конкатенация операторын жол мағыналары мен CLOB мәніне (үлкен жолдың мәндерге), сонымен қатар сандар мен күндерге де (бұл мәндер автоматты түрде бағандық түрге ауысады) қолдануға болады.
Жолдық мәннің NULL типінің мәнімен бірігуінде Oracle жолдық мәнін қайтарады, бірақ Oracle оның келешек версияларында мұндай тәртбі кепілденбейтінін ескертеді.
Сондықтан мұндай жағдайларда NULL типінің мәнін жолдың нөлдік ұзындығына өзгертеді.
Конкатенацияны орындаған кезде конкетенация үшін қолданатын деректер типтерінің шектері жайында ойлауды ұсынады.
Oracle-ды конкатенация үшін қолданатын, үш мәннен тұратын үлкен деректер типінің конкатенациясының нәтижесінде қолданады.
Мысалы, CHAR деректер типімен екі мәннің бірігуінде (максималды өлшемі — 2000 символ) CHAR қайтып оралады, CHAR мен VARCHAR2 бірігуінде (максималды өлшемі —
4000 символ) VARCHAR2 қайтып оралады, ал кез келген деректер типінің CLOB пен бірігуінде CLOB қайта оралады.
Конкатенация кезінде бос орындар әрқашан сақталады.
Егер SELECT команда қорының синтаксисіне қарасақ (2.1 тарау. қара), жол тізімінен кейін FROM кілттік сөзі жүруі керек.
FROM өрнегінен кейін көзден алынған мәліметтерді шығару үшін сүзгішті анықтайтын WHERE кілттік сөзі жүруі керек. WHERE өрнегін true қайтаратын жазбаларды ғана қайта оралтады.
WHERE өрнегімен сұраныстың мысалы келесі түрде:
SELECT * FROM hr.employees WHERE hire_date < '01.01.2000'
Әрине қайта оралған мәнді шартпен салыстыру үшін арнайы салыстырмалы операторлары ұолданады. Oracle SQL де "салыстыру операторлары" (comparison operators) деген термин қолданылмайды. Оның орнына арнайы "шарттар" (conditions) термині қарастырылады.
Oracle SQL да салыстыру (шарт) операторлары көп қарастырылады, және деректер қорын басқару жүйелерінде аналогты болмайды, мысалы, Microsoft SQL Server-де.
Oracle-дағы салыстырудың қарапайым шарттары анық:
шарт
|
Мәні
|
=
|
тең
|
<
|
кіші
|
>
|
үлкен
|
<=
|
кіші немесе тең
|
>=
|
үлкен немесе тең
|
<>
!=
^=
¬=
|
тең емес
|
Екі кезеңді ғана атап өтейік:
Кей кездері пайдаланушыда үлкен немесе тең (немесе кіші немесе тең) — бастапқыда: теңдік белгісі немесе үлкен/кіші белгісі қалай жазылады деген сұрақ туындайды. Мұнда қалай айтамыз, солай жазамыз деген принципке сүйенсек болады;
"тең емес" Oracle да түрт әртүрлі тәсілдермен, сонымен қатар экзотикалықпен анықтала алады. Бірақ мүмкіндігінше (<>) стандартты көрінісін қолдану керек.
Салыстырудың қарапайым шартына мысал алдыңғы тарауда көрсетілген: SELECT * FROM hr.employees WHERE hire_date < '01.01.2000'
Oracle SQL да салыстырудың топтық шарты үшін үш кілттік сөздер қолданады: ALL, SOME және ANY. Осы көрсетілген салыстырулардың барлығы мағына жиынтығымен салыстыру үшін қолданады:
ALL — салыстыру барлық жазулармен жүргізіледі.Егер True қайта оралса ондп сіз таңдаған шарттың түрін қанағаттандырады. Сонымен қатар Oracle да значение True мәні подзапрос бірде бір жазуды қайтармағанда оралады.
Мысал ретінде мынадай сұраныс қолданамыз:
select * from hr.employees where salary <= ALL(SELECT salary FROM hr.employees WHERE job_id = 'SH_CLERK')
Ол барлық SH_CLERK қызметті жұмысшылар үшін жалақысы ең аз жалақыдан кіші немесе тең жалақылары үшін жазуларды қайтарады.
ANY — салыстыру True ді қайтарады, егер шартты жиындағы кез келген жазу қанағаттандырар болса. Мысалы, клерк жалақысымен сәйкес келген жалақысы бар пайдаланушылардың барлығын қайтарады:
select * from hr.employees where salary = ANY(SELECT salary FROM hr.employees WHERE job_id = 'SH_CLERK')
SOME — салыстыру True-ді қайтарады, егер шартты жиындағы кейбір жазулар қанағаттандырса.
Мұндай мүмкіндіктер басқа да деретер қорын басқарудың басқа да жүйелерінде қарастырылды, Мысалы, Microsoft SQL Server.
Oracle SQL да жылжымалы үтір мәнімен салыстыру үшін арнайы екі шарт қарастырылады:
IS NAN (от is Not a Number) — мән сан болмайды(а, мысалы, бір мүмкін болмайтын операция нәтижесінде пайда болды, мысалы, 0ге бөлу);
IS INFINITE — мәні шексіздікке тең (азайту ма, қосу ма, бәрі бір). Осы шарттардың әрқайсысын көрсету:
IS NOT NAN или IS NOT INFINITE
Әрине жылжымалы үтірлі мәнге салыстырудың қарапайым шарттарын қолдануға болады. Бірақ мұндай мәндермен жұмыс жасау потенциалды мәселелермен, жуықтаумен байланысты, сондықтан жылжымалы үтірлі мәндерден мүмкіндігінше алшақ болу керек.
Oracle SQL-дағы логикалық шарттар бірнеше қарапайым шарттардан қажетті комбинацияны анықтауға мүмкіндік береді. Мұндай шарттар Oracle SQL-да үшеу:
AND — логикалық Және . Егер өрнек True- ді қайтарсын десек, екі шарт та ақиқат болуы тиіс:
SELECT * FROM hr.employees WHERE department_id = 50 AND JOB_ID = 'SH_CLERK'
OR — логикалық Немесе. Өрнек True қайтарсын десек, тек бір шарттың ақиқат болғаны жеткілікті:
SELECT * FROM hr.employees WHERE department_id = 50 OR JOB_ID = 'SH_CLERK'
NOT — "кері" шарт. NOT қосу кезінде өрнек True қайтарады, олсыз False қайтаратын еді, және керісінші:
SELECT * FROM hr.employees WHERE NOT department_id = 50
Егер деректер қорының кестесінің бір ұяшығында мәні жоқ болса, онда ұяшықта NULL арнайы мәні жатыр десек болады. NULL — это не 0 и не пустая строка. NULL арнайы мән болып табылады, ол үшін арнайы жұмыс жасау түрі қарастырылады.
NULL мәні үшін арнайы салыстыру операторларын қолдануға болмайды: NULL ешқашан NULLдің басқа мәніне тең емес. Сол үшін онымен жұмыс жасағанда екі арнайы шарт қарастырылады:
IS NULL — бұл шарт True қайтарады, егер тексермелі мән NULL ге тең болса;
IS NOT NULL — бұл шарт NULL қайтарады, егер тексермелі мән NULL ге тең емес болса.
Мысалы, Locations кестесінен почталық индексі көрсетілмеген барлық жазуларды қайтаруды келесі түрде көруге болады:
SELECT * FROM hr.locations WHERE postal_code IS NULL; Ал қалған жазуларды қайтаруға:
SELECT * FROM hr.locations WHERE postal_code IS NOT NULL;
Мұндай бос мәндермен жұмыс жасау мүмкіндіктері Microsoft SQL Server де қарастырылады.
LIKE және REGEXP_LIKE қарапайым жағдайларда кездесетінін атап өтейік. Егер сізге грамматикамен, шуылды сөздерді сүзу және басқа да іздеу жүргізу керек болса, толықмәтіндік іздеу жүргізу керек екенін ойлау керек.
Оператор LIKE операторы арнайы метасимволды символдар арқылы шаблон бойвнша символдық мәнді іздеуге қолданылады. Oracle-да осы оператордың төрт түрі қарастырылады:
"қарапайым" LIKE — дәстүрлі кодалаулы жолдық сұраныстарға қолданылады;
LIKEC — Unicode кодалауымен бағандарға қолданылады (Oracle терминологиясында— Unicode complete);
LIKE2 —UCS2 кодалауы үшін; LIKE4 —UCS4 кодалауы үшін.
Осы операторды қолданудың мысалы келесі түрде болады:
select last_name from hr.employees where last_name like 'R%';
Бұл мысалда last_name, where кілттік сөзінен кейін— тексеру үшін алынатын жолдық мәндер алынатын баған, ал 'R%' — бұл тексеру шарты. LIKE операторының ерекшелігі шартқа арнайы қойылмалы символдарды кіргізе алады. Бұл оператор үшін тек екі қойылмалы символдар қарастырылады:
% — нөл мен одан көп символдардан тізбекті көрсетеді. Сонымен бірге '%' мәні ешқашан NULL-ге тең болмайды(мұндай мәндерді тексеру үшін IS NULL қолданылады);
_ — кез келген жалғыз символды көрсетеді.
Біз мысалда қолданбалы % символын қарастырдық, сондықтан сұраныс R-дан басталатын барлық жұмысшыларды қайтарады.
Егер Oracle-да пайыз символы(%) мен сызықша(_)іздеу жүргізуге болатын қарапайым символ ретінде қабылдансын десек—ESCAPE параметрі қолданылады. Осы параметр
көмегімен қойылмалы символ бұдан кейін қарапайым болым көрінетіндей арнайы символды анықтауға болады:
select last_name from hr.employees where last_name like 'R\%' ESCAPE '\';
Мысалда \ символын қойылмалы символдан бас тарту ретінде анықтадық, егер бізде R% фамилиясы бар жұмысшы табылса сұраныс оны міндетті түрде қайтарады. Көп жағдайда қойылмалы мәннен бас тарту символы үшін (\) қайтару слэші қолданады
LIKE шартын пайдалану қиын емес және оның мүмкіндігі де өте шектеулі. Іздеу шартын анықтайтын стандартты POSIX-сәйкес өрнегін анықтайтын функционалдық мүмкіндіктері көбірек REGEXP_LIKE шарты қарастырылады. Жиі өрнектер- өте үлкен тақырып. Толық көрінісін SQL Reference Oracle құжаттандыру кітабінан көруге болады. Мұнда қарапайым мысал келтіріп кетейік:
SELECT first_name FROM employees
WHERE REGEXP_LIKE (first_name, '^Ste(v|ph)en$');
Бұл мысалда Ste-ға басталатын және en-ға аяқталатын, ал олардың арасында v немесе ph орналасқан жұмысшылар жайында ақпаратты қайтарамыз. Нәтиже келесідей:
Steven Steven Stephen
Кей кездері кез келген диапазонға түскен мәндердің барлығын қайтару керек. Ол мақсат үшін диапазондарды салыстырудың арнайы операторы BETWEEN- ді қолданған қолайлы. Мысалы, 3000 нан 4000- ға дейінгі диапазонда жалақы алатын жұмысшылар жайында ақпарат қайтару үшін келесі сұранысты қолдану керек:
SELECT * FROM hr.employees WHERE salary BETWEEN 3000 AND 4000;
Обратите внимание, что при использовании ключевого слова BETWEEN кілттік сөзін қолданған кезде, шекті мәндер де диапазонға кіреді, сондықтан сұраныс 3000 мен 4000 жалақы алатын жұмысшыларды да қайтарады.
Әрине біз BETWEEN кілттік сөзі бар сұранысты қарапайым салыстыру операторының сұранысына алмастырсақ болады:
SELECT * FROM hr.employees WHERE salary >= 3000 AND salary <= 4000; Бірақ BETWEEN-ді қолдану мүмкін.
Microsoft SQL Server-де BETWEEN операторымен жұмыс жасаудың мүмкіндіктері қарастырылады.
Егер BETWEEN шарты диапазондармен жұмыс жасауға арналса, онда IN шарты тізім мәнін тексеруге қолданады. Мысалы, Sales Manager, Sales Representative және Shipping Clerk қызметіндегі барлық жұмысшылар тізімін қайтару:
SELECT * FROM hr.employees WHERE job_id IN ('SA_MAN', 'SA_REP', 'SH_CLERK');
Нұсқалған тізімге кірмейтін барлық мәндерді қайтару үшін, NOT кілттік сөзін қолдануға болады. Мысалы, басқа қызметті барлық жұмысшылар жайында ақпаратты қайтару үшін келесі сұранысты қолдануға болады
SELECT * FROM hr.employees WHERE job_id NOT IN ('SA_MAN', 'SA_REP', 'SH_CLERK');
Осындай IN шарттарымен жұмыстарының мүмкіндіктері Microsoft SQL Server-де қарастырылған.
EXISTS шарты тек бір жағдайда қолданылады- егер сіз сұраныста жазуды қайтаруын тексеру кезінде. Егер сұраныс бір жазуды қайтарса, EXISTS шарты True қайтарады. Егер керісінше болса — false. Осы шартты қолдану мысалы былай болуы мүмкін:
SELECT * FROM departments d WHERE EXISTS
(SELECT * FROM employees e WHERE d.department_id = e.department_id);
Мысалда employees кестесіндегі кем дегенде бір жұмысшы бар барлық департаменттер жайында ақпаратты қайтарамыз.
Әдеттегідей бұл шартты NOT көмегі арқылы қайтаруға болады:
SELECT * FROM departments d WHERE NOT EXISTS
(SELECT * FROM employees e WHERE d.department_id = e.department_id); Сондай мүмкіндіктер Microsoft SQL Server-де қарастырылған.
Oracle қайтарылған нәтиженің жолдарды нөмірлей алады. Ол үшін арнайы ROWNUM жолағы қолданылады. Бірақ бұл бағанды сұраныста тікелей қолдану мүмкін емес: Мысалы, келесі сұраныс
SELECT ROWNUM, * FROM hr.employees қатені қайтарады.
Оның орнына ROWNUM енгізілген жазуды шектеу үшін қолданылады, мысалы: SELECT * FROM employees WHERE ROWNUM < 10;
Бұл жағдайда барлығы 9 жазу енгізіледі.
Мұндай мүмкіндікті сұраныс потенциалды түрде мәндердің үлкен сандарын және серверді жүктелдіруде қолдануға болады, ал сіздер оның дұрыс орындалуына сенімді болуыңыз керек.
Достарыңызбен бөлісу: |