Está en la página 1de 19

ASIR online. IES Julian Marias. Gestión de BBDD.

INSTRUCCIÓN SELECT EN UN S.G.B.D ORACLE


Ejemplos y ejercicios.
CONSIDERACIONES PREVIAS:
• Siempre que se pida una ocurrencia de entidad, se presentará la descripción y
no el código, salvo que se pida expresamente.
• No se presentarán otras columnas que las especificadas entre paréntesis.
• Previamente a resolver un ejercicio debemos tratar de averiguar que
resultados debe presentar (numero de filas y columnas, que datos), o, al
menos, una muestra respresentativa que sirva para verificar el resultado.

1.- JOIN BÁSICO

Utilizaremos una sintaxis estandar para las combinaciones de tablas (JOIN),


incluyendo las tablas a combinar en la clausula FROM, sin importar el orden
y expresando las relaciones entre las tablas mediante condiciones con el
operador = colocadas en la clausula WHERE. Las condiciones se deducen de
las FK que relacionan esas tablas y, en caso de necesitar varias condiciones
se unen siempre con AND. En general, aparecerán, al menos, tantas
condiciones como tablas menos una, pudiendo aumentar el número de
condiciones si las FK involucran a mas de una columna o si el problema
especifica mas condiciones derivadas de la lógica de negocio.

EJEMPLO 1a: Listado de empleados y los departamentos en los que trabajan.


(apellidos del empleado y nombre del dpto)
SELECT *
FROM emple e,
depart d
WHERE e.dept_no=d.dept_no;
EMP_NO APELLIDOFICIO DIR FECHA_ALT SALARIO DEPT_NODEPT_NO DNOMBRE LOC
--------- --------- ------------------- ----- -------------- ----------------- ------------- ---------- ----------------------- ---------------
7782 CEREZO DIRECTOR 7839 09/06/81 318500 10 10 CONTABILIDAD SEVILLA
7839 REY PRESIDENT 17/11/81 650000 10 10 CONTABILIDAD SEVILLA
7934 MUNOZ EMPLEADO 7782 23/01/82 169000 10 10 CONTABILIDAD SEVILLA
7566 JIMENEZDIRECTOR 7839 02/04/81 386750 20 20 INVESTIGACION MADRID
7902 FERNAN ANALISTA 7566 03/12/81 390000 20 20 INVESTIGACION MADRID
7876 ALONSO EMPLEADO 7788 23/09/81 143000 20 20 INVESTIGACION MADRID
7369 SANCHE EMPLEADO 7902 17/12/80 104000 20 20 INVESTIGACION MADRID
7788 GIL ANALISTA 7566 09/11/81 390000 20 20 INVESTIGACION MADRID
7521 SALA VENDEDOR 7698 22/02/81 162500 65000 30 30 VENTAS BARCELONA
7844 TOVAR VENDEDOR 7698 08/09/81 195000 0 30 30 VENTAS BARCELONA
7499 ARROYO VENDEDOR 7698 20/02/80 208000 39000 30 30 VENTAS BARCELONA
7900 JIMENO EMPLEADO 7698 03/12/81 123500 30 30 VENTAS BARCELONA
7698 NEGRO DIRECTOR 7839 01/05/81 370500 30 30 VENTAS BARCELONA
7654 MARTIN VENDEDOR 7698 29/09/81 162500 182000 30 30 VENTAS BARCELONA
EJEMPLO 1b: Listado de pedidos y los clientes que los han realizado.
(n.º pedido, nombre cliente)
SELECT pedido_no,
c.nombre
FROM cliente,
pedido
WHERE cliente_no=comprador;
1 DISTRIBUCIONES PEPE
4 DISTRIBUCIONES PEPE
6 DISTRIBUCIONES PEPE
5 LOGITRONICA S.L
2 LOGITRONICA S.L
3 INDUSTRIAS LACTEAS
7 TALLERES ESTESO S.A.

EJERCICIO 1.1: Listado de clientes y sus contactos.


(nombre cliente, apellido empleado contacto)
SELECT nombre,
apellido
FROM cliente,
emple
WHERE contacto=emp_no;
TALLERES ESTESO S.A. SANCHEZ
DISTRIBUCIONES PEPE ARROYO
LOGITRONICA S.L MARTIN
INDUSTRIAS LACTEAS TOVAR

