Кіріспе

SQL деректер қорында мәннің жоқ екенін көрсету үшін қолданылатын маркер. SQL-де null немесе NULL – деректер қорында деректің жоқ екенін көрсету үшін қолданылатын арнайы маркер. Реляциялық деректер базасы моделінің авторы Э. Ф. Кодд ұсынған SQL null, барлық нақты реляциялық деректер базасын басқару жүйелерінің (RDBMS) «жоғалған және қолданылмайтын ақпаратты» көрсету қажеттілігін қанағаттандыруға арналған. Кодд сондай-ақ деректер базасы теориясында null-ді көрсету үшін грек әрпі омеганың (ω) кіші әрпін пайдалануды енгізді. SQL-де NULL – бұл маркерді анықтауға арналған резервтелген сөз. Null-ді 0 мәнімен шатастыруға болмайды. Null – мәннің болмауын білдіреді, бұл нөлдік мәнмен бірдей емес. Мысалы, «Адамның неше кітабы бар?» деген сұрақты қарастырайық. Жауап «нөл» (біз оның кітабы жоқ екенін білеміз) немесе «null» (біз оның неше кітабы бар екенін білмейміз) болуы мүмкін. Деректер қоры кестесінде осы жауапты көрсететін баған бастапқыда мәнсіз болады (null арқылы белгіленеді) және Адамда кітап жоқ екені анықталғанша нөлдік мәнмен жаңартылмайды. SQL-де null – маркер, мән емес. Бұл қолданылу көптеген бағдарламалау тілдерінен өте өзгеше, онда сілтеменің null мәні ол ешқандай нысанға сілтеме жасамайды дегенді білдіреді.

Тарих

Э. Ф. Кодд 1975 жылы ACM SIGMOD FDT бюллетенінде реляциялық модельдегі жоғалған деректерді көрсету әдісі ретінде нөлдерді атады. Коддтың Null семантикасына қатысты (SQL-де қабылданған) ең көп сілтеме жасалған мақаласы – ACM Transactions on Database Systems журналында 1979 жылы жарияланған мақаласы, онда ол өзінің Реляциялық моделін/Тасманияны ұсынды, бірақ соңғы мақаланың басқа ұсыныстарының көп бөлігі түсініксіз болып қалды. Оның 1979 жылғы жұмысының 2.3-бөлімі арифметикалық операцияларда Null таралу семантикасын, сондай-ақ нөлдерді салыстыру кезінде үштік (үш мәнді) логиканы қолданатын салыстыруларды егжей-тегжейлі сипаттайды; сонымен қатар, басқа жиынтық операцияларда Null-дерді қарау туралы егжей-тегжейлі мәлімет берілген (соңғы мәселе әлі күнге дейін даулы). Деректер қоры теориясы саласында Коддтың бастапқы ұсынысы (1975, 1979) қазір «Кодд кестелері» деп аталады. 1986 жылғы SQL стандарты негізінен Коддтың ұсынысын IBM System R жүйесіндегі прототипті іске асырудан кейін қабылдады. Дон Чемберлин нөлдерді (көшірме жолдармен бірге) SQL-дің ең даулы ерекшеліктерінің бірі деп мойындаса да, ол SQL-дегі Null-дердің дизайнын қорғады, себебі бұл жоғалған ақпаратты қолдаудың ең арзан түрі екенін, бағдарламашыны көптеген қайталама қолданба деңгейіндегі тексерулерден (жартылай предикат мәселесін қараңыз) сақтап, деректер қорының дизайнеріне қажет болса Null-дерді пайдаланбау мүмкіндігін беретінін айтты; мысалы, белгілі аномалиялардан (осы мақаланың семантика бөлімінде талқыланған) аулақ болу үшін. Чемберлин сонымен қатар, Null-дермен тәжірибелік тәжірибе, жоғалған мәндік функционалдылықты қамтамасыз етуден басқа, Null-дерге негізделген басқа тілдік ерекшеліктерге, мысалы, белгілі бір топтастыру конструкциялары мен сыртқы қосылуларға әкелді деп мәлімдеді. Соңында, ол тәжірибеде Null-дер қолданыстағы схеманы бастапқы мақсатынан тыс дамыту қажет болған кезде жылдам түзету құралы ретінде қолданылатынын, деректердің жоқтығын емес, керісінше қолданылмайтын ақпаратты кодтау үшін қолданылатынын айтты; мысалы, бір галлонға шақырым есебіндегі бағанына ие бола отырып, электрлік автомобильдерді тез қолдау қажет болатын деректер қоры. Кодд 1990 жылы жарық көрген «The Relational Model for Database Management, Version 2» кітабында SQL стандартымен талап етілген жалғыз Null жеткіліксіз екенін және деректердің жоғалу себебін көрсету үшін екі бөлек Null типін белгілеушілерімен алмастырылуы керектігін көрсетті. Коддтың кітабында бұл екі Null типін белгілеушілері «A мәндері» және «I мәндері» деп аталады, олар «Жоқ, бірақ қолданыла алады» және «Жоқ, бірақ қолданылмайды» дегенді білдіреді. Бұл мәселелерді шешу үшін түрлі ұсыныстар жасалса да, баламалардың күрделілігі оларды кеңінен қабылдауға кедергі келтірді.

