Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Учебная база данных в примерах 
:(
    Опции темы
Vit
Дата 31.1.2006, 04:32 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Решил написать очень(!) краткий пример промышленной бызы данных и примеры запросов для получения самых насущных сведений. Надеюсь такой простой пример поможет тем кто делает первые шаги в мир баз данных понять как оно там работает, а так же ознакомиться с простыми примерами SQL запросов.

У нас есть предпиятие, "Рога и копыта" которое предоставляет некоторый спектр услуг клиентам:

Таблица Clients - клиенты

Id Autoincrement - порядковый номер записи, ID код клиента
First varchar(30) - имя клиента
Last varchar(30) - фамилия клиента
Phone varchar(10) - телефон клиента
Created datetime - дата внесения клиента

В заполненном виде:

ID First Last Phone Created
1 Иванов Иван 33-44-55 01.01.2005
2 Петров Петр 12-23-34 02.01.2005
3 Сидоров Сидор 24-36-48 03.02.2005



Таблица Services - предоставляемые услуги

Id Autoincrement - порядковый номер записи, ID сервиса
Name varchar(100) - название сервиса
Amount float - цена услуги

В заполненном виде:

ID Name Amount
1 Продажа рогов $10.99
2 Продажа копыт $12.95
3 Продажа хвостов $15.75



Таблица Payments - продажи услуг

Id Autoincrement - порядковый номер записи, номер транзакции
Service int - id проданного сервиса
Client int - id клиента
TransactionDate datetime - когда прошла оплата
Amount float - сумма переведенных денег


Id Service Client TransactionDate Amount
1 1 2 01.02.2005 $10.99
2 1 1 02.02.2005 $10.99
3 1 2 11.02.2005 $20.99
4 1 2 12.02.2005 $-10.00
5 2 1 01.03.2005 $10.99
6 1 2 01.03.2005 $12.95
7 3 3 01.03.2005 $15.75



Теперь запросы.


Начнём с запросам про клиентов:
1. Выдать список клиентов:

Код

Select * From Clients


2) Выдать количество клиентов

Код

Select count(*) From Clients


3) Выдать всех зарегистрированных клиентов в январе 2005 года:

Код

Select * From Clients 
Where Created between '2005-01-01' and '2005-01-31'


4) Найти всех клиентов у которых фамилии начинаются на букву "И"

Код

Select * From Clients 
Where Last like 'И%'



--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Vit
Дата 31.1.2006, 04:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Теперь более сложные запросы:

1) Показать историю платежей Иванова:



Код

Select 
  Payments.id as PaymentTransactionNumber,
  Payments.TransactionDate as TransactionDate,
  Services.Name as ServiceName,
  Payments.Amount as AmountPayed
From Payments
Inner Join Clients on Client.id=Payments.Client
Inner Join Services on Service.id=Payments.Service
Where Client.Last='Иванов'
Order by Payments.TransactionDate 



2) Показать деньги заработанные на каждом сервисе:

Код

Select 
  Services.Name as ServiceName,
  Sum(Payments.Amount)
From Payments
Inner join Services on Service.id=Payments.Service
Group by Services.Name 
Order by Services.Name 


3. Показать возвраты денег по каждому сервису

Код

Select 
  Services.Name as ServiceName,
  Sum(Payments.Amount)
From Payments
Inner join Services on Service.id=Payments.Service
Where Payments.Amount<0
Group by Services.Name 
Order by Services.Name 


4. Показать сервисы которые не дают дохода

Код

Select 
  Services.Name as ServiceName,
  Sum(Payments.Amount)
From Payments
Inner join Services on Service.id=Payments.Service
Group by Services.Name 
Having Sum(Payments.Amount)<=0
Order by Services.Name 


5. Показать заработанные деньги в янаваре 2005 года

Код

Select sum(Amount)
From Payments
Where TransactionDate between '2005-01-01' and '2005-01-31'


6. Показать суммарные затраты денег каждым клиентом в январе

Код

Select 
  Client.First+' '+Client.Last,
  sum(IsNull(Payments.Amount, 0))
From Client
Left Outer Join Payments on Payments.Client=Clients.id
Where TransactionDate between '2005-01-01' and '2005-01-31'
Group By Client.First+' '+Client.Last
Order by Client.Last



--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
achepkunov
Дата 19.12.2006, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 13.12.2006

Репутация: нет
Всего: 1



Нормально, только в самой первой таблице first - Иванов, Петров, а last - Иван. Поправить бы.
PM MAIL   Вверх
Cooper
Дата 13.1.2007, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 8.1.2007
Где: Ростов-на-Дону