EJERCICIO 1.2: ¿ En que fechas se ha pedido el ARCHIVADOR CEREZO ?


(fecha de pedido)
SELECT p.fecha_pedido
FROM pedido p,
producto pr
WHERE pr.producto_no=p.producto_no and
upper(pr.descripcion)='ARCHIVADOR CEREZO'
02/01/95

EJERCICIO 1.3: ¿ Que importe total ha supuesto cada pedido del año
1995, ordedados de mas caro a mas barato ?
(numero pedido, importe)
SELECT pedido_no,
unid_pedidas*precio_venta
FROM pedido p,
producto a
WHERE p.producto_no=a.producto_no
extract(year from fecha_pedido)=1995
ORDER BY 2 DESC;
1 330000
3 268000
4 201000
7 73500
JOIN CON MAS DE DOS TABLAS, PERO RELACIONADAS POR FK COMPUESTAS
DE UN SOLO CAMPO:

EJEMPLO 1c: Listado de productos pedidos, indicando quien los ha pedido


(descripcion producto, nombre cliente)
SELECT descripcion,
nombre
FROM cliente,
pedido p,
producto a
WHERE cliente_no=comprador AND
p.producto_no=a.producto_no;
MESA DESPACHO MOD. GAVIOTA LOGITRONICA S.L
MESA DESPACHO MOD. GAVIOTA DISTRIBUCIONES PEPE
SILLA DIRECTOR MOD. BUFALO INDUSTRIAS LACTEAS
SILLA DIRECTOR MOD. BUFALO DISTRIBUCIONES PEPE
ARMARIO NOGAL DOS PUERTAS LOGITRONICA S.L
MESA MODELO UNION DISTRIBUCIONES PEPE
ARCHIVADOR CEREZO TALLERES ESTESO S.A.

EJERCICIO 1.4: Listado de pedidos, indicando fecha, producto, comprador y


vendedor.
(fecha pedido, descripcion producto, nombre cliente, apellidos vendedor)
SELECT fecha_pedido,
descripcion,
nombre,
apellido
FROM cliente,
pedido p,
producto a,
emple
WHERE cliente_no=comprador AND
p.producto_no=a.producto_no AND
vendedor=emp_no;
02/01/95 ARCHIVADOR CEREZO TALLERES ESTESO S.A. ARROYO
25/05/95 SILLA DIRECTOR MOD. BUFALO INDUSTRIAS LACTEAS NEGRO
09/12/98 ARMARIO NOGAL DOS PUERTAS LOGITRONICA S.L TOVAR
13/11/94 MESA DESPACHO MOD. GAVIOTA LOGITRONICA S.L TOVAR
11/06/97 MESA MODELO UNION DISTRIBUCIONES PEPE JIMENO
16/05/95 SILLA DIRECTOR MOD. BUFALO DISTRIBUCIONES PEPE JIMENO
07/01/95 MESA DESPACHO MOD. GAVIOTA DISTRIBUCIONES PEPE JIMENO
JOIN CON DOS TABLAS, RELACIONADAS CON FK COMPUETAS POR MAS DE
UN CAMPO:

EJEMPLO 1d: Listado de sucursales y sus cuentas


(nombre sucursal, numero de cta)
SELECT nombre_suc,
num_cta
FROM sucursal s,
cuenta c
WHERE s.cod_banco=c.cod_banco AND
s.cod_sucur=c.cod_sucur;
* SUCURSAL 1* 123456788
* SUCURSAL 1* 123456789
* SUCURSAL 2* 123456785
* SUCURSAL 2* 123456786
* SUCURSAL 2* 123456787
* SUCURSAL 6000* 33334440
* SUCURSAL 6000* 33334444

EJERCICIO 1.4: Listado de ingresos de cuentas de MARBELLA


(nombre cuenta, importe)
SELECT nombre_cta,
importe
FROM movimiento m,
cuenta c
WHERE m.cod_banco=c.cod_banco AND
m.cod_sucur=c.cod_sucur AND
m.num_cta=c.num_cta AND
LOWER(pobla_cta)='marbella' AND
LOWER(tipo)='i';
JONAS 300
2.- FUNCIONES DE AGRUPACIÓN:

La clausula GROUP BY permite agrupar las lineas en función de uno o varios


