Новая тема по базам данных

MySQL, PostgreSQL, MSSQL, Oracle и т.д. Диалекты SQL, формирование запросов, хранимые процедуры, тригерры, транзакции и многое другое

Re: Новая тема по базам данных

Сообщение Алексей_ 24 ноя 2010, 14:27

ну с уроком мне вроде как все понятно

SELECT a.fam, a.imja, b.predmet, b.ocenka /// показываем что надо выбрать
FROM student a, ocenka b /// откуда выбрать
WHERE a.id=b.id_student /// тут указываем связь
ORDER by a.fam, a.imja, b.predmet /// сортировка

а. и b. это принадлежность столбца к таблице.

так?
Алексей_
 
Сообщения: 55
Зарегистрирован: 15 фев 2010, 16:33
Полное имя: Алексей

Re: Новая тема по базам данных

Сообщение Vladislav_133 24 ноя 2010, 16:26

a,b - псевдонимы таблиц. Используются для сокращения записи, вместо имени таблицы. Очень важный прием.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Новая тема по базам данных

Сообщение Алексей_ 24 ноя 2010, 16:27

думаю, мы его еще будем применять) а что с программой то сделать ?
Алексей_
 
Сообщения: 55
Зарегистрирован: 15 фев 2010, 16:33
Полное имя: Алексей

Re: Новая тема по базам данных

Сообщение Vladislav_133 24 ноя 2010, 16:28

какой программой?
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Новая тема по базам данных

Сообщение Алексей_ 24 ноя 2010, 16:30

