4.Lab4 Отношения, знакомство с JOIN

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 11

4.

Отношения, знакомство с JOIN


Цель: научиться выражать и использовать отношения между таблицами в запросах.

Знакомство с join

select ... from <имя таблицы> [ [тип join] join <имя таблицы> on (<выражение>) ... ] ...
имя таблицы: имя таблицы | имя таблицы as алиас
тип join: inner | left; по умолчанию inner

Примеры
4.1 select * from category join event_type;
4.2 select * from event_type join category;

4.3 select * from category as c1 join category as c2;


4.4 select * from category as c1 join category as c2 where c1.id = c2.id;
4.5 select * from category as c1 join category as c2 on (c1.id = c2.id);

Отношения

Примеры
4.6
select * from feedback;

4.7
select * from feedback join event on (feedback.eventid = event.id);

4.8
select * from feedback
join event on (feedback.eventid = event.id)
join event_type on (event.type = event_type.id);

4.9
select * from feedback as f join event as e on (f.eventid = e.id) join event_type as t on (e.type =
t.id);

4.10
select t.title, count(*) c
from feedback as f
join event as e on (f.eventid = e.id)
join event_type as t on (e.type = t.id)
group by t.id
order by c desc;

Задание
4.11 Вывести соответствие каналов городам в виде: идентификатор города, название
города, идентификатор канала, название канала (таблицы: channel_to_city, city, channel).

4.12 Вывести таблицу активности (таблица activity) пользователей заменив


идентификаторы (канала, передачи, типа передачи, города) на соответствующие
название.
select c.name, ch.title, e.title, et.title, a.id, a.date, a.sessionId, a.start from activity as a join city
as c on(c.id=a.cityId) join channel as ch on(ch.id=a.channelId) join event as e on(e.id=a.eventId)
join event_type as et on(et.id =a.eventType) limit 10;
5
Select ac.id, ac.date ,ac.sessionId, ac.refId, ac.start, ch.id as channelId, ev.id as eventId, et.id
as event_type, city.id as city from activity as ac join channel as ch on (ac.channelId = ch.id) join
event as ev on (ac.eventId = ev.id) join event_type as et on (ac.eventType = et.id) join city on
(ac.cityId = city.id) limit 5\G;
4.13 Переделать 2ой пример из темы “2.Подзапросы” с помощью JOIN.
Примеры
select (select count(*) from category),(select count(*) from channel);

select title from channel where id in (


select channelId from event where title like '%спокойной%ночи
%малыши%'
);

select title from channel where id in (


select channelId from channel_to_city where cityId = (
select id from city where name = 'Владивосток'
)
);
SELECT DISTINCT c.title
FROM channel AS c
JOIN event AS e ON e.channelId = c.id
WHERE e.title LIKE '%спокойной%ночи%малыши%';

Select * from city as c1 join city as c2 on (c1.id = c2.id) order by c1.population desc limit 10;
4.14 Переделать 3ий пример из темы “2.Подзапросы” с помощью JOIN.
select ch.title from channel as ch join channel_to_city as cht on (cht.channelId = ch.id) join city
as c on(cht.cityId=c.id) where c.name like "%Владивосток%"limit 10;

select ch.title, cat.title from channel as ch join category as cat on (ch.category = cat.id) where
cat.title like Спортивные or cat.title like Познавательные;

4.15 Переделать задачу 2.10 с помощью JOIN.


SELECT ev.title, cat.title AS category, ev.start
FROM event AS ev
JOIN channel AS ch ON ev.channelId = ch.id
JOIN category AS cat ON ch.category = cat.id
WHERE cat.title LIKE '%фильмы и сериалы%'
AND ev.start BETWEEN '2014-09-03 18:00:00' AND '2014-09-03 23:59:59'
ORDER BY ev.start
LIMIT 10;

4.16 Переделать задачу 3.6 с помощью JOIN.

4.17 Задача 3.13 дополняется требованием - вывести название передач и количество.


Доделать с левым join
select ev.id, ev.title, count(*) from activity as ac join event as ev on (ac.eventId = ev.id) where
ev.start like "%2014-09-10%" group by ev.id order by count(*) desc limit 5;
Select ev.id, ev.title, count(*) from activity as ac join event as ev on (ac.eventId = ev.id) where
ev.start like 2014-09-10 group by ev.id order by count(*) desc limit 5;

4.18 Задача 3.14 дополняется требованием - выводить название типа.


select date(ev.start) as vrem, et.title, count(*) from event as ev join event_type as et on (ev.type
= et.id) where start between 2014-08-23 and 2014-09-21 group by vrem, et.title order by vrem
limit 10;

Типы JOIN

Примеры
4.19 select count(*) total, count(parent) children, count(parent is null or null) root from feature ;

4.20 select * from feature l1 join feature l2;

4.21 select l1.*, l2.name from feature l1 join feature l2 on (l1.parent = l2.name);
4.22 select l1.*, l2.name from feature l1 left join feature l2 on (l1.parent = l2.name);
Задание
4.23 Какой глубины дерево в таблице feature? Как узнали? 2

4.24 Переделать задачу 2.5 с помощью JOIN. Вывести все “потерявшиеся” каналы, т.е.
каналы которые не относятся ни к одной из категорий перечисленных в таблице category.
Select ch.title, cat.id from channel as ch left join category as cat on (ch.category = cat.id) where
cat.id is null;

You might also like