# Here follows some examples from our testsuite of mysql
# I'm sorry that I can't distribute the tables because they are quite big,
# but this file will at least show the mysql syntax.
# When I got more time I will write a full test..
#
#
# Test is usualy run with:
#
# mysql -v database < this_file > result_file
#

#
# enkel sökning
#
select period from system;
select * from system;
select system.* from system;

# sökning med ej nyckel
#
select station.namn from station where föreningsnr = 58 and namn like "%LJUGARN%";
select namn from station where namn like "%leden" ;

# sökning med ej nyckel samt sortering
#
select station.namn from station where föreningsnr = 58 order by namn;
select namn from station order by namn desc limit 10;


# Sökning med nyckel = constant på icke unik nyckel
# Här läses databasen direkt med read-next på namn
#
select station.namn from station where namn = 'JÄRLÅSMACKEN AB';

# Test av sortering på på använd nyckel (ingen sortering behövs)
#
select station.namn from station where namn >= 'JÄRLÅSMACKEN AB' and namn <= 'JÄRLÅSMACKEN AB' order by namn;
select stationsnr,namn from station where namn="" or namn = "." order by namn ;

# sökning med nyckel = constant med flera träffar
# Här läses databasen direkt med read-next på namn ifall få träffar
#
select stationsnr,namn from station where föreningsnr = 37 and namn = 'ÖSTERSUND';


# sökning med eller-nivåer på nyckel
# Ifall man kan begränsa nyckel till ett antal intervall sökes endast de
# möjliga intervallen igenom.
#
select stationsnr from station where stationsnr=250501 or stationsnr=250502; 
select stationsnr from station where stationsnr=250501 or stationsnr=250502 or stationsnr >= 250505 and stationsnr <= 250601;


# sökning med nyckel LIKE constant
# Ifall LIKE begreppet börjar på en bokstav används nyckeln
#
select stationsnr,namn from station where föreningsnr = 37 and namn like 'f%';
select namn from station where namn like "L%" and namn = "test";
select namn from station where (namn like "L%" and namn = "Lund");


# Sökning med distinct
# ifall distinct endast är på en riktig tabell görs en automatisk group över
# alla fält. I andra fall skapas alltid en temporär databas.
# Ifall endast sorteringsfält från huvudregistret, sorteras detta först innan
# den distinkta tabellen skapas.
#
select distinct föreningsnr from station ;
select distinct station.namn,period from station,system where föreningsnr = 58 and namn like "O%";
select distinct namn from station where föreningsnr = 34 order by namn;


# Sökning med distinct och order och flera register
# Ifall result-posten är liten skapas en unik nyckel i temporärbasen som
# täcker hela posten. I annat fall görs en jämförelse alla-mot-alla för att
# eliminera dubletterna :(
# Detta specifica exempel tar tyvärr station_period som huvudtabell. Fixas genom att
# sätta nyckel på föreningsnr.

select distinct namn from station,station_period where station.föreningsnr = 34 and station.stationsnr=station_period.stationsnr order by namn;


# Sökning med konstantregister (systemregister samt nyckel = konstant)
# Alla konstantregister läses i början och härefter läses resten normalt.
#
select period from system;
select period from system where period=1900;
select namn,period from system,station where stationsnr = 011401;


# Sökning med konstantregister och flera nyckeldelar (posterna läses 1 gång vid
# start av sökningen)
#
select namn,period from station,station_period where station.stationsnr = 011401 and station.stationsnr=station_period.stationsnr and station_period.period=9501;


# Sökning med ett konstantregister och flera poster i andra register
#
select namn,period from station,system where föreningsnr = 37;


# Sökning med register referens och sökning på ej nyckel
# (Här är station_period huvudregister)
#
select namn,period,priv_inköp,ftg_inköp from station,station_period where station.stationsnr=station_period.stationsnr and period >= 9401 and period <= 9402 and station.föreningsnr = 34 order by namn,period;


# Sökning med intervall på ett register med full nyckel på referensregister
# (Här är station huvudregister och endast stationerna i stationsnummer
# intervallet kontrolleras)
#
select station.stationsnr,namn,period,priv_inköp,ftg_inköp from station,station_period where station.stationsnr>= 250501 and station.stationsnr <= 250505 and station.stationsnr=station_period.stationsnr and period = 9401 and station.föreningsnr = 34;


