Пример 9: Просмотр содержимого таблиц

advertisement
Информатика, 10-11 классы
Ледовских Ирина Анатольевна
ЯЗЫК РЕЛЯЦИОННЫХ БАЗ ДАННЫХ SQL. ОРГАНИЗАЦИЯ SQL-ЗАПРОСОВ К
БАЗЕ ДАННЫХ
Мир баз данных
Современные технологии баз данных являются одним из определяющих факторов
успеха в любой отрасли бизнеса. Они обеспечивают хранение корпоративной информации,
представление данных для пользователей и клиентов в среде World Wide Web и поддержку
многих других процессов. Помимо этого, базы данных составляют основу разнообразных
научных проектов.
Для создания и работы с базами данных существует специализированное программное
обеспечение, которое принято называть система управления базами данных (СУБД)
(Database Management Systems - DBMS), или просто система баз данных (database systems).
Что такое база данных? По существу, это не что иное, как набор порций информации,
существующий в течение длительного периода времени. Термином база данных (database) в
соответствии с принятой традицией обозначают набор данных, находящийся под контролем
СУБД.
Большинство современных СУБД основано на реляционной модели представления
данных, в соответствии с которой информация организуется в виде таблиц. Примерами
реляционных СУБД являются Access, Paradox, DB2, FoxPro, Oracle, MySQL. Пользователю
реляционной базы данных вовсе не требуется знать об особенностях организации хранения
информации на носителе.
Запросы к реляционной базе данных выражаются средствами высокоуровневого языка.
В подобных системах в качестве языка запросов наиболее часто применяется язык
структурированных запросов SQL – Structure Query Language.
Что такое запрос? Запросом называется любая операция в СУБД. Бывают запросы на
создание и удаление баз данных, на создание и удаление таблиц, на модификацию таблиц и
модификацию структуры таблиц, на выбор информации т.д.
Основные сведения о языке SQL
Язык структурированных запросов SQL ориентирован на выполнение действий с
таблицами БД и данными в этих таблицах, а также некоторых вспомогательных действий. В
отличие от процедурных языков программирования, в нём нет операторов управления
вычислительным процессом (циклов, переходов, ветвления) и средств ввода-вывода.
Составленную на языке SQL программу называют SQL-запросом.
Язык SQL обычно интегрируется в другие средства (оболочку), используясь в
интерактивном режиме. Так, в системе управления базами данных, имеющей интерактивный
интерфейс, пользователь может работать, ничего не зная об языке SQL, независимо от того,
какая база данных используется: локальная или удаленная. Такие СУБД, как Microsoft
Access, Visual FoxPro или Paradox, сами выполняют действия, связанные с
программированием запросов на SQL, предлагая пользователю средства визуального
построения запросов, например, Query By Example (QBE) – запрос по образцу. Однако, при
работе с некоторыми СУБД, например MySQL, знание языка SQL необходимо.
Так как SQL не обладает возможностями полноценного языка программирования, а
ориентирован на доступ к данным, то его часто включают в средства разработки программ,
например, такие как Delphi и Builder. При этом для работы с командами SQL предлагаются
соответствующие средства и компоненты.
Язык SQL имеет несколько стандартов. Наличие нескольких стандартов и различная их
интерпретация породили множество диалектов языка SQL, которые в большей или меньшей
степени отличаются друг от друга.
Операторы SQL
Основу языка SQL составляют операторы, условно разбитые не несколько групп по
выполняемым функциям.
Можно выделить следующие группы операторов (перечислены не все операторы SQL):
Операторы DDL (Data Definition Language) - операторы определения объектов базы
данных
CREATE DATABASE - создать базу данных
DROP DATABASE - удалить базу данных
CREATE TABLE - создать таблицу
ALTER TABLE - изменить таблицу
DROP TABLE - удалить таблицу
CREATE VIEW - создать представление
DROP VIEW - удалить представление
Операторы DML (Data Manipulation Language) - операторы манипулирования данными
SELECT - отобрать строки из таблиц
INSERT - добавить строки в таблицу
UPDATE - изменить строки в таблице
DELETE - удалить строки в таблице
Операторы защиты и управления данными
CREATE ASSERTION - создать ограничение
DROP ASSERTION - удалить ограничение
GRANT - предоставить привилегии пользователю или приложению на
манипулирование объектами
REVOKE - отменить привилегии пользователя или приложения
Наиболее важными для пользователя являются операторы манипулирования данными
(DML).
Типы данных SQL
SQL относится к категории языков с сильной типизацией. Это означает, что с любым
объектом данных связывается определенный тип, даже если на первый взгляд это не
очевидно. Тип данных одновременно определяет и ограничивает разновидности операций,
которые могут выполняться с этими данными.
Типы не только ассоциируются со всеми данными, но и играют важную роль при
создании таблиц. При создании таблицы каждому полю, помимо имени, назначается
определенный тип данных. Перечислим базовые типы данных SQL.
INTEGER, INT, INT4 - 4-х байтовое целое со знаком
SMALLINT, INT2 - 2-х байтовое целое со знаком
CHARACTER(n), CHAR(n): символьная строка фиксированной длины n.
VARCHAR(n) - символьная строка переменной длины (максимальная длина n
символов)
BOOLEAN, BOOL - отдельная логическая величина
DATE - календарная дата (день, месяц, год)
TIME - время суток
Примеры использования операторов манипулирования данными
В качестве учебной базы данных будем использовать базу данных «Учет
успеваемости», состоящую из трех таблиц: STUDENTS, SUBJECTS, MARKS.
Опишем структуру и приведём несколько первых строк каждой таблицы (названия
ключевых полей выделены жирным шрифтом). Кроме того, мы приведём и
прокомментируем соответствующие операторы CREATE TABLE.
Таблица STUDENTS
Таблица STUDENTS предназначена для хранения списка учеников. Для каждого
ученика хранятся его фамилия (syname), имя (name), дата рождения (birthday). Кроме того
каждый ученик имеет уникальный идентификатор id.
Таблица STUDENTS
Id
syname
Name
birthday
1
Karpov
Igor
1992-04-12
2
Zviagina
Katya
1992-11-27
3
Aistov
Artem
1992-09-14
4
Denisova
Dasha
1992-04-23
5
Efimov
Denis
1992-03-13
6
Ushakov
Nikita
1992-12-02
Структура этой таблицы создаётся посредством следующей команды:
CREATE TABLE STUDENTS
(id int not null auto_increment primary key, syname varchar(30) not null, name
varchar(20) not null, birthday date not null);
где
STUDENTS – название таблицы;
id, syname, name, birthday – названия полей;
int, varchar(30), date – типы данных;
not null – обязательный ввод данных;
primary key - первичный ключ.
Ключевое поле (primary key) id объявлено с параметром auto_increment. Благодаря
этому мы можем не заботиться об обеспечении уникальности значений в этом поле. При
добавлении нового ученика ему автоматически будет присвоен уникальный идентификатор
(на единицу больший максимального значения в этом столбце).
Таблица SUBJECTS
В таблице SUBJECTS хранятся названия предметов (name), которые изучают ученики.
Каждый предмет также имеет уникальный идентификатор id.
Таблица SUBJECTS
id
name
1
Literature
2
Russian
3
Mathematic
4
History
5
English
Структура таблицы SUBJECTS создается посредством следующей команды CREATE
TABLE:
CREATE TABLE SUBJECTS
(id int not null auto_increment primary key, name varchar(30) not null);
Таблица MARKS
В таблице MARKS хранятся оценки, полученные учениками (ученик определяется
полем id_student) по определенным предметам (предмет определяется полем id_subject). В
качестве первичного ключа выступает поле id.
Таблица MARKS
id
id_student
id_subject
mark
mark_date
1
1
1
5
2006-02-12
2
2
1
4
2006-03-02
3
1
2
5
2006-03-13
4
1
3
3
2006-02-10
5
2
2
4
2006-02-24
6
3
5
2
2006-02-10
7
5
4
4
2006-03-04
8
4
5
3
2006-02-28
9
5
1
4
2006-02-28
10
5
2
5
2006-03-14
11
6
3
5
2006-03-07
12
3
2
3
2006-02-24
Таблица MARKS создается посредством следующей команды CREATE TABLE:
CREATE TABLE MARKS
(id int not null auto_increment primary key, id_student int not null,
id_subject int not null, mark int not null, mark_date date not null);
Поле id в таблицах – первичный ключ (primary key) – это поле, однозначно
идентифицирующее запись в таблице.
В правильно построенной реляционной базе данных в каждой таблице есть первичный
ключ. В столбце, являющимся первичным ключом значения во всех строках разные. На
практике в качестве первичных ключей таблиц обычно следует выбирать идентификаторы.
Связи между таблицами
Связи между таблицами STUDENTS, SUBJECTS и MARKS показаны на следующем
рисунке:
Соответствие строк показано линиями. Для обозначения связи типа «один ко многим»
использованы символы «1» (на стороне «одного») и «  » (на стороне «многих»). Те, кто
имеет опыт работы в MS Access узнали знакомую «Схему данных» и знакомые обозначения.
Добавление данных в таблицу
Оператор INSERT предназначен для добавления данных в указанную таблицу базы
данных. Имеются различные модификации этого оператора. Мы рассмотрим одну, наиболее
наглядную.
Синтаксис оператора INSERT
INSERT INTO <имя таблицы>(<список полей, разделенных запятыми>)
VALUES (<список значений, разделеных запятыми>)
Приведём соответствующий пример:
INSERT INTO STUDENTS(syname, name, birthday)
VALUES ( ‘Karpov’, ‘Igor’, ‘1992-04-12’);
Оператор SELECT
Оператор SELECT является фактически самым важным для пользователя и самым
сложным оператором SQL. Он реализует одно из основных назначений баз данных –
предоставлять информацию пользователю.
Оператор SELECT всегда выполняется над некоторыми таблицами, входящими в базу
данных.
Замечание: В базах данных могут быть не только постоянно хранимые таблицы, но и
временные таблицы и так называемые представления (VIEW). Представления – это
хранящиеся в базе данных SELECT-выражения. С точки зрения пользователей
представления – это таблица, которая не хранится постоянно в базе данных, а «возникает» в
момент обращения к ней. С точки зрения оператора SELECT и постоянно хранимые
таблицы, и временные таблицы, и представления выглядят совершенно одинаково. При
реальном выполнении оператора системой учитываются различия между хранимыми
таблицами и представлениями, но эти различия скрыты от пользователя.
Результатом выполнения оператора SELECT всегда является таблица.
Оператор SELECT предназначен для построения запросов и выборки данных из
таблиц. Данные, возвращаемые в результате запроса, называются итоговым набором, как и
таблицы, они состоят из записей и полей.
Синтаксис оператора SELECT
Приведем общую структуру оператора SELECT.
SELECT <запрашиваемая информация>
[ FROM <источник информации> ]
[ WHERE <условие>]
[ GROUP BY <список полей через запятую>
[ HAVING <условие>] ]
[ ORDER BY <выражение> [ ASC | DESC ]]
[ LIMIT [<с какой строки выдать>,]<сколько строк выдавать>]
В квадратные скобки заключены необязательные части. Рассмотрим все части
оператора SELECT по отдельности.
 FROM <источник информации> – в этой части перечисляются таблицы, которые
