Delete FROM заказ where срокпоставки < '01. 01. 2013' go

33. Язык SQL : использование операторов IN , BETWEEN , LIKE и ключевого слова NULL в условиях отбора данных.

Оператор IN определяет набор значений в которое данное значение может или не может быть включено. В соответствии с нашей учебной базой данных на которой вы обучаетесь по настоящее времен, если вы хотите найти всех продавцов, которые размещены в Barcelona или в London, вы должны использовать следующий запрос ( вывод показывается в Рисунке 5.1 ):

SELECT *

FROM Salespeople

WHERE city = 'Barcelona'

OR city = 'London';

Имеется и более простой способ получить ту же информацию:

SELECT *

FROM Salespeople

WHERE city IN ( 'Barcelona', 'London' );

Вывод для этого запроса показывается в Рисунке 5.2.
Как вы можете видеть, IN определяет набор значений с помощью имен членов набора заключенных в круглые скобки и отделенных запятыми. Он затем проверяет различные значения указанного пол пытаясь найти совпадение со значениями из набора. Если это случается, то предикат верен. Когда набор содержит значения номеров а не символов, одиночные кавычки опускаются. Давайте найдем всех заказчиков относящихся к продавцам имеющих значения snum = 1001, 1007, и 1004. Вывод для следующего запроса показан на Рисунке 5.3:

SELECT *

FROM Customers

WHERE cnum IN ( 1001, 1007, 1004 );

=============== SQL Execution Log ============

| |

| SELECT * |

| FROM Salespeople |

| WHERE city = 'Barcelona' |

| OR city = 'London'; |

| ==============================================|

| snum sname city comm |

| ------ ---------- ----------- ------- |

| 1001 Peel London 0.12 |

| 1004 Motika London 0.11 |

| 1007 Rifkin Barcelona 0.15 |

| |

===============================================

Рисунок 5.1 Нахождение продавцов в Барселоне и Лондоне

=============== SQL Execution Log ============

| |

| SELECT * |

| FROM Salespeople |