criterios, obteniendo una linea de listado por cada conjunto de lineas de
datos que tengan el mismo valor para los criterios especificados.

EJEMPLO 2a: ¿ Cuantos pedidos ha hecho cada cliente ?


(nombre cliente, numero de pedidos)
SELECT apellido,
COUNT(*)
FROM emple,
pedido
WHERE emp_no=vendedor
GROUP BY apellido;
NEGRO 1
ARROYO 1
JIMENO 3
TOVAR 2

EJERCICIO 2.1: ¿ Cuantos empleados trabajan en cada ciudad ?


(nombre ciudad, cantidad de empleados)
SELECT loc,
COUNT(*)
FROM depart d,
emple e
WHERE d.dept_no=e.dept_no
GROUP BY loc;
MADRID 5
BARCELONA 6
SEVILLA 3

EJERCICIO 2.1: ¿ Cuantos pedidos se han pedido de cada producto ?


(descripcion producto, total pedidos)
SELECT descripcion,
COUNT(*)
FROM pedido p,
producto a
WHERE p.producto_no=a.producto_no
GROUP BY descripcion;
MESA DESPACHO MOD. GAVIOTA 2
ARCHIVADOR CEREZO 1
MESA MODELO UNION 1
SILLA DIRECTOR MOD. BUFALO 2
ARMARIO NOGAL DOS PUERTAS 1
EJEMPLO 2b: Salario medio de cada departamento
(nombre departamento, saladio medio)
SELECT dnombre, AVG(salario)
FROM depart d,
emple e
WHERE d.dept_no=e.dept_no
GROUP BY dnombre;
INVESTIGACION 282750
VENTAS 203666,6666666666666666666666666666666667
CONTABILIDAD 379166,6666666666666666666666666666666667

EJERCICIO 2.3: Para cada producto ¿ Cuantas unidades se incluyeron en el


pedido mas pequeño ?
(descripcion producto, unidades)
SELECT descripcion,
MIN(unid_pedidas)
FROM pedido p,
producto a
WHERE p.producto_no=a.producto_no
GROUP BY descripcion;
MESA DESPACHO MOD. GAVIOTA 5
ARCHIVADOR CEREZO 7
MESA MODELO UNION 1
SILLA DIRECTOR MOD. BUFALO 3
ARMARIO NOGAL DOS PUERTAS 2

EJERCICIO 2.4: ¿ Cual es la fecha de pedido mas reciente para cada cliente ?
(nombre cliente, fecha)
SELECT nombre,
MAX(fecha_pedido)
FROM cliente,
pedido
WHERE cliente_no=comprador
GROUP BY nombre;
TALLERES ESTESO S.A. 02/01/95
DISTRIBUCIONES PEPE 11/06/97
LOGITRONICA S.L 09/12/98
INDUSTRIAS LACTEAS 25/05/95
EJEMPLO 2c: ¿ Cuantas unidades han sido vendidas por cada empleado que haya
realizado ventas ?
(apellido vendedor, cantidad de unidades)
SELECT apellido,
SUM(unid_pedidas)
FROM emple,
pedido
WHERE emp_no=vendedor
GROUP BY apellido;
NEGRO 4
ARROYO 7
JIMENO 10
TOVAR 7

EJERCICIO 2.5: ¿ Cuantas unidades quedarían en el almacen, despues de


descontar los pedidos de los clientes ?
(nombre producto, unidades restantes)
SELECT descripcion,
existencias-SUM(unid_pedidas)
FROM pedido p,
producto a
WHERE p.producto_no=a.producto_no
GROUP BY descripcion;

MESA DESPACHO MOD. GAVIOTA 14


SILLA DIRECTOR MOD. BUFALO 18
ARMARIO NOGAL DOS PUERTAS 18
ARCHIVADOR CEREZO 3
MESA MODELO UNION 14
EJEMPLO 2c: Gasto realizado por cada cliente
(nombre cliente, euros)
SELECT nombre,
SUM(unid_pedidas*precio_venta)
FROM cliente,
pedido p,
producto a
WHERE cliente_no=comprador AND
p.producto_no=a.producto_no
GROUP BY nombre;
TALLERES ESTESO S.A. 73500
DISTRIBUCIONES PEPE 565000
LOGITRONICA S.L 367000
INDUSTRIAS LACTEAS 268000

