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

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

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

Сообщение Vladislav_133 28 окт 2010, 21:57

Здесь будет обсуждение вопросов по БД для ПОВТ 3 курс и для ПИВОЭ первый курс. Можно задавать вопросы, спорить. В ближайшее время я опубликую здесь набор требований для ПОВТ. Эти требования обязательно для всех.

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

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

Сообщение Vladislav_133 04 ноя 2010, 21:06

Начну с не большой памятки. Скорее практика, чем теория.
Назначение имени в программировании вообще очень важная задача. Тоже относится и к созданию базы данных.
1. Не используйте русские имена для: баз данных, таблиц, столбцов и других объектов. Не все системы это адекватно понимают. Серьезная проблема с переносом на другие CУБД. Кроме этого, СУБД чувствительны к заглавным и прописным буквам, а это для вас дополнительная проблема, если будете писать запросы.
2. Для имен используйте английский алфавит, цифры, тире, подчеркивание. Не используйте в именах пробелы. В противном случае опять возникнут проблемы. Конечно все решаемо, но при написании запросов эти проблемы просто выматывают и отвлекают от главного.
3. Не используйте длинных имен. Максимальная длина 8 символов, не более.
4. Выработайте систему именования для первичных и внешних ключей. Например первичный люч id, внешний ключ id_table, где table - имя таблицы.
5. Если хотите понять, что такое запрос SQL никогда не используйте QBE - составление запросов с помощью таблиц. Помните: QBE для начфака.

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

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

Сообщение xdsl 06 ноя 2010, 11:36

Со своей точки зрения, совершенно не согласен с пунктом 3. На мой взгляд, имя базы, таблицы или поля должно быть "говорящим", а тут в 8 символов часто не уложиться. Это несущественно, если разработка одноразовая, там хоть A, B, C можно называть. Но для любого, достаточно длительного проекта, "говорящие" имена критичны.
xdsl
 
Сообщения: 1236
Зарегистрирован: 09 дек 2008, 05:16
Откуда: ВЦ ШГПИ
Полное имя: Слинкин Д.А.

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

Сообщение Vladislav_133 07 ноя 2010, 15:27

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

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

Сообщение xdsl 08 ноя 2010, 15:39

"Верблюжья нотация" в обеих вариациях в большинстве случаев решает проблему (http://ru.wikipedia.org/wiki/CamelCase)
xdsl
 
Сообщения: 1236
Зарегистрирован: 09 дек 2008, 05:16
Откуда: ВЦ ШГПИ
Полное имя: Слинкин Д.А.

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

Сообщение Vladislav_133 08 ноя 2010, 20:15

Ну вот эта "верблюжина" тоже не панацея. Я вот в unix'ах никак не могу запомнить последовательность: то ли useradd, толи adduser. Как раз тот принцип работает. Тут должно быть дополнительное соглашение. Например "глагол-существительное" или наоборот, или "прилагательное-существительное", ну в общем правило должно быть. Что касается названий таблиц или столбцов, то такое правило у меня имеется, только я его пока приберегаю, пока мы до "сущностей" доберемся.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

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

Сообщение xdsl 09 ноя 2010, 09:03

Vladislav_133 писал(а): Я вот в unix'ах никак не могу запомнить последовательность: то ли useradd, толи adduser.

Не один Вы такой ;) , поэтому:
Код: Выделить всё
[root@sda2 ~]# ls -l /usr/sbin/useradd
-rwxr-xr-x 1 root root 68480 Apr 23  2008 /usr/sbin/useradd
[root@sda2 ~]# ls -l /usr/sbin/adduser
lrwxrwxrwx 1 root root 7 Dec 29  2009 /usr/sbin/adduser -> useradd
xdsl
 
Сообщения: 1236
Зарегистрирован: 09 дек 2008, 05:16
Откуда: ВЦ ШГПИ
Полное имя: Слинкин Д.А.

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

Сообщение xdsl 10 ноя 2010, 08:25

