06 2 билет 8 (775943)
Текст из файла
6. Язык структурированных запросов SQL. Выбор и модификация данных, группировка таблиц, агрегатные функции, использование подзапросов
SQL – Structured Query Language. Язык манипулирования данными во всех современных СУБД. Включает операторы трех типов: определения объектов, манипулирования данными, защиты и управления данными.
Операторы манипулирования: SELECT – выборка, INSERT – добавление данных, UPDATE – изменение данных, DELETE – удаление данных.
Результат выполнения операторы SELECT – таблица.
INSERT INTO
СИНТАКСИС:
INSERT INTO table [(column_name, ...)] VALUES (expression,...) ||
INSERT INTO table [(column_name, ...)] SELECT ...
ОПИСАНИЕ:
Вставляет данные в таблицу.
-
В выражении можно использовать любое предыдущее поле в списке column_name (или таблицу, если список имен столбцов не задан).
-
При использовании SELECT вы не можете указать ORDER BY.
-
Вы можете использовать функцию C API mysql_info для получения строки:
@result{Records: 220 Duplicates: 1 Warnings: 1}
-
Records показывает число записей, возвращенных SELECT'ом.
-
Duplicates = число строк, которые не могли быть вставлены из-за дублирования ключей.
-
Warnings = счетчик числа столбцов в запросе SELECT, которые равны NULL, но были объявлены как NOT NULL для таблицы, в которую Вы вставляете результаты. Столбцы получат значение по умолчанию (помните: в MySQL все NOT NULL столбцы имеют значение по умолчанию!). Если Вы не объявляли при создании таблицы это самое значение, оно будет автоматически назначено, основанным на типе поля.
-
Если Вы желаете вставить NULL в данное значение, Вы должны сделать это, не определяя значение для поля, в которое Вы желаете вставить NULL.
ПРИМЕР:
INSERT INTO Customer(customer_name,customer_contact) VALUES("Joes Wholesale","Joe Smith")
Этот запрос создаст новую запись в таблице Customer, которая будет содержать автоматически сгенерированный customer_id, и значения, определенные в запросе. Все другие поля будут пустыми (NULL).
Вы также можете использовать SELECT для копирования элементов из одной таблицы в другую. MySQL поддерживает ограниченную форму запросов sub, для выполнения этой возможности.
Вы должны иметь права доступа insert для использования этой команды.
UPDATE
СИНТАКСИС:
UPDATE table SET column=expression,... WHERE where_definition
Здесь where_definition:
where_definition:
where_expr or where_expr [AND | OR] where_expr
Здесь where where_expr имеет формат:
where_expr:
column_name [> | >= | = | <> | <= | < ]
column_name_or_constant or
column_name LIKE column_name_or_constant or
column_name IS NULL or column_name IS NOT NULL or (where_definition)
ОПИСАНИЕ:
Обновляет одно или несколько полей в таблице MySQL.
-
Все обновления выполняются слева направо.
-
Внутри UPDATE на одной таблице все операции атомарные. Напримерe, Вы можете увеличивать счетчик внутри таблицы, просто прибавляя 1 к соответствующей переменной.
ПРИМЕРЫ:
UPDATE Widget_Table SET widgets_on_hand=widgets_on_hand - 300 where widget_id=3;
Этот запрос вычтет 300 из значения widgets_on_hand для widget = 3.
DELETE FROM Purchase_Order_Item WHERE purchase_order = 456
Этот запрос удалит все записи из Purchase_Order_Item, которые имеют значение 456 для purchase_order. Обратите внимание, что вообще Вы НИКОГДА не должны бы удалять данные из этого сорта базы данных. Вы создаете базы данных, чтобы следить за информацией, и даже плохая информация могла бы стать полезной в некотором случае. Гораздо лучше иметь некоторый тип кода состояния, который Вы используете, когда данные стали недопустимыми по каким-либо причинам.
Вы также хотели бы удалять запись в Purchase_Order для purchase_order 456. Важно убедиться, что, когда Вы удаляете информацию, Вы избавляетесь от всех ссылок к этой информации. Иначе Вы закончите с разрушенной базой данных.
Вы должны иметь права доступа update для использования этой команды.
-
DELETE
СИНТАКСИС:
DELETE FROM table_name WHERE where_definition
Здесь where_definition имеет формат:
where_definition:
where_expr or where_expr [AND | OR] where_expr
where_expr имеет формат:
where_expr:
column_name [> | >= | = | <> | <= | < ]
column_name_or_constant or
column_name LIKE column_name_or_constant or
column_name IS NULL or column_name IS NOT NULL or (where_definition)
ОПИСАНИЕ:
Удаляет записи из таблицы.
-
Возвращает количество обработанных записей.
-
Если вызван DELETE без WHERE, то таблица будет очищена. В этом случае DELETE вернет 0 для числа обработанных записей.
Замечания:
-
Все строки сравниваются без учета регистра (ISO_8859_1). Если Вы должны сделать чувствительный к регистру поиск, то используйте REGEXP в предложении HAVING.
-
LIKE применим на числовых столбцах.
-
Сравнение с явным NULL (столбец == NULL) эквивалентно условию IS NULL, то есть использованию (столбец IS NULL). Это было сделано, для совместимости с mSQL.
Вы должны иметь права доступа delete для удаления записей.
-
SELECT
СИНТАКСИС:
SELECT [STRAIGHT_JOIN] [DISTINCT | ALL] select_expression,...
[FROM tables... [WHERE where_definition] [GROUP BY column,...]
[ORDER BY column [ASC | DESC], ...] HAVING full_where_definition
[LIMIT [offset,] rows] [PROCEDURE procedure_name]]
[INTO OUTFILE 'file_name'... ]
Здесь where_definition:
where_definition:
where_expr or where_expr [AND | OR] where_expr
where_expr имеет формат:
where_expr:
column_name [> | >= | = | <> | <= | <]
column_name_or_constant or column_name LIKE column_name_or_constant or
column_name IS NULL or column_name IS NOT NULL or (where_definition)
ОПИСАНИЕ:
Оператор SELECT является краеугольным камнем всего языка SQL. Он используется, чтобы выполнить запросы к базе данных. Это действительно основа языка SQL. Для хорошего общего учебника о том, как работает SELECT, посмотрите http://w3.one.net/~jhoffman/sqltut.htm#Basics of the SELECT Statement.
В MySQL версии меньше 3.21.x предложение WHERE очень ограничено. HAVING будет работать там, где предложение WHERE ничего не делает. Некоторые примеры, которые не работают в предложении WHERE - REGEXP и операторе !. В основном, Вы не можете использовать функции с WHERE, но Вы можете использовать функции с HAVING.
HAVING по существу, WHERE применительно к результатам. Он используется главным образом для узкой области данных, возвращенных запросом.
Вы должны иметь права select для использования SELECT.
Функции
select_expression может содержать следующие функции и операторы:
+ - * / | Арифметические действия. |
% | Остаток от деления (как в C) |
| & | Битовые функции (используется 48 бит). |
- | Смена знака числа. |
( ) | Скобки. |
BETWEEN(A,B,C) | (A >= B) AND (A <= C). |
BIT_COUNT() | Количество бит. |
ELT(N,a,b,c,d) | Возвращает a, если N == 1, b, если N == 2 и т. д. a,b,c,d строки. ПРИМЕР: ELT(3,"First","Second","Third","Fourth") |
FIELD(Z,a,b,c) | Возвращает a, если Z == a, b, если Z == b и т. д. a,b,c,d строки. ПРИМЕР: FIELD("Second","First","Second","Third","Fourth") |
IF(A,B,C) | Если A истина (!= 0 and != NULL), то вернет B, иначе вернет C. |
IFNULL(A,B) | Если A не null, вернет A, иначе вернет B. |
ISNULL(A) | Вернет 1, если A == NULL, иначе вернет 0. Эквивалент ('A == NULL'). |
NOT ! | NOT, вернет TRUE (1) или FALSE (0). |
OR, AND | Вернет TRUE (1) или FALSE (0). |
SIGN() | Вернет -1, 0 или 1 (знак аргумента). |
SUM() | Сумма столбца. |
= <> <= = > | Вернет TRUE (1) или FALSE (0). |
expr LIKE expr | Вернет TRUE (1) или FALSE (0). |
expr NOT LIKE expr | Вернет TRUE (1) или FALSE (0). |
expr REGEXP expr | Проверяет строку на соответствие регулярному выражению expr. |
expr NOT REGEXP expr | Проверяет строку на соответствие регулярному выражению expr. |
select_expression может также содержать один или большее количество следующих математических функций.
ABS() | Абсолютное значение (модуль числа). |
CEILING() | () |
EXP() | Экспонента. |
FORMAT(nr,NUM) | Форматирует число в формат '#,###,###.##' с NUM десятичных цифр. |
LOG() | Логарифм. |
LOG10() | Логарифм по основанию 10. |
MIN(),MAX() | Минимум или максимум соответственно. Должна иметь при вызове два или более аргументов, иначе рассматривается как групповая функция. |
MOD() | Остаток от деления (аналог %). |
POW() | Степень. |
ROUND() | Округление до ближайшего целого числа. |
RAND([integer_expr]) | Случайное число типа float, 0 <= x <= 1.0, используется integer_expr как значение для запуска генератора. |
SQRT() | Квадратный корень. |
select_expression может также содержать одну или больше следующих строковых функций.
CONCAT() | Объединение строк. |
INTERVAL(A,a,b,c,d) | Возвращает 1, если A == a, 2, если A == b... Если совпадений нет, вернет 0. A,a,b,c,d... строки. |
INSERT(org,strt,len,new) | Заменяет подстроку org[strt...len(gth)] на new. Первая позиция строки=1. |
LCASE(A) | Приводит A к нижнему регистру. |
LEFT() | Возвращает строку символов, отсчитывая слева. |
LENGTH() | Длина строки. |
LOCATE(A,B) | Позиция подстроки B в строке A. |
LOCATE(A,B,C) | Позиция подстроки B в строке A, начиная с позиции C. |
LTRIM(str) | Удаляет все начальные пробелы из строки str. |
REPLACE(A,B,C) | Заменяет все подстроки B в строке A на подстроку C. |
RIGHT() | Get string counting from right. |
RTRIM(str) | Удаляет хвостовые пробелы из строки str. |
STRCMP() | Возвращает 0, если строки одинаковые. |
SUBSTRING(A,B,C) | Возвращает подстроку из A, с позиции B до позиции C. |
UCASE(A) | Переводит A в верхний регистр. |
И наконец несколько просто полезных функций, которые тоже можно применить в select_expression.
CURDATE() | Текущая дата. |
DATABASE() | Имя текущей базы данных из которой выполняется выбор. |
FROM_DAYS() | Меняет день на DATE. |
NOW() | Текущее время в форматах YYYYMMDDHHMMSS или "YYYY-MM-DD HH:MM:SS". Формат зависит от того в каком контексте используется NOW(): числовом или строковом. |
PASSWORD() | Шифрует строку. |
PERIOD_ADD(P:N) | Добавить N месяцев к периоду P (в формате YYMM). |
PERIOD_DIFF(A,B) | Возвращает месяцы между A и B. Обратите внимание, что PERIOD_DIFF работает только с датами в форме YYMM или YYYMM. |
TO_DAYS() | Меняет DATE (YYMMDD) на номер дня. |
UNIX_TIMESTAMP([date]) | Возвращает метку времени unix, если вызвана без date (секунды, начиная с GMT 1970.01.01 00:00:00). При вызове со столбцом TIMESTAMP вернет TIMESTAMP. date может быть также строкой DATE, DATETIME или числом в формате YYMMDD (или YYYMMDD). |
USER() | Возвращает логин текущего пользователя. |
WEEKDAY() | Возвращает день недели (0 = понедельник, 1 = вторник, ...). |
Групповые функции в операторе select:
Следующие функции могут быть использованы в предложении GROUP:
AVG() | Среднее для группы GROUP. |
SUM() | Сумма элементов GROUP. |
COUNT() | Число элементов в GROUP. |
MIN() | Минимальный элемент в GROUP. |
MAX() | Максимальный элемент в GROUP. |
Здесь MIN() и MAX() могут принимать строку или число в качестве аргумента. Эти функции не могут использоваться в выражении, хотя их параметр может быть выражением:
ПРИМЕР: "SUM(value/10)" нормально, но вот "SUM(value)/10" уже нет!
-
Строки автоматически конвертируются в числа и наоборот по мере необходимости (прямо как в perl). При использовании операторов = <> = как в инструкции WHERE, левая сторона определяет, выполняется ли тест с числами или со строками. Все сравнения строк независимы от регистра (ISO8859-1).
ПРИМЕР:
"a" < "b" ; Сравнение строк
"a" < 0 ; Сравнение строк
0 < "a" ; Сравнение чисел
a < 5 ; Если поле имеет тип CHAR, то сравниваются строки,
; иначе сравниваются числа.
Если надо учитывать регистр, используйте REGEXP в HAVING.
-
Имя столбца не должно иметь префикса таблицы, если данное имя столбца уникально.
-
В LIKE выражения % и _ могут предваряться символом \ для получения символьного выражения.
-
DATE является строкой с одним из синтаксисов:
-
YYMMDD (Год считается 2000, если YY < 70)
-
YYYYMMDD
-
YY.MM.DD Здесь '.' может быть любым нецифровым разделителем
-
YYYY.MM.DD Здесь '.' может быть любым нецифровым разделителем
-
IFNULL() и IF() возвращает число или строку в зависимости от ситуации, в которой использованы.
Order и group столбец может быть именем столбца, его псевдонимом или номером в операторе SELECT.
HAVING может принимать в качестве аргумента любые поля или псевдонимы в select_expression. Он применяется последним перед передачей данных клиенту без какой-либо оптимизации. Не используйте его для элементов из предложения WHERE.
Замечание: Вы не можете написать:
SELECT user,MAX(salary) FROM users GROUP BY users HAVING max(salary)>10
Вместо этого, используйте нечто вроде следующего (это хороший пример использования псевдонимов столбцов):
SELECT user,MAX(salary) AS sum FROM users GROUP BY users HAVING sum > 10
-
LIMIT принимает один или два аргумента. Один аргумент задает максимальное число строк в результате. В случае двух аргументов этот максимум задает второй аргумент, а первый указывает смещение первой строки.
-
INTO OUTFILE 'filename' пишет результаты в файл. Файл не должен существовать на момент выполнения этой команды. См. раздел LOAD DATA INFILE для более подробной информации. Это может быть весьма опасной командой, если daemon запущен от имени root. Самое лучшее предоставить право доступа file только когда это абсолютно необходимо.
-
Вы можете использовать числовое значение в предложении ORDER BY для определения столбца, который Вас интересует. ТО ЕСТЬ, если Вы желаете провести сортировку второго столбца, определенного в вашем запросе SELECT, следует написать "ORDER BY 2;". Это также полезно, когда Вы использовали функцию в вашем SELECT.
ПРИМЕР:
SELECT Widget_Table.widget_id, Widget_Table.widget_name,
Purchase_Order_Item.widget_id, sum(Purchase_Order_Item.quantity)
FROM Widget_Table, Purchase_Order_Item
WHERE Widget_Table.widget_id = Purchase_Order_Item.widget_id
GROUP BY Widget_Table.widge t_name ORDER BY 4;
Присоединения
Свойство объединения SQL дает способность определить связи между таблицами и отыскивать) информацию, основанную на этих связях.
Связи перечисляются в предложении FROM запроса SELECT. Каждая связь отделяется запятой.
ПРИМЕР:
$ mysql mysql Welcome to the mysql monitor. Commands ends with ; or \g. Type 'help' for help. mysql> SELECT db.user, db.delete_priv, user.user, user.delete_priv -> FROM db,user WHERE db.user = user.user; |
Этот запрос соединит таблицы db и user посредством поля user. Это распечатает что-то вроде следующего:
+------+-------------+------+-------------+ | user | delete_priv | user | delete_priv | +------+-------------+------+-------------+ |mke | N | mke | N | +------+-------------+------+-------------+ |
Первые два поля фактические db.user и db.delete_priv , последние два user.user и user.delete_priv.
Обратите внимание, что мы используем имена таблицы в нашем запросе, чтобы определить точно, с какими полями мы работаем.
Вы можете объединить до пятнадцати таблиц в одном объединении.
MySQL не будет использовать ключи, чтобы соединить таблицы посредством полей, которые не имеют идентичный тип. Это означает, что Вы должны всегда использовать те же самые типы для полей, которые предназначены, для использования в объединениях.
Псевдонимы могут также использоваться для имен столбца. См. детали в следующем разделе.
Псевдонимы
СУБД MySQL поддерживает концепцию псевдонимов для таблиц и полей.
Псевдонимы для таблиц являются стандартной частью языка SQL.
ПРИМЕР:
SELECT A.user,A.select_priv,A.insert_priv,A.update_priv FROM user A
В этом примере использован псевдоним таблицы, чтобы сократить ваш запрос, объявляя псевдоним, который короче имени таблицы. Вы используете псевдоним в первой части выбора, и определяете это в FROM, определяя реальное имя таблицы, пробел и псевдоним. Если Вы имеете больше чем одну таблицу, для которой Вы желаете создать псевдоним, просто добавьте запятую после каждой пары имя/псевдоним таблицы.
Если Вы используете псевдонимы с запросом, который будет иметь предложение WHERE, Вы должны использовать псевдоним в предложении WHERE вместо реального имени таблицы.
Псевдонимы для полей таблицы - специфическое для MySQL расширение.
ПРИМЕР:
SELECT user.user AS "User Name", user.delete_priv AS "Delete" FROM user;
Одно хорошее дело, которое делают псевдонимы поля - это то, что они позволяют Вам определять более дружественные метки для вашего вывода. Результат вышеупомянутого запроса мог бы окончательно выглядеть примерно так:
+-----------+--------+ | User Name | Delete | +-----------+--------+ | root | Y | | mke | N | | dummy | N | | admin | N | +-----------+--------+ |
Хороший совет - брать псевдонимы в кавычки, в данном примере "Delete" вызвало бы ошибку синтаксического анализа при применение без кавычек. (Это потому, что DELETE является ключевым словом SQL.
12
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.