EJERCICIO 2.7: Listado de ingresos por ventas clasificado por departamento


(nombre departamento, euros)
SELECT dnombre,
SUM (unid_pedidas*precio_venta)
FROM depart d,
pedido p,
producto a,
emple e
WHERE p.producto_no=a.producto_no AND
e.dept_no=d.dept_no AND
e.emp_no=p.vendedor
GROUP BY dnombre;
VENTAS 1273500

EJERCICIO 2.8: Listado de empleados cuyas ventas han producido beneficios y


perdidas, indicando, para cada uno, el balance que proporciona a la empresa en
cuanto a ingresos y gastos. No presentar empleados que no hayan hecho ventas.
(apellidos empleado, balance)
SELECT APELLIDO,
SUM(UNID_PEDIDAS*PRECIO_VENTA)-SALARIO "BALANCE"
FROM PEDIDO P,
PRODUCTO A,
EMPLE
WHERE EMP_NO=VENDEDOR AND
A.PRODUCTO_NO=P.PRODUCTO_NO
GROUP BY VENDEDOR,
APELLIDO,
SALARIO
ORDER BY 2 DESC;
JIMENO 441500
TOVAR 172000
NEGRO -102500
ARROYO -134500
3.-OUTER JOIN:

Es un JOIN en que las lineas que no tienen concordancia entre las tablas
involucradas tambien se muestran, completadas con valores NULL.

EJEMPLO 3a: Listado por orden alfabetico de todos los empleados y sus pedidos.
(nombre vendedor, numero de pedidos)
SELECT apellido,
count(pedido_no)
FROM emple
pedido
WHERE emp_no=vendedor(+)
GROUP BY apellido
ORDER BY apellido;
ALONSO 0
ARROYO 1
CEREZO 0
FERNANDEZ 0
GIL 0
JIMENEZ 0
JIMENO 3
MARTIN 0
MUNOZ 0
NEGRO 1
REY 0
SALA 0
SANCHEZ 0
TOVAR 2

>> Es preciso observar que, cuando un empleado no aparece como vendedor en


ningun pedido, ha de aparecer con 0. Por eso se contabiliza COUNT(ped.pedido_no),
una columna que, en las filas sin concordancia entre ambas tablas, se genera con
valor NULL, mientras que, en cualquier linea normal, de las que si tienen
concordancia entre las dos tablas, aparecerá siempre un valor distinto de NULL al
ser la clave primaria de la tabla pedido.

EJERCICIO 3.1: ¿ Cuantos empleados tiene cada departamento ?


(nombre departamento, numero de empleados)
SELECT dnombre,
COUNT(emp_no)
FROM depart d,
emple e
WHERE d.dept_no=e.dept_no(+)
GROUP BY dnombre;
PRODUCCION 0
INVESTIGACION 5
VENTAS 6
CONTABILIDAD 3
EJERCICIO 3.2: Listado resumen de pedidos por cada producto, incluyendo
todos los productos disponibles.
(nombre artículo, numero de veces)
SELECT descripcion,
COUNT(ped.producto_no)
FROM producto pro,
pedido ped
WHERE pro.producto_no=ped.producto_no(+)
GROUP BY descripcion;
MESA DESPACHO MOD. GAVIOTA 2
ARCHIVADOR CEREZO 1
MESA MODELO UNION 1
CAJA SEGURIDAD MOD B222 0
SILLA DIRECTOR MOD. BUFALO 2
ARMARIO NOGAL DOS PUERTAS 1

EJERCICIO 3.3: ¿ Cuantos clientes no han hecho pedidos ?


(numero)
SELECT COUNT(*)
FROM cliente,
pedido
WHERE cliente_no=comprador(+) AND
pedido_no IS NULL;
0
4.-HAVING

La clausula HAVING permite selecionar uno o varios grupos de los obtenidos


mediante GROUP BY, mediante una condición.

EJEMPLO 4a: Empledos que se hayan vendido mas de siete unidades.


(apellidos empleado)
SELECT apellido
FROM emple,
pedido
WHERE vendedor=emp_no
GROUP BY apellido
HAVING sum(unid_pedidas)>7;
JIMENO