Даже появилось желание разработать такие правила специально для баз данных и принудительном порядке заставить им следовать наших студентов. Потом просто давать ссылку на правила и заставлять переделывать всю ту ересь, что они ваяют.
xdsl
 
Сообщения: 1236
Зарегистрирован: 09 дек 2008, 05:16
Откуда: ВЦ ШГПИ
Полное имя: Слинкин Д.А.

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

Сообщение Vladislav_133 20 ноя 2010, 18:36

Простая база данных.
diagr1.png
diagr1.png (13.76 Кб) Просмотров: 18448

Урок 1.

Рассмотрим очень простую ситуацию. База данных состоит всего из двух таблиц. Конечно, искушенный программист скажет, что как минимум нужна таблица для преподавателей и таблица для предметов. Но я намеренно ограничиваю рассмотрение только двумя таблицами. Я обращаю ваше внимание, что
1. По названию таблиц и столбцов все понятно.
2. По названию внешнего ключа ясно, с какой таблице устанавливается связь по этому ключу.
3. Мною выбран вполне однозначный подход в именовании таблиц и столбцов: английская транскрипция русских слов. Я выбрал вполне конкретный стиль и его придерживаюсь. Стиль наименования очень важная деталь программирования и проектирования БД.
4. В таблице ocenka также есть первичный ключ, хотя он не участвует ни в какой связи. Об этом правиле я вам также говорил, но не лишне его вспомнить.
Вот, собственно, пока все. В следующем уроке будем говорить о командах языка SQL, применительно к этой базе данных.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

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

Сообщение Алексей_ 21 ноя 2010, 22:34

Владислав Юрьевич, мы ( 184-185 группы прикладников) это понимаем, но у нас проблема в том что...признаю это, мы мало практикуемся в том числе и дома, порой очень сложно понять, то, что Вы от нас хотите. Иногда, лично я, Вас понимаю оч хорошо, но к сожалению не могу исполнить это в программе....
Алексей_
 
Сообщения: 55
Зарегистрирован: 15 фев 2010, 16:33
Полное имя: Алексей

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

Сообщение Vladislav_133 22 ноя 2010, 17:15

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

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

Сообщение Алексей_ 22 ноя 2010, 17:40

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

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

Сообщение Vladislav_133 22 ноя 2010, 19:20

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

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

Сообщение Алексей_ 22 ноя 2010, 19:45

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

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

Сообщение Vladislav_133 22 ноя 2010, 21:37

Урок 2.
Однотабличные запросы.

1. Простейший запрос к таблице student. Результат упорядочивается по fam

SELECT fam, imja, otch
FROM student
ORDER BY fam

fam imja otch
---------------------------------------------------------------------------
Васильев Василий Петрович
Иванов Иван Иванович
Кузьмин Кузьма Кузьмич
Петров Петр Петрович

К этому ничего не добавить. Разве что, можно указать другие названия результирующих столбцов.

SELECT fam as 'Фамилия', imja as 'Имя', otch as 'Отчество'
FROM student
ORDER BY fam

2. Еще одна задачка. Получить список предметов.

SELECT predmet
FROM ocenka
ORDER BY predmet

Получаем приблизительно следующий список.

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

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

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

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

Продолжение урока 2.

Еще раз повторю вопрос: почему предметы в списке повторяются? Надеюсь, вы это осмыслите.

Продолжим.
Проблема дублирования строк решается в sql следующим образом (есть и другой способ).
Есть ключевое слово distinct. Вот как это выглядит.

SELECT DISTINCT predmet
FROM ocenka
ORDER BY predmet

И в результате имеем.

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


Пока все...

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

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

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

Такс, с этим все понятно, только вот про DISTINCT я не прочитал в теории. на практике поработать сейчас не могу, так как у меня офис 7го года...завтра скину 3ий и буду пыхтеть )

________________________
если я все правильно понял......

Простейший запрос к таблице student. Результат упорядочивается по fam

SELECT fam, imja, otch /// выбрать fam, imja, otch
FROM student /// из таблицы student
ORDER BY fam /// отсортировать по fam т.е по фамилии

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

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

Сообщение Vladislav_133 22 ноя 2010, 23:30