посмотрите последнее сообщение на первой странице....ошибка вылазит, когда постгри запускаю ((
Алексей_
 
Сообщения: 55
Зарегистрирован: 15 фев 2010, 16:33
Полное имя: Алексей

Re: Новая тема по базам данных

Сообщение Vladislav_133 24 ноя 2010, 16:36

Ну, заочно такие вопросы не решаются. Вы возьмите PostgreSQL, придите к нам на кафедру и попробуйте установить. Вот там и по разбираемся.

Но я продолжу с многотабличными запросами.
Второй способ организации связанных запросов.

SELECT a.fam, a.imja, b.predmet, b.ocenka
FROM student AS a INNER JOIN ocenka AS b ON a.id = b.id_student
ORDER BY a.fam, a.imja, b.predmet

Чуть сложнее, но более корректно. Раздела WHERE теперь нет, поскольку условий отбора нет. А условие связи в разделе FROM.


Ну, до следующего урока.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Новая тема по базам данных

Сообщение Алексей_ 24 ноя 2010, 16:38

INNER JOIN - поясните пажалста значение.


З.Ы постгри я брал на кафедре, могу принести ноутбук-он у меня на нем)
Алексей_
 
Сообщения: 55
Зарегистрирован: 15 фев 2010, 16:33
Полное имя: Алексей

Re: Новая тема по базам данных

Сообщение Vladislav_133 24 ноя 2010, 16:41

inner join - способ связывания (соединения) таблиц.
inner - внутреннее соединение. В результирующий набор попадают только те записи из первой и второй таблиц,
которые связаны через условие ON. Т.е. если есть студенты, которые еще не получали оценок, они в результат не попадут.

А ноутбук приносите.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Новая тема по базам данных

Сообщение Алексей_ 24 ноя 2010, 16:46

спасибо за разъяснение, приду завтра.
Алексей_
 
Сообщения: 55
Зарегистрирован: 15 фев 2010, 16:33
Полное имя: Алексей

Re: Новая тема по базам данных

Сообщение Vladislav_133 24 ноя 2010, 20:54

По СУБД PostgreSQL пишем тут viewtopic.php?f=18&t=154 .
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Новая тема по базам данных

Сообщение Vladislav_133 30 ноя 2010, 21:41

Урок 4.
Продолжим наши изыскания. Тема: группировка.
В результирующем наборе, строки могут быть объединены по какому-либо признаку.
Например, равенство, каких-либо полей.

Вспомним запрос

SELECT predmet
FROM ocenka
ORDER BY predmet

Мы хотим опять получить список предметов. Для отбрасывания дублирующих строк ранее мы использовали ключевое слово DISTINCT.
теперь у нас есть возможность решить эту задачу с помощью группировки. Давайте перейдем сразу к решению.

SELECT predmet
FROM ocenka
GROUP BY predmet
ORDER BY predmet

Добавилcя раздел GROUP by.

predmet
--------------------------------
Алгебра
История
Программирование
Русский
Химия

Результат, как видите, правильный.
В чем суть группировки?
Суть в том, что результирующий набор группируется по признаку, указанному в разделе GROUP.
После чего берется по одному представителю от каждой группы. Результат налицо.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Новая тема по базам данных

Сообщение Vladislav_133 30 ноя 2010, 21:47

Урок 4. Продолжение...

При группировке часто используются агрегирующие функции.
Эти функции воздействуют сразу на группу. Например count(*) - количество строк в группе, sum(имя_столбца) - суммирование по столбцу в групп,
max(имя_столбца) - максимальное значение столбца в группе и т.д.

Выполним для примера следующий запрос

SELECT predmet, COUNT(*) AS 'Сколько раз'
FROM ocenka
GROUP BY predmet
ORDER BY predmet

Получим

predmet Сколько раз
----------------------------------
Алгебра 3
История 1
Программирование 2
Русский 1
Химия 2


Результат вам понятен?
Ваши вопросы.

Продолжение следует....
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Новая тема по базам данных

Сообщение Алексей_ 02 дек 2010, 17:20

Ххм...интересный я человек, тут мне все понятно, а вот завтра у нас пара Баз данных, опять нифига не соображу... надо практиковаться...надо
Алексей_
 
Сообщения: 55
Зарегистрирован: 15 фев 2010, 16:33
Полное имя: Алексей

Re: Новая тема по базам данных

Сообщение Алексей_ 13 дек 2010, 17:04

Владислав Юрьевич, прошу привести пару примеров с вложенным запросом, похожих на те что мы делали на последней паре. когда выводили предметы которые ведет, и все которые НЕ ведет конкретный преподаватель. какие функции можем применять, что еще можем получить?
Алексей_
 
Сообщения: 55
Зарегистрирован: 15 фев 2010, 16:33
Полное имя: Алексей

Re: Новая тема по базам данных

Сообщение Vladislav_133 15 дек 2010, 19:37

Урок 5. Подзапросы.

Тема очень интересная.

Рассмотрим такую базу данных
Вложения
1.jpg
1.jpg (15.21 Кб) Просмотров: 11624
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Новая тема по базам данных

Сообщение Vladislav_133 15 дек 2010, 19:42

Вот простейшая задачка, которая может быть решена с помощью подзапроса.
Получить список предметов, которые отсутствуют в таблице ocenka.

Решение такое

SELECT predmet
FROM predmet
WHERE (NOT (id IN (SELECT id_predmet FROM ocenka)))

Подзапрос выделен красным цветом. В нем мы получаем просто список идентификаторов предметов, которые есть в таблице ocenka.
А вот из таблицы predmet мы как раз и выделяем только те предметы, которые не упоминаются.
Здесь ключевое слово IN. Оно проверяет, входит или нет значение в набор.

Пока все.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Новая тема по базам данных

Сообщение Алексей_ 15 дек 2010, 20:05

спасибо, тут все понятно. ждем уроков
Алексей_
 
Сообщения: 55
Зарегистрирован: 15 фев 2010, 16:33
Полное имя: Алексей

Re: Новая тема по базам данных

Сообщение Vladislav_133 15 дек 2010, 21:10

Немного теории.
Подзапросы используются:
1. В разделе where
2. from
3. в разделе having (этот раздел используется в группировке)

Подзапросы также могут содержать подазпросы. Но это не приветсвется, так как это может сильно замедлить выполнение всего запроса.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Новая тема по базам данных

Сообщение Алексей_ 15 дек 2010, 21:12

можно по примеру с использованием в разделе Where и From ??
Алексей_
 
Сообщения: 55
Зарегистрирован: 15 фев 2010, 16:33
Полное имя: Алексей

Re: Новая тема по базам данных

Сообщение Vladislav_133 15 дек 2010, 22:33

Ну, в разделе where пример уже был.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Новая тема по базам данных

Сообщение Vladislav_133 16 дек 2010, 21:36

Продолжаем урок, посвященный подзапросам.
Рассмотрим пдзапросы в разделе FROM.
Пусть стоит такая задача.
Получить список студентов и предметов. В список должны войти только студенты, у которых есть четверки или пятерки и предметы, по которым ставились четверки или пятерки. Вот как можно решить эту задачу (возможно, несколько надуманную в данном контексте).

SELECT DISTINCT aa.fam, bb.predmet
FROM (SELECT a.fam, b.id FROM student a, ocenka b WHERE (a.id = b.id_student and b.ocenka > 3)) aa
(SELECT a.predmet, b.id FROM predmet a ocenka b WHERE (a.id = b.id_predmet and b.ocenka > 3)) bb
WHERE aa.id = bb.id

Вот примерно так. У меня был такой результат.

fam predmet
--------------------------------------
Васильев Алгебра
Васильев Химия
Иванов Русский
Петров Алгебра
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Пред.

Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron