SQL

2012-06-29 15:58
d4s: (Default)
[personal profile] d4s
А вот скажет -- разница при обучении сабжу версии начала 2000-х и современных -- она действительно колоссальная?

Date: 2012-06-29 13:18 (UTC)
From: [identity profile] captain-hell.livejournal.com
SQL без привязки к базе - полное говно, которое не пригодится в жизни... Разница настолько разница, что...

Date: 2012-06-29 13:22 (UTC)
From: [identity profile] sponeg.livejournal.com
в целях обучения только и подходит..

Date: 2012-06-29 13:27 (UTC)
From: [identity profile] captain-hell.livejournal.com
если только представления данных в виде relational tables.

Ибо выборка чуть сложнее WHERE A.ID=B.ID пишется везде по разному.

Date: 2012-06-29 13:49 (UTC)
From: [identity profile] metaclass.livejournal.com
join, group by, union вроде везде единообразны?

Date: 2012-06-29 14:59 (UTC)
From: [identity profile] captain-hell.livejournal.com
Нет.
Достаточно сказать, что WHERE STRING='' будет работать по разному для разных баз

(no subject)

From: [identity profile] enternet.livejournal.com - Date: 2012-06-29 15:49 (UTC) - Expand

(no subject)

From: [identity profile] captain-hell.livejournal.com - Date: 2012-06-29 16:55 (UTC) - Expand

(no subject)

From: [identity profile] tzirechnoy.livejournal.com - Date: 2012-06-29 16:16 (UTC) - Expand

(no subject)

From: [identity profile] captain-hell.livejournal.com - Date: 2012-06-29 16:44 (UTC) - Expand

(no subject)

From: [identity profile] tzirechnoy.livejournal.com - Date: 2012-06-29 17:49 (UTC) - Expand

(no subject)

From: [identity profile] tzirechnoy.livejournal.com - Date: 2012-06-29 19:06 (UTC) - Expand

Date: 2012-06-29 19:21 (UTC)
From: [identity profile] d4s.livejournal.com
там народ жаловался, что: "ах, приходят студенты, ах, они ничего кроме select не знают".
а я оценить уровень жалобы не могу -- или требования узко специализированы, или студов тупо не учат. не работаю с БД никак.

Date: 2012-06-29 22:04 (UTC)
From: [identity profile] darafei praliaskouski (from livejournal.com)
неоднократно сталкивался с тем, что народ не понимает subquery. то есть то, что в любом месте можно поставить скобочки, а в них написать ещё один селект, вызывает ступор.

ну и совсем отсутствует понимание aggregate functions.

где-то оттуда же растёт тяга к nosql - люди пишут О(n^2..3)-код вместо постгрёвых 1-2 строчек селекта, сводимого индексами к чему-нибудь меньше O(n).

у меня сейчас есть референсная имплементация кода в виде запроса, аналогичного (select way from planet_osm_point where way && (select ST_Union(way) from planet_osm_polygon where "name:en"='Беларусь')). выпускниковое nosql-решение пока не подобралось и близко по производительности :3

Date: 2012-06-29 13:25 (UTC)
From: [identity profile] captain-hell.livejournal.com
Например:

Оракель
WITH t AS
(SELECT 1 ID, 'A' i1, 'X' i2, 'B' i3 FROM dual UNION ALL
SELECT 2 ID, NULL i1, 'X' i2, 'Z' i3 FROM dual UNION ALL
SELECT 3 ID, NULL i1, 'X' i2, 'B' i3 FROM dual UNION ALL
SELECT 4 ID, 'A' i1, NULL i2, 'B' i3 FROM dual UNION ALL
SELECT 5 ID, 'A' i1, NULL i2, NULL i3 FROM dual)
, t2 AS
(
SELECT ID, i1, i2, i3, CONNECT_BY_ROOT ID start_id FROM t
CONNECT BY NOCYCLE
((nvl(i2,0)=PRIOR nvl(I2,0) AND nvl(i3,0)=PRIOR nvl(i3,0) AND i1 IS NULL)
OR (nvl(i1,0)=PRIOR nvl(I1,0) AND nvl(i3,0)=PRIOR nvl(i3,0) AND i2 IS NULL)
OR (nvl(i1,0)=PRIOR nvl(I1,0) AND nvl(i2,0)=PRIOR nvl(i2,0) AND i3 IS NULL))
AND LEVEL<=2 -- одного уровня иерархии достаточно
AND ID!=PRIOR ID)
SELECT
MAX(ID) KEEP (DENSE_RANK FIRST ORDER BY start_id) ID,
MAX(i1) KEEP (DENSE_RANK FIRST ORDER BY start_id) i1,
MAX(i2) KEEP (DENSE_RANK FIRST ORDER BY start_id) i2,
MAX(i3) KEEP (DENSE_RANK FIRST ORDER BY start_id) i3
FROM t2
HAVING COUNT(start_id)=1
GROUP BY start_id;