#Full join (samt alias)
select * from system,system system2;
select station.stationsnr,station2.stationsnr from station,station station2 where station.stationsnr >= 250501 and station.stationsnr <= 250505 and station2.stationsnr >= 250501 and station2.stationsnr <= 250505;


# Sökning med 'eller' med samma referens-begrepp
# Först görs en intervall sökning i det första registret och sedan refereras
# det andra med nyckel med en 'test ifall nyckelanvänding' för varje post
#
select station.stationsnr,station.föreningsnr,namn,period from station_period,station where station.stationsnr = 250501 and station.stationsnr=station_period.stationsnr and period = 9401 or station.stationsnr = 250502 and station.stationsnr=station_period.stationsnr and period = 9401;


#Sökning med flera parentesnivåer
#
select period from system where (((period > 0) or period < 10000 or (period = 1900)) and (period=1900 and period <= 1901) or (period=1903 and (period=1903)) and period>=1902) or ((period=1904 or period=1905) or (period=1906 or period>1907)) or (period=1908 and period = 1909) ;

select a.stationsnr from station as a,station as b where ((a.stationsnr = 250501 and a.stationsnr=b.stationsnr) or a.stationsnr=250502 or a.stationsnr=250503 or (a.stationsnr=250505 and a.stationsnr<=b.stationsnr and b.stationsnr>=a.stationsnr)) and a.stationsnr=b.stationsnr;

select namn from station where (((namn like "_%L%" ) or (namn like "%test%")) and ( namn like "L%" or namn like "G%")) and namn like "L%" ;


#Group on one table
#optimizer: sort table by group and send rows.
#
select count(*) from system ;
select föreningsnr,count(*),sum(stationsnr) from station group by föreningsnr ;
select föreningsnr,count(*) from station group by föreningsnr order by föreningsnr desc;
select count(*),min(stationsnamn),max(stationsnamn),sum(stationsnr),avg(stationsnr) from station where föreningsnr = 34 ;
select föreningsnr,stationsnr,count(priv_inköp),sum(priv_inköp),min(priv_inköp),max(priv_inköp),avg(priv_inköp) from station_period where föreningsnr = 34 group by föreningsnr,stationsnr ;
select föreningsnr,count(priv_inköp),sum(priv_inköp),min(priv_inköp),max(priv_inköp),avg(priv_inköp) from station_period group by föreningsnr ;


#Group with order on not first table
#optimizer: sort table by group and write group records to tmp table.
#           sort tmp_table and send rows.
#
select föreningsnr,count(*) from station group by föreningsnr order by 2 desc ;
select föreningsnr,count(*) from station where föreningsnr > 40 group by föreningsnr order by 2 desc ;
select station.stationsnamn,station.stationsnr,count(priv_inköp),sum(priv_inköp),min(priv_inköp),max(priv_inköp),avg(priv_inköp) from station_period,station where station_period.föreningsnr = 34 and station.stationsnr = station_period.stationsnr group by stationsnr,station.stationsnamn ;


#group by with many tables
#optimizer: create tmp table with group-by uniq index.
#           write with update to tmp table.
#           sort tmp table according to order (or group if no order)
#	    send rows
#
select station_period.föreningsnr,namn,sum(priv_inköp) from station_period,station where station.stationsnr = station_period.stationsnr and station_period.föreningsnr = 58 group by föreningsnr,namn ;
select station.föreningsnr,count(*),min(namn),max(namn),sum(priv_inköp),avg(priv_inköp) from station,station_period where station_period.föreningsnr >= 30 and station_period.föreningsnr <= 58 and station_period.stationsnr = station.stationsnr group by station.föreningsnr ;


# group with many tables and long group on many tables. group on formula
#optimizer: create tmp table with neaded fields
#           sort tmp table by group and calculate sums to new table
#	    if different order by than group, sort tmp table
#	    send rows

select station_period.föreningsnr+0,station_period.stationsnr,namn,sum(priv_inköp) from station_period,station where station.stationsnr = station_period.stationsnr and station_period.föreningsnr = 34 group by 1,station_period.stationsnr,namn,namn,namn,namn,namn order by stationsnr;


#WHERE const folding
#optimize: If there is a "field = const" part in the where, change all
#          instances of field in the and level to const.
#	   All instances of const = const are checked once and removed.

