b3t4 - SQL Flashcards
Que tipo de lenguaje es el Sql? Generacion y delcararivo/imperativo
Es un lenguaje de 4gl (4º generación) declarativo + una extensión procedural
Cuál es el standar ISO de SQL?
ISO 9075
Antes era ANSI-86 y luego ANSI-92
Cuál fué la versión del standar SQL que ya incluyó SQL3 con triggers?
SQL3
ISO9075 - SQL:1999
Cuál es la última versión del stadar de SQL?
ISO9075 - SQL:2016 (compatibilidad con json)
Qué es SQL/PSM?
Persistent Stored modules: Es la extensión del standar ISO9075 de SQL que es el lenguaje procedural en lugar de declarativo, que se usa en los procedimientos almacenados
Por ejemplo el Oracle PL/SQL o Sybase Transact-SQL está derivado de este standar
Qué es SQLite?
Es un formato de ficheros y una librería que usa ese fichero y que entiende el estandar SQL y transacciones sobre ese fichero. Es para uso local, no es cliente-servidor. Se usa en Android
Qué son cada uno de estos sublenguajes de SQL?
DDL
DML
DCL
DDL -> Data Definition Languaje -> Creación, borrado, eliminarción de objetos
DML -> Data Manipulation Languaje -> consulta/borrado/modificación/inserción de datos
DCL -> Data Control Languaje -> Control sobre permisos, transacciones, etc … -> Dentro está el TCL (Transaction Control Languaje)
Sentencias de DML
SELECT
UPDATE
INSERT
DELETE
MERGE
TRUNCATE *
SELECT (joins, agrupaciones, consultas)
UPDATE
INSERT
DELETE
MERGE -> mezcla de registros de una tabla sobre otra
TRUNCATE -> (es DML o DDL) -> borra los datos de una tabla. Sin tener en cuenta las transacciones
Sentencias de DDL
CREATE
DROP
ALTER
TRUNCATE*
CREATE -> crear
DROP -> borrar
ALTER -> modificar
TRUNCATE -> (es DML o DDL) -> borra los datos de una tabla. Sin tener en cuenta las transacciones
+
TABLE
INDEX
VIEW
PROCEDURE
SEQUENCE
FUNCTION
TYPE -> tipos compuestos de datos
TRIGGER
DOMAIN -> dominio de valores
SCHEMA -> una forma de agrupar tablas para subsistemas funcionales
ROLE -> para asignar permisos y funcionalidades a ese rol. El rol se asigna a usuarios
Sentencias de DCL
CALL procedure
GRANT
REVOKE
COMMIT/ROLLBACK
SAVEPOINT
SET TRANSACTION / START TRANSACTION
CALL procedure -> para llamar a procedimientos almacenados
GRANT -> dar permisos
REVOKE -> quitar permisos
TCL —————
COMMIT/ROLLBACK -> confirmar o deshacer los cambios en una transacción
SAVEPOINT -> poner un savepoint, para que si se hace rollback sólo se deshace a partir del savepoint /RELEASE SAVEPOINT (para quitar el savepoint)
SET TRANSACTION / START TRANSACTION -> Configurar e iniciar una transacción
Mirar cómo se hacen en los distintos gestores de bbdd (oracle, mysql, postgres, sqlserver)
create index
create view
call
funciones de fechas y cadenas
Constraints
CHECK
PRIMARY KEY
UNIQUE
FOREIGN KEY
CHECK -> establecer condiciones que ha de cumplir el valor del campo
PRIMARY KEY
UNIQUE -> admite 1 solo null en toda la columna
FOREIGN KEY
Sintaxis de CREATE y las distintas CONSTRAINT
CREATE TABLE nombre-tabla (campo1 CHAR(4) not null, campo 2 INT, …),
CONSTRAINT nombre-constraint PRIMARY KEY (campo key),
CONSTRAINT nombre-constraint FOREIGN KEKY (campo fk) REFERENCES tabla_referenciada (campo_referenciado),
CONSTRAINT nombre-constraint UNIQUE (campo),
CONSTRAINT nombre-constraint CHECK (condición o exp regular)
Sintaxis ALTER TABLE, y sus distintas opciones para
añadir columna
modificar columna
eliminar columna
añadir restriccion
ALTER TABLE nombre_tabla ADD COLUMN nombre_col tipo_dato atributos
ALTER TABLE nombre_tabla ALTER COLUMN nombre_col SET DEFAULT/SET NOT NULL/SET DATA TYPE tipo dato
ALTER TABLE nombre_tabla DROP COLUMN nombre_col
ALTER TABLE nombre_tabla ADD CONSTRAINT…
Sintáxis de GRANT
GRANT tipo-privilegio ON objeto TO destinatario-privilegio [WITH GRANT OPTIONS]
- tipo privilegio: (SELECT, UPDATE, INSERT, DELETE, REFERENCES (para poder hacer fks)) + columnas, ALL, USAGE (ej. secuencia), EXECUTE
- objeto: tabla, vista, …
- destinatario-privilegio: usuario, rol
- WITH GRANT OPTIONS: para que el destinatario del permiso también pueda darlo a otros. Delegación de permisos
Sintáxis REVOKE
REVOKE privilegio ON objeto FROM destinatario-privilegio
En qué consisten los siguentes niveles de aislamiento que se pueden configurar en un monitor de transacciones de una base de datos?
READ UNCOMMITED
READ COMMITED
REPEATABLE READ
SERIALIZABLE
READ UNCOMMITED -> (lectura no confirmada) se permite leer los datos de las transacciones no comiteadas
READ COMMITED -> (lectura confirmada) solo se pueden leer los datos de transacciones comiteadas
REPEATABLE READ (lectura repetible)-> no permite durante una transacción que otra transacción haga commits, mediante bloqueos de registro
SERIALIZABLE (serializable)-> todas las transacciones una detrás de otra, no da problemas de concurrencia, es que peor rendimiento tiene
Ver el vídeo para entender los niveles de las transacciones
https://www.youtube.com/watch?v=ky7zUJwfWQc
Qué son los problemas de concurrencia siguientes y a qué niveles de aislamiento de transacciones afecta?
Lectura sucia
Lectura no repetible
Lectura fantasma
Lectura sucia -> Cuando se permite leer los datos no comiteados de otra transacción
Lectura no repetible -> Ocurre cuando a lo largo de una transacción, la misma lectura que se haga varias veces y de datos distintos, porque entre una lectura y otra haya comiteado otra transacción
Lectura fantasma -> Cuando en la lectura se leen un rango de registros, y no se puede solucionar por bloqueos porque no se pueden bloquean rangos, si otra transacción inserta, modifica, etc … ya hay lectura fantasma
Sintaxis INSERT
INSERT INTO tabla (col1, col2,…) VALUES (valor1, valor2…)
Se puede hacer un INSERT a partir de los datos de una sélect
INSERT INTO tabla (col1, col2,…) SELECT …
Sintáxis UPDATE
UPDATE tabla SET col1 = valor, col2=valor WHERE …
Sintáxis DELETE
DELETE FROM tabla WHERE condiciones
Sintáxis SELECT
Qué tres usos tienen las subconsultas?
where [NOT] EXISTS (subconsulta) -> da true/false si la subconsulta devuelve resultados o no
where col1 [NOT] IN (subconsulta) -> da true si el campo está (o no si se pone NOT) en la subconsulta
where col1 [operador =, >=, < …] ANY/SOME/ALL (subconsulta) -> compara el campo con otros de la subconsulta
Qué hacen a alto nivel los distintos tipos de join?
CROSS JOIN
INNER JOIN
LEFT [OUTER] JOIN
RIGHT [OUTER] JOIN
FULL [OUTER] JOIN
https://zbrain-academy.es/pluginfile.php/76122/mod_resource/content/1/SQL_Joins.pdf
CROSS JOIN -> producto cartersiano, todos por todos
INNER JOIN -> solo coincidentes
LEFT [OUTER] JOIN -> tabla izquierda, completando con los que coincida de la derecha, los que no coincidan los rellena a null en la derecha
RIGHT [OUTER] JOIN -> tabla derecha, completando con los que coincida de la izquierda, los que no coincidan los rellena a null en la izquierda
FULL [OUTER] JOIN -> left join + right join
Qué es el EXPLAIN PLAN de Oracle?
Sentencia que muestra el plan de ejecución de Oracle de operaciones para ejecutar internamente una sentencia SELECT, UPDATE, INSERT o DELETE
Qué hace la sentencia UNION? Y UNION ALL?
Operador de conjuntos como EXCEPT, INTERSEC
Lo que hace es unir distintas selects compatibles (que sacan las mismas columnas), eliminando las repetidas
UNION ALL deja las duplicadas
Qué hace y cuál es la sintaxis de la sentencia MERGE?
Sirve para, en una sola sentencia, comparar dos tablas, una source y una target por un campo, y especficicar acciones INSERT, UPDATE o DELETE en la tabla source en función de esa comparación.
MERGE INTO < tablaobjetivo> AS obj
USING < tablafuente> AS fuente
ON < clausula coincidencia>
WHEN MATCHED [ AND < clausula >]
THEN < codigo >
WHEN NOT MATCHED [BY TARGET] [AND < clausula >]
THEN INSERT…
WHEN NOT MATCHED BY SOURCE [AND < clausula >]
THEN < codigo>
[OUTPUT …]
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
MERGE INTO <tablaObjetivo> : Define la tabla a la cual le realizaremos las operaciones INSERT, UPDATE, o DELETE.
**USING** <tablaFuente>: Define la tabla de la cual provienen los datos, aunque también se puede utilizar un CTE o tabla derivada entre algunas otras opciones. Lo más común es utilizar una tabla.
**ON** <clausula>: Define la cláusula utilizada para encontrar las coincidencias entre ambas tablas, fuente y destino, muy parecido al ON de un JOIN.
**WHEN MATCHED** [ AND <clausula>] THEN <codigo>: Se utiliza cuando existen coincidencias a través de la cláusula ON, por lo tanto la acción INSERT no está permitida; es posible utilizar 2 cláusulas WHEN MATCHED, una para utilizar la acción **UPDATE** y otra para la acción **DELETE**, la única condicionante es que deben tener filtros si se utilizan ambas, esto se los explicaré con ejemplos posteriormente.
**WHEN NOT MATCHED** [BY TARGET] [AND <clausula>] THEN INSERT... Se utiliza cuando una fila existe en la fuente pero no en el destino, por lo tanto la única operación permitida es un INSERT.
**WHEN NOT MATCHED BY SOURCE** [AND < clausula >] THEN <codigo> Es el caso contrario a la cláusula anterior, cuando la fila existe en la tabla destino pero no en la fuente, no se puede aplicar una operación INSERT pero si UPDATE y DELETE, también se puede declarar dos cláusulas de este tipo al igual que la claúsula WHEN MATCHED, con la misma condicionante que deben tener filtros.
**OUTPUT** Se pueden obtener los datos insertados, eliminados y actualizados por medio de las palabras reservadas inserted y deleted, esto lo expliqué en otro en la publicación CLAUSULA OUTPUT( inserted, deleted ) SIN TRIGGERS.</codigo></clausula></codigo></clausula></clausula></tablaFuente></tablaObjetivo>
Qué hace y cuál es la sentencia sql TRUNCATE?
TRUNCATE borra los datos de una tabla y deja la estructura
Es un borrado rápido, saltándose los mecanismos de integridad, hace commit automático al terminar, no se puede hacer rollback
Normalmente consiste en borrar páginas enteras de bbdd. Pero en MySQL hace un drop y un create seguidos en lugar de eso
Cuál es la sintáxis de los TRIGGER?
Se ejecuta cuando ocurre el evento indicado sobre determinados objetos
Usa dos pseudotablas para usar datos de antes y después en las sentencias del cuerpo del trigger (INSERT… old.campo1…)
- Oracle: OLD/NEW
- SQLServer: INSERTED/DELETED
CREATE TRIGGER nombre-trigger
[BEFORE/AFTER/INSTEAD OF] [DELETE/INSERT/UPDATE]
ON tabla FOR EACH [ROW/STATEMENT]
WHEN condiciones
BEGIN
sentencias insert, update, delete…
END;
INSTEAD_OF*: Sirve para anular la sentencia disparadora y solo tiene efecto el trigger
Qué son y qué sintaxis tienen los PROCEDURE de sql?
Lógica de negocio que se ejecuta (CALL) en el ámbito del SGBBDD
Acepta parámetros (entrada, salida, entrada/salida) pero a diferencia de las funciones, no retornan valor
CREATE PROCEDURE nombre-procedure
[param1 IN/OUT/IN OUT tipo-parametro, …]
LANGUAGE
IS
–declaración de variables locales
BEGIN
.. se hacen select, updates, etc…
hay CURSORES que recorren los resultados de una select
se usan elementos de programación FOR, IF, CASE, …
COMMIT;
END;
$$
Hacer ejercicios de SQL
https://www.w3resource.com/sql-exercises/
el count() de sql, cuenta los null?
No
Para qué sirve en sql la cláusula HAVING? Un ejemplo de uso
SELECT postalCode, count(CustomerId) FROM Customers group by postal Code HAVING count(CustomerId)>1;
Qué dos comandos permiten usar un condicional para para mapear un valor a devolver por una select, a otro
Existen DECODE, que sólo se puede usar para condicionales de igualdad, y CASE que permite condicionales más complejos
Ejemplo de DECODE:
SELECT Nombre,
DECODE(Precio,
0, ‘Sin Precio’,
10, ‘Bajo’,
50, ‘Medio’,
‘Alto’) AS Categoria
FROM Productos;
Ejemplo de CASE
SELECT IdProceso, CASE idFormaAcceso WHEN ‘L’ THEN ‘Ingreso Libre’ WHEN ‘P’ THEN ‘Promoción Interna END as FormaAcceso FROM Proceso
qué significa en ORACLE “from dual”?
En la sentencia FROM dual, “dual” es una tabla especial de Oracle que consta de una sola fila y una sola columna. Es utilizada en consultas cuando no se necesita acceder a una tabla real, pero se requiere una cláusula FROM para que la consulta sea sintácticamente válida.
¿Cual es la utilidad de un TABLESPACE en Oracle?
Agrupar objetos como tables, indices, etc y asociarse con una serie de ficheros de datos (datafiles)
La operación de diferencia de conjuntos del álgebra relacional se realiza en ANSI/SQL mediante el operador:
EXCEPT.
En una transacción en un Sistema de Gestión de Bases de Datos (SGBD), ¿qué se entiende por el punto de integridad?
El estado de la base de datos en el momento en que se inicia la transacción.
Qué hacen los operadores de intersección
UNION
UNION ALL
INSERSEC
EXCEPT
UNION incluye la suma de los registros de las dos tablas, quitando duplicados
UNION ALL incluye la suma de los registros de las dos tablas, sin quitar duplicados
INSERSEC incluye sólo los registros que están en ambas tablas
EXCEPT incluye sólo los registros que están en la primera tabla, pero no están en la segunda. Es decir, los de la primera excepto los de la segunda.
Para qué sirve DISTINCT, y cómo es su sintáxis?
Sirve para filtrar filas duplicadas en el resultado de la select
La sitáxis es sin paréntesis, separando por comas los campos a los que afecta. Aunque pueda parecer que sólo afecta al primer campo, afecta a todos los que vayan después.
Trata los null como si fuesen duplicados unos de otros también
SELECT
DISTINCT column_1,
column_2,
column_3
FROM
table_name;
Los campos que pongas antes del DISTINCT no se ven afectados, sólo los de después
La solución de alta disponibilidad y recuperación ante desastres de un SGDB basado en Microsoft SQL server se denomina
AlwaysOn
diferencias entre data lake, data warehouse, data mart y data fog
A continuación, te explico las diferencias entre data lake, data warehouse, data mart y data fog:
- Data Lake:
Un data lake es un repositorio de almacenamiento centralizado donde se almacenan grandes cantidades de datos en bruto, tanto estructurados como no estructurados. Los datos se capturan de diversas fuentes y se mantienen en su formato original, sin una estructura o transformación predefinida. Esto permite un almacenamiento flexible y escalable de datos, que luego pueden ser procesados y analizados según sea necesario. Los data lakes suelen estar asociados con tecnologías como Hadoop y permiten el análisis de big data. - Data Warehouse:
Un data warehouse es una base de datos centralizada que recopila datos de varias fuentes, los transforma y los organiza en una estructura predefinida y coherente. El propósito principal de un data warehouse es proporcionar un almacenamiento optimizado y una estructura adecuada para el análisis de datos empresariales. Los datos en un data warehouse suelen estar limpios, integrados y listos para su uso en informes, análisis y toma de decisiones empresariales. - Data Mart:
Un data mart es una versión más específica y enfocada de un data warehouse. Se centra en un área particular del negocio o en un conjunto de usuarios específicos. Un data mart se deriva del data warehouse y está diseñado para satisfacer las necesidades de información de un grupo de usuarios más limitado. Contiene una selección de datos relevantes y preprocesados del data warehouse que son específicos para un departamento o área funcional en particular. - Data Fog:
El término “data fog” no es tan común como los anteriores. Sin embargo, en el contexto de la computación en el borde (edge computing), el concepto de data fog se refiere a la distribución y procesamiento de datos en dispositivos o servidores cercanos al punto de generación de los datos. Mientras que el edge computing se refiere al procesamiento en el borde de la red, el data fog se centra específicamente en los datos y cómo se gestionan y procesan en entornos distribuidos y descentralizados. Es similar al concepto de edge computing, pero con un enfoque más específico en la gestión y procesamiento de datos en la periferia de la red.
En resumen, un data lake es un repositorio de almacenamiento centralizado de datos en bruto, un data warehouse es una base de datos centralizada y estructurada para análisis empresariales, un data mart es una versión más específica de un data warehouse orientada a un grupo de usuarios particular, y el data fog se refiere al procesamiento de datos distribuido en entornos descentralizados, como parte del enfoque de edge computing.
Cómo usar una subselect en las cláusulas SELECT, FROM Y WHERE de una consulta SQL
Puedes utilizar una subconsulta en distintas cláusulas de una sentencia SELECT
en SQL para realizar cálculos o filtrar datos basados en los resultados de la subconsulta. Aquí tienes algunos ejemplos de cómo puedes hacerlo:
- Subconsulta en la cláusula
SELECT
:
Puedes usar una subconsulta en la cláusulaSELECT
para obtener un valor específico basado en los datos de otras tablas o subconjuntos de datos. Por ejemplo:
```sql
SELECT nombre, (SELECT COUNT(*) FROM pedidos WHERE id_cliente = clientes.id_cliente) AS cantidad_pedidos
FROM clientes;
~~~
En este caso, la subconsulta (SELECT COUNT(*) FROM pedidos WHERE id_cliente = clientes.id_cliente)
cuenta la cantidad de pedidos para cada cliente en la tabla “pedidos”, y esa cantidad se muestra en una columna adicional llamada “cantidad_pedidos” en el resultado de la consulta principal.
- Subconsulta en la cláusula
FROM
(Tabla derivada o tabla virtual):
Puedes utilizar una subconsulta en la cláusulaFROM
para crear una tabla derivada o tabla virtual, que luego puedes usar como si fuera una tabla real en el resto de la consulta. Por ejemplo:
```sql
SELECT c.nombre, p.total_monto
FROM clientes c
INNER JOIN (SELECT id_cliente, SUM(monto) AS total_monto FROM pedidos GROUP BY id_cliente) p
ON c.id_cliente = p.id_cliente;
~~~
En este caso, la subconsulta (SELECT id_cliente, SUM(monto) AS total_monto FROM pedidos GROUP BY id_cliente)
calcula la suma total de montos de pedidos por cliente y crea una tabla virtual “p” que se utiliza en la cláusula JOIN
para obtener la suma de montos de pedidos para cada cliente.
- Subconsulta en la cláusula
WHERE
:
Puedes utilizar una subconsulta en la cláusulaWHERE
para filtrar datos basados en los resultados de la subconsulta. Por ejemplo:
```sql
SELECT nombre, edad
FROM personas
WHERE edad > (SELECT AVG(edad) FROM personas);
~~~
En este caso, la subconsulta (SELECT AVG(edad) FROM personas)
calcula la edad promedio de todas las personas y la consulta principal muestra el nombre y la edad de las personas cuya edad es mayor que la edad promedio.
Estos son solo algunos ejemplos de cómo puedes utilizar una subconsulta en diferentes cláusulas de una sentencia SELECT
en SQL. Las subconsultas son una herramienta poderosa que te permite realizar cálculos complejos o combinar datos de diferentes tablas para obtener resultados más precisos o detallados.
Ámbito de accesibilidad a tablas de la consulta principal desde las subconsultas. Leer
El acceso de una subconsulta a las tablas de la consulta principal depende de si la subconsulta es correlacionada o no correlacionada y de cómo están estructuradas las cláusulas en la consulta. El concepto clave que define la accesibilidad es el ámbito (scope) de las tablas.
- Subconsultas no correlacionadas:
En una subconsulta no correlacionada, la subconsulta se ejecuta de forma independiente de la consulta principal y, por lo tanto, no tiene acceso directo a las tablas de la consulta principal. La subconsulta es evaluada solo una vez, y el resultado se utiliza en la consulta principal como un valor escalar o un conjunto de resultados. Estas subconsultas no necesitan hacer referencia a las tablas de la consulta principal y se evalúan por separado.
Ejemplo de subconsulta no correlacionada:
```sql
SELECT nombre, (SELECT SUM(monto) FROM pedidos) AS total_monto
FROM clientes;
~~~
En este ejemplo, la subconsulta (SELECT SUM(monto) FROM pedidos)
es no correlacionada y se evalúa de manera independiente. No hace referencia a ninguna tabla de la consulta principal.
- Subconsultas correlacionadas:
En una subconsulta correlacionada, la subconsulta se ejecuta para cada fila de la consulta principal. En este caso, la subconsulta tiene acceso a las tablas de la consulta principal y puede referenciarlas utilizando alias o nombres de tabla completos para evitar ambigüedades. La subconsulta utiliza valores de la fila actual de la consulta principal en su lógica de filtrado o cálculos.
Ejemplo de subconsulta correlacionada:
```sql
SELECT nombre, (SELECT SUM(monto) FROM pedidos WHERE id_cliente = clientes.id_cliente) AS total_monto
FROM clientes;
~~~
En este ejemplo, la subconsulta (SELECT SUM(monto) FROM pedidos WHERE id_cliente = clientes.id_cliente)
es correlacionada, y se ejecuta para cada cliente en la tabla “clientes”. La subconsulta hace referencia a la tabla “clientes” utilizando el alias “clientes” y utiliza el valor actual de “id_cliente” de la fila de la consulta principal en su cláusula WHERE
.
El ámbito de una subconsulta correlacionada se extiende a la consulta principal, lo que significa que la subconsulta puede acceder a las tablas de la consulta principal y utilizar valores de las filas actuales de la consulta principal para filtrar o calcular resultados.
Es importante tener en cuenta que el uso de subconsultas correlacionadas puede tener un impacto significativo en el rendimiento, ya que la subconsulta se ejecutará múltiples veces (una vez por cada fila de la consulta principal). Por lo tanto, es recomendable usar subconsultas no correlacionadas cuando sea posible, para evitar repeticiones innecesarias de la misma consulta.
Formas de referenciar en un ORDER BY a los campos
En la cláusula ORDER BY
, hay varias formas distintas de referenciar a los campos o expresiones por los que se desea ordenar los resultados de una consulta. Aquí tienes algunas de las formas más comunes de hacerlo:
- Ordenar por nombre de columna:
Puedes simplemente utilizar el nombre de una columna existente en la tabla para ordenar los resultados en función de ese campo.
Ejemplo:
```sql
SELECT nombre, edad, salario
FROM empleados
ORDER BY nombre;
~~~
- Ordenar por posición de columna:
En lugar de usar el nombre de la columna, puedes usar la posición numérica de la columna en la listaSELECT
para ordenar los resultados.
Ejemplo:
```sql
SELECT nombre, edad, salario
FROM empleados
ORDER BY 1; – Ordena por la primera columna en la lista SELECT (nombre)
~~~
- Ordenar por alias de columna:
Si utilizas un alias para renombrar una columna en la listaSELECT
, puedes usar ese alias en la cláusulaORDER BY
.
Ejemplo:
```sql
SELECT nombre AS nombre_completo, edad, salario
FROM empleados
ORDER BY nombre_completo;
~~~
- Ordenar por expresión:
Puedes utilizar una expresión en la cláusulaORDER BY
, que puede ser una combinación de columnas, funciones o constantes.
Ejemplo:
```sql
SELECT nombre, edad, salario
FROM empleados
ORDER BY edad * 2 + salario DESC;
~~~
En este ejemplo, la consulta ordenará los resultados basándose en la expresión edad * 2 + salario
en orden descendente.
- Ordenar por múltiples campos:
Puedes ordenar los resultados por múltiples campos en un orden específico, proporcionando una lista de campos separados por coma en la cláusulaORDER BY
.
Ejemplo:
```sql
SELECT nombre, edad, salario
FROM empleados
ORDER BY edad DESC, salario ASC;
~~~
En este ejemplo, la consulta ordenará primero por edad
en orden descendente y luego por salario
en orden ascendente.
Recuerda que el orden predeterminado es ascendente (ASC), por lo que si no especificas el tipo de orden (ASC o DESC), la consulta ordenará en orden ascendente. Para ordenar en orden descendente, debes agregar la palabra clave DESC
después del campo o expresión por el que deseas ordenar.
Uso de las funciones de agregación en las distintas cláusulas de una consulta
Las funciones de agregación, como SUM
, se pueden utilizar en diferentes cláusulas de una consulta SQL para realizar cálculos sobre conjuntos de datos y obtener resultados resumidos. Aquí tienes ejemplos de cómo se pueden usar las funciones de agregación en distintas cláusulas:
- Cláusula
SELECT
:
Las funciones de agregación se utilizan comúnmente en la cláusulaSELECT
para realizar cálculos sobre una columna o conjunto de columnas y devolver un valor resumido.
Ejemplo - Obtener la suma total de una columna:
```sql
SELECT SUM(monto) AS total_monto
FROM ventas;
~~~
- Cláusula
GROUP BY
:
Las funciones de agregación se utilizan junto con la cláusulaGROUP BY
para agrupar datos y realizar cálculos para cada grupo.
Ejemplo - Obtener la suma de ventas por categoría:
```sql
SELECT categoria, SUM(monto) AS total_ventas
FROM ventas
GROUP BY categoria;
~~~
- Cláusula
HAVING
:
La cláusulaHAVING
se utiliza para filtrar los resultados de una consulta después de aplicar la cláusulaGROUP BY
. Aquí, puedes usar funciones de agregación en combinación conHAVING
para aplicar condiciones a los grupos resultantes.
Ejemplo - Obtener las categorías con ventas totales mayores que 1000:
```sql
SELECT categoria, SUM(monto) AS total_ventas
FROM ventas
GROUP BY categoria
HAVING SUM(monto) > 1000;
~~~
Es importante tener en cuenta que, en la mayoría de los casos, cuando se utilizan funciones de agregación, se debe usar GROUP BY
para agrupar los datos según un criterio específico, a menos que se utilicen funciones de agregación en una consulta sin cláusula GROUP BY
, lo que devolverá un único resultado agregado para toda la tabla o conjunto de datos.
Ejemplo de BETWEEN
Uso de FETCH
El comando FETCH
se utiliza en SQL para recuperar un número específico de filas después de ejecutar una consulta, especialmente cuando la consulta devuelve un conjunto de resultados más grande y se necesita un control más preciso sobre cuántas filas recuperar. La cláusula FETCH
se usa comúnmente en combinación con la cláusula ORDER BY
para obtener un subconjunto de filas ordenadas.
Es importante mencionar que la sintaxis y la compatibilidad de FETCH
pueden variar entre diferentes sistemas de bases de datos. A continuación, te mostraré un ejemplo de cómo usar FETCH
en SQL, utilizando la sintaxis estándar de SQL:
Supongamos que tienes una tabla llamada “empleados” con las columnas “nombre” y “salario”, y deseas recuperar los 5 empleados con los salarios más altos:
```sql
SELECT nombre, salario
FROM empleados
ORDER BY salario DESC
FETCH FIRST 5 ROWS ONLY;
~~~
En este ejemplo:
- La consulta selecciona los campos “nombre” y “salario” de la tabla “empleados”.
- Utilizamos
ORDER BY salario DESC
para ordenar los resultados por el salario en orden descendente, lo que colocará los salarios más altos primero. - Luego, usamos
FETCH FIRST 5 ROWS ONLY
para limitar el resultado a las primeras 5 filas, es decir, los 5 empleados con los salarios más altos.
Es importante tener en cuenta que la cláusula FETCH
no es soportada en todos los sistemas de bases de datos. Algunos sistemas utilizan diferentes sintaxis, como LIMIT
o TOP
, para lograr resultados similares. Por lo tanto, es recomendable consultar la documentación específica de tu sistema de bases de datos para obtener la sintaxis correcta.