EJERCICIO 4.1: Cuentas que han ingresado 500 euros o mas, indicando
cuantos ingresos han tenido.
(nombre cuenta, numero de ingresos)
SELECT nombre_cta,
count(*)
FROM cuenta c,
movimiento m
WHERE c.cod_banco=m.cod_banco AND
c.cod_sucur=m.cod_sucur AND
c.num_cta=m.num_cta AND
LOWER(m.tipo)=’i’
GROUP BY m.cod_banco, m.cod_sucur, m.num_cta, nombre_cta
HAVING sum(importe)>=500;
MANUEL 1
ISABEL 2
5.-SUBCONSULTAS:

En una instrucción SQL se puede incluir otra instrucción SQL. A esta segunda
se le llama subconsulta. La subconsulta se debe encerrar entre paréntesis.

En un SELECT es posible anidar una subconsulta en:

• la clausula FROM, donde es muy conveniente darle un alias para poder


referirse a las columnas que devuelva.

• en las condiciones de la clausula WHERE, comparando sus resultados


con valores constantes, con otras columnas o con operaciones.

• en la propia lista de campos a presentar, aunque esto último es menos


común.

5.1.-Subconsultas escalares:

Devuelven el mismo dato para todas las filas del select principal.

EJEMPLO 5a: Listado de empleados que cobre comisiones mas altas que el precio
del producto número 2.
SELECT apellido
FROM emple
WHERE comision > (SELECT precio_venta
FROM producto
WHERE producto_no=2);
MARTIN

EJEMPLO 5b: Listado de empleados que cobran mas que la media de la empresa.
(apellido empleado)
SELECT apellido
FROM emple
WHERE salario > ( SELECT AVG(salario)
FROM emple );
JIMENEZ
NEGRO
CEREZO
GIL
REY
FERNANDEZ
EJERCICIO 5.1.1: Listado de empleados que trabajan en Sevilla. Realizarlo
mediante SUBCONSULTAS y mediante JOIN.
(nombre empleado)
SELECT apellido
FROM emple
WHERE dept_no = ( SELECT dept_no
FROM depart
WHERE upper(loc)='SEVILLA' );
CEREZO
REY
MUNOZ
SELECT apellido
FROM emple e,
depart d
WHERE e.dept_no=d.dept_no AND
upper(loc)='SEVILLA'
CEREZO
REY
MUNOZ

EJERCICIO 5.1.2: ¿ Que pedidos han llegado el ultimo dia ?


(id de pedido)
SELECT pedido_no
FROM pedido
WHERE fecha_pedido = ( SELECT MAX(fecha_pedido)
FROM pedido );
5

EJERCICIO 5.1.3: Listado de empleados que han vendido pedidos con mas
unidades que la media.
(apellido cliente)
SELECT apellido
FROM emple, pedido
WHERE emp_no=vendedor AND
unid_pedidas > ( SELECT AVG(unid_pedidas)
FROM pedido );
JIMENO
TOVAR
ARROYO
EJERCICIO 5.1.2: ¿ Que cliente hizo el ultimo pedido en llegar ?
(nombre)
SELECT nombre
FROM cliente
WHERE cliente_no = ( SELECT comprador
FROM pedido
WHERE fecha_pedido = ( SELECT
MAX(fecha_pedido)
FROM pedido )
);
LOGITRONICA S.L

5.2.-Subconsultas sincronizadas:

Devuelven un dato distinto para cada fila del select principal.

EJEMPLO 5c: Listado de clientes que han hecho dos compras


(nombre cliente)
SELECT nombre
FROM cliente
WHERE 2 = ( SELECT COUNT(*)
FROM pedido
WHERE cliente_no=comprador );
LOGITRONICA S.L

EJEMPLO 5d: Listado de empleados que cobran mas que el salario medio de su
departamento.
(nombre empleado)
SELECT e1.apellido
FROM emple e1
WHERE e1.salario > ( SELECT AVG(e2.salario)
FROM emple e2
WHERE e1.dept_no=e2.dept_no );

* esta segunda versión minimiza el uso de alias, con igual resultado */


SELECT apellido v
FROM emple e1
WHERE salario > ( SELECT AVG(salario)
FROM emple e2
WHERE e1.dept_no=e2.dept_no );
ARROYO
JIMENEZ
NEGRO
GIL
REY
FERNANDEZ
EJERCICIO 5.2.1: Listado de empleados cuyas ventas totales hayan superado
los 100000 euros.
(apellido empleado)
SELECT apellido
FROM emple
WHERE ( SELECT SUM(precio_venta*unid_pedidas)
FROM pedido p,
producto a
WHERE p.producto_no=a.producto_no AND
vendedor=emp_no )
> 100000;
NEGRO
TOVAR
JIMENO

