Vita:SQL
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. | |||
|
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)
CASE fejezetnél script javítás, tesztelés, és ugyanitt alias-ok szükségessége
szerkesztés1. 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
JOIN fejezet példával bekerült
szerkesztésEgyé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
INNER join-nál az inner kifejezés elhagyható?
szerkesztésAdatdefiní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.
A Jelentős különbségek az SQL megvalósítások között - Összekapcsolás - már mindenhol lehet
szerkesztésA 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?
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ésA 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)