Кіріспе
SQL деректер қорында мәннің жоқ екенін көрсету үшін қолданылатын маркер. SQL-де null немесе NULL – деректер қорында деректің жоқ екенін көрсету үшін қолданылатын арнайы маркер. Реляциялық деректер базасы моделінің авторы Э. Ф. Кодд ұсынған SQL null, барлық нақты реляциялық деректер базасын басқару жүйелерінің (RDBMS) «жоғалған және қолданылмайтын ақпаратты» көрсету қажеттілігін қанағаттандыруға арналған. Кодд сондай-ақ деректер базасы теориясында null-ді көрсету үшін грек әрпі омеганың (ω) кіші әрпін пайдалануды енгізді. SQL-де NULL – бұл маркерді анықтауға арналған резервтелген сөз. Null-ді 0 мәнімен шатастыруға болмайды. Null – мәннің болмауын білдіреді, бұл нөлдік мәнмен бірдей емес. Мысалы, «Адамның неше кітабы бар?» деген сұрақты қарастырайық. Жауап «нөл» (біз оның кітабы жоқ екенін білеміз) немесе «null» (біз оның неше кітабы бар екенін білмейміз) болуы мүмкін. Деректер қоры кестесінде осы жауапты көрсететін баған бастапқыда мәнсіз болады (null арқылы белгіленеді) және Адамда кітап жоқ екені анықталғанша нөлдік мәнмен жаңартылмайды. SQL-де null – маркер, мән емес. Бұл қолданылу көптеген бағдарламалау тілдерінен өте өзгеше, онда сілтеменің null мәні ол ешқандай нысанға сілтеме жасамайды дегенді білдіреді.
In SQL, null or NULL is a special marker used to indicate that a data value does not exist in the database. Introduced by the creator of the relational database model, E. F. Codd, SQL null serves to fulfil the requirement that all true relational database management systems (RDBMS) support a representation of "missing information and inapplicable information". Codd also introduced the use of the lowercase Greek omega (ω) symbol to represent null in database theory. In SQL, NULL is a reserved word used to identify this marker. A null should not be confused with a value of 0. A null indicates a lack of a value, which is not the same thing as a zero value. For example, consider the question "How many books does Adam own?" The answer may be "zero" (we know that he owns none) or "null" (we do not know how many he owns). In a database table, the column reporting this answer would start out with no value (marked by null), and it would not be updated with the value zero until it is ascertained that Adam owns no books. In SQL, null is a marker, not a value. This usage is quite different from most programming languages, where a null value of a reference means it is not pointing to any object.
Тарих
Э. Ф. Кодд 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-мен бірдей деп есептеледі.
interchangeably to mean exactly the same thing". The Boolean type has been subject of criticism, particularly because of the mandated behavior of the UNKNOWN literal, which is never equal to itself because of the identification with NULL. As discussed above, in the PostgreSQL implementation of SQL, Null is used to represent all UNKNOWN results, including the UNKNOWN BOOLEAN. PostgreSQL does not implement the UNKNOWN literal (although it does implement the IS UNKNOWN operator, which is an orthogonal feature.) Most other major vendors do not support the Boolean type (as defined in T031) as of 2012. The procedural part of Oracle's PL/SQL however supports BOOLEAN variables; these can also be assigned NULL and the value is considered the same as UNKNOWN.
Сындар
Null-дың ISO SQL-дегі іске асырылуы сынға ұшырап, пікірталас тудырып, өзгерістер қажеттігін білдіреді. Деректер қорын басқарудың реляциялық моделі: 2-ші нұсқасында Кодд SQL-дегі Null іске асырылуының кемшіліктері бар екенін және оны екі түрлі Null типті белгілермен алмастыру қажеттігін айтқан. Ол ұсынған белгілер "Қосымшалы болмағанмен, қолданылуы мүмкін" және "Қосымшалы болмағанмен, қолданылуы мүмкін емес" деп аталатын, сәйкесінше A және I мәндері ретінде танылды. Коддтың ұсынысы қабылданған жағдайда, SQL-де төрт мәнді логиканы іске асыру қажет болар еді. Басқалар Коддтың ұсынысына қосымша Null типті белгілерді енгізуді ұсынды, деректер мәнінің "жоқ" болуының себептерін көбірек көрсету үшін, бұл SQL логикалық жүйесінің күрделілігін арттырар еді. Әр түрлі уақытта SQL-де бірнеше пайдаланушы анықтаған Null белгілерін енгізу туралы ұсыныстар да жасалды. Көптеген Null белгілерін қолдауға қажетті Null басқару және логикалық жүйелердің күрделілігіне байланысты, бұл ұсыныстардың ешқайсысы кеңінен қабылданбады. Крис Дате мен Хью Дарвен, "Үшінші манифест" авторлары, SQL-дегі Null іске асырылуының өзінде кемшіліктер бар екенін және оны мүлдем жою қажеттігін айтты. SQL Null-ді (әсіресе жиынтық функцияларда) іске асырудағы сәйкессіздіктер мен кемшіліктерді дәлелдеп, Null тұжырымдамасының өзінде кемшіліктер бар екенін және оны реляциялық модельден алып тастау керек екенін көрсетті. Басқалар, автор Фабиан Паскаль сияқты, "функция есептеулері жоғалған мәндерге қалай қарау керектігі реляциялық модельмен реттелмейді" деген пікірде болды.
Жабық әлем болжамы
Nulls туралы тағы бір дау тудыратын мәселе – олар реляциялық деректер қорының жабық әлемді қабылдау моделін бұзады, оған ашық әлемді қабылдауды енгізеді. Деректер қорына қатысты жабық әлемді қабылдау мынаны білдіреді: "Деректер қорында нақты немесе түсіндіріліп айтылғанның бәрі шын, ал қалғаны бәрі жалған." Бұл көзқарас деректер қорында сақталған әлем туралы білімнің толық екенін болжайды. Дегенмен, Nulls ашық әлемді қабылдау бойынша жұмыс істейді, онда деректер қорында сақталған кейбір мәліметтер белгісіз деп есептеледі, бұл деректер қорының әлем туралы сақталған білімін толық емес етеді.