Ugrás a tartalomhoz

Vita:SQL

Az oldal más nyelven nem érhető el.
Új téma nyitása
A Wikipédiából, a szabad enciklopédiából
Ez a szócikk témája miatt az Informatikai műhely érdeklődési körébe tartozik.
Bátran kapcsolódj be a szerkesztésébe!
Színvonalas Ez a szócikk színvonalas besorolást kapott a kidolgozottsági skálán.
Nélkülözhetetlen Ez a szócikk nélkülözhetetlen besorolást kapott a műhely fontossági skáláján.
Értékelő szerkesztő: Zafir (vita), értékelés dátuma: 2011. december 11.
Informatikai szócikkek Wikipédia:Cikkértékelési műhely/Index

SQL isn't really a programming language :-) -- Timwi 2004 február 15, 02:53 (CET)


Jó lenne a JOIN részt jobban kifejteni, a példa túl egyszerű és nem látszódik a különböző típusok közti eltérések. - TG.

Hát tegyétek meg zafir vita 2011. december 11., 20:16 (CET)Válasz

CASE fejezetnél script javítás, tesztelés, és ugyanitt alias-ok szükségessége

[szerkesztés]

1. hibás a script: a from előtt nem állhat vessző

select APP_ID, max(net_income), max(gross_income), max(bonus)
from (
 select APP_ID,
  case when BUDGET_INFO_TYPE='net_income' then amount else null end   as  net_income,
  case when BUDGET_INFO_TYPE='gross_income' then amount else null end as gross_income,
  case when BUDGET_INFO_TYPE='bonus' then amount else null end as   bonus,
 from acq_budget_info) xx
group by APP_ID

Tesztelve itt: sqlfiddle.com letesztelt sql típusok: MySQL 5.6, oracle 11g R2, PostgreSQL 9.6 és 9.3, SQLite (WebSQL), SQLite (SQL.js), MS SQL Server 2017

Javaslat: a belső select-ben a bonus szó után a vesszőt el kell hagyni:

select APP_ID, max(net_income), max(gross_income), max(bonus)
from (
 select APP_ID,
  case when BUDGET_INFO_TYPE='net_income' then amount else null end   as  net_income,
  case when BUDGET_INFO_TYPE='gross_income' then amount else null end as gross_income,
  case when BUDGET_INFO_TYPE='bonus' then amount else null end as   bonus
 from acq_budget_info) xx
group by APP_ID


2. hibás az eredmény kiírása: az oszlopok neve a legtöbb sql-nél a függvényt tartalmazza: "max(net_income)" és nem a megadott NET_INCOME az oszlop neve.

Tesztelés: Script:

select APP_ID, max(net_income), max(gross_income), max(bonus)
from (
 select APP_ID,
  case when BUDGET_INFO_TYPE='net_income' then amount else null end   as  net_income,
  case when BUDGET_INFO_TYPE='gross_income' then amount else null end as gross_income,
  case when BUDGET_INFO_TYPE='bonus' then amount else null end as   bonus
 from acq_budget_info) xx
group by APP_ID


Eredmény:

-- MySQL 5.6

APP_ID max(net_income) max(gross_income) max(bonus)
0001 110000 1000 7500
0002 120000 2000 8500
0003 130000 3000 9500


-- pl sql

APP_ID MAX(NET_INCOME) MAX(GROSS_INCOME) MAX(BONUS)
0001 110000 1000 7500
0002 120000 2000 8500
0003 130000 3000 9500


-- PostrgreSQL 9.6 -

app_id max max max
0001 110000 1000 7500
0002 120000 2000 8500
0003 130000 3000 9500


-- SQLLite (SQL.js)

APP_ID max(net_income) max(gross_income) max(bonus)
0001 110000 1000 7500
0002 120000 2000 8500
0003 130000 3000 9500


-- SQLLITE (WebSQL)

APP_ID max(net_income) max(gross_income) max(bonus)
0001 110000 1000 7500
0002 120000 2000 8500
0003 130000 3000 9500


-- MS SQL Server 2017

APP_ID
0001 110000 1000 7500
0002 120000 2000 8500
0003 130000 3000 9500