Майкрософт:

select x.n2, datediff(mi, time_out,case when time_in < time_out then time_in+1 else time_in end)
from trip t
inner join company cp on cp.id_comp=t.id_comp
inner join
(select distinct q.n2 from
(select a.name as n1, b.name as n2, count(b.plane) as c from (select name, plane
from company c
inner join trip t on c.id_comp=t.id_comp
group by name, plane) a
inner join (select name, plane
from company c
inner join trip t on c.id_comp=t.id_comp
group by name, plane) b on a.name<>b.name and a.plane=b.plane
group by a.name, b.name) q
where q.c=(select count(distinct plane)
from company c
inner join trip t on c.id_comp=t.id_comp
where name=q.n2)) x on x.n2=cp.name
where datediff(mi, time_out,case when time_in < time_out then time_in+1 else time_in end) <= ALL(
select datediff(mi, time_out,case when time_in < time_out then time_in+1 else time_in end)
from trip t
inner join company cp on cp.id_comp=t.id_comp
inner join
(select distinct q.n2 from
(select a.name as n1, b.name as n2, count(b.plane) as c from (select name, plane
from company c
inner join trip t on c.id_comp=t.id_comp
group by name, plane) a
inner join (select name, plane
from company c
inner join trip t on c.id_comp=t.id_comp
group by name, plane) b on a.name<>b.name and a.plane=b.plane
group by a.name, b.name) q
where q.c=(select count(distinct plane)
from company c
inner join trip t on c.id_comp=t.id_comp
where name=q.n2)) x2 on x2.n2=cp.name and x2.n2=x.n2)

group by x.n2, datediff(mi, time_out,case when time_in < time_out then time_in+1 else time_in end)

Date: 2012-06-29 15:45 (UTC)
From: [identity profile] enternet.livejournal.com
Кстати хороший пример. Реально он доказывает только то, что знания по mssql у вас сильно устарели.

Date: 2012-06-29 16:56 (UTC)
From: [identity profile] captain-hell.livejournal.com
Это вообще не мой код. А нагугленный с ходу.

Date: 2012-06-29 15:52 (UTC)
From: [identity profile] theiced.livejournal.com
великолепный пример, прекрасно показывает что вы долбоёб.

Date: 2012-06-29 16:14 (UTC)
From: [identity profile] tzirechnoy.livejournal.com
Это ты про CONNECT BY ... LEVEL <= 2 ?

Date: 2012-06-29 16:57 (UTC)
From: [identity profile] captain-hell.livejournal.com
Он, наверняка, и не знает, что так можно. И что такое оконные функции. и как вообще плюнуть дальше, чем ORM

(no subject)

From: [identity profile] tzirechnoy.livejournal.com - Date: 2012-06-29 17:50 (UTC) - Expand

Date: 2012-06-29 16:29 (UTC)

Date: 2012-06-29 16:41 (UTC)
From: [identity profile] captain-hell.livejournal.com
айсед, про тебя долбоеба и так все знают
это вообще не мой код ни там и ни там.

Date: 2012-06-29 19:12 (UTC)
From: [identity profile] tzirechnoy.livejournal.com
Ой, я наконец осилил прочесть все названия таблиц в обоих запросах. И потом ещё сравнить их. И понял о чём ты.

Я лопух, а клиент просто сказочный, конечно.

Date: 2012-06-29 13:48 (UTC)
From: [identity profile] metaclass.livejournal.com
Даже базовых конструкций из стандарта хватает для работы.
А логика на стороне БД, требующая расширений - вещь достаточно спорная.

Date: 2012-06-29 14:32 (UTC)
From: [identity profile] max-posedon.livejournal.com
Простите, а что вы предлагаете из стандарта для того, что в MySQL называется auto_increment, а в PostgreSQL serial? Или "без этого можно жить"?