Нөлдік басқару функциялары

SQL екі функцияны Null мәндерін нақты өңдеу үшін анықтайды: NULLIF және COALESCE. Екі функция да ізделінетін CASE өрнектерінің қысқартылған түрі болып табылады.

BOOLEAN дерек түрі

ISO SQL:1999 стандарты SQL-ге BOOLEAN дерек типін енгізді, бірақ ол әлі күнге дейін T031 кодымен белгіленген, міндетті емес, қосымша мүмкіндік болып табылады. NOT NULL шектеуімен шектелген кезде SQL BOOLEAN басқа тілдердегі Boolean типі сияқты жұмыс істейді. Дегенмен, шектеусіз BOOLEAN дерек типі, атына қарамастан, TRUE, FALSE және UNKNOWN шындық мәндерін сақтай алады, олардың барлығы стандартқа сәйкес boolean литералдары ретінде анықталған. Стандартта NULL және UNKNOWN "бір-бірін алмастыра қолданылып, бірдей мағынаны білдіруі мүмкін" делінген. Boolean типі сынға ұшырады, әсіресе UNKNOWN литералының міндетті түрдегі мінез-құлқы, NULL-мен теңестірілуінің нәтижесінде өзіне тең болмайды. Жоғарыда айтылғандай, SQL-дің PostgreSQL нұсқасында Null барлық UNKNOWN нәтижелерін, соның ішінде UNKNOWN BOOLEAN-ды көрсету үшін қолданылады. PostgreSQL UNKNOWN литералын іске асырмайды (бірақ IS UNKNOWN операторын іске асырады, ол дербес мүмкіндік болып табылады). 2012 жылдан бастап көптеген басқа ірі жеткізушілер Boolean типін (T031 стандартында анықталғандай) қолдамайды. Алайда, Oracle PL/SQL-дің процедуралық бөлігі BOOLEAN айнымалыларын қолдайды; оларға NULL да тағайындалуы мүмкін, ал оның мәні UNKNOWN-мен бірдей деп есептеледі.

Сындар

Null-дың ISO SQL-дегі іске асырылуы сынға ұшырап, пікірталас тудырып, өзгерістер қажеттігін білдіреді. Деректер қорын басқарудың реляциялық моделі: 2-ші нұсқасында Кодд SQL-дегі Null іске асырылуының кемшіліктері бар екенін және оны екі түрлі Null типті белгілермен алмастыру қажеттігін айтқан. Ол ұсынған белгілер "Қосымшалы болмағанмен, қолданылуы мүмкін" және "Қосымшалы болмағанмен, қолданылуы мүмкін емес" деп аталатын, сәйкесінше A және I мәндері ретінде танылды. Коддтың ұсынысы қабылданған жағдайда, SQL-де төрт мәнді логиканы іске асыру қажет болар еді. Басқалар Коддтың ұсынысына қосымша Null типті белгілерді енгізуді ұсынды, деректер мәнінің "жоқ" болуының себептерін көбірек көрсету үшін, бұл SQL логикалық жүйесінің күрделілігін арттырар еді. Әр түрлі уақытта SQL-де бірнеше пайдаланушы анықтаған Null белгілерін енгізу туралы ұсыныстар да жасалды. Көптеген Null белгілерін қолдауға қажетті Null басқару және логикалық жүйелердің күрделілігіне байланысты, бұл ұсыныстардың ешқайсысы кеңінен қабылданбады. Крис Дате мен Хью Дарвен, "Үшінші манифест" авторлары, SQL-дегі Null іске асырылуының өзінде кемшіліктер бар екенін және оны мүлдем жою қажеттігін айтты. SQL Null-ді (әсіресе жиынтық функцияларда) іске асырудағы сәйкессіздіктер мен кемшіліктерді дәлелдеп, Null тұжырымдамасының өзінде кемшіліктер бар екенін және оны реляциялық модельден алып тастау керек екенін көрсетті. Басқалар, автор Фабиан Паскаль сияқты, "функция есептеулері жоғалған мәндерге қалай қарау керектігі реляциялық модельмен реттелмейді" деген пікірде болды.

Жабық әлем болжамы

Nulls туралы тағы бір дау тудыратын мәселе – олар реляциялық деректер қорының жабық әлемді қабылдау моделін бұзады, оған ашық әлемді қабылдауды енгізеді. Деректер қорына қатысты жабық әлемді қабылдау мынаны білдіреді: "Деректер қорында нақты немесе түсіндіріліп айтылғанның бәрі шын, ал қалғаны бәрі жалған." Бұл көзқарас деректер қорында сақталған әлем туралы білімнің толық екенін болжайды. Дегенмен, Nulls ашық әлемді қабылдау бойынша жұмыс істейді, онда деректер қорында сақталған кейбір мәліметтер белгісіз деп есептеледі, бұл деректер қорының әлем туралы сақталған білімін толық емес етеді.