требуются для выполнения запроса. Допускается перечисление нескольких таблиц,
разделенных запятыми.
 WHERE <условие> – записывается условие отбора строк из таблицы результата. Условие
должно возвращать простое логическое значение, но оно может состоять из нескольких
внутренних условий, объединенных логическими операторами AND или OR.
Формулирование условий – это самая интересная составляющая при конструировании
запросов.

GROUP BY <список полей через запятую> - обеспечивает группировку записей по
заданному критерию. Причем критерий может быть простым именем поля или
произвольным выражением, примененным к значениям итогового набора.
o HAVING <условие> – предложение HAVING, в котором задается условие, имеет
отношение к GROUP BY и не употребляется без последнего. Эта часть схожа с
частью WHERE, но WHERE применяется до группировки, а HAVING после.
 ORDER BY <выражение> – сортировка результатов по заданному выражению
 [ACS | DESC ] – определяет порядок сортировки: по возрастанию (ASC, такой режим
установлен «по умолчанию») или по убыванию (DESC).
LIMIT [<какой строки выдать>,]<сколько строк выдавать>]
ограничение
максимального количества возвращаемых записей или возвращение всей выборки.
Примеры использования оператора SELECT
Отбор данных из одной таблицы
(ключевые слова SELECT…FROM…WHERE)
Пример 1: Выбрать все записи из таблицы STUDENTS:
SELECT * FROM STUDENTS;
Пример 2: Выбрать все строки из таблицы MARKS, удовлетворяющие условию: оценка
равна 3:
SELECT * FROM MARKS WHERE mark=3;
Пример 3: Выбрать некоторые колонки из исходной таблицы STUDENTS:
SELECT syname, birthday FROM STUDENTS;
Пример 4: Использование переименования колонок в запросах:
SELECT id, ‘=’ AS Equ, syname FROM STUDENTS;
Пример 5: Упорядочение результатов запроса:
SELECT * FROM STUDENTS ORDER BY syname;
Пример 6: Изменение параметров упорядочения и упорядочение по нескольким полям:
SELECT * FROM STUDENTS ORDER BY syname, name DESC;
Замечание: если явно не указан порядок сортировки, то по умолчанию используется
упорядочение по возрастанию (ASC)
Отбор данных из нескольких таблиц
Пример 7: Естественное соединение таблиц (явное указание условий соединения):
SELECT MARKS.id_student, MARKS.mark, STUDENTS.id, STUDENTS.syname
FROM MARKS, STUDENTS WHERE STUDENTS.id=MARKS.id_student;
Пример 8: Прямое произведение таблиц:
SELECT STUDENTS.id, STUDENTS.syname, MARKS.mark, MARKS.mark_date
FROM STUDENTS, MARKS;
Пример 9: Просмотр содержимого таблиц:
SELECT s.syname, s1.name, m.mark, m.mark_date
FROM STUDENTS s, SUBJECTS s1, MARKS m
WHERE s.id=m.id_student and s1.id=m.id_subject;
Использование псевдонимов
Иногда приходится выполнять запросы, в которых таблица соединяется сама с собой,
или одна таблица соединяется дважды с другой таблицей. При этом используются
псевдонимы, которые позволяют различать соединяемые копии таблиц. Псевдонимы
вводятся в разделе FROM и идут через пробел после имени таблицы. Определение имени
псевдонима действует только во время исполнения запроса.
Пример 10: Отобрать все пары учеников таким образом, чтобы первый ученик в паре
был младше второго:
SELECT t1.syname, t1.birthday, t2.syname, t2.birthday
FROM STUDENTS t1, STUDENTS t2
WHERE t1.birthday>t2.birthday;
Использование агрегатных функций в запросах
Агрегатные функции – функции, которые выполняются над группой строк.
• COUNT – количество
• SUM – сумма
• AVG – среднее арифметическое
• MAX – максимум
• MIN - минимум
Пример 11: Получить общее количество оценок:
SELECT COUNT (*) FROM MARKS;
Пример 12: Получить максимальную, минимальную и среднюю оценку:
SELECT MAX (MARKS.mark),
MIN(MARKS.mark),
AVG(MARKS.mark)
FROM MARKS;
Пример 13: Для каждого предмета получить среднюю оценку:
SELECT
AVG(MARKS.mark) AS Sredniy_ball
FROM MARKS
GROUP BY MARKS.id_subject;
Замечание: В списке отбираемых полей оператора SELECT, содержащего раздел
GROUP BY можно включать только агрегатные функции и поля, которые входят в условие
группировки, иначе запрос выдаст синтаксическую ошибку.
Использование подзапросов
Очень удобным средством, позволяющим формулировать запросы более понятным
образом, является возможность использования подзапросов, вложенных в основной запрос.
Пример 14: Получить список студентов, возраст которых больше минимального
возраста в таблице студентов:
SELECT * FROM STUDENTS s
WHERE s.birthday<(SELECT MAX(s.birthday) FROM STUDENTS s);
Выводы
 Фактически стандартным языком доступа к базам данных в настоящее время стал
