|
|
|
Live query view en Paradox
(Ayuda del database desktop al estar en una ventana SQL y
seleccionar SQL-Propiedades)
" When you create a Database Desktop query that generates an Answer, the Answer table generated by the query does not maintain a relationship with the original table you queried. Edits you make to Answer are not reflected in the original table.
If you prefer, you can create a live query view. When you create a live query
view, Database Desktop generates an Answer set that is a limited, direct view
into the table you queried. The view is limited by the selection conditions
you specify in the query. When you edit the Answer table, you are really editing
the table you queried, and using this limited, direct view to see only the
data you want from that table. When Database Desktop creates a live query
view, live-field indicators appear next to each live field. Changes you make
to data in a live field are also made to the source table.
Multi-table QBE queries can't return live query views.
Importante: SQL queries on up to three tables can return
live query views.
Here are some common reasons why a live query view might not appear:
You performed an INSERT, DELETE, or CHANGETO query. You performed a CALC query.
"
Resultados de una consulta en MySQL:
Cuando se dá una orden que retribuye records (select por ejemplo),
los resultados los guarda en el caso de mysql en una estructura (seguramente
con campos dinámicos) llamada: MYSQL_RES.
Existen varias funciones del API, utilizadas por los programas clientes, como:
MYSQL_RES res=mysql_store_result()
mysql_fetch_row( res );
Para obtener las filas seleccionadas, ver ejemplo mytest.c que viene con el
paquete.
CADENAS
Las cadenas se encierran entre comillas simples ejs:
' hola mundo'
' especial \"chorizo\"
El concatenador de cadenas es ||
Ejemplos de órdenes comunes en SQL:
Hay unas para definición de datos:
1. create table table01 (field01 integer,field02 char(10));
CREATE TABLE config_reg_clases ( isede int2 NOT NULL , ipserver char(15) NOT
NULL )
2. drop table basura;
borra la tabla basura
3. show tables;
show columns from table01;
Y Otras para la manipulación de datos:
insert into table01 (field01,field02) values (1,'first');
select * from table01;
Para adicionar un usuario, Sin password:
insert into user (Host,User,Password) values('localhost','dummy','');
Con password:
insert into user (Host,User,Password) values('localhost','dummy',password("3dffcv"));
Para el manejo de usuarios es mas recomendado el uso de grant
Se pueden omitir las columnas si se llenan todas:
INSERT INTO films VALUES ('UA502','Bananas',105,'1971-07-13','Comedy',INTERVAL
'82 minute');
Ejemplo de postreSQL, observar lo de la fecha:
INSERT INTO films (code, title, did, date_prod, kind)
VALUES ('T_601', 'Yojimbo', 106, DATE '1961-06-16', 'Drama');
Para adicionar registros de otra tabla:
En paradox no se puede utilizar en el select, order by.
caso 1:
Funciona bien, si las estructuras son identicas:
insert into zonas select * from zonas2
(Si zonas2 tiene menos campos que zonas1 sale "invalid parameter"
(BDE))
SOLUCION: no usar el asterisco sino los campos que coincidan
insert into notas (IGrado,IGrupo,IEstudiante) Select igrado,igrupo,iestudiante
from estudiantes
caso 2:
Aunque zonas2 no tenga todos los campos de zonas1, asi si funciona:
insert into zonas (Icuenta,Izona) select * from zonas2
caso 3: los nombre de los campo coinciden pero los tipos no:
Sale "Type mismatch in expression" (BDE)
Ejemplo 4:
INSERT INTO PROJECTS
SELECT * FROM NEW_PROJECTS
WHERE NEW_PROJECTS.START_DATE > "6-JUN-1994";
Alter table
alter table table01 add column field03 char(20);
alter table table01 add column field04 date,add column field05 time;
ALTER TABLE regclases RENAME COLUMN "HoraFin" TO "hora_fin"
(sin comillas tambien?)
ALTER TABLE config_reg_clases RENAME TO config_regclases
Update
update table01 set field03='new info' where field01=1;
update table01 set field04=19991022, field05=062218 where field01=1;
update table01 set field05=152901 where field04>19990101;
Para cambiar la contraseña del root: use mysql y entonces:
update user set password=password("diferent") where user="root";
update Usuarios as a
set QLecturaActual=4 /*b.QLecturaActual no se puede*/
where IUsuario IN
(select IUsuario from :aniolocal:facturas as b where b.IMes=2)
Donde :aniolocal: es un alias del BDE, que se puede reeplazar por ruta.
update tabla set campo=(select sum etc...), set campo2=(select sum...)
funciona en postgre, probado con cbc5 y el componente zeos.
Delete
delete from table01 where field01=3;
Select
select * from biblio where Titulo like "%soledad%"
utiliza los signos de porcentaje como comodines y muestra todos los registros
que contengan en Titulo la palabra soledad.
Para seleccionar campos vacíos:
select * from FactTemp where IUsuario is null
select * from abaservicio where isnull(finicio) (no lo soporta paradox)
select * from abaservicio where finicio is not null
Un select anidado: (Por ejemplo para sacar los usuarios que un registro cumplen
una condicion y en otro otra diferente)
select * from facturas
where iusuario in
(select iusuario from facturas
where IMes=8 and (BPagado=false or BPagado is null))
and Imes=9 and (bpagado=false or BPagado is null)
En Paradox el orden de los campor en el insert y el select, ademas de los
tipos y anchos en las tablas, deben ser identicos.
Para sacar en un grid un resumen con los totales por estrato, con Facturas
y Usuarios teniendo comun a IUsuario, y con Facturas teniendo los valores
y Usuarios al estrato:
os<<"select usuarios.IEstrato, sum(Facturas.aseo) as Aseo, \
sum(Facturas.CFAlc) as CFAlc, sum(Facturas.ConsumoAlc) as ConsumoAlc,\
sum(Facturas.CFAcd) as CFAcd, sum(Facturas.ConsumoAcd) as ConcumoAcd,\
sum(Facturas.MValor) as Total \
from \""<<PathAnio<<"\" as Facturas, usuarios
as Usuarios \
where Facturas.iusuario=Usuarios.iusuario and Facturas.BPagado=true \
and Facturas.imes="<<IMes<<
" group by Usuarios.IEstrato"<<ends;
HagaSQL("aqua", Query1, os.str());
No olvidar que un select con dos o mas tablas es un join (se unen COLUMNAS
HORIZONTALMENTE).
Para tomar FILAS de dos tablas distintas y crear otra con las FILAS de la
una y la otra debe extractarse de una ponerse en una tabla y luego insertarles
las otras.
Para copiar registros de una tabla en otra (que debe existir en paradox pero
que en otros engines es capaz de crear)
insert into "basura.db" (PorcRecargo) select PorcRecargo from "config.db"
Esta es la forma ANSI SQL.
Para tomar registros de una misma tabla, hacerles algun cambio y volverlos
a añadir, con el C++Builder:
Select las columnas haciendo de una vez la operacion sobre los campos TBatchMove
desde el query a la tabla Update en la tabla si es necesario
ORACLE y Microsoft tienen la extension select ... into
MySQL: Tiene la ANSI, select into outfile y create table...select.
Para crear un DBGrid con los resultados de un query mas columnas adicionales:
select distinct descdocu, numedocu," " as borrar, " "
as pasar from mvt where numedocu="1" and descdocu="CE"
Operaciones entre columna
Para operaciones es importante indicar el tipo de dato con un punto, de lo
contrario el resultado de una division puede dar cero al tomarlo como entero:
select sum (valocomp * existencia*(1+iva/100.)) from infoarti
Es muy distinto si no se le coloca el punto al 100
En el BDE hay un BUG, que hace fallar un SQL que contenga en un select una
suma de campos, por ej:
select a,b,c,a+b+c from ....
Si en esos campos no hay información, toca ponerle a la tabla un archivo
VAL, que obligue a que en los campos el default sea cero.
Para mas avanzadas REGEXP
Formatos de fechas;
Depende del motor y es fijo, por ejemplo en mysql, tomado del manual:
A `Date' expression may be a date string, a datetime string, a timestamp([6
| 8 | 14]) or a number of format `YYMMDD' or `YYYYMMDD'.
En el Local SQL del BDE es MMDDYYYY
Para hacer restas con fechas y horas debe multiplicarse por 24 para que todo
quede
convertido en horas: (por lo menos asi es en el BDE)
os<<"select count(*) as Cuantos from test "
<<"where ICuenta="<<aICuenta<<" and ('"<<aFecha.FormatString("mm/dd/yyyy").c_str()
<<"'-fecha)*24 + ('"<<HoraActual.c_str()<<"'-hora)*24<="<<aFrecTest+1<<ends;
Count
Para contar los que cumplen una condición dada:
select count(*) as total from facturas where IMes=4;
Para mostrar una columna calculada:
select campo1, (campo1+campo2) as Total from tal where tal.
Group:
select fecha, sum(debito) as x from cafi99 group by fecha
asi es que funciiona en el BDE!
select fecha from cafi99 group by fecha
o así, es decir los campo del group deben ser los mismos del select
select fecha, cedulanit, numecuen from cafi99 group by fecha,cedulanit, numecuen
Para totalizar columnas:
select sum(ValoComp) from Infoarti
Para totalizar la multiplicacion de dos columnas:
select sum(ValoComp*Existencia) from Infoarti
Having (Condiciones con conjuntos)
Group con having, para especificar condiciones sobre cada grupo y no sobre
cada registro: (el where hace la condicion por registro y el having sobre
el grupo.)
select iestudiante,avg(ndef)
from factdlle
where iperiodo="021"
group by iestudiante // primero agruparlos y sacarles el avg
having avg(ndef)>4.6 // y ahi si poner la condicion
select igrado, igrupo,nestudiante,
avg(abanotas.valor) as promedio, count(imateria) as nummat
from notas, abanotas, estudiantes
/* condiciones sobre cada registro */
where notas.inota=abanotas.inota
and notas.iestudiante=estudiantes.iestudiante
and notas.igrado=estudiantes.igrado
and notas.igrupo=estudiantes.igrupo
and iperiodo=3
/*
Asi no se puede:
and count(imateria) o nummat>8
*/
group by igrado, igrupo,nestudiante
/*Condiciones sobre el grupo, asi si:*/
having avg(abanotas.valor)>4.0 and count(imateria)>8
order by promedio desc
select iestudiante,avg(ndef) from factdlle
where iperiodo="021" group by iestudiante
having avg(ndef) not in (3.8,42,5)
select distinct codigo from tabla1
where nombre in ('velasquez', 'santos')
Select tomando de dos tablas, pero con la condicion in:
Cuando una condicion esta basada en otro select, las condiciones adicionales
del primer select se deben especificar despues del segundo select, al menos
en Paradox, ej:
select imateria, isemestre from AbaMaterias
where imateria not in
(select imateria from factdlle
where iestudiante='2042704' and
(NDef>=2.95 or NHab>=2.95 or NVal>=2.95 or NHom>=2.95))
and iprograma='2' and imateria not like '63%'
order by ISemestre
ERROR COMUN
Este SQL tiene un problema, porque si en mvt no tiene tercero no aparece en el sql nos van aparecer menos registros de los que debieran aparecer, especificamente no aparecerán si en el movimiento cedulanit es null
select descdocu,numedocu,fecha,cedulanit,nombre,numecuen,nombCuen,debito,credito
from mvt a, pl b, tc c
where a.numeCuen=b.numeCuen
and a.descDocu="APP"
and a.cedulanit=c.cedulanit
SE CORRIGE ASI:
select descdocu,numedocu,fecha,cedulanit,nombre,numecuen,nombCuen,debito,credito
from mvt a, pl b, tc c
where a.numeCuen=b.numeCuen
and a.descDocu="APP"
and (a.cedulanit=c.cedulanit or (a.cedulanit is null and c.cedulanit is null))
Existen palabras para comparaciones de conjuntos: all, some, any
y otros con case:
update cuentas set saldo= case
when saldo>=1000 then saldo*1.05
else saldo*1.06
end