(valóban nincsenek oszlopnevek?, ms sql felhasználó tesztelés szükséges)

Javaslat: a script-be kerüljön bele az oszlopok mellé az alias és megjegyzésként, hogy itt az 'as' nem szükséges

Alias-okkal (az oszlopneveknél megadott 'as' elhagyható)

select APP_ID, max(net_income) as net_inc, max(gross_income) as gross_inc, max(bonus) as bonus_inc
from (
 select APP_ID,
  case when BUDGET_INFO_TYPE='net_income' then amount else null end   as  net_income,
  case when BUDGET_INFO_TYPE='gross_income' then amount else null end as gross_income,
  case when BUDGET_INFO_TYPE='bonus' then amount else null end as   bonus
 from acq_budget_info) xx
group by APP_ID


APP_ID net_inc gross_inc bonus_inc
0001 110000 1000 7500
0002 120000 2000 8500
0003 130000 3000 9500


3. Szükséges-e a belső select-et tartalmazó tábla alias elnevezése (kell-e az "xx" felirat?).

Tesztelés:

nem kell: Oracle, SQLlite kell: MySQL, PostgreSQL, MS SQL Server

Javaslat: megjegyzésként feltüntetni, hogy az xx table alias nélkül is működik bizonyos esetekben


Diaphol vita 2018. július 26., 11:26 (CEST) diapholVálasz

JOIN fejezet példával bekerült

[szerkesztés]

Egyéb utasításokhoz bekerült a JOIN fejezet (alcím2) benne egy példán keresztül cartesian join, inner join, left és right join, full join, self join

Diaphol vita 2018. július 26., 11:31 (CEST) diapholVálasz

INNER join-nál az inner kifejezés elhagyható?

[szerkesztés]

Adatdefiníciós utasítások - FROM-nál szóba kerül a join

"az INNER általában elhagyható, vagy írható helyette LEFT, RIGHT, FULL OUTER, CROSS is." - töröltem mert ez így egyáltalán nem igaz (az INNER join teljesen más mint a LEFT join, nem hagyható el). Lehet hogy az 'outer' kifejezésre gondolt? Vagy arra, hogy a simán leírt join is inner join.


Diaphol vita 2018. július 26., 11:31 (CEST) diapholVálasz

A Jelentős különbségek az SQL megvalósítások között - Összekapcsolás - már mindenhol lehet

[szerkesztés]

A Jelentős különbségek az SQL megvalósítások között - Összekapcsolás fejezetet törtöltem mert a kiszolgálók már mindkét megoldást elfogadják. (Kicsit úgy tűnik mintha nem lett volna világos a descartes-szorzat + where az írónak, homályos volt a megfogalmazás is "SQL kiszolgálok egy része" - melyek?) Letesztelve itt: http://sqlfiddle.com A következő verzióknál mindkét inner join működik: MySQL 5.6, Oracle 11g R2, PostgreSQL 9.6, PostrgreSQL 9.3, SQLite (WebSQL), SQLite (SQL.js), MS SQL Server 2017

Van olyan verzió ahol nem lehet?

Diaphol vita 2018. július 26., 11:31 (CEST) diapholVálasz

A Jelentős különbségek az SQL megvalósítások között - Az Oracle rendszereiben nincs NUMERIC, helyette a NUMBER-t kell - töröltem

[szerkesztés]

A Jelentős különbségek az SQL megvalósítások között - Az Oracle rendszereiben nincs NUMERIC, helyette a NUMBER-t kell használni - töröltem mert 12c-ben, 11g R2-ben letesztelve lehet használni a numeric adattípust create table xxxc (x numeric); insert into xxxc values (5);

(valószínűleg korábbi verziókban nem, itt meg kellene nézni hogy mióta van erre lehetőség? mindenesetre a mondat tartalmilag helytelen volt)

Ugyanitt számomra homályos az "oracle nem támogatja" megfoglamazás - mit jelent ez pontosan? create table lehetséges (de ezeken a mondatokon nem változtattam)

Diaphol vita 2018. július 26., 11:32 (CEST) diapholVálasz