Date: 2012-06-29 15:15 (UTC)
From: [identity profile] metaclass.livejournal.com
Более того, в MSSQL это называется identity, а в Firebird вообще нужно это делать на триггерах (впрочем serial в постгресе тоже сделан на них).

Мы ведем речь о проектировании БД или о запросах к готовой БД?
Практика показывает, что людей хотя бы второму научить как следует, а до первого вообще доходят единицы, а нормально делать не умеет почти никто.

(no subject)

From: [identity profile] tzirechnoy.livejournal.com - Date: 2012-06-29 16:44 (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2012-06-29 16:56 (UTC) - Expand

(no subject)

From: [identity profile] pascendi.livejournal.com - Date: 2012-06-29 19:07 (UTC) - Expand

(no subject)

From: [identity profile] d4s.livejournal.com - Date: 2012-06-29 19:26 (UTC) - Expand

Date: 2012-06-29 15:42 (UTC)
From: [identity profile] tzirechnoy.livejournal.com
Для этого из стандарта я предлагаю стандартную документацыю.

Date: 2012-06-29 15:07 (UTC)
From: [identity profile] captain-hell.livejournal.com
Посмотри селект свыше. CONNECT BY ROOT или MAX(ID) KEEP (DENSE_RANK FIRST ORDER BY start_id) ID, - это не логика на стороне БД.

А еще есть OLAP синтаксис(у всех разный)
А еще есть кляуза MODEL(у всех разная)
А еще есть форматирование вывода(у всех разное)
А еще есть функции работы с данными(у всех разные)

Date: 2012-06-29 15:16 (UTC)
From: [identity profile] metaclass.livejournal.com
Это частные случаи. Чтобы обучить людей понимать реляционную модель делать запросы, они мало того, что не нужны, а даже и вредны.

(no subject)

From: [identity profile] captain-hell.livejournal.com - Date: 2012-06-29 16:47 (UTC) - Expand

(no subject)

From: [identity profile] pascendi.livejournal.com - Date: 2012-06-29 19:10 (UTC) - Expand

(no subject)

From: [identity profile] tzirechnoy.livejournal.com - Date: 2012-07-02 06:01 (UTC) - Expand

(no subject)

From: [identity profile] pascendi.livejournal.com - Date: 2012-07-02 07:36 (UTC) - Expand

(no subject)

From: [identity profile] tzirechnoy.livejournal.com - Date: 2012-07-02 07:48 (UTC) - Expand

(no subject)

From: [identity profile] pascendi.livejournal.com - Date: 2012-07-02 07:58 (UTC) - Expand

(no subject)

From: [identity profile] tzirechnoy.livejournal.com - Date: 2012-06-29 19:14 (UTC) - Expand

Date: 2012-06-29 16:04 (UTC)
From: [identity profile] tzirechnoy.livejournal.com
1) CONNECT BY вообще нереляцыонен, его следует избегать в RDBMS, а если избегать получается плохо -- подумать насчёт сменить базу на деревянную. И уж точно это не нужно давать начинающим.
2) OLAP по большэй части -- syntax shugar к реляцыонным возможностям. Его надо хорошо понимать, чтобы использовать, а будет там CUBE MATERIALIZED VIEW или закат солнца вручную на триггерах и LIKE '..%' -- это дело десятое.

(no subject)

From: [identity profile] captain-hell.livejournal.com - Date: 2012-06-29 16:58 (UTC) - Expand

(no subject)

From: [identity profile] tzirechnoy.livejournal.com - Date: 2012-06-29 17:52 (UTC) - Expand

(no subject)

From: [identity profile] captain-hell.livejournal.com - Date: 2012-06-29 17:59 (UTC) - Expand

(no subject)

From: [identity profile] tzirechnoy.livejournal.com - Date: 2012-06-29 19:16 (UTC) - Expand

Date: 2012-06-29 16:05 (UTC)
From: [identity profile] tzirechnoy.livejournal.com
Ну, и форматирование вывода или как там даты складываются -- это вообще смешно. Мы про программистов говорим, или про операторов ЭВМ вообще?

Date: 2012-06-29 19:18 (UTC)
From: [identity profile] az-from-belarus.livejournal.com
Поддерживаю.

Profile

d4s: (Default)
d4s

October 2016

M T W T F S S
     12
345 6789
10111213141516
17181920212223
24252627282930
31      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated 2026-04-07 19:36
Powered by Dreamwidth Studios