Репутация: нет
Всего: нет



Цитата(Vit @  31.1.2006,  04:32 Найти цитируемый пост)
Решил написать очень(!) краткий пример промышленной бызы данных и примеры запросов для получения самых насущных сведений. Надеюсь такой простой пример поможет тем кто делает первые шаги в мир баз данных понять как оно там работает, а так же ознакомиться с простыми примерами SQL запросов.


Спасибо, Vit!!! 

PM MAIL ICQ   Вверх
It_tomahawk_vh
Дата 18.1.2007, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 19.12.2006

Репутация: нет
Всего: нет



Vit,  не плохое начало у меня получается  smile 
Спасибо...
PM MAIL   Вверх
pretender
Дата 24.12.2007, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 19.11.2007

Репутация: нет
Всего: нет



Цитата

6. Показать суммарные затраты денег каждым клиентом в январе

Код

Select 
  Client.First+' '+Client.Last,
  sum(IsNull(Payments.Amount, 0))
From Client
Left Outer Join Payments on Payments.Client=Clients.id
Where TransactionDate between '2005-01-01' and '2005-01-31'
Group By Client.First+' '+Client.Last
Order by Client.Last



Простите за не понимание, а как мне сделать выборку за период не по всем клиентам, а только по определенному?

Это сообщение отредактировал(а) pretender - 24.12.2007, 08:36
PM MAIL   Вверх
LSD
Дата 24.12.2007, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 24
Всего: 538



Цитата(pretender @  24.12.2007,  08:30 Найти цитируемый пост)
Простите за не понимание, а как мне сделать выборку за период не по всем клиентам, а только по определенному?

Добавь еще одно условие в where.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
pretender
Дата 24.12.2007, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 19.11.2007

Репутация: нет
Всего: нет



Цитата(LSD @ 24.12.2007,  12:36)
Добавь еще одно условие в where.

Спасибки. Вчера добавлял - не работало, сегодня добавил - работает... Что за ерунда  smile 
PM MAIL   Вверх
LSD
Дата 24.12.2007, 13:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 24
Всего: 538



Цитата(pretender @  24.12.2007,  13:21 Найти цитируемый пост)
 Вчера добавлял - не работало, сегодня добавил - работает... Что за ерунда

Это не ерунда, это просто выходной день, никто не работает smile


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Vit
Дата 26.12.2007, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Цитата(LSD @  24.12.2007,  04:26 Найти цитируемый пост)
Это не ерунда, это просто выходной день, никто не работает 


 smile 


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Xonxt
Дата 27.4.2008, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 24.1.2006
Где: Украина / Одесса

Репутация: нет
Всего: 1



А можно такой вопрос... Как where правильно написать, если у меня есть таблица, а которой, скажем, в столбце Name есть набор фамилий.. К примеру такая:

Код
Коваленко
Иваненко
Петров
Иванюк
Петренко
Шушкевич
Калабин


И я хочу выбрать из этой таблицы все фамилии, которые заканчиваются на 'енко'. Не могу же я проссто написать where name = 'енко'...
PM MAIL ICQ Skype   Вверх
LSD
Дата 27.4.2008, 19:00 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 24
Всего: 538



Надо использовать like
Код

where name like '%енко'



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Xonxt
Дата 27.4.2008, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 24.1.2006
Где: Украина / Одесса

Репутация: нет
Всего: 1



Спасибо!
А если мне нужно, чтобы вывело все фамилии, содержащие "енк", то надо писать 
Код
where name like "%енк%"
?
PM MAIL ICQ Skype   Вверх
Fortop
Дата 27.4.2008, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: нет
Всего: 42



да


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Temdegon
Дата 21.1.2009, 02:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.10.2008
Где: Minsk

Репутация: нет
Всего: 9



ИМХО неплохо бы добавить скрипты для создания и заполнения этих таблиц БД. Меня например особо интересуют Foreign Keys - как создавать constrats, что бы при удалении записи из одной таблицы, что-то происходило с данными в таблицах, которые на нее ссылаются (Ну там дефолтные значения ставились, или удалялись соответсвующие записи). Когда пользовался EMS, таких вопросов не возникало, ибо там это пара кликов мышью. А вот как только появилась необходимость создать несколько взаимосвязанных таблиц вручную - начались проблемы... Кроме того, волнуют Primary Keys. Как сделать что бы он автоматически увеличивался? Я думаю это будет интересно не только мне. Тем более, что в вашей учебной БД явно в Payments должны быть два foreign key. 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1008 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.