язык SQL (Structured Query Language).
 Основу языка SQL составляют операторы, условно разбитые не несколько групп по
выполняемым функциям:
o Операторы DDL (Data Definition Language) - операторы определения объектов
базы данных.
o Операторы DML (Data Manipulation Language) - операторы манипулирования
данными.
o Операторы защиты и управления данными, и др.
 Одним из основных операторов DML является оператор SELECT, позволяющий
извлекать данные из таблиц и получать ответы на различные запросы.
ВОПРОСЫ ДЛЯ САМОКОНТРОЛЯ
1. Что такое реляционная база данных?
2. Как называется специализированное программное обеспечение для работы с базами
данных?
3. Приведите примеры систем управления базами данных.
4. Основное назначение языка SQL?
5. Для чего используется оператор SELECT?
6. Назовите основные секции оператора SELECT.
7. Для чего предназначены секции WHERE, GROUP BY, HAVING?
Задачи для самостоятельного решения
Представленные ниже задачи являются контрольным заданием №3 для учащихся 11
классов. Решения необходимо оформить в отдельной тетради и выслать по адресу 680000,
г. Хабаровск, ул. Дзержинского, 48, ХКЦТТ, ХКЗФМШ.
И.10-11.3.1. Используя инструкции SQL,
o создать таблицы Сотрудники и Дети_сотрудников. Таблица Сотрудники содержит
шесть полей: целочисленное поле Код_сотрудника, текстовые поля - Фамилия, Имя,
Адрес, Телефон, поле типа дата – Дата_рождения. Таблица Дети_сотрудников содержит
5 полей: целочисленные поля Код_ребенка и Код_сотрудника, текстовые поля
Имя_ребенка, Пол, поле типа дата – Дата_рождения. Поля Код_сотрудника в таблице
Сотрудники и Код_ребенка в таблице Дети_сотрудников определить как ключевые. Для
всех полей, кроме Телефона, определить обязательный ввод данных;
o Найти всех сотрудников, имеющих телефон;
o Добавить в таблицу информацию о новом сотруднике;
o Получить фамилии сотрудников, имеющих детей;
o Получить имена детей каждого сотрудника;
o Посчитать количество мальчиков и девочек;
o Получить список сотрудников, у которых есть дети, не достигшие 16 лет.
И.10-11.3.2. Придумайте ещё 5-10 различных запросов к таблицам Сотрудники и
Дети_сотрудников, используя различные модификации оператора SELECT. Отчет оформите
в тетради и отправьте преподавателю.
Download