Практическое занятие № 8
Тема: "Использование и создание функций в разных СУБД"
Цель: получить практические навыки по использованию встроенных функций при построении запросов в разных СУБД
Ход работы
Работа с SQL server
Пусть имеется база данных студентов с полями:

Подключите файлы БД к серверу.
Указания: скачайте архив БД.
Запустите утилиту "Microsoft SQL Server Management Studio", пройдите регистрацию введя информацию: Параметры подлинности = Проверка подлинности SQL Server, Имя пользователя=sa, пароль=111.
В дереве объектов проверьте наличие БД dekanat. Если БД есть, то она готова к работе.
Если БД нет, то в дереве объектов вызовите контекстное меню папки "Базы данных" и выберите команду "Присоединить". В правой части появится окно, в котором с помощью кнопки Добавить укажите файл из архива и щелкните ОК.
В результате у вас на сервере будет зарегистрирована новая БД.
Проверьте работу запросов в этой СУБД.
Из таблицы "stud" выполните выбор следующих данных:
1. Отобрать фамилию и инициалы всех студентов мужского пола.
2. Вывести уникальный список всех групп без номеров.
3. Вывести уникальный список всех групп без номеров. При этом заменить 2-значное обозначение года поступления на 4-значное (13 - 2013, 14 - 2014 и т.д.). Например:
было: 18 ПКС - 16 - 1/9
стало: ПКС - 2016 - 1/9
4. Вывести ФИО студентов заглавными буквами, отсортировать по фамилии.
5. Вывести список студентов, родившихся в 1997 году
6. Вывести список студентов, родившихся сегодня
7. Вывести список студентов, у которых день рождения будет на протяжении следующих 7 дней (включая сегодняшний).
Указания: Введите тексты запросов:
Запрос 1.
select fam+' '+left(imya,1)+'. '+left(otch,1)+'.' as fio
from stud
where pol='м'
Запрос 2.
Номер группы с пробелом занимает три символа, следовательно выделим из текста все символы, начиная с 4 и до конца текста. Будем использовать функцию substring
select distinct substring(grupa,4,len(grupa)-3) as nazv_grup
from stud
order by nazv_grup
Запрос 3.
Обрезку номера группы будем выполнять аналогично предыдущему запросу.
Для поиска вхождения года в названии группы будем использовать функцию charindex, а для замены года будем использовать функцию replace. Всего в нашей таблице есть группы с годами: 13, 14, 15, 16.
select distinct case when charindex('13',substring(grupa,4,len(grupa)-3))>0
then replace(substring(grupa,4,len(grupa)-3), '13', '2013')
when charindex('14',substring(grupa,4,len(grupa)-3))>0
then replace(substring(grupa,4,len(grupa)-3), '14', '2014')
when charindex('15',substring(grupa,4,len(grupa)-3))>0
then replace(substring(grupa,4,len(grupa)-3), '15', '2015')
when charindex('16',substring(grupa,4,len(grupa)-3))>0
then replace(substring(grupa,4,len(grupa)-3), '16', '2016')
end as nazv_grup
from studorder by nazv_grup
Запрос 4.
select upper(fam) as fam,
upper(imya) as imya,
upper(otch) as otch
from stud
order by fam
Запрос 5.
select *
from stud
where year(datar)=1997
order by fam
Запрос 6.
select *
from stud
where day(datar)=day(getdate())
and month(datar)=month(getdate())
order by fam
Запрос 7.
Для построения запроса нужно получить диапазон дат: от текущей: getdate() до +7 дней: dateadd(day,7,getdate())
select *
from stud
where day(datar) between day(getdate())
and day(dateadd(day,7,getdate()))
and month(datar) between month(getdate())
and month(dateadd(day,7,getdate()))
order by fam
Над данными таблицы "stud" выполнить следующие действия:
1. Все фамилии записать заглавными буквами, а имена - маленькими.
2. Все фамилии и имена записать с большой буквы и удалить начальные и конечные пробелы
3. Всем студентам, у которых день рождения в текущем месяце, в поле "fam" к фамилии добавить знак "+".
Указания:
Запрос 1.
update stud
set fam=upper(fam),
imya=lower(imya)
Запрос 2.
update stud
set fam=upper(left(ltrim(fam),1))+lower(substring(ltrim(rtrim(fam)),2,len(ltrim(rtrim(fam)))-1)),
imya=upper(left(ltrim(imya),1))+lower(substring(ltrim(rtrim(imya)),2,len(ltrim(rtrim(imya)))-1))
Запрос 3.
update stud
set fam=ltrim(rtrim(fam))+'+'
where month(datar)=month(getdate())
Работа в MySQL
Подключите БД к серверу MySQL.
Указания: скачайте архив БД, распакуйте его.
В архиве находится файл со скриптом БД.
Запустите утилиту EMS SQL Manager for MySQL.
Если в левой части окна отображается БД dekanat, то вы можете приступать к работе с ней.
Если БД нет, т о ее нужно подключить. Для этого в правой части окна программы выберите команду "Выполнить SQL скрипт". В новом окне выберите команду "Выполнить скрипт из файла". В диалоговом окне укажите распакованный файл скрипта. Если появится окно регистрации, то укажите Пользовать=root, Пароль=111. Если такого окна не появилось, то нажимайте в окне ОК. Появится сообщение, что скрипт выполнен успешно и появится окно для регистрации БД. Перенесите ее в правую часть окна и нажмите ОК. В результате БД будет установлена, зарегистрирована и готова к работе.
В левой части окна можете открыть БД, просмотреть ее таблицы.
Для выполнения запросов в окне выполните команду "Инструменты - Показать редактор SQL". В результате в правой части окна откроется поле для ввода тестов запросов.
Из таблицы "stud" выполните выбор следующих данных:
1. Отобрать фамилию и инициалы всех студентов мужского пола.
2. Вывести уникальный список всех групп без номеров.
3. Вывести уникальный список всех групп без номеров. При этом заменить 2-значное обозначение года поступления на 4-значное (13 - 2013, 14 - 2014 и т.д.)
4. Вывести ФИО студентов заглавными буквами, отсортировать по фамилии.
5. Вывести список студентов, родившихся в 1997 году
6. Вывести список студентов, родившихся сегодня
7. Вывести список студентов, у которых день рождения будет на протяжении следующих 7 дней (включая сегодняшний).
Указания: введите текст запросов:
Запрос 1.
В MySQL для суммирования текстов используют функцию concat
select concat(fam,' ',left(imya,1),'. ',left(otch,1),'.') as fio
from stud
where pol='м'
Запрос 2.
Номер группы с пробелом занимает три символа, следовательно выделим из текста все символы, начиная с 4 и до конца текста. Будем использовать функцию substring.
Запрос похож на SQL Server, только вместо функции len будем использовать функцию char_length.
При этом, если не указать число выделяемых символов, то выделается весь текст до конца.
select distinct substring(grupa,4,char_length(grupa)-3) as nazv_grup
from stud
order by nazv_grup
Однако, если в MySQL в функции substring не указано количество выделяемых символов, то выделяется весь текст до конца. Следовательно этот же запрос можно записать короче:
select distinct substring(grupa,4) as nazv_grup
from stud
order by nazv_grup
Запрос 3.
Обрезку номера группы будем выполнять аналогично предыдущему (укороченному) запросу.
Для поиска вхождения года в названии группы будем использовать функцию locate, а для замены года будем использовать функцию replace. Всего в нашей таблице есть группы с годами: 13, 14, 15, 16.
select distinct case when locate('13' ,substring(grupa,4))>0
then replace(substring(grupa,4), '13', '2013')
when locate('14',substring(grupa,4))>0
then replace(substring(grupa,4), '14', '2014')
when locate('15',substring(grupa,4))>0
then replace(substring(grupa,4), '15', '2015')
when locate('16',substring(grupa,4))>0
then replace(substring(grupa,4), '16', '2016')
end as nazv_grup
from stud
order by nazv_grup
Запрос 4.
select upper(fam) as fam,
upper(imya) as imya,
upper(otch) as otch
from stud
order by fam
Запрос 5.
select *
from stud
where year(datar)=1997
order by fam
Запрос 6.
В MySQL текущая дата определяется функцией curdate:
select *
from stud
where day(datar)=day(curdate())
and month(datar)=month(curdate())
order by fam
Запрос 7.
Для построения запроса нужно получить диапазон дат: от текущей: curdate() до +7 дней: adddate(curdate(),7)
select *
from stud
where day(datar) between day(curdate())
and day(adddate(curdate(),7))
and month(datar) between month(curdate())
and month(adddate(curdate(),7))
order by fam
Над данными таблицы "stud" выполнить следующие действия:
1. Все фамилии записать заглавными буквами, а имена - маленькими.
2. Все фамилии и имена записать с большой буквы и удалить начальные и конечные пробелы
3. Всем студентам, у которых день рождения в текущем месяце, в поле "fam" к фамилии добавить знак "+".
Указания:
Запрос 1.
update stud
set fam=upper(fam),
imya=lower(imya)
Запрос 2.
В MySQL комбинацию функций ltrim(rtrim()) можно записать как trim(). В функции substring можно не указывать число выделяемых символов. Суммирование текстов записывается функцией concat()
update stud
set fam=concat(upper(left(ltrim(fam),1)),lower(substring(trim(fam),2))),
imya=concat(upper(left(ltrim(imyA),1)),lower(substring(trim(imya),2)))
Запрос 3.
В MySQL комбинацию функций ltrim(rtrim()) можно записать как trim(). Суммирование текстов записывается функцией concat(). Текущая дата определяется функцией curdate()
update stud
set fam=concat(trim(fam),'+')
where month(datar)=month(curdate())
Работа в SQLite
Указания: скачайте исходную БД в формате SQLite. Распакуйте содержимое архива/ Запустите утилиту "SQLite ExpertPro". С помощью команды "File - Open Database" откройте БД.
В правой части окна на закладке SQL вводите нужный запрос и щелкните на кнопке "Execute SQL".
Если запрос выполнен правильно, то в нижней части окна появится список отобранных данных.
Из таблицы "stud" выполните выбор следующих данных:
1. Отобрать фамилию и инициалы всех студентов мужского пола.
2. Вывести уникальный список всех групп без номеров.
3. Вывести уникальный список всех групп без номеров. При этом заменить 2-значное обозначение года поступления на 4-значное (13 - 2013, 14 - 2014 и т.д.)
4. Вывести ФИО студентов заглавными буквами, отсортировать по фамилии.
5. Вывести список студентов, родившихся в 1997 году
6. Вывести список студентов, родившихся сегодня
7. Вывести список студентов, у которых день рождения будет на протяжении следующих 7 дней (включая сегодняшний).
Указания: при работе в SQLite с русским текстом в кодировке UTF8 часто возникают проблемы с использованием строковых функций. Для их решения необходимо настроить параметры утилиты SQLite Expert. Выполните команду меню "Tools - Options". В окне настроек в левой части выберите строку "Data". В правой части внизу выберите второй переключатель "sqlite3.dll (version 3.8.7.1) supports FTS3, FTS4, RTREE, ICU". После этого все строковые функции будут корректно работать с русским текстом в кодировке UTF8.
Введите тексты запросов:
Запрос 1.
select fam || ' ' || substr(imya,1,1) || '. ' || substr(otch,1,1) || '.' as fio
from stud
where pol='м'
Запрос 2.
Номер группы с пробелом занимает три символа, следовательно выделим из текста все символы, начиная с 4 и до конца текста. Будем использовать функцию substr
select distinct substr(grupa,4,length(grupa)-3) as nazv_grup
from stud
order by nazv_grup
Запрос 3.
Обрезку номера группы будем выполнять аналогично предыдущему (укороченному) запросу.
Для поиска вхождения года в названии группы будем использовать функцию instr, а для замены года будем использовать функцию replace. Всего в нашей таблице есть группы с годами: 13, 14, 15, 16.
select distinct case when instr(substr(grupa,4),'13')>0
then replace(substr(grupa,4), '13', '2013')
when instr(substr(grupa,4),'14')>0
then replace(substr(grupa,4), '14', '2014')
when instr(substr(grupa,4),'15')>0
then replace(substr(grupa,4), '15', '2015')
when instr(substr(grupa,4),'16')>0
then replace(substr(grupa,4), '16', '2016')
end as nazv_grup
from stud
order by nazv_grup
Запрос 4.
СУБД SQLite не умеет работать с текстовыми функциями, если текст набран в кодировке UTF-8. Поэтому запрос выполнится, но содержимое полей не изменится.
select upper(fam) as fam,
upper(imya) as imya,
upper(otch) as otch
from stud
order by fam
Запрос 5.
В SQLite выделение частей из даты выполняется с помощью функции strftime. При этой каждая часть выделяется в текстовом формате.
select *
from stud
where strftime('%Y',datar)='1997'
order by fam
Запрос 6.
В SQLite выделение частей из даты выполняется с помощью функции strftime. При этой каждая часть выделяется в текстовом формате.
Для получения текущей даты используют текстовую константу 'now'
select *
from stud
where strftime('%d',datar)=strftime('%d','now')
and strftime('%m',datar)=strftime('%m','now')
order by fam
Запрос 7.
В SQLite выделение частей из даты выполняется с помощью функции strftime. При этой каждая часть выделяется в текстовом формате.
Для построения запроса нужно получить диапазон дат: от текущей: 'now' до +7 дней: date('now','+7 days')
select *
from stud
where strftime('%d',datar) between strftime('%d','now')
and strftime('%d',date('now','+7 days'))
and strftime('%m',datar) between strftime('%m','now')
and strftime('%m',date('now','+7 days'))
order by fam
Над данными таблицы "stud" выполнить следующие действия:
1. Все фамилии записать заглавными буквами, а имена - маленькими.
2. Все фамилии и имена записать с большой буквы и удалить начальные и конечные пробелы
3. Всем студентам, у которых день рождения в текущем месяце, в поле "fam" к фамилии добавить знак "+".
Указания:
Запрос 1.
update stud
set fam=upper(fam),
imya=lower(imya);
Запрос 2.
В SQLite длина строки определяется функцией length(), первый символ выделяется функцией substr(поле, 1, 1), часть строки выделяется функцией substr(), суммирование текстов записывается операцией ||
update stud
set fam = upper(substr(ltrim(fam),1,1))||lower(substr(ltrim(rtrim(fam)),2,length(ltrim(rtrim(fam)))-1)),
imya = upper(substr(ltrim(imya),1,1))||lower(substr(ltrim(rtrim(imya)),2,length(ltrim(rtrim(imya)))-1))
Запрос 3.
update stud
set fam=ltrim(rtrim(fam)) || '+'
where strftime('%m',datar)=strftime('%m','now')