- •Лекция: Введение в MySql Содержание
- •Концепции баз данных Системы управления файлами
- •Иерархические базы данных
- •Сетевые базы данных
- •Реляционные базы данных
- •Объектно-ориентированные базы данных
- •Объектно-реляционные базы данных
- •2. Лекция: Подготовка к работе с MySql Содержание
- •Инсталляция вручную
- •Компиляция программы
- •Предоставление привилегий
- •Лекция: Создание базы данных, основы работы с таблицами
- •Создание базы данных в Windows
- •Создание базы данных в Linux
- •Команда create database
- •Работа с таблицами
- •Использование базы данных
- •Создание таблицы
- •Синтаксис команды create table
- •Удаление таблиц
- •Синтаксис команды drop table
- •Лекция: Типы данных столбцов
- •Числовые типы данных
- •Типы данных даты и времени
- •Типы данных datetime, date и timestamp
- •Тип данных time
- •Тип данных year
- •Лекция: Работа с таблицами. Внесение, извлечение, поиск и удаление данных
- •Запись данных в таблицы
- •Задания
- •Возможные решения
- •Выборка данных с помощью условий
- •Операторы больше и меньше
- •Задания
- •Возможные решения
- •Предложение having
- •Задание
- •Возможное решение
- •Удаление записей из таблицы
- •Лекция: Логические операторы
- •Задания
- •Возможные решения
- •8. Лекция: Математические функции
- •9. Лекция: Работа с датой и временем
- •Особенности типа данных Date
- •Операции с датами
- •10. Лекция: Работа со строками
- •Строковые функции
- •Ascii(строка) ord(строка)
- •Concat(строка1, строка2, ...)
- •Concat_ws(разделитель, строка1, строка2, ...)
- •Conv(n, основание_начальное, основание_конечное)
- •Elt(n, строка1, строка2, строкаЗ, ...)
- •Field(строка, строка1, строка2, строка3, ...)
- •Find_in_set(строка, список_строк)
- •Substring_index(строка, разделитель, количество)
- •Trim([[both | leading | trailing] [удаляемая_строка] from] строка)
- •Uncompress(строка_для_распаковки)
- •Unhex(строка)
- •Upper(строка) ucase(строка)
- •11. Лекция: Дополнительные функции MySql
- •Битовые функции
- •Побитовое или ( | )
- •Побитовое и ( & )
- •Функции шифрования
- •Aes_encrypt(строка, строка_ключа) aes_decrypt(зашифрованная_строка, строка_ключа)
- •Decode(зашифрованная_строка, строка_пароля)
- •Encode(строка, строка_пароля)
- •Des_decrypt(зашифрованная_строка [, строка_ключа])
- •Информационные функции benchmark(количество, выражение)
- •Charset(строка)
- •Coercibility(строка)
- •Collation(строка)
- •Прочие функции
- •Get_lock(строка, таймаут)
- •Inet_aton(выражение)
- •Inet_ntoa(выражение)
- •Is_free_lock(строка)
- •Master_pos_wait(имя_журнала, позиция_в_журнале [, таймаут])
- •Release_lock(строка)
Задания
1. Вывести имена и фамилии всех сотрудников, которые получают зарплату не более 90000 и не являются программистами, старшими программистами или программистами мультимедиа.
2. Что делает следующий оператор?
SELECT l_name, f_name from employee_data
where title NOT LIKE '%продавец%'
AND age < 30;
3. Вывести все идентификационные номера и имена сотрудников в возрасте между 32 и 40 годами.
4. Выберите имена всех сотрудников в возрасте 32 лет, которые не являются программистами.
Возможные решения
mysql> select f_name, l_name from employee_data
-> where salary <= 90000
-> AND title NOT LIKE '%программист%';
Команда выводит имена (фамилию, за которой следует имя) сотрудников, которые не работают в отделе продаж и моложе 30 лет.
mysql> SELECT l_name, f_name from employee_data
-> where title NOT LIKE '%продавец%'
-> AND age < 30;
mysql> select emp_id, f_name, l_name from
-> employee_data where age > 32
-> and age < 40;
mysql> select f_name, l_name from employee_data
-> where age = 32 AND
-> title NOT LIKE '%программист%';
Операторы IN и BETWEEN Чтобы найти сотрудников, которые являются разработчиками Web или системными администраторами, можно использовать оператор SELECTследующего вида: SELECT f_name, l_name, title from -> employee_data where -> title = 'разработчик Web' OR -> title = 'системный адм.'; На рис. 6.6. приведен результат запроса.
Рис. 6.6. Поиск сотрудников, которые являются разработчиками Web или системными администраторами В SQL имеется более простой способ сделать это с помощью оператора IN (в множестве). Его использование не представляет никаких трудностей. SELECT f_name, l_name, title from -> employee_data where title -> IN ('разработчик Web', 'системный адм.'); Результат будет аналогичен рис. 6.6. Использование NOT перед IN позволяет вывести данные, которые не входят в множество, определяемое условиемIN. Следующий оператор выводит список сотрудников, которые не занимают должность программиста или системного администратора. SELECT f_name, l_name, title from -> employee_data where title NOT IN -> ('программист', 'системный адм.'); Оператор BETWEEN используется для определения целочисленных границ. Поэтому вместо age >= 32 AND age <= 40можно использовать age BETWEEN 32 AND 40. select f_name, l_name, age from -> employee_data where age BETWEEN -> 32 AND 40; На рис. 6.7. приведен результат запроса.
Рис. 6.7. Поиск сотрудников, возраст которых лежит в промежутке от 32-х до 40 лет NOT также можно использовать вместе с BETWEEN, как в следующем операторе, который выводит сотрудников, зарплата которых меньше 90000 или больше 150000. select f_name, l_name, salary -> from employee_data where salary -> NOT BETWEEN -> 90000 AND 150000; Задания 1. Найдите всех сотрудников, которые занимают должность "старший программист" и "программист мультимедиа". 2. Выведите список имен сотрудников, зарплата которых составляет от 70000 до 90000. 3. Что делает следующий оператор? SELECT f_name, l_name, title from employee_data where title NOT IN ('программист', 'старший программист', 'программист мультимедиа'); 4. Вот более сложный оператор, который объединяет BETWEEN и IN. Что он делает? SELECT f_name, l_name, title, age from employee_data where title NOT IN ('программист', 'старший программист', 'программист мультимедиа') AND age NOT BETWEEN 28 and 32; Возможные решения
|
|||||||||
|
|||||||||
Упорядочивание данных Рассмотрим вопрос о том, как можно изменить порядок вывода данных, извлеченных из таблиц MySQL, используя предложение ORDER BY оператораSELECT. Извлекаемые до сих пор данные всегда выводились в том порядке, в котором они были сохранены в таблице. В действительности SQL позволяет сортировать извлеченные данные с помощью предложения ORDER BY. Это предложение требует имя столбца, на основе которого будут сортироваться данные. Давайте посмотрим, как можно вывести имена сотрудников с упорядоченными по алфавиту фамилиями сотрудников (в возрастающем порядке). SELECT l_name, f_name from employee_data ORDER BY l_name; А вот так сотрудников можно отсортировать по возрасту. SELECT f_name, l_name, age from employee_data ORDER BY age; Предложение ORDER BY может сортировать в возрастающем порядке (ASCENDING или ASC) или в убывающем порядке (DESCENDING или DESC) в зависимости от указанного аргумента. Чтобы вывести список сотрудников в убывающем порядке, можно использовать следующий оператор. SELECT f_name from employee_data ORDER by f_name DESC; Примечание: Возрастающий порядок (ASC) используется по умолчанию. Задания 1. Вывести список сотрудников в порядке, определяемом зарплатой, которую они получают. 2. Выведите список сотрудников в убывающем порядке их стажа работы в компании. 3. Что делает следующий оператор? SELECT emp_id, l_name, title, age from employee_data ORDER BY title DESC, age ASC; 4. Вывести список сотрудников (фамилию и имя), которые занимают должность "программист" или "разработчик Web" и отсортировать их фамилии по алфавиту. Возможные решения
Примечание: Сначала сортируются должности в убывающем порядке. Затем для каждой должности сортируется возраст сотрудников в возрастающем порядке.
|
|||||||||
|
|
||||||||
Ограничение количества извлекаемых данных Далее рассмотрим, как ограничить число записей, выводимых операторомSELECT. По мере увеличения таблиц возникает необходимость вывода только подмножества данных. Этого можно добиться с помощью предложения LIMIT. Например, чтобы вывести из таблицы имена только первых пяти сотрудников, используется оператор LIMIT с аргументом равным 5. SELECT f_name, l_name from employee_data LIMIT 5; На рис. 6.8. приведен результат запроса.
Рис. 6.8. Имена первых пяти сотрудников Это первые пять записей таблицы. Можно соединить оператор LIMIT с оператором ORDER BY. Таким образом, следующий оператор выведет четверых самых молодых сотрудников компании. SELECT f_name, l_name, age from employee_data ORDER BY age LIMIT 4; На рис. 6.9. приведен результат запроса.
Рис. 6.9. Четверо самых молодых сотрудников компании Аналогично можно вывести двух самых старших сотрудников. SELECT f_name, l_name, age from employee_data ORDER BY age LIMIT 2; На рис. 6.10. приведен результат запроса.
Рис. 6.10. Двое самых старших сотрудников Извлечение подмножеств LIMIT можно использовать также для извлечения подмножества данных, используя дополнительные аргументы. Общая форма оператора LIMIT имеет следующий вид: SELECT (что-нибудь) from таблица LIMIT начальная строка, извлекаемое число записей;
SELECT f_name, l_name from employee_data LIMIT 6,3; На рис. 6.11. приведен результат запроса.
Рис. 6.11. Извлечение трёх строк начиная с 6-й Будут извлечены три строки, начиная с шестой. Задания
SELECT emp_id, age, perks from employee_data ORDER BY perks DESC LIMIT 10; Возможные решения
|
|||||||||
|
|
Поиск минимального и максимального значений
Минимальное значение
Максимальное значение
Задания
Возможные решения
Поиск среднего значения и суммы
Суммирование значений столбца с помощью функции SUM
Вычисление среднего значения
Задания
Возможные решения
Именование столбцов
Подсчет числа записей
Группировка данных
Сортировка данных
Задания
Возможные решения
Поиск минимального и максимального значений
В MySQL имеются встроенные функции для вычисления минимального и максимального значений.
SQL имеет 5 агрегатных функций.
MIN(): минимальное значение
MAX(): максимальное значение
SUM(): сумма значений
AVG(): среднее значений
COUNT(): подсчитывает число записей
В этом параграфе мы рассмотрим поиск минимального и максимального значений столбца.
Минимальное значение
select MIN(salary) from employee_data;
На рис. 7.1. приведен результат запроса.
Рис. 7.1. Поиск минимальной зарплаты
Максимальное значение
select MAX(salary) from employee_data;
На рис. 7.2. приведен результат запроса.
Рис. 7.2. Поиск максимальной зарплаты
Задания
Найдите минимальные надбавки.
Найдите максимальную зарплату среди всех "программистов".
Найдите возраст самого старого "продавца".
Найдите имя и фамилию самого старого сотрудника.
Возможные решения
1. mysql> select MIN(perks) from employee_data;
На рис. 7.3. приведен результат запроса.
Рис. 7.3. Минимальные надбавки
2.
mysql> select MAX(salary) from employee_data
-> where title = 'программист';
На рис. 7.4. приведен результат запроса.
Рис. 7.4. Максимальная зарплата среди программистов
3. mysql> select MAX(age) from employee_data
-> where title = 'продавец';
На рис. 7.5. приведен результат запроса.
Рис. 7.5. Возраст самого старого продавца
4. Вот один из способов сделать без использования агрегатных функций.
mysql> select f_name, l_name, age
-> from employee_data
-> order by age DESC limit 1;
На рис. 7.6. приведен результат запроса.
Рис. 7.6. Имя и фамилия самого старого сотрудника
Поиск среднего значения и суммы Суммирование значений столбца с помощью функции SUM Агрегатная функция SUM() вычисляет общую сумму значений в столбце. Для этого необходимо задать имя столбца, которое должно быть помещено внутри скобок. Давайте посмотрим, сколько компания BigFoot тратит на зарплату своих сотрудников. select SUM(salary) from employee_data; На рис. 7.7. приведен результат запроса.
Рис. 7.7. Сумма всех зарплат Аналогично можно вывести общую сумму надбавок, выдаваемых сотрудникам. select SUM(perks) from employee_data; На рис. 7.8. приведен результат запроса.
Рис. 7.8. Сумма всех надбавок Можно найти также общую сумму зарплаты и надбавок. select sum(salary) + sum(perks) from employee_data; На рис. 7.9. приведен результат запроса.
Рис. 7.9. Общая сумма зарплаты и надбавок Здесь показаны также дополнительные возможности команды SELECT. Значения можно складывать, вычитать, умножать или делить. В действительности можно записывать полноценные арифметические выражения. Вычисление среднего значения Агрегатная функция AVG() используется для вычисления среднего значения данных в столбце. select avg(age) from employee_data; На рис. 7.10. приведен результат запроса.
Рис. 7.10. Средний возраст сотрудников Пример выше вычисляет средний возраст сотрудников компании BigFoot, а следующий выводит среднюю зарплату. select avg(salary) from employee_data; На рис. 7.11. приведен результат запроса.
Рис. 7.11. Средняя зарплата сотрудников Задания
select (SUM(perks)/SUM(salary) * 100) from employee_data; Возможные решения 1. mysql> select SUM(age) from employee_data; На рис. 7.12. приведен результат запроса.
Рис. 7.12. Сумма всех возрастов сотрудников 2. mysql> select SUM(yos) from employee_data; На рис. 7.13. приведен результат запроса.
Рис. 7.13. Общее количество лет стажа работы сотрудников 3. mysql> select SUM(salary), AVG(age) -> from employee_data where -> title = 'программист'; На рис. 7.14. приведен результат запроса.
Рис. 7.14. Сумма зарплат и средний возраст программистов 4. Этот оператор выводит процент зарплаты, который сотрудники BigFoot получают в качестве надбавок. mysql> select (SUM(perks)/SUM(salary) * 100) -> from employee_data; На рис. 7.15. приведен результат запроса.
Рис. 7.15. Процент зарплаты, который сотрудники получают в качестве надбавок |
|
|
|
Именование столбцов
MySQL позволяет задавать имена для выводимых столбцов. Поэтому вместоf_name или l_name и т.д. можно использовать более понятные и наглядные термины. Это делается с помощью оператора AS.
select avg(salary) AS
'Средняя зарплата' from
employee_data;
На рис. 7.16. приведен результат запроса.
Рис. 7.16. Вывод средней зарплаты с использованием псевдо-имен столбцов.
Такие псевдо-имена могут сделать вывод более понятным для пользователей. Важно только помнить, что при задании псевдо-имен с пробелами необходимо заключать такие имена в кавычки. Вот еще один пример:
select (SUM(perks)/SUM(salary) * 100)
AS 'Процент надбавок' from
employee_data;
На рис. 7.17. приведен результат запроса.
Рис. 7.17. Вывод процента зарплаты, которую сотрудники получают в качестве надбавок с использованием псевдо-имен
Подсчет числа записей
Агрегатная функция COUNT() подсчитывает и выводит общее число записей. Например, чтобы подсчитать общее число записей в таблице, выполните следующую команду.
select COUNT(*) from employee_data;
На рис. 7.18. приведен результат запроса.
Рис. 7.18. Общее количество записей
Как мы уже знаем, знак * означает "все данные".
Теперь давайте подсчитаем общее число сотрудников, которые занимают должность "программист".
select COUNT(*) from employee_data
where title = 'программист';
На рис. 7.19. приведен результат запроса.
Рис. 7.19. Общее количество сотрудников-программистов
Группировка данных
Предложение GROUP BY позволяет группировать аналогичные данные. Поэтому, чтобы вывести все уникальные должности в таблице, можно выполнить команду
select title from employee_data
GROUP BY title;
На рис. 7.20. приведен результат запроса.
Рис. 7.20. Все уникальные должности сотрудников
Можно видеть, что это аналогично использованию DISTINCT в предыдущей лекции.
Вот как можно подсчитать число сотрудников имеющих определенную должность.
select title, count(*)
from employee_data GROUP BY title;
На рис. 7.21. приведен результат запроса.
Рис. 7.21. Количество сотрудников по должностям
В предыдущей команде MySQL сначала создает группы различных должностей, а затем выполняет подсчет в каждой группе.
Сортировка данных
Теперь давайте найдем и выведем число сотрудников, имеющих различные должности, и отсортируем их с помощью ORDER BY.
select title, count(*) AS Number
from employee_data
GROUP BY title
ORDER BY Number;
На рис. 7.22. приведен результат запроса.
Рис. 7.22. Количество сотрудников по должностям с сортировкой
Задания
Подсчитайте число сотрудников, которые проработали в BigFoot более трех лет.
Подсчитайте количество сотрудников в группах одного возраста.
Измените предыдущее задание так, чтобы возраст выводился в убывающем порядке.
Найдите средний возраст сотрудников в различных подразделениях (должностях).
Измените предыдущий оператор так, чтобы данные выводились в убывающем порядке среднего возраста.
Возможные решения
1. mysql> select count(*) from employee_data
-> where yos >= 4;
На рис. 7.23. приведен результат запроса.
Рис. 7.23. Число сотрудников, которые проработали более трех лет
2. mysql> select age, count(*)
-> from employee_data
-> GROUP BY age;
На рис. 7.24. приведен результат запроса.
Рис. 7.24. Количество сотрудников в группах одного возраста
3. mysql> select age, count(*)
-> from employee_data
-> GROUP BY age
-> ORDER by age DESC;
На рис. 7.25. приведен результат запроса.
Рис. 7.25. Количество сотрудников в группах одного возраста с обратной сортировкой
4. mysql> select title, AVG(age)
-> from employee_data
-> GROUP BY title;
На рис. 7.26. приведен результат запроса.
Рис. 7.26. Средний возраст сотрудников по должностям
5. mysql> select title, AVG(age)
-> AS 'средний возраст'
-> from employee_data
-> GROUP BY title
-> ORDER BY 'средний возраст' DESC;
На рис. 7.27. приведен результат запроса.
Рис. 7.27. Средний возраст сотрудников по должностям с использованием псевдо-имени столбца
Примечание: Нам нужно задать псевдо-имя для столбца, содержащего среднее значение возраста, чтобы его можно было сортировать.