Баарына салам!
Биз баарыбыз бул жерде бир максат үчүн иштеп жатабыз - Java Developers болуу . Балким, кесипкөй болуу жолунда эң маанилүү этап техникалык интервью болуп саналат. Эреже катары, интервью алуучу бир-эки суроолорду берип, негизги темалардан өтөт. Бул макалада биз ушундай негизги темалардын бири жөнүндө сүйлөшөбүз -
маалымат базалары . Келгиле, эң көп берилүүчү суроолорду карап көрөлү жана аларга материалга терең сүңгүп кирбестен жооп бергенге аракет кылалы, анткени мындай учурда китептин көлөмү бизге жетпей калат! Ошентип, кетели.
1. Маалымат базалары деген эмне? Алар кандай түрлөргө бөлүнөт?
DBMS деген эмнени билдирет?
Берorштер базасы (МБ) – негизинен чоң көлөмдөгү өз ара байланышкан маалыматты сактоо, өзгөртүү жана иштетүү үчүн арналган уюшкан структура. Башка сөз менен айтканда, маалымат базасы структураланган маалыматтарды сактоо болуп саналат. Мисалы, телефон китепчеси.
Маалымат базасынын түрлөрү
- Реляциялык маалымат базасы - бул алардын ортосунда алдын ала аныкталган мамилелери бар маалыматтардын жыйындысы. Маалыматтар тилкелерден жана саптардан турган tableлардын жыйындысы катары сакталат. Таблицалар маалымат базасында көрсөтүлгөн an objectтер жөнүндө маалыматты сактайт. Ар бир table тилкесинде белгилүү бир маалымат түрү сакталат жана ар бир клетка атрибут маанисин сактайт.
- Реляциялык эмес системалар (NoSQL) ийкемдүү схемалары бар белгилүү бир маалымат моделдери үчүн иштелип чыккан системалар. Башкача айтканда, бул маалыматтарды tableлык схемалар, саптар жана мамычалар түрүндө эмес, башка форматтарда сактаган маалымат базалары.
Реляциялык эмес маалымат базалары жөнүндө көбүрөөк маалыматты бул макаладан окуй аласыз:
Иштеп чыгуучулар үчүн NoSQL колдонмосу .
Берorштер базасын башкаруу системасы (МББ) – бул колдонуучу маалымат базасын (МБ) түзүп, алар боюнча ар кандай операцияларды: толуктоо, жаңыртуу, жок кылуу, тандоо ж.б.у.с. аткара ала турган программалык камсыздоонун жыйындысы. маалыматтарды сактоо жана маалымат базасын башкаруу мүмкүнчүлүгүн берүүгө мүмкүндүк берет. Мисал катары, MySql реляциялык маалымат базасына же MongoDBге байланышы жок маалымат базасына кирүү мүмкүнчүлүгүн камсыз кылган DBMS болуп саналат.
2. Нормалдаштыруу деген эмне? Нормалдаштырылган формабы? Нормалдаштыруунун канча формасы бар? Биринчи үчөөнү атаңыз.
Нормалдаштыруу - бул ашыкча жана көз карандылыктын ыраатсыздыгын жоюу аркылуу маалымат базасынын ийкемдүүлүгүн камсыз кылган маалымат базасындагы маалыматтарды уюштуруу жана структуралаштыруу процесси.
Нормалдуу форма – tableны түзүмдүн жөнөкөйлүгү жана тууралыгы боюнча мүнөздөгөн нормалдаштыруу контекстинде каралуучу tableнын касиети. Кадимки форма table канааттандырууга тийиш болгон талаптардын жыйындысы катары аныкталат. Жалпысынан алты нормалдуу форма бар, бирок иш жүзүндө биринчи үчтөн көп эмес колдонулат:
- Биринчи нормалдуу формасы:
- Бардык атрибуттар жөнөкөй (башкача айтканда, атомдук жана бөлүнгүс);
- Бардык маалыматтар скаляр (башкача айтканда, оң);
- Кайталануучу саптар жок (бул үчүн ар бир сап үчүн негизги ачкыч түзүлөт).
- Экинчи нормалдуу түрү:
- Биринчи нормалдуу форманын шарттары аткарылат;
- Ар бир ачкыч эмес атрибут негизги ачкычка шилтеме кылат.
- Үчүнчү нормалдуу түрү:
- Экинчи нормалдуу топтун шарттары аткарылат;
- Ачкыч эмес талаалар башка ачкыч эмес талаалардан көз каранды эмес: аларды негизги ачкыч менен гана байланыштырууга болот.
3. Нормализация
Денормализация - бул маалымат базасын нормалдаштыруу формаларын атайылап кыскартуу же бузуу, адатта ашыкча маалыматтарды кошуу менен маалымат базасынан окууну тездетүү. Жалпысынан алганда, бул нормалдаштырууга тескери процесс. Бул нормалдуу формалар теориясы практикада дайыма эле колдонула бербейт. Мисалы, атомдук эмес баалуулуктар дайыма эле "жаман" эмес: кээде тескерисинче. Кээ бир учурларда, суроо-талаптарды аткарууда, өзгөчө чоң көлөмдөгү маалыматты иштеп чыгууда кошумча кошулмалар зарыл. Бул акыры аткарууну жакшыртышы мүмкүн. Аналитика үчүн арналган маалымат базалары көбүнчө сурамдардын аткарылышын тездетүү үчүн нормадан ажыратылат. Мисалы, сиз көп учурда негизги эмес мамычалар бири-бири менен байланышта боло турган отчеттор үчүн кээ бир маалыматтарды тандайсыз. Сиз атайылап нормалдаштыруунун үчүнчү түрүн алып салыңыз жана үлгү алуу оңой болушу үчүн бардыгын бир tableга бириктиресиз - башка tableларга кошумча сурамдарды жасоонун кереги жок.
4. Индекстер
Индекс - бул маалыматтарды издөөнү тездетүүчү белгилүү бир тилке менен table же көрүнүш менен байланышкан баалуулуктардын сорттолгон жыйындысы. Башкача айтканда, бул индекстин бир түрү: телефон китепчесиндеги алфавит сыяктуу, фамorя боюнча издөөдө бизге жардам берет. Эгер туура колдонулса, бул функция чоң маалымат базалары менен иштөөдө натыйжалуулукту бир топ жакшыртат. Же сиз аны бир топ төмөндөтсөңүз болот. Издөөнү тездетүү үчүн бул ачкычтар тең салмактуу дарак структурасында сакталат, ал аркылуу издөө жүргүзүлөт. Эреже катары, индекстер эң көп изделген талааларга киргизorши керек. Сизде жок дегенде 10 миң жазуу болгондон эрте эмес индексти түзүү жөнүндө ойлонушуңуз керек. Болбосо, сиз байкалаарлык натыйжаны көрбөйсүз, анткени мөөнөтүнөн мурда оптималдаштыруу -
EVIL . Жана индекс системанын иштешине кандай таасир этиши мүмкүн, сиз сурайсызбы? Жаңы маалыматтар киргизилгенде же эски маалыматтар жок кылынганда, тең салмактуу дарак түзүмү кайра эсептелинет. Чынында, маалымат жана индекстер канчалык көп болсо, ошончолук көп дарактарды санаш керек. Кырдаалды элестетиңиз: бул tableда сизде 20 000ге жакын жазуу жана 7 индекс бар. Башкача айтканда, маалыматтарды киргизүүдө ар биринде 20 000 жазуу бар 7 даракты кайра эсептөө керек. Тактап айтканда, маалыматтар тез-тез кошула турган/жок кылына турган tableлар үчүн индекстерди колдонуу такыр сунушталbyte. Акырында белгилеп кетким келет, көп учурда мааниси табылган мамычалар үчүн индекстер
null
анчалык эффективдүү болбой калат, андыктан аларды мындай тилкелерге кошуунун кереги жок.
SQLдеги кластердик жана кластердик эмес индекстердин ортосунда кандай айырма бар?
Кластердик:
- Тандалган талаа үчүн физикалык тартипти камсыз кылат;
- Эгерде tableда кластердик индекс болсо, анда ал кластерленген деп айтылат;
- Ар бир tableга бирден ашык индекс талап кылынbyte;
- MySQLде кластердик индекс колдонуучу тарабынан ачык көрсөтүлбөйт, анткени үстөлүңүздө БАШКЫ АЧКЫЧты аныктабасаңыз, MySQL
UNIQUE
бардык негизги мамычалар турган биринчи индексти табат NOT NULL
жана InnoDB аны кластердик индекс катары колдонот.
Кластердик эмес:
- Бир tableда 999га чейин кластердик эмес индекстер болушу мүмкүн;
- Таблицадагы реалдуу маалыматтары бар саптарга көрсөткүчтү камтыйт;
- Физикалык тартипти камсыз кылbyte;
- Кластердик эмес индекстер үчүн сорттолгон маалыматтары бар өзүнчө tableлар бар, тактап айтканда, индекс жайгашкан бир мамыча үчүн бир table, ошондуктан, берилген талаага кирбеген маалыматтарды сураганда, сурам биринчи кезекте аткарылат. бул tableдагы талаа, андан кийин гана баштапкы tableдагы сапка каршы кошумча суроо.
Кластердик эмес индексти түзүү:
CREATE INDEX index_name ON table_name(column_name)
6. Курама индекс деген эмне?
Композиттик индекс - бир эле учурда бир нече тилкеге жөнөтүү менен курулган. Башкача айтканда, бул бир нече тилкеден турган татаал индекс. Мындай индекстер бир суроодо бирден ашык тилке пайда болгондо колдонулат. Композиттик индексти түзүү:
CREATE INDEX index_name ON table_name(first_column_name, second_column_name, third_column_name)
Адатта, бул индекстер бир нече тилкелердеги маалыматтар логикалык жактан байланышкан учурда колдонулат.
7. Камтуу индекси деген эмне? Уникалдуу индекс?
Жабуучу индекс – бул tableга кирбестен суроого жооп берүү үчүн жетиштүү болгон индекс. Бул индексти колдонуу менен, сиз маалыматтардын бардык сабын ала аласыз, бирок чындыгында бул жөн эле зарыл эмес. Түздөн-түз булак tableсына өтүүнүн кереги жок жана индексти колдонуу менен жооп бере алсаңыз, камтуу индекстерин колдонуу бир аз ылдамыраак. Ошол эле учурда, канчалык көп мамычалар, индекстин өзү ошончолук түйшүктүү жана жай болоорун унутпаңыз. Андыктан муну кыянаттык менен колдонбошуңуз керек.
Жогоруда биз уникалдуу болушу мүмкүн болгон кластердик жана кластердик эмес индекстер жөнүндө сүйлөштүк . Бул индекс ачкычы үчүн эки талаа бирдей мааниге ээ эмес дегенди билдирет. Болбосо, индекс уникалдуу болбойт, анткени бир нече саптар бирдей маанини камтышы мүмкүн. Уникалдуу кластердик эмес индексти түзүүнүн мисалы:
CREATE UNIQUE INDEX index_name ON table_name(column_name)
8. Негизги ачкыч деген эмне
Негизги ачкыч - tableдагы талаа, ал маалымат базасынын tableсындагы ар бир сапты аныктайт. Таблицада бир гана ушундай талаа болушу мүмкүн жана бардык баалуулуктар уникалдуу болушу керек. Сизге эч нерсени эскерткен жоксузбу?
Анткени, негизги ачкыч
уникалдуу, кластердик индекстен башка эч нерсе эмес. Эреже катары, table түзүүдө негизги ачкычтар түзүлөт:
CREATE TABLE table_name(
column_name int PRIMARY KEY,
…..)
Бул тилкеге чектөө автоматтык түрдө кошулат -
NOT NULL
. Сиз буга чейин түзүлгөн table үчүн да ачкыч орното аласыз:
ALTER TABLE table_name ADD PRIMARY KEY (column_name);
Эгерде негизги ачкыч жогоруда айтылгандай кошулса, анда негизги ачкыч ( ) катары көрсөтүлгөн талаалардын маанилери
column_name
нөл маанилерди камтыбашы үчүн текшерилет (чектөө да кошулат -
NOT NULL
).
Чет элдик ачкыч деген эмне?
Тышкы ачкыч tableлардын ортосундагы байланышты камсыз кылуу үчүн түзүлгөн касиет. Адатта, тышкы ачкыч субtableдагы мамычаларга коюлат жана негизги tableдагы тилкелердин бирине көрсөтөт. Таблицаны түзүүдө катары белгилениши мүмкүн:
CREATE TABLE table_name{
column_name int,
…..
FOREIGN KEY(column_name) REFERENCES another_table_name(another_table_column_name) }
Ошентип, tableны түзгөндөн кийин:
ALTER TABLE table_name
ADD FOREIGN KEY(column_name) REFERENCES another_table_name(another_table_column_name));
Сиз чет өлкөлүк ачкычтын аракетин ал тиешелүү талааны манипуляциялоодо орното аласыз. Манипуляциялар төмөнкүдөй
ON DELETE
түрлөрү болушу мүмкүн
ON UPDATE
: Мүмкүн болгон жүрүм-турум варианттары:
CASCADE
— бул касиет менен, негизги tableда тиешелүү саптар өчүрүлгөндө же өзгөртүлгөндө, көз каранды tableдагы саптар автоматтык түрдө өчүрүлөт же өзгөртүлөт;
SET NULL
— бул касиет менен, тиешелүү сап негизги tableдан өчүрүлгөндө же жаңыртылганда, NULL
чет өлкөлүк ачкыч мамычасынын мааниси коюлат;
NO ACTION
— эгерде көз каранды tableда тиешелүү саптар бар болсо, негизги tableдагы саптарды өчүрүү же өзгөртүү аракеттерин четке кагат;
RESTRICT
- эквиваленттүү NO ACTION
;SET DEFAULT
- бул касиет менен, тиешелүү сап негизги tableдан өчүрүлгөндө же жаңыртылганда, чет өлкөлүк ачкыч мамычасынын демейки мааниси (эгерде бар болсо) коюлат.
Колдонуу мисалы:
CREATE TABLE table_name{
column_name int,
…..
FOREIGN KEY(column_name) REFERENCES another_table_name(another_table_column_name) ON UPDATE CASCADE ON DELETE CASCADE }
ON DELETE
Эгерде жүрүм- турум ачык коюлбаса
ON UPDATE
, жүрүм-турум деп коюлат
RESTRICT
.
10. Таблицалардын ортосундагы байланыштардын түрлөрү (кошулуу)
Таблицалардын ортосундагы байланыш жалпы маалыматтарга (талааларга) негизделген.
JOIN
Бул бир tableдагы саптар менен башка саптар менен дал келген оператордун жардамы менен болот . Карталоо эки tableнын мамычалары жанаша тургандай кылып жасалат, бирок аларды өзүнчө tableлардан алууга болот. Ал эми бизде үч table үчүн жалпы талаалар болсо, алардын маалыматтарын бир жалпы table катары көрсөтө алабыз. Бирок, кошулган tableлар канчалык аз болсо, суроо ошончолук тезирээк иштей турганын эске алуу керек. Ошентип, түрлөрү
JOIN
:
INNER JOIN
- биринчи tableдагы экинчи tableдагы кээ бир маалыматтарга дал келген маалыматтарды гана көрсөткөн байланыш. Калгандары түшөт.
LEFT JOIN
- биринчи tableдагы бардык маалыматтарды жана эгер бар болсо, экинчиден тиешелүү маалыматтарды көрсөткөн байланыш. Эгерде тиешелүү маалыматтар жок болсо, экинчи tableдагы маалыматтар үчүн талаалар бош болот.
RIGHT JOIN
- экинчи tableдагы бардык маалыматтарды жана эгерде бар болсо, биринчиден тиешелүү маалыматтарды көрсөткөн байланыш. Эгерде тиешелүү маалыматтар жок болсо, биринчи tableдагы маалыматтар үчүн талаалар бош болот.
FULL JOIN
- биринчи жана экинчи tableлардагы бардык маалыматтарды көрсөткөн байланыш. Эгерде башка tableда тиешелүү маалыматтар жок болсо, анда ал маалыматтар үчүн талаалар бош болот.
CROSS JOIN
- биринчи tableнын ар бир сабы экинчи tableнын ар бир сабына кошулган кайчылаш кошулуу (ар бирине). Башкача айтканда, эки tableда ар биринде 3 сап болсо, бул кошулгандан кийин биз 9 саптын натыйжасын алабыз.
Мисал
Join(inner)
:
SELECT *
FROM first_table
INNER JOIN second_table ON first_table.some_column = second_table.some_column
11. Маалыматтар базасындагы ACID касиети деген эмне?
A - Atomicity , эч кандай транзакция жарым-жартылай системага берилгенин камсыздайт. Же анын бардык субоперациялары аткарылат, же бири дагы аткарылbyte. Мисалы, банктан башка эсепке акча которуу эки операцияны камтыйт:
- Банк эсебине акча которуу.
- Банк эсебинен белгилүү бир эсепке акча которуу.
Бирок баары болушу мүмкүн. Мисалы, алар банкка барышат, анан кандайдыр бир ката болуп, экинчи операция бүтпөй калат. Же тескерисинче: экинчи операция гана аткарылат. Ошондуктан, бул иш-аракеттер бир бүтүм ичинде жүзөгө ашырылат, жана натыйжасы же баары же эч нерсе.
C - ырааттуулугу : Ар бир ийгorктүү транзакция дайыма чечиле турган натыйжаларды гана жазат. Бул бардык чектөөлөрдүн аткарылышын камсыздайт (мисалы,
NOT NULL
), антпесе транзакция артка кайтарылат.
Жана - изоляция : бүтүмдү аткаруу учурунда, параллелдүү бүтүмдөр анын натыйжасына таасир этпеши керек. Бул бизге акыркы эмес маалымат абалын бардыгынан жашыруу мүмкүнчүлүгүн берет. Чындыгында, ушул себептен ийгorксиз транзакциялар эч нерсени буза алbyte. Бир аз төмөн, биз транзакциялардын изоляциясынын деңгээли менен таанышабыз.
D - Узактыгы : Эгер транзакция бүтсө, анда ал киргизилген өзгөртүүлөр кандайдыр бир катачылыктан улам жокко чыгарылbyte деп ишенсеңиз болот.
12. Транзакциянын изоляциясынын деңгээли
Ар бир обочолонуу деңгээли белгилүү бир аракеттерге (мүмкүнчүлүктөргө) уруксат берет/тыю салат:
- фантомдук окуу - бир эле транзакциянын ичинде бир эле маалымат суроосу башка (параллель) транзакция менен маалыматтарды кошуудан улам пайда болгон ар кандай натыйжаларды берет.
- кайталанбаган окуу - бир эле транзакциянын чегинде бир эле маалымат суроо-талаптары башка (параллель) транзакция менен маалыматтарды өзгөртүүдөн же жок кылуудан улам пайда болгон ар кандай натыйжаларды берет.
- "кир" окуу - транзакция менен кошулган же өзгөртүлгөн маалыматтарды окуу, алар кийинчерээк артка кайтарылbyte;
- жоголгон жаңыртуу - ар кандай транзакциялар бир эле учурда бир маалымат блогун өзгөрткөндө, акыркысынан башка бардык өзгөртүүлөр жоголот (көп агымдагы "жарыш шартына" окшош).
Ыңгайлуу болуу үчүн tableда изоляциянын деңгээлин жана алардын мүмкүнчүлүктөрүн карап чыгабыз:
Изоляция деңгээли |
Фантомдук окуу |
Кайталанбаган окуу |
"кир" окуу |
жоголгон жаңыртуу |
СЕРИЯЛАШТЫРУУЧУ |
+ |
+ |
+ |
+ |
REPEATABLE_READ |
- |
+ |
+ |
+ |
READ_COMMITTED |
- |
- |
+ |
+ |
READ_UNCOMMITTED |
- |
- |
- |
+ |
13. SQL инъекциясы деген эмне?
SQL инъекциясыGET
– бул веб-сайтты бузуп алуу ыкмаларынын бири, анын маңызы сурамдар
POST
же кукилер аркылуу берorштерге SQL codeун киргизүү болуп саналат . Эгерде веб-сайт ушундай инъекцияларды жасаса, анда маалымат базасына кирүү жана тиркемени бузуп алуу мүмкүн. Мисалы, биз кандайдыр бир өзгөрмөнүн атын билебиз.
column_name
түрү менен айталы
boolean
. Эгерде система инъекцияларга дуушар болсо, биз
OR column_name=true
маалымат базасынан керектүү нерселердин баарын кошуп, анан жаза алабыз.
OR
ЖЕ шартын түзөт жана андан кийинки биздин туюнтма ар дайым болот
true
, бул бизди алдыга алып барат. SQL инъекциясы сыяктуу веб-сайтка чабуул SQL сурамдарында колдонулган кирүүчү маалыматтарды туура эмес иштетүүдөн улам болушу мүмкүн.
JDBC аркылуу маалымат базасына туташып жатканда , сиз ар кандай колдоносуз
Statements
.
PreparedStatement
Коопсуздукту жогорулатуу үчүн, адаттагыдай эмес колдонуу керек
Statement
, анткени колдонулганда,
Statement
суроо саптары жана баалуулуктары жөн гана кошулуп, инъекцияларды жасоого мүмкүндүк берет. Өз кезегинде,
PreparedStatement
суроо-талаптын белгилүү бир шаблону бар жана ага маалыматтар тырмакчалар менен киргизилет. Натыйжада, SQL инъекциялары кээ бир талаанын сап чагылдырылышы катары гана кабыл алынат. SQL инъекцияларынан коргоо үчүн, сиз кадимки туюнтмалардын негизинде текшерүүлөрдү колдонсоңуз болот (сиз
бул макалада туруктуу сөз айкаштары жөнүндө көбүрөөк окуй аласыз ).
Дагы бир вариант - кирүүчү параметрлердин символдорунун санына чектөө коюу: мисалы, эгер сиз 9999дан ашпаган санды алышыңыз керек болсо, анда келген төрт символдон турган чек аткарылат.
Бул SQL инъекцияларын колдонуу менен хакерлик кылуу коркунучун азайтат.Сиз Javaдагы коопсуздук тууралуу көбүрөөк биле аласыз “Javaдагы коопсуздук: мыкты тажрыйбалар” деген макаладан .
14. Сакталган proceduresалар деген эмне? Сакталган функциялар? Trigger?
SQLде сакталган proceduresалар – бул бир жолу түзүлүп, serverде сакталган SQL нускамаларынын жыйындысы болгон маалымат базасындагы an object. Бир сөз менен айтканда, бул Java методдорунун аналогу. Сакталган proceduresалар кадимки сурамдарда да, кадимки сурамдар үчүн жеткorксиз болгон кээ бир аракеттерде да, берorштер боюнча аракеттерди жасай алат. Процедура бир жолу түзүлүп, андан кийин аргументтерди өткөрүү аркылуу чакырылган SQL an objectиси. Бул ыкманын артыкчылыгы - бул нускамаларды бир нече жолу колдонууга болот. Сакталган proceduresалар аткарууну жакшыртат, программалоо мүмкүнчүлүктөрүн өркүндөтөт жана маалымат коопсуздук функцияларын колдойт. Келгиле, proceduresаны түзүүнү карап көрөлү:
CREATE PROCEDURE procedure_name (first_param some_type, second_param some_type..)
begin
……...
end
Процедураны чакыруу:
CALL procedure_name (first_param, second_param…..);
Сакталган функция сакталган proceduresанын бир түрү болуп саналат. Функциянын айырмасы - ал ар дайым бир гана маанини кайтарат, ал эми proceduresа ар дайым маанилердин жыйындысын кайтарат. Сакталган proceduresаларды кадимки SQL менен аралаштырууга болбойт, ал эми сакталган функция мүмкүн - бул анын артыкчылыгы. Башка жагынан алганда, сакталган функциялар proceduresаларга караганда көбүрөөк чектөөлөргө ээ. Сакталган функцияны түзүү:
CREATE FUNCTION function_name (first_param, second_param…..)
RETURNS some_type
begin
……...
RETURN some_value;
end
Сакталган функцияны чакыруу:
SELECT function_name(first_param, second_param…..);
Триггер – бул сакталган proceduresанын дагы бир түрү, аны колдонуучу түздөн-түз чакырbyte, бирок маалыматтар өзгөртүлгөндө иштетилет. Башкача айтканда, бул proceduresа белгилүү шарттар аткарылганда, мисалы,
INSERT
же
DELETE
, же
UPDATE
берилген tableнын белгилүү тилкесиндеги маалыматтар иштетилет. Качан триггер иштетилгени ачкыч сөздөрдүн жардамы менен аныкталат
BEFORE
(байланышкан окуяга чейин триггер оту) же
AFTER
(окуядан кийин).
CREATE TRIGGER trigger_name
ON table_name
AFTER INSERT
begin
……...
end
15. Практика
Кандай болбосун, интервьюда эң кеңири таралган SQL суроосу практика болот - көйгөйдү чечүү. Сизге кандай тапшырмалар келерин болжолдоонун мааниси жок, анткени баары карама-каршы адамдын фантазиясынын татаалдыгынан көз каранды. Ошондуктан, бир гана жумушчу вариант - ар кандай татаалдыктагы SQL сурамдарын жакшыраак алуу.
sql-ex.ru ар кандай тапшырмаларды аткаруу үчүн булак катары кызмат кыла алат . Биринчи жыйырма тапшырманы аткаргандан кийин, маектешиңиз сизди кандайдыр бир SQL тапшырмасы менен коркутуу абдан кыйын болот.
Бүгүнкү күндө бардыгы: бул макаланы окуп чыккандан кийин, маалымат базалары жөнүндө суроолор эч кандай кыйынчылыктарды же көйгөйлөрдү жаратпайт деп үмүттөнөм. Көңүл бурганыңыз үчүн рахмат жана кайрадан көрүшкөнчө!
GO TO FULL VERSION