EJERCICIO 5.2.2: ¿ Que empleados han vendido el producto cuyo número es


1?
(apellidos empleado)
SELECT apellido
FROM emple
WHERE ( SELECT COUNT(*)
FROM pedido
WHERE vendedor=emp_no AND
producto_no=1 )
>0;
TOVAR
JIMENO

EJERCICIO 5.2.3: Listado de empleados que producen beneficios.


(apellido empleado)
SELECT apellido
FROM emple
WHERE ( SELECT SUM(precio_venta*unid_pedidas)
FROM pedido p,
producto a
WHERE p.producto_no=a.producto_no AND
vendedor=emp_no )
> salario;
TOVAR
JIMENO
EJERCICIO 5.2.4: Clientes que han gastado mas que la media
(nombre cliente)
SELECT nombre
FROM cliente
WHERE ( SELECT SUM(precio_venta*unid_pedidas)
FROM pedido p,
producto a
WHERE a.producto_no=p.producto_no AND
cliente_no=comprador )
>
( SELECT AVG(precio_venta*unid_pedidas)
FROM pedido p,
producto a
WHERE a.producto_no=p.producto_no AND
cliente_no=comprador );
DISTRIBUCIONES PEPE
LOGITRONICA S.L

5.3.-Operadores IN y EXISTS:

Se utilizan para comparaciones en las que intervienen condiciones del estilo


“es alguno de ciertos valores … ” o “se puede dar algun caso que...” y sus
contrarios. No son imprescindibles, ya que se pueden sustituir normalmente
por comparaciones usando la función COUNT.

EJEMPLO 5e: IN
Listado de empleados que han hecho ventas.
(nombre empleado)
SELECT apellido
FROM emple
WHERE emp_no IN ( SELECT vendedor
FROM pedido );
ARROYO
NEGRO
TOVAR
JIMENO

EJERCICIO 5.3.1: Listado de productos de los que no hay pedidos


(descripcion producto)
SELECT descripcion
FROM producto pro
WHERE producto_no NOT IN ( SELECT producto_no
FROM pedido ped );
CAJA SEGURIDAD MOD B222
EJERCICIO 5.3.2: Listado de empleados que no trabajan ni en Sevilla ni en
Madrid ni en Rio.
(apellidos empleado)
SELECT apellido
FROM emple
WHERE dept_no IN ( SELECT dept_no
FROM depart
WHERE lower(loc) IN ('sevilla','madrid','rio') );
SALA
TOVAR
ARROYO
JIMENO
NEGRO
MARTIN

EJEMPLO 5f: EXISTS


Empleados que han tramitado algún pedido del artículo cuyo código es 1
(apellido empleado)
SELECT apellido
FROM emple
WHERE EXISTS ( SELECT *
FROM pedido
WHERE vendedor=emp_no AND
producto_no=1) ;
TOVAR
JIMENO

EJERCICIO 5.3.3: Listado de productos y sus precios, que no se han vendido


(descripcion producto)
SELECT descripcion,
precio_venta
FROM producto pro
WHERE NOT EXISTS ( SELECT *
FROM pedidos ped
WHERE pro.producto_no=ped.producto_no) ;
CAJA SEGURIDAD MOD B222 28000
6.- VARIOS

6.1.- EQUIVALENCIA OPERADOR LIMIT DE MySQL: seudocolumna ROWNUM

SELECT * FROM

(
INSTRUCCION SELECT COMPLETA
)

WHERE ROWNUM <= 10;

EJEMPLO 6a: Listado de empleados que han hecho ventas, mostrando


solo 2.
(nombre empleado)
SELECT *
FROM (
SELECT apellido
FROM emple
WHERE emp_no IN ( SELECT vendedor
FROM pedido )
)
WHERE rownum <= 2;
TOVAR
JIMENO

6.2.- FECHA DEL SISTEMA: SYSDATE

SELECT sysdate
FROM dual;

6.3.- VER MIS TABLAS: vista TABS

SELECT *
FROM tabs;

También podría gustarte