Все верно.

Я вам советую все таки установить приличный СУБД. Возьмите PostgreSQL. Есть под любой ОС. Работает легко и никому не мешает.





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

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

Сообщение [DD] 23 ноя 2010, 08:44

Извиняюсь... немного вмешаюсь в тему...
В свое время для изучения SQL и баз в целом применял MySQL и софтинку от PremiumSoft под названием navicat mySQL...
в ней есть конструктор запросов который я применял на начальном этапе для изучения команд самого языка... а затем перешел к написанию запросов вручную... просто экспериментировал с различными конструкциями(ИМХО лучший способ что-то изучать - это экспериментировать ну или как у меня было с Basic и Pascal - взять простую задачу, а потом смотреть что туда можно добавить).

P.S. PremiumSoft выпустила бесплатную для некомерческого использования версию navicat который может работать с MySQL, Postgres и Oracl.
мы рождены чтоб сказку сделать кодом
[DD]
Elite
 
Сообщения: 163
Зарегистрирован: 18 мар 2009, 22:18
Откуда: from HELL
Полное имя: Зыков Д.А.

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

Сообщение Vladislav_133 23 ноя 2010, 10:11

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

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

Сообщение Vladislav_133 23 ноя 2010, 10:22

Урок 3.
Многотабличные запросы. Введение.

Продолжим уроки. Многотабличные запросы, это запросы сразу к нескольким таблицам. В нашем случае их две.
Возникает следующий вопрос: связь между таблицами через первичный ключ имеет отношение к такому запросу или нет?
Ответ: Да. Такая связь еще называется статической. Запрос же к нескольким таблицам устанавливает динамическую связь,
связь на время запроса. Но в большинстве случаев (но не всегда) такая связь осуществляется как раз по первичному и внешнему ключам.
В нашем случае эта связь может быть выражена равенством student.id=ocenka.id_student.
Запрос можно производить и к трем и к четырем и к десяти таблицам сразу. Зная технологию, вы без труда с этим справитесь.

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

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

Сообщение Алексей_ 23 ноя 2010, 17:22

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

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

Сообщение Vladislav_133 23 ноя 2010, 21:45

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

Прежде чем продолжить говорить о многотабличных запросах, следует остановиться на очень важном разделе команды SELECT. Этот раздел where.
В этом разделе помещаются условия отбора строк. Поставим такую задачу. Получить список преподавателей, которые не ставили двоек и пятерок.
Вот как это выглядит.
SELECT prepodavatel
FROM ocenka
WHERE (ocenka <> 2) AND (ocenka <> 5)

А вот результат

prepodavatel
---------------------------------
Прошкин
Гулькин
Дмитриев
Гулькин

Обращаю внимание, что одна фамилия в списке у нас повторилась. Это и понятно, в запросе нет указания, чтобы удалять дублирующие строки.
Раздел WHERE может быть довольно сложным, так как условий может быть много. Элементарные условия можно связывать друг с другом логическими связками .


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

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

Сообщение Vladislav_133 24 ноя 2010, 10:08

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

При многотабличных запросах, должно указываться условие связи между таблицами.
Условие связи можно указывать двумя способами:
а) в разделе where
б) в разделе from.

Способ б) является предпочтительным, по отношению к способу а). Прежде всего потому, что рекомендуется стандартом. Кроме того, он более богат возможностями, чем способ а). Многие СУБД автоматически преобразуют а) в б). Но способ а) более прост, и его предпочитают использовать многие программисты.

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

Давайте рассмотрим конкретный пример. Требуется получить список студентов с оценками по всем предметам.

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

В результате получим

fam imja predmet ocenka
---------------------------------------------------------------------------------------
Васильев Василий Алгебра 5
Васильев Василий Алгебра 4
Васильев Василий Программирование 3
Васильев Василий Химия 5
Иванов Иван История 3
Иванов Иван Русский 5
Кузьмин Кузьма Химия 2
Петров Петр Алгебра 4
Петров Петр Программирование 2

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

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

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

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

След.

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

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

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

cron