Материал: BD шпорки

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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 этапа:

  1. сначала выполняется обычная группировка и подсчет итоговых данных

  2. подсчет итоговых данных, а потом к получаемому набору данных меняются условия отбора, задаваемые

HAVING

SELECT факультет, COUNT(*)

FROM группа

GROUP BY факультет

HAVING COUNT(*) <=15

SELECT год_поступления, COUNT(*)

FROM студент

WHERE год_поступления >= 2002

GROUP BY год_поступления

HAVING COUNT(*) > 15

  1. Язык sql: соединение таблиц (внутреннее и внешнее)

Команда выборки данных позволяет извлечь данные сразу из нескольких таблиц, для этого их имена нужно перечислить во 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

  1. Язык sql: использование подзапросов

Язык 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

  1. Язык sql: операторы exists, any, all в командах с подзапросом

Оператор 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.-группы)

  1. Язык sql: основные команды определения данных

Язык определения данных используется для создания и изменения структуры базы данных и ее составных частей - таблиц, индексов, представлений (виртуальных таблиц), а также триггеров и сохраненных процедур. Основными его командами являются:

  1. CREATE DATABASE (Эта команда создает новую базу данных)

CREATE DATABASE db_name;

  1. USE (Для того чтобы начать работу с таблицами, необходимо сообщить MySQL с какой базой данных вы намерены работать. Это осуществляется при помощи команды USE)

USE db_name;

  1. CREATE TABLE( создает новую таблицу в выбранной базе данных)

CREATE TABLE table_name [(create_definition, ...)]

  1. DESCRIBE( показывает структуру созданных таблиц)

DESCRIBE tаble_namе

  1. ALTER TABLE( позволяет изменить структуру таблицы. Эта команда позволяет добавлять и удалять столбцы, создавать и уничтожать индексы, переименовывать столбцы и саму таблицу)

ALTER TABLE table_name alter_spec

  1. DROP TABLE( для удаления одной или нескольких таблиц)

DROP TABLE table_name [ ,table_name,...]

  1. DROP DATABASE( удаляет базу данных со всеми таблицами входящими в её состав)

DROP DATABASE database_namе

  1. INSERT INTOVALUES(вставляет новые записи в существующую таблицу)

INSERT INTO table_name VALUES (values,…)

  1. DELETE(удаляет из таблицы table_name записи, удовлетворяющие заданным в definition условиям, и возвращает число удаленных записей.)

DELETE FROM table_name [WHERE definition]

  1. SELECT( предназначена для извлечения строк данных из одной или нескольких таблиц)

SELECT column,...

[FROM table WHERE definition]

[ORDER BY col_name [ASC | DESC], ...]

[LIMIT [offset], rows

  1. UPDATE (обновляет столбцы таблицы table в соответствии с их новыми значениями в строках существующей таблицы. В выражении SET указывается, какие именно столбцы следует модифицировать и какие величины должны быть в них установлены. В выражении WHERE, если оно присутствует, задается, какие строки подлежат обновлению. В остальных случаях обновляются все строки. Ключевое слово LIMIT позволяет ограничить число обновляемых строк.

UPDATE table

SET col_name1=expr1 [, col_name2=expr2 ...

[WHERE definition]

  1. SHOW( получения списка баз данных и таблиц в выбранной базе данных)