Introducción a SQL y Sentencia Select
Introducción a SQL y Sentencia Select
José R. Paramá
Guión
Introducción
Conexión a Oracle con Dbeaver
Tablas usadas en los ejemplos
Conceptos previos
Sentencia Select
Distinct
Order by
Predicados
Funciones
Group by
Having
Join
Subconsultas
Composición de consultas
Introducción
Parte del SEQUEL (Structured English QUEry Language), desarrollado en laboratorios
de IBM para el SYSTEM R.
Se basa en el álgebra relacional y el cálculo relacional.
Este lenguaje evolucionó al SQL (Structured Query Language).
ANSI decidió estandarizarlo, se le llamó SQL-86 o SQL1. ISO la aceptó en el 87.
Aparecieron luego otros estándares: SQL-92 (SQL2), SQL:1999 (SQL3), SQL:2003,
SQL:2006, SQL:2008, SQL:2011
Introducción
La mayor parte es seguida por los fabricantes, pero hay pequeñas divergencias, por
eso el SQL que sigue cada producto se denomina dialecto.
A pesar de su nombre, no es sólo un lenguaje de consulta y cubre:
DDL o LDD (lenguaje de definición de datos).
DML o LMD (lenguaje de manipulación de datos).
Con SQL se puede realizar cualquier tarea dentro del SGBD(crear usuarios, dar
permisos, control concurrencia, creación de estructuras de almacenamiento y acceso
a los datos, etc.)
Introducción
Otras características:
Es posible incrustar SQL dentro de programas escritos con lenguajes de propósito
general.
Es un lenguaje no procedimental (se especifica lo qué queremos, y no
especificamos el cómo).
No manipula conjuntos de filas (como el modelo relacional teórico), maneja
colecciones de filas (no hay orden, pero puede haber filas repetidas).
Cambia también la terminología: tablas, filas y columnas en lugar de relaciones,
tuplas y atributos.
Conexión a Oracle con Dbeaver
Programa cliente que usaremos para conectarnos remotamente al servidor Oracle de
la facultad y ejecutar sentencias de SQL en un entorno Oracle.
Select *
Las sentencias SQL se pueden escribir en varias filas y acaban en ; From emp;
PRO
Campo Tipo Descripción EMPPRO
NUMBER(4) NOT Número o código del Proyecto. Campo Tipo Descripción
PRONO
NULL Es la clave primaria de la tabla. Número o código del empleado.
EMPNO NUMBER(4) NOT NULL Es la clave
PNAME VARCHAR2(10) Nombre del proyecto. Clave foránea que referencia la tabla EMP
primaria
LOC VARCHAR2(13) Ciudad donde se realiza el proyecto. Número o código del proyecto. de la tabla
PRONO NUMBER(4) NOT NULL
Número del departamento controlador del Clave foránea que referencia la tabla PRO
DEPTNO NUMBER(2) proyecto. Clave foránea que referencia la HOURS NUMBER(2) Horas que ha trabajado un empleado en un proyecto.
tabla DEPT
Tablas usadas en los ejemplos
Guion
Introducción
Conceptos previos
Nulos
Expresiones
Sentencia Select
Distinct
Order by
Predicados
Funciones
Group by
Having
Join
Subconsultas
Composición de consultas
Conceptos previos
Nulos:
El valor nulo NULL representa la ausencia de información, o bien por
desconocimiento del dato, o bien porque no procede.
Debe diferenciarse de cualquier otro valor, entre ellos del valor 0 si se trata
de un dato numérico, y de la cadena de caracteres vacía, si es un dato de
tipo carácter.
Conceptos previos
Expresiones1:
Una expresión es la formulación de una secuencia de operaciones, o sea, una
combinación de operadores, operandos y paréntesis, que, cuando se ejecuta,
devuelve un único valor escalar como resultado.
Los operandos pueden ser constantes, nombres de columna, funciones,
otras expresiones y otros elementos.
El tipo de dato de cada operando de una expresión debe ser el mismo. Si
un operando es nulo, el resultado también es nulo
Operadores numéricos: + - * /
Operador alfanumérico: || (concatenación de cadenas de texto)
Ejemplos: •
•
3
’Casa’
No son expresiones:
• 3+2
• SAL < 1500
• ’A’|| ’BC’
• (SAL+COMM) >=10
• ENAME
• SAL*1.5
• 0.5 * COMM
• SAL + COMM
• (Select COMM FROM EMP WHERE EMPNO = 7499)
1Restringimos la definición de expresión a la versión “Core SQL” del estándar.
Conceptos previos
En Oracle, el texto (literal de texto) va entre comillas simples, y es sensible a las
mayúsculas/minúsculas.
‘casa’
‘Casa’
‘Casa bonita’
Los identificadores (de usuario, nombres de columnas,…) van entre comillas dobles.
Se pueden omitir las comillas cuando el identificador no tiene espacios o símbolos de
puntuación.
psanchez
“Pedro Sanchez”
Guion
Introducción
Conceptos previos
Sentencia Select
Distinct
Order by
Predicados
Funciones
Group by
Having
Join
Subconsulta
Composición de consultas
Sentencia Select
La sentencia SELECT permite seleccionar u obtener datos de una o de varias tablas.
Parte de una o de varias tablas de la BD y el resultado es otra tabla, denominada
a veces tabla resultado, pero que no formará parte de la BD.
Correctas
select ename, job
from emp
order by hiredate;
Igual valor en la
primera
Order by
Se puede ordenar ascendentemente en unas expresiones, y descendente en otras
Descendente
Ascendente
Order by
Para el order by, por convención, los nulos se consideran mayores que cualquier valor.
select ename, sal, comm
from emp
order by comm;
Guion
Introducción
Conceptos previos
Sentencia Select
Distinct
Order by
Predicados
Funciones
Group by
Having
Join
Subconsultas
Composición de consultas
Predicados elementales
Los predicados permiten especificar una condición.
Se pueden usar en las partes where y having.
<expre1> <op_condición> <expre2>
<op_condición> puede ser: < <= = != <> >= >
El resultado de un predicado dentro de una cláusula where, como hemos visto, se
aplica a una única fila y su resultado puede ser: cierto (true), falso (false) o
desconocido (null).
El motivo del tercer resultado posible es la presencia de nulos.
Cuando <expre1> o <expre2> es un nulo, el resultado es desconocido.
Predicados elementales
Select ‘Nombre: ’ || ename, sal*0.20
from emp
where comm>1000;
Desconocido
Falso
Falso
Desconocido
Cierto: continúa
Desconocido
Desconocido
Desconocido
Desconocido
Falso
Desconocido
Desconocido
Desconocido
Desconocido
Resultado final
Predicados elementales
<expre1> <op_condición> <expre2>
Observa que a los dos lados de la condición puede haber expresiones
select ename, job, sal, comm, sal+comm
from emp
where sal+comm > 2500;
SELECT *
FROM emp
WHERE sal BETWEEN 1500 AND 3000;
Predicados de pertenencia a conjunto
Predicado de pertenencia a conjunto (IN)
Comprueba si el valor de una expresión coincide con alguno de los valores incluidos en
una lista de expresiones.
Formato: <expr1> [NOT] IN (<expr2>[, <expr3>, …])
SELECT *
FROM emp
WHERE deptno IN (10,30,40);
SELECT ename
FROM emp
WHERE job IN (‘CLERK’, ’SALESMAN’);
<expre1> IN (<expre2>,<expre3>) es lo mismo que <expre1>=<expre2> OR <expre1>=<expre3>
<expre1> NOT IN (<expre2>,<expre3>) es lo mismo que <expre1>!=<expre2> AND <expre1>!=<expre3>
Predicado LIKE
Predicado de correspondencia con un patrón o modelo
Comprueba si el valor de una expresión alfanumérica se corresponde con un modelo. El
modelo puede incluir dos caracteres que actúan como comodines:
_ Indica un único carácter, incluido el blanco.
% Indica una cadena de caracteres de cualquier longitud,
incluida la cadena vacía.
Formato: <expr1> [NOT] LIKE <modelo>
SELECT * SELECT *
FROM emp FROM emp
WHERE ename LIKE ‘%NE%’ WHERE ename LIKE ‘_____’
Predicados compuestos
Son la unión de dos o más predicados mediante los operadores lógicos AND, OR y
NOT.
Al existir una lógica de tres valores, debemos considerar el efecto del valor NULL.
X Y X AND Y X OR Y NOT X
TRUE TRUE TRUE TRUE FALSE
TRUE FALSE FALSE TRUE FALSE
TRUE DESC. DESC. TRUE FALSE
FALSE TRUE FALSE TRUE TRUE
FALSE FALSE FALSE FALSE TRUE
FALSE DESC. FALSE DESC. TRUE
DESC. TRUE DESC. TRUE DESC.
DESC. FALSE FALSE DESC. DESC.
DESC. DESC. DESC. DESC. DESC.
Predicados compuestos
Select *
from emp
where sal+comm>2500; Desconocido
Falso
Falso
Desconocido
Cierto
Desconocido
Desconocido
Desconocido
Desconocido
Falso
Desconocido
Desconocido
Desconocido
Desconocido
Numéricas o aritméticas:
SQRT(<exp_numerica>) Raíz cuadrada. Ej.: SQRT(81)
ABS(<exp_numerica>) Valor absoluto. Ej.: ABS(-11)
POWER(<exp1>,<exp2>) Potencia. Ej.: POWER(9,2) = 81
De fecha y tiempo:
CURRENT_DATE Fecha actual del sistema. Ej.: SELECT CURRENT_DATE FROM DUAL
Funciones Escalares
Función útil cuando hay valores nulos en expresiones.
Formato: COALESCE(<expr1>, <expr2>, …)
Funcionamiento:
Evalúa la <expr1>. Si su valor es distinto de NULL, devuelve dicho valor. En caso contrario, evalúa la
<expr2> y devuelve el resultado, y así sucesivamente.
SELECT COALESCE(sal + comm, sal)
FROM emp;
En este ejemplo se evalúa la suma del salario y la comisión de cada empleado. Si el resultado es distinto
de NULL, se devuelve dicho resultado. Si el resultado es NULL (debido a que la comisión del empleado
es NULL), se evalúa el salario de cada empleado y se devuelve ese valor.
COALESCE(<expr1>, <expr2>, …) es una expresión, y por tanto se puede usar en cualquier sitio donde se
espere una expresión, por ej:
El estándar indica que la expresión no puede ser una subconsulta ni una expresión
con una función colectiva (no se puede anidar funciones colectivas).
Aunque algunos SGBD sí permiten un nivel de anidamiento.
Funciones Colectivas
Si se incluye una función de agrupamiento en la cláusula SELECT todas las expresiones
en dicha cláusula deben tener un valor único para el conjunto de las filas.
Esta expresión (una Esta expresión sólo devuelve
columna en el resultado) un valor
devuelve 14 valores
select ename, sum(sal)
from emp;
No se puede construir una tabla resultado con una columna de 14 valores y otra
columna con sólo un valor. La tabla tiene una bolsa de filas, y cada fila tiene que tener
un valor (o un nulo) para cada una de las columnas (2 en este ejemplo).
El propio SGBD da un error:
select ename, sum(sal)
2 from emp;
select ename, sum(sal)
*
ERROR en línea 1:
ORA-00937: la función de grupo no es de grupo único
Funciones Colectivas
Las funciones colectivas eliminan (casi siempre) los nulos antes de realizar su
operación.
select comm, mgr select sum(comm), count(mgr)
from emp; from emp;
1 nulo y 13 distintos
10
de nulo
nulos
Funciones Colectivas
Se puede incluir un distinct dentro de cada función colectiva (es el único modo de
que pueda aparecer más de un distinct en una cláusula select).
<func>([ALL|DISTINCT]<expr>)
Cuenta (10,20,30)
Suma (10,20,30)
14 valores y 3
distintos (10,20,30)
Funciones Colectivas
La función count tiene pequeñas diferencias:
count([ALL] <expre>) cuenta cuántos valores distintos de nulo hay en la
columna correspondiente a <expre> en la tabla resultante.
count(DISTINCT <expre>) cuenta cuántos valores distintos de nulo y
distintos entre sí hay en la columna correspondiente a <expre> en la tabla
resultante.
count(*) cuenta cuántas filas hay en la tabla resultante (aún cuando las filas
sean todo nulos.
select * select count(col1), count(distinct col1), count(*)
from tabla; from tabla;
5 filas, 3 distintos de
nulo y 2 distintos
(1,2)
Ejercicios
1. Muestra cuántos empleados hay y a cuánto ascienden sus ingresos (sumando los
de todos e incluyendo salario y comisión) que sean SALESMAN o CLERK.
2. Cuántos empleados tienen comisión, cuántos no tienen comisión, a cuánto
asciende el salario medio, y cuánto asciende la comisión media.
3. Empleados con un nombre de más de 5 letras.
4. Cuántos empleados trabajan para los departamentos 20 y 30, y cuántos trabajos
distintos se desempeñan en esos departamentos.
5. Cuántos empleados tienen jefe, cuántos son jefes y cuántos no son jefes.
6. Cuántos son los ingresos (salario más comisión) medios de los empleados
contratados después del 01-08-1981.
Ejercicios
1. Select count(*),sum(sal+coalesce(comm,0)) 2. Select count(comm), count(*)-count(comm),avg(sal), avg(comm)
from emp from emp
where job in (‘SALESMAN’,’CLERK’)
6. select avg(coalesce(sal+comm,sal))
from emp
where hiredate >'01-08-1981'
Guion
Introducción
Conceptos previos
Sentencia Select
Distinct
Order by
Predicados
Funciones
Group by
Having
Join
Subconsultas
Composición de consultas
Group by
Hasta ahora, las funciones de agrupamiento actuaban sobre el conjunto de las filas
que le llegan a la cláusula select.
En lugar de aplicar las funciones colectivas sobre todas las filas, éstas se pueden
agrupar, formando más de un grupo de filas, y entonces aplicar las funciones sobre
cada uno de esos grupos.
Esos grupos se crean indicando una o más columnas de agrupamiento, así los grupos
de filas están formados por todas las filas que tienen el mismo valor en las columnas
de agrupamiento.
En el resultado, habrá una fila por cada uno de estos grupos.
SELECT …
FROM …
[WHERE …]
[GROUP BY <columna1>[,<columna2>,...]
Cierto
Falso
Cierto
Cierto
Falso
Having
En el predicado de un having se puede utilizar todas herramientas usadas en los
predicados where: todos los predicados, subconsultas, etc.
Pero hay que tener cuidado con las expresiones que se incluyan: éstas sólo pueden
contener constantes, funciones (incluyendo las colectivas) aplicadas sobre cualquier
columna, pero, fuera de funciones colectivas, sólo pueden aparecer las columnas de
agrupamiento. SELECT job, count(*), sum(sal)
FROM emp
GROUP BY job
HAVING sal > 1500
¿3000>1500?
El predicado se aplica UNO A UNO a cada uno de los
¿800>1500? grupos de filas.
¿2450>1500?
¿5000>1500?
¿1250>1500?
Having
Orden de ejecución en la sentencia select:
1. FROM
2. WHERE
3. GROUP BY
4. HAVING
5. SELECT
6. ORDER BY
Having
La condición where se aplica a filas
La condición having se aplica a grupos de filas
SELECT deptno, count(*), sum(sal)
FROM emp
WHERE sal > 1450 Primer paso
GROUP BY deptno
HAVING count(*)>2
Having
La condición where se aplica a filas
La condición having se aplica a grupos de filas
SELECT deptno, count(*), sum(sal)
FROM emp
WHERE sal > 1450 Segundo paso
GROUP BY deptno
HAVING count(*)>2
Falso
Cierto
Having
La condición where se aplica a filas
La condición having se aplica a grupos de filas
SELECT deptno, count(*), sum(sal)
FROM emp
WHERE sal > 1450 Tercer paso
GROUP BY deptno
HAVING count(*)>2
Having
La condición where se aplica a filas
La condición having se aplica a grupos de filas
SELECT deptno, count(*), sum(sal)
FROM emp
WHERE sal > 1450 Cuarto paso
GROUP BY deptno
HAVING count(*)>2
Falso
Cierto
Cierto
Having
La condición where se aplica a filas
La condición having se aplica a grupos de filas
SELECT deptno, count(*), sum(sal)
FROM emp
WHERE sal > 1450 Quinto paso
GROUP BY deptno
HAVING count(*)>2
Ejercicios
1. Para cada departamento muestra cuántos empleados tienen unos ingresos
(sal+comm) superiores a 2500 €.
2. Muestra los departamentos con unos ingresos medios superiores a los 2500 €.
Muestra para cada uno, cuántos empleados tienen.
3. Departamentos con al menos dos ‘MANAGER’
4. Departamentos con al menos dos empleados con comisión. Para cada
departamento muestra cuántos empleados tiene (en total) y cuántos con
comisión.
5. Departamentos con al menos dos empleados con el mismo puesto de trabajo. No
puede aparecer repetidos.
Ejercicios
1. Select deptno, count(*) 2. Select deptno, count(*)
from emp from emp
where coalesce(sal+comm,sal)>2500 group by deptno
group by deptno having avg(coalesce(sal+comm,sal))>2500
El más normal es este: que obtiene, del producto cartesiano, las filas que hacen cierta
la condición de join
SELECT …
FROM <tabla1> [INNER] JOIN <tabla2>
ON <condición de join>
Y lo más normal es que la condición de join sea una igualdad entre una clave foránea
y una clave primaria. Por ej.
SELECT *
FROM emp JOIN dept
ON [Link]=[Link]
EMP DEPT
EMP DEPT
Sólo es necesario desambiguar en los nombres de columna que aparecen en las dos tablas.
JOIN
Recordar los pasos
1. FROM(obligatoria)
Partiendo de una o más tablas obtiene una única tabla que será procesada por el
resto de cláusulas
2. WHERE (optativa)
3. GROUP BY (optativa)
4. HAVING (optativa)
3. SELECT (obligatoria)
4. ORDER BY (optativa)
Así, que todo lo visto hasta ahora funciona igual, porque el FROM es lo primero que se
ejecuta, y devuelve una única tabla.
JOIN
Primer paso
SELECT ename, [Link], dname
FROM emp E JOIN dept D
ON [Link]=[Link]
WHERE coalesce(comm,0)+sal>2500
JOIN
SELECT ename, [Link], dname
FROM emp E JOIN dept D
ON [Link]=[Link]
WHERE coalesce(comm,0)+sal>2500
Segundo paso
Tercer paso
JOIN
Se puede usar más de una copia de una misma tabla.
SELECT [Link] subordinado, [Link], [Link], [Link] jefe
FROM emp s JOIN emp j ON [Link]=[Link]
JOIN
La condición de join puede ser cualquier predicado.
SELECT [Link], [Link], [Link], [Link] SELECT [Link] sub, [Link], [Link] jefe, [Link]
FROM emp a JOIN emp b ON [Link]>[Link] FROM emp s JOIN emp j
ON [Link]=[Link] AND [Link]>[Link]
…
JOIN
Recalcamos que en el resultado, están las filas (del producto cartesiano) que cumplen
la condición de join.
SELECT *
FROM emp JOIN dept
ON [Link]=[Link]
Podemos forzar a que las filas de una (o de las dos) tabla de entrada que en el INNER
join no aparecen por no hacer cierta la condición de join, salgan rellenando las
columnas del otro lado con nulos.
SELECT *
FROM emp RIGHT JOIN dept Vamos forzar que salgan las filas del lado derecho que no salen en el INNER
ON [Link]=[Link]
Las filas del lado
derecho que
“emparejan”,
salen igual que
en el INNER join
Encaje “normal”
Encaje “normal”
Esto NO ES CORRECTO!!
Join de más de dos tablas
SELECT ename, pname, hours
FROM emp e JOIN emppro ep ON [Link]=[Link]
JOIN pro p ON [Link]=[Link]
Primer paso
emp emppro
Join de más de dos tablas
SELECT ename, pname, hours
FROM emp e JOIN emppro ep ON [Link]=[Link] Segundo paso
JOIN pro p ON [Link]=[Link]
Dicho de otro modo, la subconsulta devuelve una tabla con una fila y una columna. Por
lo tanto es equivalente a escribir una expresión literal (una constante).
Este es el único tipo de subconsulta válida con predicados elementales.
SELECT *
ERROR en línea 3:
FROM emp
ORA-01427: la subconsulta
WHERE deptno = (SELECT deptno
de una sola fila devuelve
FROM dept
más de una fila
WHERE dname IN (‘SALES',‘RESEARCH'))
Subconsultas
La subconsulta puede usar todas las herramientas usadas hasta el momento, por ej:
SELECT *
FROM emp
WHERE sal > (SELECT AVG(sal)
FROM emp
WHERE deptno=10)
Si usamos un predicado IN, la subconsulta puede devolver más de una fila. En tal
caso, la subconsulta, ya no se considera una expresión.
La subconsulta debe devolver una tabla de sólo una columna.
SELECT *
FROM emp
WHERE deptno IN(SELECT deptno
FROM dept
WHERE loc IN ('DALLAS','NEW YORK'))
Subconsultas
Es posible que la subconsulta devuelva más de una fila usando predicados
elementales si los operadores están cuantificados.
Los operadores ANY o SOME y ALL modifican el operador para que se pueda
comparar un valor escalar con una lista de valores (una tabla de una sola columna)
... <expre> operador_comparacion { ALL | SOME | ANY } (subconsulta)
Operadores de comparacion: < <= = != <> >= >
ANY, SOME: La expresión se compara con cada uno de los valores de la subconsulta y
si para alguno es verdadera, el resultado es verdadero.
ALL: La expresión se compara con cada uno de los valores de la subconsulta y si para
todos es verdadera, el resultado es verdadero.
SELECT * SELECT *
FROM emp FROM emp
WHERE sal > ANY(SELECT sal WHERE sal > ALL(SELECT sal
FROM emp FROM emp
WHERE deptno=10) WHERE deptno=10)
Ejercicios
1. Empleados que tienen un salario mayor al salario medio de la empresa
2. Para cada departamento mostrar cuántos empleados tiene que ganen más del
salario medio de la empresa. Muestra el nombre del departamento.
3. Empleados que son jefe. Muestra su nombre.
4. Empleados que no son jefe. Muestra su nombre.
5. Muestra el empleado/s (nombre) con el salario más alto.
6. Muestra el departamento (nombre) con la suma de salarios más alta.
7. Para los departamentos que tienen empleados con comisión, muestra cuántos
empleados tienen comisión, y cuántos no. Muestra nombre del departamento.
Ejercicios
1. Select empno, ename, sal 2. Select dname, count(*)
from emp from emp e join dept d on [Link]=[Link]
where sal > (Select avg(sal) from emp) where sal > (Select avg(sal) from emp)
group by [Link], dname
SELECT *
FROM emppro a Referencia a
WHERE hours = (SELECT MAX(hours) columna de la
FROM emppro consulta principal
WHERE prono=[Link])
Subconsultas correlacionadas
SELECT *
FROM emppro a
Para cada proyecto, ¿cuál es el empleado que
WHERE hours = (SELECT MAX(hours)
más horas trabaja
FROM emppro
WHERE prono=[Link])
SELECT MAX(hours)
FROM emppro
WHERE prono= 1001
WHERE 4 = 16
Ejecución de la
SELECT MAX(hours)
subconsulta
FROM emppro
para la fila en
WHERE prono= 1001
color rojo
WHERE 16= 16
Ejecución de la
SELECT MAX(hours)
subconsulta
FROM emppro
para la fila en
WHERE prono= 1001
color rojo
WHERE 15= 15
Ejecución de la
SELECT MAX(hours)
subconsulta
FROM emppro
para la fila en
WHERE prono= 1004
color rojo
WHERE 10= 15
Ejecución de la
SELECT MAX(hours)
subconsulta
FROM emppro
para la fila en
WHERE prono= 1004
color rojo
WHERE 6 = 12
Ejecución de la
SELECT MAX(hours)
subconsulta
FROM emppro
para la fila en
WHERE prono= 1005
color rojo
SELECT dname
FROM dept d
WHERE EXISTS (select *
from emp
where deptno=[Link])
Ejercicios
1. Muestra el empleado/s con el salario más alto de cada departamento.
2. Muestra el código del empleado/s que más horas trabajan en cada proyecto.
3. Muestra el nombre de empleado/s que más horas trabajan en cada proyecto
4. Muestra el nombre de empleado/s que más horas trabajan en cada proyecto.
Muestra también el nombre del proyecto.
5. Para cada departamento muestra su nombre y cuántos empleados de ese
departamento tienen un salario mayor al salario medio de su departamento.
6. Para cada departamento muestra su nombre y cuántos empleados ganan más que
su jefe.
7. Muestra los nombres de los departamentos sin personal asociado
Ejercicios
1. Select ename, deptno, sal 2. Select prono, empno, hours
from emp e from emppro ep
where sal= (Select max(sal) from emp where hours= (Select max(hours) from emppro
where deptno=[Link]) where prono=[Link])