GROUP BY год_рождения
SELECT предмет, семестр, MIN(оценка), AVG(оценка), MAX(оценка)
FROM экзамен
GROUP BY предмет, семестр
SELECT год_поступления, COUNT(*)
FROM студент
WHERE год_поступления >= 2008
GROUP BY год_поступления
В предложении SELECT, как правило, фигурируют поля, содержащиеся в предложении GROUP BY, а также поля, используемые для подсчета итоговых данных.
Команда выборки данных группировкой может включать в себя предложение HAVING, которое, как и предложение WHERE , задает условия отбора для отдельных строк, то HAVING – для групп строк, определяемых предложением GROUP BY. Поэтому в YFVING обязательно должна быть указана хотя бы 1 из агрегатных функций, фигурирующих в SELECT, в то время как, в WHERE это нудопустимо. Т.о. результирующий набор данных формируется в 2 этапа:
сначала выполняется обычная группировка и подсчет итоговых данных
подсчет итоговых данных, а потом к получаемому набору данных меняются условия отбора, задаваемые
HAVING
SELECT факультет, COUNT(*)
FROM группа
GROUP BY факультет
HAVING COUNT(*) <=15
SELECT год_поступления, COUNT(*)
FROM студент
WHERE год_поступления >= 2002
GROUP BY год_поступления
HAVING COUNT(*) > 15
Команда выборки данных позволяет извлечь данные сразу из нескольких таблиц, для этого их имена нужно перечислить во FROM, а в WHERE необходимо задать условие соединение, указывая через знак равенства поля, по которым происходит соединение таблиц. Чаще всего такими полями являются первичные и внешние ключи таблиц между которыми установлены связи типа 1:М
SELECT Группа.*, Студент.фамилия
FROM Группа, Студент
WHERE Группа.N_группы = Студент.N_группы
Чтобы упростить запись таких команд, имена таблиц в FROM снабжаются псевдонимами, которых можно использовать лишь в контексте данной команды
SELECT Г.*, С.фамилия
FROM Группа Г, Студент С
WHERE Г.N_группы = C.N_группы
SELECT Г.*, С.фамилия, Э.*
FROM Группа Г, Студент С, Экзамен Э
WHERE Г.N_группы = C.N_группы
AND C.N_зачетки = Э.N_зачетки
Существуют следующие правила:
Число условий соединения предложения WHERE не должно быть меньше, чем n – 1, где n – число таблиц, перечисленных во FROM.
Если условия соединения не указывать, то результирующий набор данных будет представлять собой декартово произведение таблиц, перечисленных в FROM.
SELECT Г.*, Э.*
FROM Группа Г, Экзамен Э
/*не получится соединить, т.к. нет непосредств. Связи */
Чтобы избежать декартово произведения нужно добавить связующую страницу и 2 условия соединения.
Как правило, БД не содержит изолированных таблиц, поэтому нужно соединять любые таблицы, добавляя при необходимости промежуточные связующие таблицы.
SELECT С.фамилия, С.N_зачетки, Э.оценка
FROM Студент С, Экзамен Э
WHERE C.N_зачетки = Э.N_зачетки
AND C.N_группы = 372302
AND Э.предмет = ‘Теория систем’
ORDER BY С.фамилия
SELECT Г.N_группы, AVG(Э.оценка)
FROM Группа Г, Студент С, Экзамен Э
WHERE Г.N_группы = C.N_группы
AND C.N_зачетки = Э.N_зачетки
AND Г.Факультет = ‘ИЭ’
AND Э.предмет = ‘Теория систем’
GROUP BY Г.N_группы
Рассмотренный способ соединения таблиц:
Известен как внутреннее соединение, и он характерен тем, что результирующий набор данных будет содержать только те строки, которые удовлетворяют условиям соединения, указанным в
WHERE
SELECT Г.*, С.фамилия
FROM Группа Г, Студент С
WHERE Г.N_группы = C.N_группы
Предположим, что таблица студент содержит 100 строк, в которых поле N_группы наполовину не заполнено(NULL), тогда эта команда вернет результирующий набор данных, содерж. 50 строк, т.к. поле N_группы фигурирует в условии соединения таблиц. Если мы хотим получить фамилии всех 100 студентов и увидеть, у кого отсутствует инфа о N_группы, то нужно использовать другой тип соединения, называемый внешним соединением.
Внешнее соединение может быть левым или правым.
Левое внешнее соединение включ. в результ. набор данных все строки таблицы, расположенный слева в предл. FROM, а правое внешнее – все троки таблицы, распол. справа.
При этом условие соединения записываются в предл. FROM после зарезервированного слова ON
SELECT Г.*, С.фамилия
FROM Студент С LEFT OUTER JOIN Группа Г
ON Г.N_группы = С.N_группы
SELECT Г.*, С.фамилия
FROM Группа Г
RIGHT OUTER JOIN Студент С
ON Г.N_группы = С.N_группы
SELECT Г.*, С.фамилия, Э.оценка
FROM Студент С
LEFT OUTER JOIN Группа Г ON Г.N_группы = С.N_группы
LEFT OUTER JOIN Экзамен Э ON С.N_зачетки = Э.N_зачетки
WHERE Э.предмет = ‘Теория систем’
Внешнее соединение используется не очень часто и обычно в тех случаях, когда поля, по которым производится соединение содержит NULL значит, если же указанных поля не содержат NULL значений, то внутр. и внешн. соединение порождают один и тот же набор данных
SELECT С.фамилия, Э.*
FROM Студент С
RIGHT OUTER JOIN Экзамен Э ON С.N_зачетки = Э.N_зачетки
WHERE Э.оценка
~
SELECT С.фамилия, Э.*
FROM Студент С, Экзамен Э
RIGHT OUTER JOIN Экзамен Э ON С.N_зачетки = Э.N_зачетки
WHERE C.N_зачетки = Э.N_зачетки
AND Э.оценка = 10
Имеется другой альтернативный способ записи внутренних соединений. Аналогичн. способ записи внешних соединений.
SELECT С.фамилия, Э.*
FROM Студент С
INNER JOIN Экзамен Э ON С.N_зачетки = Э.N_зачетки
WHERE Э.оценка = 10
Язык SQL позволяет вкладывать запросы на выборку друг в друга. Обычно внутр. Запрос называемый подзапросом генерирует набор данных с помощью которого выполняется оценка истинности предиката внешнего запроса
SELECT *
FROM Студент
WHERE N_Группы IN(
SELECT N_группы
FROM Группа
WHERE факультет = ‘ИЭ’).
SELECT C.*
FROM Группа Г
INNER JOIN Студент С ON Г.N_группы = С.N_группы
WHERE Г факультет = ‘ИЭ’
SELECT *
FROM Экзамен
WHERE N_Зачетки IN(
SELECT N_зачетки
FROM Студент
WHERE N_группы = 372301).
ORDER BY предмет, N_зачетки
SELECT Э.экзамен, С.фамилия, Э.оценка
FROM студент C,
INNER JOIN Экзамен Э ON С.N_зачетки = Э.N_зачетки
WHERE Э оценка > (SELECT AVG (оценка) FROM Экзамен)
ORDER BY Э.предмет, С.фамилия
SELECT C.N.-группа, COUNT(*)
FROM студент C
INNER JOIN экзамен Э ON C.N-зачётки=Э.N.зачётки
WHERE Э.предмет= ‘теория систем’
AND Э.оценка>(SELECT AVG(ОЦЕНКА)
FROM экзамен
WHERE предмет=’теория систем’)
GROUP BY C.N. группы
HAVING COUNT(*)>=20
Оператор EXIST
Использует подзапрос в качестве аргумента и принимают значение ‘истина’ только в том случае, если подзапрос возвращает набор данных, содержащий хотя бы 1 строку.
Например:
SELECT*
FROM студент С
WHERE EXISTS(
SELECT*
FROM Экзамен Э
WHERE э.N.- зачётки= С.N.- зачётки AND ценка<=3.
Оператор ANY (SOME) перебирает все значения выдаваемые как истину, если хотя бы 1 из этих значений обеспечивает истинность предиката внешнего запроса
SELECT *
FROM Группа Г
WHERE 1992=ANY(SELECT год_рождения
FROM студент С
WHERE C.N.-группы=Г.N.-группы)
Оператор ALL
Перебирает все значение, выдаваемые подзапросом и оценивает результат как истина, если для каждого из этих значений обеспечивает истинность предиката внешнего запроса.
SELECT*
FROM Группа Г
WHERE 1992<=ALL (SELECT год-рождения
FROM студент С
WHERE C.N.-группы=Г.N.-группы)
Язык определения данных используется для создания и изменения структуры базы данных и ее составных частей - таблиц, индексов, представлений (виртуальных таблиц), а также триггеров и сохраненных процедур. Основными его командами являются:
CREATE DATABASE (Эта команда создает новую базу данных)
CREATE DATABASE db_name;
USE (Для того чтобы начать работу с таблицами, необходимо сообщить MySQL с какой базой данных вы намерены работать. Это осуществляется при помощи команды USE)
USE db_name;
CREATE TABLE( создает новую таблицу в выбранной базе данных)
CREATE TABLE table_name [(create_definition, ...)]
DESCRIBE( показывает структуру созданных таблиц)
DESCRIBE tаble_namе
ALTER TABLE( позволяет изменить структуру таблицы. Эта команда позволяет добавлять и удалять столбцы, создавать и уничтожать индексы, переименовывать столбцы и саму таблицу)
ALTER TABLE table_name alter_spec
DROP TABLE( для удаления одной или нескольких таблиц)
DROP TABLE table_name [ ,table_name,...]
DROP DATABASE( удаляет базу данных со всеми таблицами входящими в её состав)
DROP DATABASE database_namе
INSERT INTO…VALUES(вставляет новые записи в существующую таблицу)
INSERT INTO table_name VALUES (values,…)
DELETE(удаляет из таблицы table_name записи, удовлетворяющие заданным в definition условиям, и возвращает число удаленных записей.)
DELETE FROM table_name [WHERE definition]
SELECT( предназначена для извлечения строк данных из одной или нескольких таблиц)
SELECT column,...
[FROM table WHERE definition]
[ORDER BY col_name [ASC | DESC], ...]
[LIMIT [offset], rows
UPDATE (обновляет столбцы таблицы table в соответствии с их новыми значениями в строках существующей таблицы. В выражении SET указывается, какие именно столбцы следует модифицировать и какие величины должны быть в них установлены. В выражении WHERE, если оно присутствует, задается, какие строки подлежат обновлению. В остальных случаях обновляются все строки. Ключевое слово LIMIT позволяет ограничить число обновляемых строк.
UPDATE table
SET col_name1=expr1 [, col_name2=expr2 ...
[WHERE definition]
SHOW( получения списка баз данных и таблиц в выбранной базе данных)