Мартин Грубер - Понимание SQL (Мартин Грубер. Понимание SQL), страница 7
Описание файла
PDF-файл из архива "Мартин Грубер. Понимание SQL", который расположен в категории "". Всё это находится в предмете "информационные технологии в материаловедении" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "информационные технологии в материаловедении" в общих файлах.
Просмотр PDF-файла онлайн
Текст 7 страницы из PDF
Так как 200 — это скалярное значение, как и значение в столбце оценки, для ихсравнения вы можете использовать реляционный оператор.SELECT *FROM CustomersWHERE rating > 200;Вывод для этого запроса показывается в Рисунке 4.1.=============== SQL Execution Log ============| SELECT *|| FROM Customers|| WHERE rating > 200;|| ============================================= ||snumcnamecityratingsnum|| ------------ -------- ---------||2004CrassBerlin3001002||2008Cirneros San Jose3001007|===============================================Рисунок 4.1:Использование больше чем (>)Конечно, если бы мы захотели увидеть еще и заказчиков с оценкой, равной 200,мы стали бы использовать предикатrating >= 200БУЛЕВЫ ОПЕРАТОРЫОсновные Булевы операторы также распознаются в SQL. Выражения Буля —являются или верными или неверными, подобно предикатам. Булевы операторы связывают одно или более верных/неверных значений и производят едиственное верное/или/неверное значение.
Стандартными операторами Буля, распознаваемыми вSQL, являются: AND, OR, и NOT.Существуют другие, более сложные, операторы Буля (типа "исключенный или"),но они могут быть сформированы из этих трех простых операторов — AND, OR, NOT.Как вы можете понять, Булева верная / неверная логика — основана на цифровой компьютерной операции; и фактически, весь SQL (или любой другой язык) можетбыть сведен до уровня Булевой логики.Операторы Буля и как они работают:AND берет два Буля (в форме A AND B) как аргументы и оценивает их по отношению к истине, верны ли они оба.OR берет два Буля (в форме A OR B) как аргументы и оценивает на правильность, верен ли один из них.NOT берет одиночный Булев (в форме NOT A) как аргументы и заменяет егозначение с неверного на верное или верное на неверное.Связывая предикаты с операторами Буля, вы можете значительно увеличить ихвозможности.
Предположим вы хотите видеть всех заказчиков в San Jose которыеимеют оценку (рейтинг) выше 200:SELECT *FROM CustomersWHERE city = “San Jose”AND rating > 200;Вывод для этого запроса показан на Рисунке 4.2. Имеется только один заказчик,который удовлетворяет этому условию.=============== SQL Execution Log ============||| SELECT *|| FROM Customers|| WHERE city = 'San Jose'|| AND rating > 200;|| ============================================= ||сnumcnamecityratingsnum|| ------------- -------- -------||2008Cirneros San Jose3001007|===============================================Рисунок 4.2: SELECT использующий ANDЕсли вы же используете OR, вы получите всех заказчиков, которые находились вSan Jose или (OR) которые имели оценку выше 200.SELECT *FROM CustomersWHERE city = “San Jose” OR rating > 200;Вывод для этого запроса показывается в Рисунке 4.3.=============== SQL Execution Log ============| SELECT *|| FROM Customers|| WHERE city = 'San Jose'|| OR rating > 200;|| ============================================= ||сnumcnamecityratingsnum|| ----------- -------- ---------||2003LiuSan Jose2001002||2004GrassBerlin3001002||2008Cirneros San Jose3001007|===============================================Рисунок 4.3: SELECT использующий ORNOT может использоваться для инвертирования значений Буля.
Имеется пример запроса с NOT:SELECT *FROM CustomersWHERE city = "San Jose" OR NOT rating > 200;Вывод этого запроса показывается в Рисунке 4.4.=============== SQL Execution Log ============| SELECT *|| FROM Customers|| WHERE city = 'San Jose'|| OR NOT rating > 200;|| ============================================= ||cnumcnamecityratingsnum|| ------------- -------------||2001Hoffman London1001001||2002Giovanni Rome2001003||2003LiuSan Jose2001002||2006Clemens London1001001||2008Cirneros San Jose3001007||2007Pereira Rome1001004|===============================================Рисунок 4.4: SELECT использующий NOTВсе записи за исключением Grass были выбраны. Grass не был в San Jose, и егооценка была больше чем 200, так что он потерпел неудачу при обеих проверках.
Вкаждой из других строк встретился один или другой или оба критериев. Обратитевнимание что оператор NOT должен предшествовать Булеву оператору, чье значениедолжно измениться, и не должен помещаться перед реляционным оператором. Например неправильным вводом оценки предиката будет:rating NOT > 200Он выдаст другую отметку. А как SQL оценит следующее?SELECT *FROM CustomersWHERE NOT city = “San Jose” OR rating > 200;NOT применяется здесь только к выражению city = 'SanJose', или к выражениюrating > 200 тоже? Как и написано, правильный ответ будет прежним. SQL может применять NOT с выражением Буля только сразу после него.
Вы можете получить другойрезультат при команде:SELECT *FROM CustomersWHERE NOT( city = “San Jose” OR rating > 200 );Здесь SQL понимает круглые скобки как означающие, что все внутри них будетоцениваться первым и обрабатываться как единое выражение с помощью всего чтоснаружи них (это является стандартной интерпретацией в математике).
Другими словами, SQL берет каждую строку и определяет, соответствует ли истине равенство city= "San Jose' или равенство rating > 200. Если любое условие верно, выражение Булявнутри круглых скобок верно. Однако, если выражение Буля внутри круглых скобокверно, предикат как единое целое неверен, потому что NOT преобразует верно в неверно и наоборот.Вывод для этого запроса показывается в Рисунке 4.5.=============== SQL Execution Log ============| SELECT *|| FROM Customers|| WHERE NOT (city = 'San Jose'|| OR rating > 200);|| ============================================= ||cnumcnamecityratingsnum|| ------------ ---------------||2001Hoffman London1001001||2002Giovanni Rome2001003||2006Clemens London1001001||2007Pereira Rome1001004|===============================================Рисунок 4.5: SELECT использующий NOT и вводное предложениеИмеется намеренно сложный пример.
Посмотрим сможете ли вы проследить егологику (вывод показан в Рисунке 4.6):SELECT *FROM OrdersWHERE NOT ((odate = 10/03/1990 AND snum >1002) OR amt > 2000.00);=============== SQL Execution Log ==============| SELECT *|| FROM Orders|| WHERE NOT ((odate = 10/03/1990 AND snum > 1002) || OR amt > 2000.00);|| =============================================== ||onumamtodatecnumsnum || ------------- ---------- --------- ||3003767.19 10/03/199020011001 ||30091713.23 10/04/199020021003 ||300775.75 10/04/199020041002 ||30101309.95 10/06/199020041002 |=================================================Рисунок 4.6: Полный (комплексный) запросНесмотря на то, что Булевы операторы индивидуально просты, они не так просты, когда комбинируются в комплексное выражение.Способ оценки комплекса Булева состоит в том, чтобы оценивать Булевы выражения, наиболее глубоко вложенные в круглых скобках, объединять их в единичноеБулево значение, и затем объединять его с верхними значениями.Имеется подробное объяснение того как пример выше был вычислен.
Наиболееглубоко вложенные выражения Буля в предикате — это odate = 10/03/1990 и snum >1002 являются объединеными с помощью AND, формируя одно выражение Буля, которое будет оценено как верное для всех строк, в которых встретились оба эти условия. Это составное Булево выражение (которое мы будем называть Булево номер 1,или B1 для краткости) объдиняется с выражением (amt) > 2000.00 (B2) с помощью OR,формируя третье выражение (B3), которое является верным для данной строки, еслиили B1 или B2 — верны для этой строки.
B3 полностью содержится в круглых скобкахкоторым предшествует NOT, формируя последнее выражение Буля (B4), которое является условием предиката. Таким образом B4, предикат запроса, — будет верен всякий раз, когда B3 неправилен. B3 — неправилен всегда, когда B1 и B2 — оба неверны.B1 неправилен для строки если дата порядка строки не 10/03/1990, или если значениеsnum не большее чем 1002.
B2 неправилен для всех строк, значения суммы приобретений которых не превышает 2000.00. Любая строка со значением выше 2000.00 сделает B2 — верным; в результате B3 будет верен, а B4 нет. Следовательно, все этистроки будут удалены из вывода. Из оставшихся, строки, которые на 3 Октября имеютsnum > 1002 (такие, как строки для onum 3001 на 3 Октября со snum = 1007), делаютB1 верным, с помощью верного B3 и неверного предиката запроса. Они будут такжеудалены из вывода.
Вывод показан для строк которые оставлены.РЕЗЮМЕВ этой главе вы значительно расширили ваше знакомство с предикатами. Теперь вы можете находить значения, которые связаны с данным значением любымспособом — определяемым различными реляционными операторами. Вы можететакже использовать операторы Буля AND и OR чтобы много условий, каждое из которых автономно в предикатах, объединять в единый предикат. Оператор Буля NOT, каквы уже видели, может изменять значение условия или группы условий напротивоположное.Булевы и реляционные операторы могут эффективно управляться с помощьюкруглых скобок, которые определяют порядок, в котором операции будут выполнены.Эти операции применимы к любому уровню сложности и вы поняли как сложные условия могут создаваться из этих простых частей.Теперь, когда мы показали как используются стандартные математические операторы, мы можем перейти к операторам, которые являются исключительными в SQL.Это мы сделаем в Главе 5.РАБОТА С SQL1.
Напишите запрос который может дать вам все порядки со значениями суммы вышечем $1,000.2. Напишите запрос который может выдать вам поля sname и city для всех продавцовв Лондоне с комиссионными выше .10.3. Напишите запрос к таблице Заказчиков чей вывод может включить всех заказчиковс оценкой =< 100, если они не находятся в Риме.4. Что может быть выведено в результате следующего запроса ?SELECT *FROM OrdersWHERE (amt < 1000 OR NOT (odate = 10/03/1990 AND cnum > 2003 ));5. Что может быть выведено в результате следующего запроса ?SELECT *FROM OrdersWHERE NOT ((odate = 10/03/1990 OR snum > 1006) AND amt > = 1500 );6.