#Where -> station_period.stationsnr = 98005 and station.stationsnr = 98005
select sum(priv_inköp) from station_period,station where station.stationsnr = station_period.stationsnr and station_period.föreningsnr = 58 and station_period.stationsnr = 98004 and station.stationsnr = 98005 or station.stationsnr = station_period.stationsnr and station_period.stationsnr = 98005 and station.stationsnr = 98005 ;

select station.stationsnr,sum(priv_inköp) from station_period,station where station.stationsnr = station_period.stationsnr and station_period.föreningsnr = 58 and station_period.stationsnr = 98004 and station.stationsnr = 98005 or station.stationsnr = station_period.stationsnr and station_period.stationsnr = 98005 and station.stationsnr = 98005 or station_period.stationsnr = station.stationsnr and station.stationsnr = 98004 group by station.stationsnr ;

#
# HAVING
#
select föreningsnr,count(*) as count,sum(stationsnr) as sum from station group by föreningsnr having count > 40 and sum/count >= 120000 ;

#
# Test of alias
#
select system.period from system = system ;
select system.period from system as system ;
select "Nuvarande period" := period from system;
select system.period as "Nuvarande period" from system as system;
select period:=period from system;
select period:=period from system group by period;
select summa:=1+1 from system group by summa;
select "Nuvarande period" := period from system group by "Nuvarande period";

#
# Some simple show commands
#
show databases;
show tables;
show tables from test;
show fields from station ;
show fields from station from test like 's%' ;
show keys from station ;

#
# Some new procedures
#
select stationsnr from station_drvm where stationsnr>=98001 and stationsnr <= 98002 group by stationsnr procedure split_sum(5,dm_1_kvant10,1,stationsnr,kundnr,kortnr) ;
select stationsnr from station_drvm where stationsnr>=98001 and stationsnr <= 98002 group by stationsnr procedure split_count(5,dm_1_kvant10,1,stationsnr,kundnr,kortnr) ;

#
# Functions
#
select 1+1,1-1,1+1*2,8/5,8%5,mod(8,5),-(1+1)*-2,abs(-1),floor(5.2),sign(-5) ;
select concat("monty"," was here ","again"),length("hello"),locate("hello","he"),locate("hello","he",2),locate("hello","lo",2)  ;
select left("hello",2),right("hello",2),substring("hello",2,2),mid("hello",3,2) ;
select concat(left(right(concat("what ",concat("is ","happening")),9),4),substring("monty",5,1)) ;
select min(1,2),max(3,4,5) ;
select NULL=NULL,0=0,1>0,1>=1,1<0,1<=0,strcmp("abc","abcd"),strcmp("b","a"),strcmp("a","a") ;
select "a"<"b","a"<="b","b">="a","b">"a","a"="A","a"<>"b","abc" like "a%", "abc" not like "%d%" ;
select !0,NOT 0=1,!(0=0),1 AND 1,1 && 0,0 OR 1,1 || NULL ;
select 1 | 2,5 & 3,bit_count(7) ;
select null,isnull(null),isnull(1/0),isnull(1/0 = null),ifnull(null,1),ifnull(null,"TRUE"),ifnull("TRUE","ERROR"),1/0 is null,1 is not null;
select IF(0,"ERROR","this"),IF(1,"is","ERROR"),IF(NULL,"ERROR","a"),IF(1,2,3) ;
select intervall(5,1,2,3,4,5,6,7,8,9,10),intervall(3,1,1+1,1+1+1),between(2,1,3),field("IBM","NCA","ICL","SUN","IBM") ;
select period_add(system.period,-12),period_diff(199505,"9404") from system;
select from_days(to_days("960101")),to_days(960201)-to_days("19960101"),to_days(curdate()+1)-to_days(curdate()),weekday(to_days("1996-01-01")) ;
select replace("aaaa","a","b"),replace("aaaa","aa","b"),replace("aaaa","a","bb") ;
select replace(concat(lcase(concat("THIS"," ","IS"," ","A"," ")),ucase("false")," ","test"),"FALSE","REAL") ;
#
# Functions and groups
#
select concat(station_period.föreningsnr,station_period.stationsnr) as concat,station_period.stationsnr+1,left(namn,4),sum(priv_inköp/100),sum(length(concat("1","2"))) from station_period,station where station.stationsnr = station_period.stationsnr and station_period.föreningsnr = 34 group by concat,2,3 order by 2;