| WHERE city IN ('Barcelona', 'London'; |

| ==============================================|

| snum sname city comm |

| ------ ---------- ----------- ------- |

| 1001 Peel London 0.12 |

| 1004 Motika London 0.11 |

| 1007 Rifkin Barcelona 0.15 |

| |

===============================================

Рисунок 5.2 SELECT использует IN

=============== SQL Execution Log ============

| SELECT * |

| FROM Customers |

| WHERE snum IN ( 1001, 1007, 1004 ); |

| ============================================= |

| snum cname city rating snum |

| ------ -------- ------ ---- ------ |

| 2001 Hoffman London 100 1001 |

| 2006 Clemens London 100 1001 |

| 2008 Cisneros San Jose 300 1007 |

| 2007 Pereira Rome 100 1004 |

=============================================

Рисунок 5.3: SELECT использует IN с номерами

ОПЕРАТОР BETWEEN

Оператор BETWEEN похож на оператор IN. В отличии от определения по номерам из набора, как это делает IN, BETWEEN определяет диапазон, значения которого должны уменьшаться что делает предикат верным. Вы должны ввести ключевое слово BETWEEN с начальным значением, ключевое AND и конечное значение. В отличие от IN, BETWEEN чувствителен к порядку, и первое значение в предложении должно быть первым по алфавитному или числовому порядку. ( Обратите Внимание что, в отличие от Английского языка, SQL не говорит что "значение находится (между)BETWEEN значением и значением", а просто "значение BETWEEN значение значение". Это применимо и к оператору LIKE). Следующий пример будет извлекать из таблицы Продавцов всех продавцов с комиссионными между .10 и .12 (вывод показывается в Рисунке 5.4):

SELECT *

FROM Salespeople

WHERE comm BETWEEN .10 AND .12;

Для включенного оператора BETWEEN, значение совпадающее с любым из двух значений границы ( в этом случае, .10 и .12 ) заставляет предикат быть верным.

=============== SQL Execution Log ============

| SELECT * |

| FROM Salespeople |

| WHERE comm BETWEEN .10 AND .12; |

| ==============================================|

| snum sname city comm |

| ------ ---------- ----------- ------- |

| 1001 Peel London 0.12 |

| 1004 Motika London 0.11 |

| 1003 Axelrod New York 0.10 |

=============================================

Рисунок 5.4: SELECT использует BETWEEN
SQL не делает непосредственной поддержки невключения BETWEEN. Вы должны или определить ваши граничные значения так, чтобы включающая интерпретация была приемлема, или сделать что-нибудь типа этого:

SELECT *

FROM Salespeople

WHERE ( comm BETWEEN .10, AND .12 )

AND NOT comm IN ( .10, .12 );

Вывод для этого запроса показывается в Рисунке 5.5. По общему признанию, это немного неуклюже, но зато показывает как эти новые операторы могут комбинироваться с операторами Буля чтобы производить более сложные предикаты. В основном, вы используете IN и BETWEEN также как вы использовали реляционные операторы чтобы сравнивать значения, которые берутся либо из набора ( для IN ) либо из диапазона ( для BETWEEN ).
Также, подобно реляционным операторам, BETWEEN может работать с символьными полями в терминах эквивалентов ASCII. Это означает что вы можете использовать BETWEEN чтобы выбирать ряд значений из упорядоченных по алфавиту значений.

=============== SQL Execution Log ============

| |

| SELECT * |

| FROM Salespeople |

| WHERE ( comm BETWEEN .10 AND .12 |

| AND NOT comm IN ( .10 .12; |

| ==============================================|

| snum sname city comm |

| ------ ---------- ----------- ------- |

| 1004 Motika London 0.11 |

| |

===============================================

Рисунок 5.5: Сделать BETWEEN - невключенным Этот запрос выбирает всех заказчиков чьи имена попали в определенный алфавитный диапазон:

SELECT *

FROM Customers

WHERE cname BETWEEN 'A' AND 'G';

Вывод для этого запроса показывается в Рисунке 5.6.
Обратите Внимание что Grass и Giovanni отсутствуют, даже при включенном BETWEEN. Это происходит из-за того что BETWEEN сравнивает строки неравной длины. Строка 'G' более коротка чем строка Giovanni, поэтому BETWEEN выводит 'G' с пробелами. Пробелы предшествуют символам в алфавитном порядке ( в большинстве реа- лизаций ), поэтому Giovanni не выбирается. То же самое происходит с Grass. Важно помнить это когда вы используете BETWEEN для извлечения значений из алфавитных диапазонов. Обычно вы указываете диапазон с помощью символа начала диапазона и символа конца( вместо которого можно просто поставить z ).

=============== SQL Execution Log ============

| |

| SELECT * |

| FROM Customers |

| WHERE cname BETWEEN 'A' AND 'G'; |

| ============================================= |

| cnum cname city rating snum |

| ------ -------- ------ ---- ------ |

| 2006 Clemens London 100 1001 |

| 2008 Cisneros San Jose 300 1007 |

| |

=============================================

Рисунок 5. 6: Использование BETWEEN в алфавитных порядках

ОПЕРАТОР LIKE

LIKE применим только к полям типа CHAR или VARCHAR, с которыми он используется чтобы находить подстроки. Т.е. он ищет поле символа чтобы видеть, совпадает ли с условием часть его строки. В качестве условия он использует групповые символы(wildkards) - специальные символы которые могут соответствовать чему-нибудь. Имеются два типа групповых символов используемых с LIKE:
* символ подчеркивания ( _ ) замещает любой одиночный символ. Например, 'b_t' будет соответствовать словам 'bat' или 'bit', но не будет соответствовать 'brat'.
* знак процента (%) замещает последовательность любого числа символов (включая символы нуля). Например '%p%t' будет соответствовать словам 'put', 'posit', или 'opt', но не 'spite'.
Давайте найдем всех заказчиков чьи имена начинаются с G ( вывод показывается в Рисунке 5.7 ):

SELECT

FROM Customers

WHERE cname LIKE 'G%';

=============== SQL Execution Log ============

| |

| SELECT * |

| FROM Customers |

| WHERE cname LIKE 'G'; |

| ============================================= |

| cnum cname city rating snum |

| ------ -------- ------ ---- ------ |

| 2002 Giovanni Rome 200 1003 |

| 2004 Grass Berlin 300 1002 |

| |

=============================================

Рисунок 5. 7: SELECT использует LIKE с %
LIKE может быть удобен если вы ищете им или другое значение, и если вы не помните как они точно пишутся. Предположим что вы неуверенны как записано по буквам им одного из ваших продавцов Peal или Peel. Вы можете просто использовать ту часть которую вы знаете и групповые символы чтобы находить все возможные пары ( вывод этого запроса показывается в Рисунке 5.8 ):

SELECT *

FROM Salespeople

WHERE sname LIKE 'P _ _ l %';

Групповые символы подчеркивания, каждый из которых представляет один символ, добавят только два символа к уже существующим 'P' и 'l' , поэтому им наподобие Prettel не может быть показано. Групповой символ ' % ' - в конце строки необходим в большинстве реализаций если длина пол sname больше чем число символов в имени Peel ( потому что некоторые другие значения sname - длиннее чем четыре символа ). В таком случае, значение пол sname , фактически сохраняемое как им Peel, сопровождается рядом пробелов. Следовательно, символ 'l' не будет рассматриваться концом строки. Групповой символ ' % ' - просто соответствует этим пробелам. Это необязательно, если пол sname имеет тип - VARCHAR.

============== SQL Execution Log ============

| |

| SELECT * |

| FROM Salespeople |

| WHERE sname LIKE ' P 1% '; |

| ==============================================|

| snum sname city comm |

| ------ ---------- ----------- ------- |

| 1001 Peel London 0.12 |

| |

===============================================

Рисунок 5.8: SELECT использует LIKE с подчеркиванием (_)
А что же Вы будете делать если вам нужно искать знак процента или знак подчеркивания в строке? В LIKE предикате, вы можете определить любой одиночный символ как символ ESC. Символ ESC используется сразу перед процентом или подчеркиванием в предикате, и означает что процент или подчеркивание будет интерпретироваться как символ а не как групповой символ. Например, мы могли бы найти наш sname столбец где присутствует подчеркивание, следующим образом:

SELECT *

FROM Salespeople

WHERE sname LIKE '%/_%'ESCAPE'/';

С этими данными не будет никакого вывода, потому что мы не включили никакого подчеркивания в им нашего продавца. Предложение ESCAPE определяет '/ ' как символ ESC. Символ ESC используемый в LIKE строке, сопровождается знаком процента, знаком подчеркивания, или знаком ESCAPE, который будет искаться в столбце, а не обрабатывать- с как групповой символ. Символ ESC должен быть одиночным символом и применяться только к одиночному символу сразу после него.
В примере выше, символ процента начала и символ процента окончания обрабатываются как групповые символы; только подчеркивание предоставлено само себе.
Как упомянуто выше, символ ESC может также использоваться самостоятельно. Другими словами, если вы будете искать столбец с вашим сим- волом ESC, вы просто вводите его дважды. Во-первых это будет означать что символ ESC "берет следующий символ буквально как символ", и во-вторых что символ ESC самостоятелен. Имеется предыдущий пример который пересмотрен чтобы искать местонахождение строки '_/' в sname столбце:

SELECT *

FROM Salespeople

WHERE sname LIKE ' % /_ / / %'ESCAPE'/';

Снова не будет никакого вывода с такими данными. Строка сравнивается с содержанием любой последовательности символов (%), сопровождаемых символом подчеркивания ( /_ ), символом ESC ( // ), и любой последовательностью символов в конце строки ( % ).

РАБОТА С НУЛЕВЫМИ( NULL ) ЗНАЧЕНИЯМИ

Часто, будут иметься записи в таблице которые не имеют никаких значений для каждого пол, например потому что информация не завершена, или потому что это поле просто не заполнялось. SQL учитывает такой вариант, позволяя вам вводить значение NULL(ПУСТОЙ) в поле, вместо значения. Когда значение пол равно NULL, это означает, что программа базы данных специально промаркировала это поле как не имеющее никакого значения для этой строки (или записи). Это отличается от просто назначения полю, значения нуля или пробела, которые база данных будет обрабатывать также как и любое другое значение. Точно также, как NULL не является техническим значением, оно не имеет и типа данных. Оно может помещаться в любой тип пол. Тем ни менее, NULL в SQL часто упоминается как нуль.
Предположим, что вы получили нового заказчика который еще не был назначен продавцу. Чем ждать продавца к которому его нужно назначить, вы можете ввести заказчика в базу данных теперь же, так что он не потеряется при перестановке.
Вы можете ввести строку для заказчика со значением NULL в поле snum и заполнить это поле значением позже, когда продавец будет назначен.

NULL ОПЕРАТОР

Так как NULL указывает на отсутствие значения, вы не можете знать каков будет результат любого сравнения с использованием NULL. Когда NULL сравнивается с любым значением, даже с другим таким же NULL, результат будет ни верным ни неверным, он - неизвестен. Неизвестный Булев, вообще ведет себя также как неверна строка, которая произведя неизвестное значение в предикате не будет выбрана запросом - имейте ввиду что в то врем как NOT(неверное) - равняется верно, NOT (неизвестное) - равняется неизвестно. Следовательно, выражение типа 'city = NULL' или 'city IN (NULL)' будет неизвестно, независимо от значения city. Часто вы должны делать различи между неверно и неизвестно - между строками содержащими значения столбцов которые не соответствуют условию предиката и которые содержат NULL в столбцах. По этой причине, SQL предоставляет специальный оператор IS, который используется с ключевым словом NULL, для размещения значения NULL. Найдем все записи в нашей таблице Заказчиков с NULL значениями в city столбце:

SELECT *

FROM Customers

WHERE city IS NULL;

Здесь не будет никакого вывода, потому что мы не имеем никаких значений NULL в наших типовых таблицах. Значения NULL - очень важны, и мы вернемся к ним позже.

 

34. Язык SQL : обновление записей в таблице.

Синтаксис команды UPDATE

UPDATE [LOW_PRIORITY] [IGNORE] tbl_name

SET col_name1=expr1 [, col_name2=expr2, ...]

[WHERE where_definition]

[LIMIT #]

tbl_name

- Задает имя таблицы, в которой будут обновляться записи. На момент запуска команды UPDATE таблица с таким именем должна существовать в базе данных.

LOW_PRIORITY

- Если указан этот параметр, то обновление записи будет отложена до тех пор, пока другие сценарии не закончат чтение из этой таблицы.

IGNORE

- Если некоторые поля таблицы имеют ключи PRIMARY или UNIQUE, и производится обновление строки, в которой эти поля имеют дублирующее значение, то действие команды аварийно завершается и выдается ошибка №1062 ("Duplicate entry 'val' for key N"). Если в команде INSERT указано ключевое слово IGNORE, то обновление записей не прерывается, а строки с дублирующими значениями просто не изменяются.

SET

- После этого ключевого слова должен идти список полей таблицы, которые будут обновлены и непосредственно сами новые значения полей в виде:

WHERE

- Задает условие отбора записей, подлежащих изменению.

LIMIT

- Задает максимальное количество строк, которые могут быть изменены.

 

UPDATE

 

  `users`

 

  SET

 

  `country`='Russia'

 

UPDATE

 

  `users`

 

  SET

 

  `age`=`age`+1

 

  LIMIT

 

5  
   
 
   
   

35. Язык SQL : выборка данных из таблиц. Использование агрегатных функций и вычисляемых полей.

Выборка данных из нескольких таблиц, их обработка, а также использование подзапросов (запросов, которые нужны в качестве промежуточных для получения окончательного результата) относятся к теме сложных запросов. Сложные запросы будут рассмотрены в последующих главах, а в данной главе мы остановимся на задаче выборки данных из одной таблицы при относительно простых условиях отбора, группировки и сортировки записей. Тем не менее, операторы SQL, применяемые в простых запросах на выборку данных, используются и в сложных запросах, направленных не только на получение, но и на изменение данных. Начните с простого, чтобы потом было легко понять сложное. Я хотел сказать, что материал данной главы относится к фундаментальным темам SQL, не смотря на то, что многие пользователи баз данных пожелают им и ограничиться. Последнее меня не удивляет, поскольку материал этой главы сам по себе исключительно практичен.

Все SQL-выражения, предназначенные для выборки данных из существующих таблиц базы данных начинаются с ключевого слова (оператора) SELECT (Выбрать). Для уточнения запроса служат дополнительные операторы, такие как FROM (Из),WHERE (Где) и др. Сейчас важно понять и запомнить, что результатом выполнения запроса, сформулированного в виде SQL-выражения, является не что иное, как таблица, содержащая запрошенные данные. Эта таблица виртуальна в том смысле, что лишь только представляет результаты запроса и не принадлежит к базе данных. Замечу попутно, что SQL-позволяет изменять существующую базу данных — создавать и добавлять к ней новые таблицы, а также модифицировать и удалять уже существующие

SELECT * FROM authors;

SELECT titles.title,titles.yearpub,publishers.publisher

FROM titles,publishers

WHERE titles.pub_id=publishers.pub_id AND

titles.yearpub>1996;

SQL позволяет выполнять различные арифметические операции над столбцами результирующего отношения. В конструкции <список_выбора> можно использовать константы, функции и их комбинации с арифметическими операциями и скобками. Например, чтобы узнать сколько лет прошло с 1992 года (год принятия стандарта SQL-92) до публикации той или иной книги можно выполнить команду:

SELECT title, yearpub-1992 FROM titles WHERE yearpub > 1992;

В арифметических вражения допускаются операции сложения (+), вычитания (-), деления (/), умножения (*), а также различные функции (COS, SIN, ABS - абсолютное значение и т.д.). Также в запрос можно добавить строковую константу:

SELECT 'the title of the book is', title, yearpub-1992

FROM titles WHERE yearpub > 1992;

В SQL также определены так называемые агрегатные функции, которые совершают действия над совокупностью одинаковых полей в группе записей. Среди них:

Следует учитывать, что каждая агрегирующая функция возвращает единственное значение. Примеры: определить дату публикации самой "древней" книги в нашей базе данных

 

SELECT MIN(yearpub) FROM titles;

подсчитать количество книг в нашей базе данных:

 

SELECT COUNT(*) FROM titles;

Область действия данных функции можно ограничить с помощью логического условия. Например, количество книг, в названии которых есть слово "SQL":

 

SELECT COUNT(*) FROM titles WHERE title LIKE '%SQL%'

 

36. Язык SQL : группировка строк набора данных.

Создание групп (GROUP BY)

Группы создаются с помощью предложения GROUP BY оператора SELECT. Рассмотрим на примере.

SELECT Product, SUM(Quantity) AS Product_num FROM Sumproduct GROUP BY Product

Данным запросом мы извлекли информацию о количестве реализованной продукции в каждом месяце. Оператор SELECT приказывает вывести два столбца Product - название продукта и Product_num - расчетное поле, которое мы создали для отображения количества реализованной продукции (формула поля SUM (Quantity)). Предложение GROUP BY указывает СУБД сгруппировать данные по столбцу Product. Стоит также отметить, что GROUP BY должен идти после предложения WHERE и перед ORDER BY.

2. Фильтрующие группы (HAVING)

Так же, как мы фильтровали строки в таблице, мы можем осуществлять фильтрацию по сгруппированным данным. Для этого в SQL существует оператор HAVING. Возьмем предыдущий пример и добавим фильтрацию по группам.

SELECT Product, SUM(Quantity) AS Product_num FROM Sumproduct GROUP BY Product HAVING SUM(Quantity)>4000

Видим, что после того, как была посчитана количество реализованного товара в разрезе каждого продукта, СУБД "отсекла" те продукты, которых было реализовано меньше 4000 шт.

Как видим, оператор HAVING очень похож на оператора WHERE, однако между собой они имеют существенное отличие: WHERE фильтрует данные до того, как они будут сгруппированы, а HAVING - осуществляет фильтрацию после группировки. Таким образом, строки, которые были изъяты предложением WHERE НЕ будут включены в группу. Итак, операторы WHERE и HAVING могут использоваться в одном предложении. Рассмотрим пример:

SELECT Product, SUM(Quantity) AS Product_num FROM Sumproduct WHERE Product<>'Skis Long' GROUP BY Product HAVING SUM(Quantity)>4000

3. Группировка и сортировка

Как и при обычной выборке данных, мы можем сортировать группы после группировки оператором HAVING. Для этого мы можем использовать уже знакомый нам оператор ORDER BY. В данной ситуации его применения аналогичное предыдущим примерам. К примеру:

SELECT Product, SUM(Quantity) AS Product_num FROM Sumproduct GROUP BY Product HAVING SUM(Quantity)>3000 ORDER BY SUM(Quantity)

или просто укажем номер поля по порядку, по которому хотим сортировать:

SELECT Product, SUM(Quantity) AS Product_num FROM Sumproduct GROUP BY Product HAVING SUM(Quantity)>3000 ORDER BY 2

Видим, что для сортировки сводных результатов нам нужно просто прописать предложения с ORDER BY после оператора HAVING. Однако есть один нюанс. СУБД Access не поддерживает сортировку групп по псевдонимами колонок, то есть в нашем примере, чтобы сортировать значения, мы не сможем в конце запроса прописать ORDER BY Product_num .

 

 

37. Язык SQL : соединение таблиц (внутреннее и внешнее).