- Aprender
- Informática
- Programación
- Fundamentos de SQL
- Consultas con SELECT
Consultas con SELECT
PrincipianteUnidad 2 de 6 del curso Curso de Fundamentos de SQL
Lo que aprenderás
- Escribe consultas que lean las columnas elegidas de una tabla, comprende el conjunto de resultados que devuelven y enumera los valores distintos de una columna con DISTINCT.
- Escribe una consulta SELECT básicaIndica las columnas que quieres mostrar con SELECT y la tabla que quieres leer con FROM, sigue las reglas básicas de sintaxis y reconoce cómo será el resultado.
- Enumera valores distintos con DISTINCTElimina las filas repetidas de un resultado con SELECT DISTINCT y predice cuántas filas quedan, también cuando intervienen varias columnas o valores ausentes.
- Escribe una consulta SELECT básica
- Conserva solo las filas que responden a una pregunta mediante condiciones con operadores de comparación sobre números, texto y fechas, y combina condiciones con AND, OR y NOT.
- Compara números mediante operadores de comparaciónUtiliza WHERE con =, <>, <, >, <= y >= para seleccionar filas según sus valores numéricos y elige el operador adecuado para las palabras de la pregunta.
- Compara texto y fechas correctamenteEscribe los valores de texto y fecha con el formato correcto, predice cómo afectan a una comparación las mayúsculas y minúsculas, el orden alfabético y los formatos de fecha, y evita los errores habituales de comillas y fechas.
- Combina condiciones con AND, OR y NOTUne varias condiciones con AND y OR, invierte una condición con NOT y utiliza paréntesis para que la consulta compruebe exactamente lo que pide la pregunta.
- Compara números mediante operadores de comparación
- Escribe condiciones más breves y precisas con IN para listas de valores, BETWEEN para intervalos y LIKE para patrones de texto, incluidas sus formas con NOT y sus errores habituales.
- Busca coincidencias en una lista de valores con INUtiliza IN y NOT IN para conservar filas cuyo valor sea uno de los enumerados y comprende cómo interactúan las listas con AND y con los valores ausentes.
- Selecciona un intervalo con BETWEENUtiliza BETWEEN y NOT BETWEEN para intervalos de números, fechas y texto, teniendo en cuenta que se incluyen ambos extremos y cuándo eso provoca errores.
- Busca patrones de texto con LIKEEncuentra texto que empiece por, termine en o contenga determinados caracteres mediante LIKE con % y _, y gestiona la distinción entre mayúsculas y minúsculas, los comodines literales y los valores ausentes.
- Busca coincidencias en una lista de valores con IN
- Reconoce NULL como un valor ausente, encuéntralo con IS NULL e IS NOT NULL y predice cómo cambian los valores ausentes el resultado de cualquier otro tipo de condición.
- Encuentra valores ausentes con IS NULLDistingue NULL de cero y de una cadena vacía, y utiliza IS NULL e IS NOT NULL para encontrar filas donde un valor esté registrado o no.
- Predice cómo afecta NULL a las condicionesAplica la lógica trivalente (verdadero, falso, desconocido) a las comparaciones, AND, OR, NOT, IN, BETWEEN y LIKE, y decide si las filas con valores ausentes deben incluirse en una respuesta.
- Encuentra valores ausentes con IS NULL
- Ordena las filas del resultado de forma útil con ORDER BY, utiliza varias columnas gestionando empates y valores ausentes y devuelve las primeras filas o una página de filas con LIMIT y OFFSET.
- Ordena filas con ORDER BYOrdena un resultado por una columna en orden ascendente o descendente y predice cómo se ordenan los números, las fechas y el texto.
- Ordena por varias columnas y gestiona los empates y los valores NULLOrdena por más de una columna con una dirección para cada una, añade criterios de desempate para obtener un orden reproducible y controla dónde aparecen los valores ausentes.
- Obtén las primeras filas y páginas con LIMIT y OFFSETDevuelve las primeras filas de un resultado ordenado con LIMIT, omite filas con OFFSET para mostrar páginas posteriores y escribe la misma petición en otros dialectos SQL.
- Ordena filas con ORDER BY
- Combina todas las cláusulas en consultas correctas y legibles, comprende el orden de procesamiento de una consulta y convierte preguntas habituales en consultas cuyos resultados compruebas.
- Ordena las cláusulas y comprende cómo se ejecuta una consultaEscribe SELECT, FROM, WHERE, ORDER BY y LIMIT en el orden requerido y utiliza el orden lógico de procesamiento para predecir a qué datos puede acceder cada cláusula.
- Convierte una pregunta en una consulta y comprueba la respuestaConvierte paso a paso una pregunta habitual en una consulta sobre una sola tabla y comprueba después los límites, los valores ausentes, las mayúsculas y minúsculas y los empates del resultado.
- Ordena las cláusulas y comprende cómo se ejecuta una consulta
Guía de estudio de Consultas con SELECT
1Elige los datos que quieres mostrar
Una consulta útil empieza por elegir la tabla y las columnas que responden a tu pregunta. El resultado puede mostrar todos los registros, unos pocos campos de cada registro o una lista de valores distintos. Trabajarás con dos tablas pequeñas para poder relacionar cada resultado con los datos almacenados. Leer con atención los nombres de las columnas y distinguir el orden de las columnas del orden de las filas facilitará la comprensión de los filtros y las ordenaciones posteriores.
1.1 SELECT, FROM y la tabla de resultados
Una consulta pide datos a una base de datos. Una consulta SELECT sencilla lee la tabla almacenada sin modificarla. SELECT indica las columnas que se mostrarán y FROM indica la tabla que se leerá.
Los ejemplos de texto utilizan la comparación de igualdad habitual de SQLite y PostgreSQL, que distingue mayúsculas y minúsculas. La configuración de intercalación puede cambiar cómo se compara y ordena el texto.
Dos tablas para trabajar
La tabla employees tiene estas ocho filas. salary es el salario anual en u.m.; hire_date es texto con el formato YYYY-MM-DD. NULL marca un valor ausente.
| employee_id | first_name | last_name | department | city | salary | hire_date | phone |
|---|---|---|---|---|---|---|---|
| 1 | Ana | Lopez | Sales | Chicago | 52 000 | 2019-03-15 | 312-555-0147 |
| 2 | Ben | Carter | IT | Denver | 71 000 | 2021-07-01 | NULL |
| 3 | Chloe | Nguyen | Sales | Chicago | 48 000 | 2023-01-09 | 312-555-0198 |
| 4 | David | Kim | Marketing | Boston | 60 000 | 2020-11-23 | 617-555-0110 |
| 5 | Emma | Brown | Sales | Denver | 65 000 | 2018-05-30 | NULL |
| 6 | Farid | Haddad | IT | Chicago | 83 000 | 2017-09-12 | 312-555-0175 |
| 7 | Grace | Okafor | NULL | Boston | 45 000 | 2024-02-19 | 617-555-0133 |
| 8 | Hugo | O'Neill | Marketing | Chicago | 58 000 | 2022-08-05 | NULL |
La tabla products registra los precios en u.m. y las existencias en unidades del almacén.
| product_id | name | category | price | stock |
|---|---|---|---|---|
| 1 | Desk Lamp | Lighting | 24,99 | 40 |
| 2 | Floor Lamp | Lighting | 89,00 | 12 |
| 3 | Lamp Shade | Lighting | 15,50 | 0 |
| 4 | Office Chair | Furniture | 149,00 | 8 |
| 5 | Standing Desk | Furniture | 349,00 | 5 |
| 6 | Desk Organizer | Storage | 18,75 | 60 |
| 7 | Bookshelf | Furniture | 120,00 | NULL |
| 8 | Paper Tray | Storage | 9,99 | 25 |
Lee la estructura de la consulta
SELECT city, first_name
FROM employees;
El conjunto de resultados es otra tabla: ocho filas y dos columnas, con city primero. No hay ningún filtro, así que cada empleado aporta una fila. SQL no garantiza ningún orden de filas hasta que añadas ORDER BY.
SELECT * FROM products; muestra todas las columnas en el orden definido en la tabla. El asterisco resulta útil para explorar. En una consulta guardada, indicar los nombres de las columnas mantiene el resultado centrado en lo necesario e impide que una nueva columna de la tabla cambie su estructura.
Haz que la sintaxis sea legible
Separa las columnas con comas, sin una coma final antes de FROM. Termina la sentencia con punto y coma. Las palabras clave no distinguen mayúsculas y minúsculas, por lo que select funciona, pero las mayúsculas facilitan localizar las cláusulas. Los espacios y los saltos de línea separan palabras; no cambian el significado de esta consulta. Un comentario -- continúa hasta el final de su línea.
Los nombres deben corresponder al esquema. Si frist_name provoca un error de columna inexistente, compara su escritura con first_name. SQL estándar utiliza comillas dobles para los nombres que contienen espacios o palabras reservadas, como "order date". PostgreSQL convierte los nombres sin comillas a minúsculas, mientras que "City" solicita ese nombre exacto con mayúscula inicial. MySQL normalmente utiliza acentos graves; las comillas dobles identifican nombres en su modo ANSI_QUOTES. SQL Server también acepta corchetes y acepta comillas dobles cuando QUOTED_IDENTIFIER está activado, su configuración predeterminada.
Puntos clave
SELECTelige las columnas que se muestran;FROMidentifica su tabla.- Las columnas del resultado siguen la lista SELECT; el orden de las filas requiere
ORDER BY. SELECT *muestra todas las columnas; los nombres explícitos mantienen las consultas guardadas centradas en lo necesario.- Utiliza comas entre columnas y punto y coma para terminar una sentencia.
- Comprueba los nombres con el esquema y utiliza las reglas de la base de datos para delimitar identificadores con comillas.
1.2 Valores distintos y combinaciones distintas
Un valor repetido en el resultado de una consulta suele ser útil. Varios empleados pueden vivir en la misma ciudad y cada uno sigue necesitando una fila. Utiliza DISTINCT cuando la pregunta pida valores distintos o combinaciones distintas.
Elige qué debe contar como duplicado
SELECT DISTINCT city
FROM employees;
El resultado contiene Chicago, Denver y Boston, sin un orden garantizado. Un simple SELECT city devolvería ocho filas porque cada empleado aporta una ciudad. Añadir DISTINCT reduce lo mostrado a tres valores distintos. Los ocho registros de empleados permanecen almacenados.
La comparación incluye todas las columnas seleccionadas. Considera:
SELECT DISTINCT department, city
FROM employees;
Ana y Chloe aportan (Sales, Chicago), así que ese par aparece una sola vez. Emma aporta (Sales, Denver), que es distinto y se conserva. Los demás pares son (IT, Denver), (Marketing, Boston), (IT, Chicago), (NULL, Boston) y (Marketing, Chicago). Hay siete filas en el resultado. Los departamentos repetidos se mantienen porque un departamento asociado a otra ciudad constituye una fila de resultado distinta.
Escribe DISTINCT una sola vez, justo después de SELECT. Se aplica a toda la fila seleccionada. Colocarlo entre nombres de columna, como en SELECT department, DISTINCT city, es un error de sintaxis.
Presta atención a las columnas que incluyes
Si añades employee_id a las columnas seleccionadas, cada fila pasa a ser distinta. SELECT DISTINCT employee_id, city FROM employees; sigue devolviendo ocho filas: cada identificador es único, incluso cuando se repite la ciudad. Para responder «¿Qué ciudades tienen empleados?», selecciona solo la ciudad. Para responder «¿Qué empleados viven en cada ciudad?», conserva las columnas identificativas y espera que las ciudades se repitan.
En este paso de eliminación de duplicados, los NULL repetidos se tratan como duplicados. SELECT DISTINCT department FROM employees; devuelve Sales, IT, Marketing y una fila NULL. La fila NULL indica que falta un departamento; no es el nombre de un cuarto departamento. Esta regla de duplicados difiere de NULL = NULL, que da desconocido en un filtro.
Las comparaciones de texto siguen una intercalación, las reglas de la base de datos para buscar coincidencias y ordenar texto. Con las comparaciones habituales que distinguen mayúsculas y minúsculas utilizadas en estos ejemplos de SQLite y PostgreSQL, Chicago y chicago son valores distintos. Una lista con DISTINCT puede revelar diferencias en el uso de mayúsculas y minúsculas. Eliminar las repeticiones de lo mostrado no corrige la escritura de los datos almacenados.
Combina DISTINCT con una lista breve ordenada
SELECT DISTINCT city
FROM employees
ORDER BY city
LIMIT 2;
Primero desaparecen las ciudades duplicadas. Después se ordenan las tres ciudades. Por último, quedan dos filas de resultado: Boston y Chicago, en ese orden. Aplicar primero el límite a las filas de empleados respondería a otra pregunta.
En una consulta con DISTINCT, incluye las columnas de ordenación en la lista SELECT. PostgreSQL lo exige; SQLite permite algunas consultas que ordenan por una columna no seleccionada, pero elegir entre distintos valores ocultos hace que su ordenación sea difícil de interpretar. Si un resultado presenta repeticiones inesperadas, revisa qué columnas has seleccionado antes de decidir si la consulta necesita DISTINCT.
Puntos clave
DISTINCTelimina las filas completas duplicadas del resultado sin modificar las filas almacenadas.- Añadir columnas cambia qué filas cuentan como duplicadas; una clave única hace que todas las filas sigan siendo distintas.
- DISTINCT agrupa los NULL repetidos.
- Los duplicados se eliminan antes de limitar el resultado ordenado.
2Conserva las filas que responden a la pregunta
El filtrado convierte una tabla en una respuesta sobre registros concretos: un intervalo salarial, una ciudad o un grupo que cumple varias condiciones. Las pequeñas decisiones importan, como si un extremo cuenta y si deben cumplirse ambas condiciones. Las comparaciones numéricas, los valores de texto y fecha y la lógica agrupada tienen sus propias reglas. Una consulta puede ejecutarse correctamente y aun así plantear una pregunta equivocada, así que seguirás qué filas superan cada prueba.
2.1 Números y valores límite
La cláusula WHERE conserva una fila solo cuando su condición es verdadera. Se escribe después de FROM y puede comprobar cualquier columna de la tabla, incluida una que no muestres.
Relaciona las palabras con el operador
| Petición | Operador | Condición de ejemplo |
|---|---|---|
| Igual a | = | stock = 0 |
| Distinto de | <> | stock <> 0 |
| Más de | > | salary > 60000 |
| Al menos | >= | salary >= 60000 |
| Menos de | < | price < 20.50 |
| Como máximo | <= | price <= 20.50 |
<> es la forma de SQL estándar para «distinto de». Las cinco bases de datos tratadas aquí también aceptan !=. Utiliza un solo signo igual para la igualdad. SQLite acepta ==, pero PostgreSQL rechaza esa forma.
Sigue una fila situada en el límite
SELECT first_name, salary
FROM employees
WHERE salary > 60000;
Ben tiene 71 000, Emma tiene 65 000 y Farid tiene 83 000. Esas son las tres filas que cumplen la condición, sin un orden indicado. David gana exactamente 60 000. Su fila no cumple > 60000 porque «más de» excluye la igualdad.
Cambia solo el operador a >=. David se incorpora ahora al resultado, que pasa a tener cuatro filas. Así se distingue «al menos 60 000» de «más de 60 000». Una comprobación de límites útil pregunta qué ocurre con un valor exactamente igual al umbral; los valores muy superiores no permiten detectar ese error.
Para «como máximo 20,50», un precio de 20,50 cumple la condición y uno de 20,51 no. Cuando una petición indique un límite inferior y otro superior, comprueba cada extremo por separado antes de unir las pruebas.
Escribe los valores numéricos como números
Utiliza solo cifras en las condiciones SQL: 60000, sin separadores de millares ni símbolos monetarios. Una coma separa elementos de SQL; WHERE salary > 60,000 es un error de sintaxis. Los valores decimales utilizan un punto, como en WHERE price < 20.50. Los salarios y los precios deben estar en columnas numéricas para que las comparaciones utilicen su magnitud numérica.
El texto que parece numérico sigue las reglas del texto cuando se compara como texto. El valor de texto '9' se ordena después de '10' porque su primer carácter viene después. Eso informa sobre caracteres, no sobre si nueve es mayor que diez. Lee el tipo de datos de la columna antes de interpretar una comparación inesperada.
Filtra sin mostrar la columna comprobada
SELECT first_name
FROM employees
WHERE salary < 50000;
Chloe y Grace cumplen la condición. Sus salarios se utilizan para comprobar las filas, pero no aparecen en el resultado. No necesitas añadir el salario a SELECT para que funcione el filtro. Al comprobar una consulta, mostrarlo temporalmente puede ayudarte a revisar por qué cada fila cumplió la condición.
La igualdad sobre una clave primaria permite buscar directamente un registro: WHERE employee_id = 6 encuentra a Farid. Una clave primaria identifica una fila, por lo que esa igualdad no puede devolver varios empleados con el mismo identificador.
Los datos ausentes requieren atención por separado. WHERE stock <> 0 devuelve seis productos. Lamp Shade queda fuera porque sus existencias conocidas son cero. Bookshelf también queda fuera: sus existencias son NULL, por lo que la comparación es desconocida y WHERE no lo conserva. Una prueba de desigualdad no añade los valores ausentes a su resultado.
Puntos clave
- WHERE conserva solo las filas cuya condición es verdadera.
>y<excluyen sus umbrales;>=y<=los incluyen.- Escribe los literales numéricos sin símbolos monetarios, comillas ni separadores de millares.
- Un filtro puede comprobar una columna que no se muestra.
- Utiliza una comparación de igualdad sobre una clave para buscar un registro.
- Las comparaciones ordinarias con NULL no superan un filtro WHERE.
2.2 Texto, comillas y fechas completas
Las condiciones de texto y fecha necesitan valores con un formato que la base de datos pueda interpretar. Un valor mal escrito puede no devolver filas sin avisar, mientras que una comilla ausente puede convertir ese valor en un nombre de columna.
Distingue un valor de un nombre
SELECT first_name
FROM employees
WHERE city = 'Chicago';
Las comillas simples hacen que 'Chicago' sea un valor de texto. El resultado contiene Ana, Chloe, Farid y Hugo. Sin comillas, Chicago se interpreta como un nombre, así que la base de datos busca una columna con ese nombre. Las comillas dobles estándar también delimitan nombres. PostgreSQL rechaza city = "Chicago" cuando no existe esa columna. Algunas configuraciones de SQLite aceptan cadenas entre comillas dobles como una función heredada; utiliza siempre comillas simples para los valores.
Un apóstrofo dentro de un valor se duplica:
SELECT first_name
FROM employees
WHERE last_name = 'O''Neill';
Así se encuentra a Hugo. Las dos comillas simples contiguas representan un apóstrofo dentro del valor; las comillas exteriores marcan su inicio y su final. SQL estándar no utiliza una barra inversa para escapar ese apóstrofo.
Comprueba las reglas de comparación
Una intercalación controla la igualdad y la ordenación del texto, incluidas las mayúsculas, las minúsculas y las letras con tilde. En las comparaciones habituales de SQLite y PostgreSQL utilizadas aquí, que distinguen mayúsculas y minúsculas, 'Chicago' y 'chicago' difieren. WHERE city = 'chicago' no devuelve filas. MySQL y SQL Server suelen utilizar intercalaciones que no distinguen mayúsculas y minúsculas, por lo que sus configuraciones habituales pueden hacer coincidir ambas formas.
Las comparaciones de intervalos de texto también siguen la intercalación. Con estos apellidos, WHERE last_name < 'M' devuelve Brown, Carter, Haddad, Kim y Lopez. Los valores se comparan desde la izquierda. Un valor más largo que empieza con los mismos caracteres viene después de su prefijo: 'Martin' va después de 'M'. Un límite de 'M' no equivale a «todos los apellidos que empiezan por M».
Pon el año primero
La columna de ejemplo hire_date almacena fechas completas como texto: año, mes y día, con longitudes fijas. Así, el orden del texto coincide con el orden del calendario.
SELECT first_name, hire_date
FROM employees
WHERE hire_date >= '2022-01-01';
Chloe, Grace y Hugo cumplen la condición. PostgreSQL también tiene un tipo DATE real que acepta este literal. Su forma estándar con tipo explícito es DATE '2022-01-01'; SQLite no utiliza esa sintaxis de literal con tipo.
Una cadena de fecha local como '03/04/2024' es ambigua en una columna de fecha porque la configuración puede hacer que signifique 4 de marzo o 3 de abril. Almacenadas como texto, las fechas con el mes primero se comparan por mes antes que por año. Por ejemplo, '12/01/2021' se ordena después de '03/15/2024' aunque la primera fecha sea anterior en el calendario.
Traduce el límite con una fecha completa
«Contratados después de 2022» significa a partir de '2023-01-01'. En cambio, comparar el texto con '2022' también incluye a Hugo, cuya fecha es '2022-08-05': el texto más largo se ordena después del prefijo coincidente.
Si una columna contiene horas, la igualdad con una fecha sola no selecciona todas las horas de ese día. Para incluir el 31 de marzo de 2024, utiliza ordered_at >= '2024-03-31' AND ordered_at < '2024-04-01'. Esto conserva todas las horas desde el inicio del 31 de marzo hasta el inicio del 1 de abril, sin incluir este último.
Puntos clave
- Utiliza comillas simples para los valores de texto; duplica un apóstrofo dentro de un valor.
- La intercalación determina cómo se comparan las mayúsculas, las minúsculas y los caracteres del texto.
- Utiliza fechas completas
YYYY-MM-DDpara que las fechas de texto con longitud fija se ordenen cronológicamente. - Para abarcar un día completo con horas, incluye su inicio y excluye el inicio del día siguiente.
2.3 AND, OR, NOT y condiciones agrupadas
Una fila puede necesitar superar varias pruebas. AND exige que ambas condiciones sean verdaderas. OR exige que al menos una sea verdadera. NOT invierte verdadero y falso; cuando una condición es desconocida debido a NULL, NOT la mantiene desconocida.
Decide si deben cumplirse ambas pruebas
SELECT first_name
FROM employees
WHERE department = 'Sales' AND city = 'Chicago';
Ana y Chloe superan ambas pruebas. Emma trabaja en Sales, pero vive en Denver, así que no cumple este AND. Cambiar AND por OR también incluye a Emma, Farid y Hugo: los cinco empleados que cumplen la condición satisfacen una prueba o ambas.
Añadir una condición AND puede mantener o reducir el resultado. Añadir una condición OR puede mantenerlo o ampliarlo. Esto te permite hacer una comprobación rápida al construir un filtro por etapas.
Cada comparación debe estar completa. Escribe department = 'IT' OR department = 'Marketing', repitiendo la columna y el operador. department = 'IT' OR 'Marketing' no expresa la segunda comparación. PostgreSQL lo rechaza; SQLite trata el texto por sí solo como falso y devuelve solo el personal de IT. Del mismo modo, escribe salary > 50000 AND salary < 70000, con el salario a ambos lados de AND.
Traduce grupos de alternativas
«Empleados en Boston y Denver» suele pedir personas de cualquiera de las dos ciudades. Cada fila tiene una ciudad, así que utiliza city = 'Boston' OR city = 'Denver'. Eso devuelve Ben, David, Emma y Grace. Un AND entre estas igualdades exige que un valor de ciudad sea ambos lugares a la vez y no devuelve filas.
Cuando se mezclan operadores, NOT se evalúa antes que AND, y AND antes que OR. Sin paréntesis:
WHERE department = 'Sales'
OR department = 'Marketing' AND city = 'Chicago'
Esto significa personal de Sales de cualquier lugar, más personal de Marketing en Chicago. Emma cumple la condición porque basta con la comparación de Sales. Para restringir ambos departamentos a Chicago, agrupa las alternativas:
SELECT first_name
FROM employees
WHERE (department = 'Sales' OR department = 'Marketing')
AND city = 'Chicago';
Ahora cumplen la condición Ana, Chloe y Hugo. Los paréntesis hacen que las dos opciones de departamento compartan un mismo requisito de ciudad. Utilízalos para aclarar un filtro que combine AND y OR incluso cuando el orden predeterminado ya sea correcto.
Invierte un grupo completo
NOT (city = 'Chicago' OR city = 'Denver') devuelve David y Grace, de Boston. No se permite ninguna de las ciudades enumeradas. Equivale a city <> 'Chicago' AND city <> 'Denver' para estos valores.
Utilizar OR entre esas dos pruebas de desigualdad es un error habitual. Una fila de Chicago difiere de Denver y una fila de Denver difiere de Chicago. Cada empleado con una ciudad registrada supera al menos una prueba, por lo que OR no consigue excluir ninguna de las dos ciudades.
Construye una condición compleja por partes. Comprueba las filas después de la primera prueba y después de añadir la siguiente. Puedes intercambiar los dos lados de un AND o los dos lados de un OR sin cambiar la respuesta; elige la disposición que facilite más la lectura de los grupos.
Puntos clave
- AND requiere ambas condiciones; OR requiere al menos una.
- Escribe una comparación completa a cada lado de un operador lógico.
- NOT se evalúa antes que AND y después se evalúa OR; los paréntesis hacen explícita la agrupación deseada.
- Las alternativas para una columna suelen necesitar OR, incluso cuando la petición dice «y».
- Para excluir cualquiera de dos coincidencias, niega el grupo OR o une las dos exclusiones con AND.
3Busca coincidencias con listas, intervalos y patrones de texto
Algunas preguntas requieren varias opciones exactas; otras, un intervalo de valores o parte de un nombre. IN, BETWEEN y LIKE dan una forma clara a cada tipo de petición. Para elegir entre ellos, empieza por determinar qué significa una coincidencia: un valor completo, un valor entre extremos o un texto que encaja en un patrón. También comprobarás los valores ausentes y los detalles que cambian una respuesta, como la inclusión de los extremos, la posición de los comodines y la distinción entre mayúsculas y minúsculas.
3.1 Listas de opciones exactas con IN
Utiliza IN cuando una columna pueda coincidir con cualquier valor de una lista. Abrevia un grupo de igualdades unidas con OR sin cambiar su significado.
Construye una lista de alternativas
SELECT first_name
FROM employees
WHERE department IN ('IT', 'Marketing');
Ben, David, Farid y Hugo cumplen la condición. Cada uno tiene uno de los dos valores de departamento. La misma prueba podría escribirse como department = 'IT' OR department = 'Marketing'.
Pon los elementos de la lista entre paréntesis, separados por comas. Escribe el texto entre comillas y deja los valores numéricos sin ellas. Por ejemplo, employee_id IN (2, 4, 6) selecciona Ben, David y Farid. El orden de los elementos de la lista no ordena el resultado. Repetir un elemento no repite una fila coincidente: IN (6, 2, 2, 4) selecciona los mismos registros. Utiliza ORDER BY si necesitas un orden para el resultado.
IN busca coincidencias de valores completos con las mismas reglas de comparación que la igualdad. city IN ('Chi') no coincide con Chicago. Con las comparaciones habituales que distinguen mayúsculas y minúsculas utilizadas aquí, city IN ('chicago') tampoco coincide. Buscar un fragmento requiere LIKE, mientras que el comportamiento de las mayúsculas y minúsculas depende de la intercalación.
Aplica otra regla a todas las opciones
SELECT first_name
FROM employees
WHERE department IN ('IT', 'Marketing')
AND city = 'Chicago';
Farid y Hugo cumplen la condición. IN es una sola condición, por lo que AND aplica la prueba de ciudad a toda la selección de departamentos. En la versión desarrollada con OR, pon paréntesis alrededor de las dos comparaciones de departamento. Sin ellos, department = 'IT' OR department = 'Marketing' AND city = 'Chicago' también incluye a Ben, porque AND tiene mayor precedencia y la regla de ciudad solo se aplica a Marketing.
Excluye los valores enumerados
WHERE city NOT IN ('Chicago', 'Denver') devuelve David y Grace. Una ciudad registrada cumple la condición solo cuando difiere de ambos elementos. Es una forma útil de expresar varias exclusiones y evita el error de unir condiciones de desigualdad con OR.
Los valores ausentes no coinciden con ninguna de las dos formas. Grace tiene un departamento NULL, así que department NOT IN ('Sales') no la incluye. La base de datos no puede establecer que el departamento ausente difiera de Sales. Para incluir también al personal sin asignar, escribe department NOT IN ('Sales') OR department IS NULL.
Un NULL dentro de una lista NOT IN crea un problema más amplio. department NOT IN ('Sales', NULL) exige tanto department <> 'Sales' como department <> NULL. La segunda comparación siempre es desconocida, por lo que la prueba combinada nunca es verdadera y WHERE no devuelve filas. Mantén las pruebas de valores ausentes separadas de la lista de valores.
Con IN, una coincidencia real sigue cumpliéndose aunque otro elemento de la lista sea NULL. department IN ('Sales', NULL) conserva a los tres empleados de Sales, pero no añade a Grace. Utiliza IS NULL para solicitar explícitamente los valores ausentes.
Una lista IN de SQL ordinario necesita al menos un elemento. PostgreSQL rechaza IN (); SQLite lo acepta como falso. Si un programa construye una lista a partir de las opciones del usuario, gestiona una lista vacía antes de enviar la consulta para controlar el comportamiento en las distintas bases de datos.
Puntos clave
- IN coincide con cualquier valor completo de su lista entre paréntesis y separada por comas.
- El orden de la lista y los elementos repetidos no controlan el orden del resultado ni duplican las filas coincidentes.
- IN se combina con AND como una sola condición.
- NOT IN excluye los valores enumerados, pero no incluye los valores ausentes.
- Un NULL dentro de una lista NOT IN impide que cualquier fila supere la prueba de WHERE.
3.2 Intervalos y extremos incluidos
BETWEEN comprueba un intervalo con ambos extremos incluidos. Utilízalo cuando «de» y «a» incluyan los valores límite indicados; utiliza comparaciones explícitas cuando deba excluirse alguno de los límites.
Comprueba los dos extremos
SELECT name, price
FROM products
WHERE price BETWEEN 15.50 AND 89.00;
Desk Lamp, Floor Lamp, Lamp Shade y Desk Organizer cumplen la condición. Floor Lamp cuesta exactamente 89,00 y Lamp Shade exactamente 15,50, por lo que ambos se conservan. La condición significa price >= 15.50 AND price <= 89.00.
Pon primero el valor menor. price BETWEEN 89.00 AND 15.50 pide un precio de al menos 89,00 y como máximo 15,50. La sintaxis es válida, pero no hay coincidencias. BETWEEN ordinario no reordena los extremos por ti. PostgreSQL ofrece BETWEEN SYMMETRIC para hacerlo, pero utiliza la forma con el menor primero para una consulta compartida con SQLite.
Para «más de 15,50 y menos de 89,00», escribe price > 15.50 AND price < 89.00. Solo cumplen la condición Desk Lamp y Desk Organizer. Esa diferencia depende de los extremos que pide la pregunta, no de cómo se muestra el resultado.
Fuera de un intervalo
price NOT BETWEEN 20 AND 100 significa price < 20 OR price > 100. Devuelve Lamp Shade, Office Chair, Standing Desk, Desk Organizer, Bookshelf y Paper Tray. Los valores exactamente iguales a 20 o 100 estarían dentro del intervalo original y no cumplirían NOT BETWEEN.
Un valor comprobado que está ausente da desconocido en ambas pruebas. Para las existencias, BETWEEN 5 AND 40 selecciona cinco productos y NOT BETWEEN selecciona dos: Lamp Shade con 0 y Desk Organizer con 60. Bookshelf tiene existencias NULL y no pertenece a ninguno de los resultados. Por tanto, un intervalo y su negación no tienen por qué abarcar todas las filas almacenadas.
Fechas y horas
Las cadenas de fecha completas en orden YYYY-MM-DD permiten trabajar con intervalos de fechas. hire_date BETWEEN '2020-01-01' AND '2022-12-31' selecciona Ben, David y Hugo, y abarca los tres años naturales completos en esta columna que solo contiene fechas.
Una columna que contiene horas necesita otro límite superior para abarcar un mes completo. Un extremo que solo indica la fecha en una columna de marca de tiempo significa la medianoche al inicio de ese día. En texto, incluso '2024-03-31 00:00:00' se ordena después del prefijo más corto '2024-03-31'. Para incluir todas las horas de marzo, utiliza:
WHERE ordered_at >= '2024-03-01'
AND ordered_at < '2024-04-01'
Esto incluye el inicio de marzo y termina justo antes de abril, sin tener que adivinar la última fracción de segundo del 31 de marzo.
Intervalos de texto y los dos usos de AND
Los extremos de texto son valores completos. last_name BETWEEN 'A' AND 'C' incluye Brown, pero excluye Carter, ya que Carter se ordena después de su prefijo C. Con estas reglas de texto, last_name >= 'A' AND last_name < 'D' abarca los apellidos que empiezan por A, B o C y devuelve Brown y Carter.
En price BETWEEN 10 AND 100 AND category = 'Lighting', el primer AND separa los extremos del intervalo; el segundo une la prueba del intervalo con la de categoría. Los productos coincidentes son Desk Lamp, Floor Lamp y Lamp Shade. Los saltos de línea pueden facilitar la distinción entre las dos funciones.
Puntos clave
- BETWEEN incluye ambos extremos y espera que el extremo inferior vaya primero.
- NOT BETWEEN selecciona valores inferiores al extremo inferior o superiores al extremo superior.
- Las comparaciones explícitas permiten excluir uno o ambos extremos.
- Para abarcar un mes completo con horas, incluye su inicio y termina antes del mes siguiente.
- Un extremo de texto es un valor completo, no todos los valores con esa letra inicial.
- NULL en la columna comprobada no supera ninguna de las dos pruebas de intervalo.
3.3 Patrones de texto con LIKE
LIKE comprueba si un texto coincide con un patrón. Utilízalo para buscar un inicio, un final o un fragmento cuando la igualdad exigiría un valor completo exacto.
Coloca los comodines
| Patrón | Significado | Nombres de productos coincidentes |
|---|---|---|
'Lamp%' | Empieza por Lamp | Lamp Shade |
'%Lamp' | Termina en Lamp | Desk Lamp, Floor Lamp |
'%Lamp%' | Contiene Lamp | Desk Lamp, Floor Lamp, Lamp Shade |
'Lamp' | Exactamente Lamp | Ninguno |
El patrón debe coincidir con el valor completo. % puede representar cero o más caracteres, incluidos los espacios. En '%Lamp%', cualquiera de los signos de porcentaje puede coincidir con una secuencia vacía, por lo que el texto puede empezar o terminar con Lamp, además de contenerlo en medio.
_ representa exactamente un carácter. last_name LIKE '_im' encuentra Kim. Cuatro guiones bajos en first_name LIKE '____' encuentran Emma y Hugo, los nombres con exactamente cuatro letras. El guion bajo no es un carácter opcional.
SELECT first_name, phone
FROM employees
WHERE phone LIKE '312-%';
Ana, Chloe y Farid cumplen la condición porque el texto de su teléfono registrado empieza por 312-. El signo de porcentaje abarca todos los caracteres restantes.
Elige el operador y la regla de mayúsculas y minúsculas
Los comodines pertenecen a los patrones LIKE. name = '%Lamp%' busca signos de porcentaje literales y aquí no devuelve ningún producto. Los comodines de búsqueda de archivos * y ? no tienen ningún significado especial en LIKE; name LIKE 'Desk*' exige un asterisco literal después de Desk.
LIKE de SQLite normalmente no distingue mayúsculas y minúsculas para las letras ASCII de la A a la Z, mientras que LIKE ordinario de PostgreSQL sí las distingue. Por tanto, name LIKE '%desk%' encuentra Desk Lamp, Standing Desk y Desk Organizer en SQLite, pero ninguno en PostgreSQL con una intercalación que distinga mayúsculas y minúsculas. PostgreSQL también ofrece ILIKE, que no las distingue. El comportamiento de MySQL depende de la intercalación.
Para los nombres de productos ASCII utilizados aquí, LOWER(name) LIKE '%desk%' obtiene las mismas coincidencias en SQLite y PostgreSQL: LOWER convierte el nombre a minúsculas antes de buscar coincidencias. La conversión entre mayúsculas y minúsculas en otros sistemas de escritura depende de la base de datos y de las reglas del idioma. La igualdad de SQLite también difiere de su LIKE: city = 'chicago' no encuentra Chicago con la intercalación binaria predeterminada, aunque city LIKE 'chicago' sí lo encuentra.
Busca un carácter de comodín literal
Para buscar una coincidencia literal con un guion bajo, elige un carácter de escape:
WHERE code LIKE 'SPRING!_%' ESCAPE '!'
En una tabla de códigos de descuento, esto coincide con 'SPRING_10', pero no con 'SPRINGS10'. !_ es un guion bajo literal; el último % sigue coincidiendo con una secuencia. Utiliza el mismo método con !% para un signo de porcentaje literal. Escribir ESCAPE explícitamente evita depender de los valores predeterminados de la base de datos; PostgreSQL normalmente utiliza una barra inversa y SQLite no tiene un carácter de escape predeterminado.
Negación y alcance de la búsqueda
name NOT LIKE '%Lamp%' devuelve los otros cinco productos. El texto ausente no cumple ni LIKE ni NOT LIKE. De los empleados, tres teléfonos coinciden con '312-%', dos teléfonos registrados no coinciden y los tres teléfonos NULL no aparecen en ninguno de los resultados.
Un % inicial no proporciona a un índice ordinario un texto inicial fijo con el que acotar la búsqueda, por lo que puede recorrerse gran parte de la tabla. Un inicio fijo como 'Desk%' puede ayudar a un índice adecuado. Para las fechas, utiliza intervalos de fechas: LIKE funciona con estas fechas de texto, pero PostgreSQL exige una conversión antes de aplicar LIKE a una columna de tipo DATE real.
Puntos clave
- LIKE busca coincidencias con el valor completo;
%abarca cualquier número de caracteres y_exactamente uno. - Pon
%al principio, al final o en ambos extremos para controlar dónde puede aparecer un fragmento. - La distinción entre mayúsculas y minúsculas depende de la base de datos y la intercalación; LOWER ayuda con estos nombres ASCII.
- ESCAPE permite que un comodín represente su carácter literal.
- NULL no coincide ni con LIKE ni con NOT LIKE.
- Los comodines iniciales pueden hacer que una búsqueda recorra más datos; utiliza intervalos para las fechas.
4Ten en cuenta los valores ausentes
Los datos ausentes cambian qué registros puede encontrar un filtro. Unas existencias de cero, una cadena de teléfono vacía y un valor sin registrar indican cosas distintas, aunque una herramienta de consulta muestre algunas celdas de forma parecida. Utilizarás pruebas explícitas de valores ausentes y seguirás el tercer valor de verdad, desconocido. Estas reglas explican por qué un filtro y su opuesto pueden excluir las mismas filas, y cómo incluirlas cuando la pregunta lo requiera.
4.1 NULL, cero y cadena vacía
NULL marca un valor ausente: un valor puede ser desconocido, no estar registrado o no ser aplicable. Es distinto de un cero conocido o de un texto conocido sin caracteres.
Interpreta qué significa un valor ausente
Lamp Shade tiene stock = 0. Su cantidad registrada es cero, por lo que está agotado. Bookshelf tiene stock NULL: la cantidad no se registró. La base de datos no puede decirte que tiene cero unidades ni ninguna otra cantidad.
La distinción cambia la pregunta que puedes responder:
| Pregunta | Condición | Resultado |
|---|---|---|
| ¿Qué productos están agotados? | stock = 0 | Lamp Shade |
| ¿Qué cantidades de existencias son desconocidas? | stock IS NULL | Bookshelf |
| ¿Qué cantidades están registradas? | stock IS NOT NULL | Los otros siete productos |
Una celda que parece vacía en una herramienta de consulta no basta para distinguir estos estados. Algunas herramientas muestran NULL como una celda vacía; otras escriben NULL. Comprueba directamente el valor almacenado.
Utiliza las pruebas de valores ausentes
SELECT first_name
FROM employees
WHERE phone IS NULL;
Ben, Emma y Hugo no tienen un teléfono registrado. IS NULL da verdadero para sus valores ausentes. Para encontrar a los cinco empleados con un teléfono registrado, utiliza phone IS NOT NULL: Ana, Chloe, David, Farid y Grace.
No escribas phone = NULL para encontrar teléfonos ausentes. Una comparación ordinaria con NULL da desconocido, incluso cuando ambos lados son NULL. WHERE conserva solo las filas verdaderas, por lo que = NULL no devuelve ninguna. <> NULL tiene el mismo problema. IS NULL comprueba el marcador de ausencia y da una respuesta definida de verdadero o falso para estos valores de una sola columna.
La forma NOT phone IS NULL también encuentra los teléfonos presentes en SQLite y PostgreSQL, pero phone IS NOT NULL facilita la lectura de la prueba deseada.
Distingue tres casos de texto
| Expresión SQL | Qué representa |
|---|---|
NULL | Un valor ausente |
'' | Un valor de texto conocido con cero caracteres |
'NULL' | Cuatro letras ordinarias |
SQLite, PostgreSQL, MySQL y SQL Server distinguen la cadena vacía de NULL. phone = '' encontraría cadenas vacías, no los teléfonos ausentes de Ben, Emma o Hugo. Si una columna puede contener ambos, utiliza phone IS NULL OR phone = '' para encontrar cualquiera de los dos estados. Oracle trata una cadena vacía como NULL, por lo que esta distinción cambia al pasar a otra base de datos.
Aplica lo que indican las palabras y el esquema
«Ausente», «sin registrar» y «sin asignar» apuntan a IS NULL. department IS NULL encuentra a Grace. Que falte su departamento no significa que el texto del departamento sea la palabra 'NULL', ni permite establecer a qué departamento pertenece.
La definición de la tabla puede marcar una columna como NOT NULL, lo que significa que una fila almacenada no puede tener NULL en esa columna. Una consulta IS NULL sobre esa columna no devuelve filas. Comprueba esta regla al revisar un esquema: las columnas que permiten datos ausentes necesitan especial atención al construir exclusiones o combinar condiciones.
Puntos clave
- NULL es un marcador de ausencia; cero y la cadena vacía son valores conocidos.
- IS NULL encuentra valores ausentes e IS NOT NULL encuentra valores presentes.
= NULLy<> NULLno pueden encontrar filas mediante comparaciones ordinarias.'NULL'entre comillas es texto, y Oracle trata la cadena vacía de forma distinta a las demás bases de datos mostradas.- Una columna NOT NULL no puede almacenar NULL.
4.2 Verdadero, falso y desconocido
Una condición en SQL puede ser verdadera, falsa o desconocida. Los valores ausentes hacen necesario el tercer estado: sin una cantidad registrada, una base de datos no puede establecer si esa cantidad supera un umbral.
Una condición y su opuesta
Para Bookshelf, stock > 10 es desconocido porque sus existencias son NULL. Lo mismo ocurre con stock <= 10. WHERE conserva solo las condiciones verdaderas y descarta tanto las falsas como las desconocidas.
En la tabla de productos, stock > 10 devuelve cuatro filas y stock <= 10 devuelve tres. Juntas abarcan siete de los ocho productos. Bookshelf está ausente de ambas. Aplicar NOT no lo recupera: NOT desconocido es desconocido, por lo que NOT (stock > 10) sigue seleccionando solo las tres cantidades conocidas de como máximo 10.
Esto difiere de un valor que no cumple una condición. El cero conocido de Lamp Shade hace que stock > 10 sea falso, por lo que NOT lo convierte en verdadero. Una cantidad ausente no proporciona una comparación definida que se pueda invertir.
Combina desconocido con otra prueba
| Combinación | Resultado |
|---|---|
| Desconocido AND falso | Falso |
| Desconocido AND verdadero | Desconocido |
| Desconocido AND desconocido | Desconocido |
| Desconocido OR verdadero | Verdadero |
| Desconocido OR falso | Desconocido |
| Desconocido OR desconocido | Desconocido |
Bookshelf cuesta 120,00. En stock > 10 OR price > 100, la condición del precio es verdadera. OR solo necesita una parte verdadera, así que la fila se conserva aunque la comparación de existencias sea desconocida. En stock > 10 AND price > 100, la condición de existencias sigue sin resolverse, por lo que el resultado es desconocido y la fila se descarta.
Incluye los valores ausentes de forma deliberada
SELECT first_name
FROM employees
WHERE department <> 'Sales'
OR department IS NULL;
Esto devuelve Ben, David, Farid, Hugo y Grace. La comparación por sí sola devolvería cuatro y dejaría fuera a Grace. La rama IS NULL incluye explícitamente al personal cuyo departamento no está asignado. Que ese personal deba contar como «fuera de Sales» depende de la respuesta que se pretende obtener; la consulta debe expresar esa decisión.
Un valor NULL en una lista NOT IN puede bloquear todo el resultado. department NOT IN ('Sales', NULL) significa que el departamento debe ser distinto de Sales y distinto de NULL. Esta última comparación es desconocida para todas las filas, por lo que la condición completa nunca es verdadera. IN sigue conservando las coincidencias reales: department IN ('Sales', NULL) selecciona a los tres empleados de Sales, pero no encuentra a Grace.
Un valor comprobado que está ausente también produce desconocido con LIKE y con un intervalo BETWEEN ordinario. IS NULL e IS NOT NULL dan respuestas definidas para estas columnas escalares. Comprueba los valores ausentes por separado con estas pruebas cuando un recuento de filas resulte sorprendente.
Comprende cuándo se agrupan los NULL
NULL = NULL sigue siendo desconocido; no se sabe si dos teléfonos ausentes son el mismo número. Sin embargo, DISTINCT trata los valores ausentes repetidos como duplicados y ORDER BY los coloca juntos. Para una comparación que trate expresamente dos NULL como iguales, SQLite y PostgreSQL también ofrecen IS NOT DISTINCT FROM.
Puntos clave
- WHERE conserva las filas verdaderas y elimina las falsas y las desconocidas.
- NOT mantiene desconocido sin cambios; los filtros negados también pueden excluir filas con NULL.
- Una rama OR verdadera puede conservar una fila con otra rama desconocida.
- Añade IS NULL explícitamente cuando los valores ausentes deban formar parte de la respuesta.
- Un NULL en una lista NOT IN impide que cualquier fila supere ese filtro de exclusión.
- La eliminación de duplicados agrupa los NULL aunque la igualdad ordinaria entre NULL sea desconocida.
5Ordena los resultados y elige una página
Un límite de filas solo adquiere sentido después de decidir qué filas deben ir primero. La ordenación puede organizar números, texto o fechas, y las columnas de ordenación posteriores resuelven los empates de las anteriores. Los valores ausentes y las filas empatadas requieren atención cuando una lista breve o una página debe ser reproducible. Construirás órdenes totales, aplicarás límites después del filtrado y reconocerás las distintas sintaxis para limitar filas que utilizan los sistemas de bases de datos habituales.
5.1 Orden ascendente y descendente
ORDER BY establece el orden de las filas del resultado. Sin él, SQL no garantiza qué fila aparecerá primero, aunque una tabla pequeña parezca devolver siempre el mismo orden.
Elige la dirección
| Dirección | Números | Fechas completas | Texto |
|---|---|---|---|
ASC | El menor primero | La más antigua primero | Orden de intercalación |
DESC | El mayor primero | La más reciente primero | Orden de intercalación inverso |
ASC es la opción predeterminada. ORDER BY salary y ORDER BY salary ASC solicitan la misma dirección. «Los salarios más altos primero» requiere ORDER BY salary DESC.
SELECT first_name, salary
FROM employees
ORDER BY salary DESC;
Lee el resultado de mayor a menor: Farid 83 000, Ben 71 000, Emma 65 000, David 60 000, Hugo 58 000, Ana 52 000, Chloe 48 000 y Grace 45 000. La base de datos reorganiza las filas del resultado; esta consulta no modifica la tabla almacenada.
Filtra antes de ordenar
SELECT name, price
FROM products
WHERE category = 'Lighting'
ORDER BY price;
Solo las tres filas de Lighting entran en este resultado. Sus precios ascendentes producen Lamp Shade 15,50; Desk Lamp 24,99; y después Floor Lamp 89,00. ORDER BY se escribe después de WHERE en la sentencia. Invertir esas cláusulas es un error de sintaxis.
La columna de ordenación no tiene que mostrarse. SELECT first_name FROM employees ORDER BY salary DESC; da el mismo orden de nombres sin mostrar los salarios. PostgreSQL lo restringe cuando está presente DISTINCT: una consulta DISTINCT debe seleccionar sus columnas de ordenación.
Lee el tipo de datos almacenado
Las columnas numéricas se ordenan por magnitud numérica. Las columnas de texto se ordenan por caracteres según su intercalación. Los valores de texto '10', '9' y '100' se ordenan como '10', '100', '9' con la ordenación ordinaria de caracteres. Ese orden no es numéricamente correcto, así que comprueba el tipo de columna cuando los importes parezcan desordenados.
Los valores de ejemplo de hire_date son fechas de texto completas de longitud fija con el año primero. ORDER BY hire_date empieza con Farid el 2017-09-12 y termina con Grace el 2024-02-19. DESC invierte ese orden para mostrar primero las contrataciones más recientes. Las fechas de texto con el mes primero, como MM/DD/YYYY, comparan el mes antes que el año y no pueden dar un orden cronológico fiable entre años distintos.
El orden del texto depende de la intercalación
La intercalación binaria predeterminada de SQLite coloca las letras ASCII mayúsculas antes que las minúsculas. Con esa regla, 'Zebra' precede a 'apple' y 'é' va después de 'z'. Muchas bases de datos PostgreSQL utilizan intercalaciones adaptadas al idioma que producen otro orden. Un uso uniforme de mayúsculas y minúsculas ayuda, pero las reglas de comparación de la base de datos siguen decidiendo el orden de las letras con tilde y otros caracteres.
Utiliza nombres de columna para especificar claramente la ordenación. ORDER BY 2 DESC se refiere al segundo elemento de la lista SELECT, por lo que mover columnas puede cambiar la ordenación sin avisar. ORDER BY 'salary' indica una constante de texto, no la columna de salario: SQLite no obtiene de ella una ordenación útil y PostgreSQL la rechaza. Escribe ORDER BY salary.
Puntos clave
- ORDER BY determina el orden de las filas; ASC es la opción predeterminada y DESC invierte la dirección.
- WHERE filtra las filas antes de que se ordenen.
- La magnitud numérica, la representación de las fechas y la intercalación del texto determinan qué significa «ascendente».
- Indica explícitamente los nombres de las columnas de ordenación para evitar constantes entre comillas y posiciones de columna cambiantes.
5.2 Varias columnas de ordenación, empates y valores ausentes
Una segunda columna de ordenación solo importa cuando las filas empatan en la primera. Piensa en una lista de personal ordenada: agrupa primero por ciudad y después ordena los nombres dentro de cada ciudad.
Sigue las columnas de ordenación de izquierda a derecha
SELECT last_name, city
FROM employees
ORDER BY city, last_name;
El resultado empieza con Kim y Okafor, de Boston. Después vienen Haddad, Lopez, Nguyen y O'Neill, de Chicago. Brown y Carter, de Denver, van al final. last_name no compite con city; solo decide el orden dentro de una misma ciudad.
Invertir las columnas cambia el orden principal. ORDER BY last_name, city ordena principalmente por apellido y consulta la ciudad solo cuando los apellidos empatan. Utiliza una cláusula ORDER BY con comas entre sus columnas de ordenación. Una segunda cláusula ORDER BY no es válida.
Da a cada columna su dirección
ORDER BY department, salary DESC significa departamento en orden ascendente y después salario descendente dentro de cada departamento. DESC solo corresponde al salario. Para que ambos sean descendentes, escribe department DESC, salary DESC.
Con la ordenación predeterminada de NULL en SQLite, la primera forma coloca primero el departamento ausente de Grace. Sigue IT con Farid y después Ben; Marketing tiene a David y después Hugo; Sales tiene a Emma, Ana y después Chloe. Estás leyendo una jerarquía de comparaciones, no ordenando primero todas las filas por salario para después ignorar ese orden.
Resuelve un empate con un valor único
Las filas iguales en todas las columnas de ordenación pueden aparecer en cualquier orden. ORDER BY city no resuelve qué empleado de Chicago va primero. Un orden total añade una última columna que identifica de forma única cada fila:
SELECT first_name, city
FROM employees
ORDER BY city, employee_id;
Los identificadores resuelven todos los empates de ciudad. Si los datos no cambian, esto permite que un LIMIT o una página posterior seleccione una parte reproducible de la lista ordenada. Un criterio de desempate único fija qué filas aparecen en un punto de corte; no incluye filas empatadas adicionales.
Sitúa los valores ausentes de forma deliberada
Los valores predeterminados varían según la base de datos:
| Base de datos | NULL en orden ASC | NULL en orden DESC |
|---|---|---|
| SQLite, MySQL, SQL Server | Al principio | Al final |
| PostgreSQL, Oracle | Al final | Al principio |
Por eso, la consulta por departamento coloca a Grace al final en PostgreSQL con su configuración predeterminada, aunque la coloca al principio en SQLite. Esta diferencia es independiente de la dirección del salario.
SELECT first_name, department, salary
FROM employees
ORDER BY department NULLS LAST, salary DESC;
SQLite 3.30 o posterior, PostgreSQL y Oracle admiten NULLS FIRST y NULLS LAST. Aquí colocan a Grace después de todos los departamentos registrados y mantienen el orden de salario dentro de cada departamento. MySQL y SQL Server no aceptan esas cláusulas.
Traduce la jerarquía solicitada en la misma secuencia en que se expresa: «por departamento, con los salarios más altos primero dentro de cada departamento» da department, salary DESC. «Por orden alfabético de apellido y después de nombre» da last_name, first_name. Añade un identificador al final cuando necesites un orden reproducible entre personas con nombres idénticos.
Puntos clave
- Las columnas posteriores de ORDER BY deshacen los empates de las anteriores.
- ASC o DESC se aplica a su propia columna; si se omite la dirección, se utiliza ASC.
- Añadir una última columna de ordenación única produce un orden total si los datos no cambian.
- La posición de NULL depende de la base de datos; las cláusulas NULLS FIRST/LAST, cuando se admiten, la establecen explícitamente.
- Un criterio de desempate resuelve qué fila se elige sin ampliar un LIMIT para incluir todos los empates.
5.3 Primeros resultados y páginas con LIMIT
LIMIT conserva como máximo el número elegido de filas del resultado. No decide qué filas deben ir primero. Utiliza ORDER BY para dar a una lista breve un significado como mayor salario, más reciente o más barato.
Ordena y después recorta
SELECT first_name, salary
FROM employees
ORDER BY salary DESC
LIMIT 3;
Los salarios ordenados empiezan con Farid 83 000, Ben 71 000 y Emma 65 000, así que esas tres filas se conservan. Sin ORDER BY, LIMIT 3 devuelve tres filas cualesquiera, sin garantizar que sean las de mayor salario.
WHERE actúa antes del límite. WHERE city = 'Boston' ORDER BY salary DESC LIMIT 5 devuelve solo David y Grace porque únicamente dos empleados cumplen la condición. LIMIT es un máximo, no una petición para inventar filas adicionales. LIMIT 0 no devuelve ninguna.
Omite filas para una página posterior
OFFSET omite filas antes de que LIMIT cuente las que se devolverán. ORDER BY salary DESC LIMIT 3 OFFSET 3 omite Farid, Ben y Emma, y después devuelve David, Hugo y Ana: las posiciones de la cuarta a la sexta.
Para la página k con n filas por página, omite (k − 1) × n filas. La página tres con tres filas por página utiliza LIMIT 3 OFFSET 6. Solo quedan Chloe y Grace. La primera página tiene desplazamiento cero, no uno.
«Segunda fila» y «segundo valor distinto» son peticiones diferentes. ORDER BY salary DESC LIMIT 1 OFFSET 1 devuelve aquí a Ben con 71 000. Si dos empleados compartieran el salario máximo, esa consulta devolvería a otra persona con el salario máximo. Para encontrar el segundo salario distinto, selecciona DISTINCT salary antes de ordenar y omitir filas.
Resuelve el punto de corte
ORDER BY city LIMIT 3 incluye a los dos empleados de Boston y a uno de Chicago, pero no especifica cuál de Chicago. ORDER BY city, employee_id LIMIT 3 selecciona David, Grace y Ana. El identificador único resuelve el punto de corte.
Para conservar a todos los empatados en el último valor de ordenación, PostgreSQL 13 o posterior y Oracle admiten FETCH FIRST 3 ROWS WITH TIES. Con ORDER BY city, conserva seis filas: las dos de Boston y las cuatro de Chicago. Si ORDER BY también incluye un identificador único, las filas no pueden empatar en la clave completa de ordenación.
Reconoce la sintaxis de la base de datos
| Base de datos | Un límite de tres filas |
|---|---|
| SQLite, PostgreSQL, MySQL | ORDER BY salary DESC LIMIT 3 |
| PostgreSQL, Oracle 12c o posterior | ORDER BY salary DESC FETCH FIRST 3 ROWS ONLY |
| SQL Server | SELECT TOP (3) first_name, salary FROM employees ORDER BY salary DESC; |
SQL estándar utiliza OFFSET y FETCH, no LIMIT. PostgreSQL y Oracle aceptan OFFSET 3 ROWS FETCH FIRST 3 ROWS ONLY. SQL Server utiliza ORDER BY salary DESC OFFSET 3 ROWS FETCH NEXT 3 ROWS ONLY; ORDER BY es obligatorio para esta forma de paginación.
SQLite y MySQL también aceptan LIMIT 6, 3, con el desplazamiento primero. Utiliza preferentemente LIMIT 3 OFFSET 6 para que las funciones sean explícitas. La paginación ejecuta de nuevo una consulta para cada página. Un orden total mantiene la coherencia entre páginas mientras los datos no cambien; las inserciones o eliminaciones entre peticiones pueden seguir haciendo que las páginas repitan u omitan registros.
Puntos clave
- ORDER BY decide qué filas van primero; LIMIT conserva como máximo el número solicitado.
- OFFSET omite filas antes de que LIMIT cuente; la primera página utiliza desplazamiento cero.
- Selecciona primero DISTINCT cuando quieras ordenar valores distintos en lugar de filas individuales.
- Un criterio de desempate único fija el corte; WITH TIES puede incluir filas adicionales empatadas en la clave completa de ordenación.
- LIMIT, TOP y OFFSET/FETCH son formas de limitar filas que dependen de la base de datos.
- Los cambios en los datos pueden desplazar los límites de las páginas entre peticiones.
6Construye y comprueba una consulta completa
Una pregunta del entorno laboral suele combinar varias decisiones: qué registros cuentan, qué detalles mostrar y qué filas van primero. Planificar esas decisiones por separado te ayuda a escribir una consulta cuyas partes concuerden. El orden escrito de las cláusulas y el orden lógico explican por qué un filtro puede utilizar una columna oculta y por qué un límite se aplica a las filas que cumplen las condiciones. También comprobarás los límites, los datos ausentes y los empates antes de dar por válido un resultado que parezca razonable.
6.1 Orden escrito y procesamiento lógico
Las cláusulas SQL tienen un orden escrito fijo. Su orden lógico explica el resultado como una secuencia de decisiones, incluso cuando la base de datos utiliza un plan de ejecución interno diferente.
Escribe la sentencia en el orden de las cláusulas
SELECT DISTINCT city
FROM employees
WHERE department = 'Sales'
ORDER BY city
LIMIT 2 OFFSET 0;
SELECT y FROM identifican las columnas solicitadas y la tabla de origen. Las demás cláusulas son opcionales, pero, cuando aparecen, mantienen este orden: WHERE, ORDER BY, LIMIT y después OFFSET en esta forma con LIMIT. DISTINCT se sitúa justo después de SELECT.
Utiliza una cláusula WHERE con varias condiciones unidas. Un segundo WHERE es un error de sintaxis. Lo mismo se aplica a ORDER BY: pon varias columnas de ordenación en una cláusula, separadas por comas. Mover WHERE por debajo de ORDER BY no solicita otro orden de procesamiento; produce SQL no válido.
Sigue las decisiones lógicas
| Etapa lógica | Qué ocurre en el ejemplo |
|---|---|
| FROM | Leer las filas de empleados. |
| WHERE | Conservar a Ana, Chloe y Emma, de Sales. |
| SELECT | Conservar sus valores de ciudad: Chicago, Chicago, Denver. |
| DISTINCT | Reducir esos valores a Chicago y Denver. |
| ORDER BY | Poner Chicago antes que Denver. |
| OFFSET y LIMIT | No omitir ninguna fila y devolver como máximo dos. |
El resultado es Chicago y después Denver. La ciudad repetida desaparece antes de que el límite cuente las filas del resultado. No se toman dos empleados para después preguntar si viven en ciudades distintas.
El optimizador puede utilizar un plan de ejecución física diferente que produzca el mismo resultado que esta secuencia lógica.
Utiliza las columnas donde estén disponibles
WHERE comprueba las filas de origen antes de que SELECT elija las columnas que se muestran:
SELECT first_name
FROM employees
WHERE salary > 60000;
Esto funciona sin incluir el salario en la salida. Los nombres que cumplen la condición son Ben, Emma y Farid. El salario sigue siendo una columna de cada fila de origen cuando se realiza la prueba.
Del mismo modo, filtrar antes de ordenar es esencial para obtener el primer resultado dentro de un grupo:
SELECT first_name
FROM employees
WHERE department = 'Sales'
ORDER BY salary DESC
LIMIT 1;
La respuesta es Emma. Primero se selecciona al personal de Sales; después se ordenan sus salarios. Tomar primero a la persona con mayor salario de la empresa y comprobar si esa única fila pertenece a Sales no daría la respuesta buscada, porque Farid pertenece a IT.
Haz visible la estructura
Escribe una cláusula por línea y coloca las condiciones más largas en líneas separadas con sangría. Para «productos de Furniture por debajo de 200 u.m., con el precio más alto primero», utiliza:
SELECT name, price
FROM products
WHERE category = 'Furniture'
AND price < 200
ORDER BY price DESC;
Office Chair, con 149,00, va antes que Bookshelf, con 120,00. Las dos condiciones comparten un WHERE, el umbral numérico no tiene símbolo monetario y ORDER BY ordena las filas que cumplieron las condiciones. Comprobar cada línea según su función facilita localizar tanto los errores de sintaxis como las interpretaciones incorrectas.
Puntos clave
- Escribe SELECT, FROM, WHERE, ORDER BY y LIMIT en el orden de cláusulas requerido.
- Lógicamente, lee la tabla, filtra, selecciona columnas, elimina duplicados, ordena y después toma una parte de las filas.
- WHERE puede comprobar columnas de origen que SELECT no muestra.
- Filtrar antes de ordenar permite encontrar el primer resultado dentro del grupo solicitado.
6.2 De una petición a una respuesta comprobada
Antes de escribir SQL, identifica las distintas decisiones ocultas en una petición habitual. Cada decisión corresponde a una cláusula y cada cláusula puede contrastarse con la respuesta buscada.
Toma seis decisiones
- ¿Qué tabla contiene los registros? Elige FROM.
- ¿Qué registros cumplen los requisitos? Construye WHERE.
- ¿Qué campos responden a la pregunta? Elige SELECT.
- ¿Son útiles los valores repetidos en el resultado? Decide si usar DISTINCT.
- ¿Qué debe ir primero? Construye ORDER BY.
- ¿Hay un máximo o una página? Añade LIMIT y OFFSET.
Para «al menos», incluye la igualdad. «Uno de» sugiere IN, «contiene» sugiere un patrón LIKE con signos de porcentaje en ambos extremos, «ausente» sugiere IS NULL y «valores distintos» sugiere DISTINCT. Una petición de las primeras n filas necesita tanto una dirección de ordenación como un límite.
Construye una lista breve de personal
«Muestra los nombres y las fechas de contratación de los tres empleados contratados más recientemente fuera de Sales que tengan un teléfono registrado, con los más recientes primero». Incluye al personal sin asignar en el significado de «fuera de Sales» de esta petición.
Empieza con los empleados. La regla de departamento es department <> 'Sales' OR department IS NULL. Agrupa esa elección para que la regla del teléfono se aplique a ambas ramas. Muestra los nombres y las fechas y después ordena las filas que cumplen las condiciones:
SELECT first_name, last_name, hire_date
FROM employees
WHERE (department <> 'Sales' OR department IS NULL)
AND phone IS NOT NULL
ORDER BY hire_date DESC
LIMIT 3;
Grace Okafor, con fecha 2024-02-19, va primero; David Kim, con 2020-11-23, segundo; y Farid Haddad, con 2017-09-12, tercero. Eliminar la rama IS NULL deja fuera a Grace y mantiene solo dos resultados. Ante una petición poco clara, decide cómo deben contar los departamentos ausentes e indica la decisión junto con la respuesta.
Combina categoría, precio y existencias
«¿Qué productos de Lighting o Storage cuestan menos de 20 u.m. y tienen existencias, con los más baratos primero?». Utiliza IN para las dos opciones de categoría y exige una cantidad positiva conocida:
SELECT name, price
FROM products
WHERE category IN ('Lighting', 'Storage')
AND price < 20
AND stock > 0
ORDER BY price;
Paper Tray, con 9,99, va antes que Desk Organizer, con 18,75. Lamp Shade es lo bastante barato y pertenece a una categoría elegida, pero sus existencias son cero, así que no supera la última prueba. Una cantidad de existencias ausente tampoco la superaría porque no permite establecer que sea positiva.
Comprueba las filas que podrían revelar un error
Empieza con SELECT * FROM products LIMIT 5; al explorar el esquema y unos pocos registros. Añade los filtros uno a uno, comprueba los cambios en el recuento del resultado y muestra temporalmente las columnas evaluadas cuando resulte útil.
Comprueba los límites exactos, los valores ausentes, las mayúsculas y minúsculas del texto y los empates en el límite. NOT muestra las filas donde una condición era falsa; no revela aquellas donde era desconocida. Ejecuta pruebas IS NULL por separado. Comprueba que la salida tenga las columnas solicitadas y que ORDER BY resuelva los empates que afecten a la respuesta.
Al trasladar la consulta a otra base de datos, comprueba la sintaxis de limitación de filas, las reglas de mayúsculas y minúsculas de la igualdad y LIKE, las comillas de identificadores, el tratamiento de fechas y la posición de NULL. Los ejemplos utilizan LIMIT en SQLite y PostgreSQL; la forma de SQL estándar para limitar filas es OFFSET con FETCH FIRST.
Puntos clave
- Planifica por separado la tabla, las filas que cumplen las condiciones, las columnas de salida, los duplicados, la ordenación y el número de filas.
- Expresa explícitamente la decisión sobre valores ausentes cuando una exclusión deba incluir registros sin asignar.
- Contrasta los límites y los efectos de cada filtro con la pregunta.
- Revisa los NULL por separado porque NOT no convierte desconocido en verdadero.
- Vuelve a comprobar mayúsculas y minúsculas, fechas, nombres, ordenación de NULL y límites de filas al cambiar de base de datos.
Ejemplos de Consultas con SELECT
1De los registros de empleados a una lista de ciudades
11 pasos
- 1IntroducciónUna tabla, dos tipos de respuestas
Una lista de personal y una lista de las ciudades del personal utilizan los mismos registros de empleados, pero necesitan resultados con estructuras distintas. Un SELECT básico elige los campos que se mostrarán. Después, DISTINCT puede reducir los valores seleccionados repetidos. Primero construiremos un resultado de empleados con dos columnas y después cambiaremos la pregunta a ciudades distintas para seguir qué desaparece.
- 2ExplicaciónElige las columnas que se muestran
Empieza con una petición concreta: mostrar la ciudad de cada empleado seguida de su nombre. Escribe:
SELECT city, first_name FROM employees;La lista SELECT establece el orden de las columnas de salida, por lo que la ciudad va primero. FROM proporciona la tabla. No hay filtro, así que los ocho empleados aportan una fila; esta consulta sencilla deja intactos los registros almacenados.
- 3EjemploLee la estructura del resultado
El registro de Ana aporta Chicago y Ana; el de Ben aporta Denver y Ben. Cada empleado restante aporta los mismos dos campos. Por tanto, el resultado tiene ocho filas y dos columnas. Las ciudades repetidas se mantienen porque esas filas siguen describiendo a personas distintas. No hay ORDER BY, así que estos ejemplos identifican filas sin garantizar su orden de presentación.
- 4DesafíoComprueba una lista SELECT modificada
¿Qué cambia si la consulta pasa a ser
SELECT first_name FROM employees;? Indica su número de filas y de columnas.---reveal---
Sigue devolviendo ocho filas, ahora con una columna, first_name. Eliminar la ciudad de SELECT elimina un campo mostrado, no registros de empleados. Haría falta un filtro o un límite de filas para reducir las filas.
- 5ConsejoLocaliza los errores de sintaxis
Separa los nombres de columna con comas, pero no dejes una coma final antes de FROM. Utiliza punto y coma para terminar la sentencia;
--inicia un comentario hasta el final de la línea. Si la base de datos informa de una columna desconocida, compara su escritura con el esquema.SELECT *resulta útil para una primera exploración, mientras que los nombres explícitos mantienen un resultado guardado centrado en lo necesario. - 6ExplicaciónPide ciudades distintas
Pregunta ahora qué ciudades tienen personal. Los nombres ya no deben formar parte de esa respuesta:
SELECT DISTINCT city FROM employees;Las ocho entradas de ciudad se reducen a Chicago, Denver y Boston, sin un orden garantizado. DISTINCT elimina las repeticiones del resultado seleccionado, no de la tabla de empleados almacenada. Cada ciudad aparece una vez aunque varias personas vivan en ella.
- 7EjemploCompara filas seleccionadas completas
Añade el departamento a la lista SELECT. Ana y Chloe aportan el par Sales-Chicago, que se reduce a una fila. Emma aporta Sales-Denver, que se conserva porque la ciudad es distinta. El resultado completo de
SELECT DISTINCT department, city FROM employees;tiene siete filas. DISTINCT se escribe una vez después de SELECT y compara conjuntamente todos los campos seleccionados. - 8DesafíoUn identificador único cambia la eliminación de duplicados
¿Cuántas filas devolvería
SELECT DISTINCT employee_id, city FROM employees;y por qué?---reveal---
Se mantienen las ocho filas. Cada employee_id es único, así que cada par de identificador y ciudad difiere de todos los demás. Que se repitan las ciudades no basta para que las filas seleccionadas completas sean duplicadas.
- 9Idea claveInterpreta qué indica una fila NULL
Una lista de departamentos con DISTINCT contiene Sales, IT, Marketing y una fila NULL correspondiente a Grace. Los marcadores de ausencia repetidos también se reducirían a uno. Esa fila indica que un departamento no está registrado; no es otro departamento con nombre. La agrupación de duplicados trata los NULL juntos aunque una comparación ordinaria
NULL = NULLsea desconocida. - 10DesafíoTermina con una lista breve ordenada
Predice el resultado de
SELECT DISTINCT city FROM employees ORDER BY city LIMIT 2;. Indica los valores en el orden devuelto y explica qué cuenta el límite.---reveal---
Boston y después Chicago. DISTINCT reduce primero los valores de ciudad a tres; ORDER BY ordena esos valores y LIMIT conserva dos. Cuenta ciudades distintas del resultado después de eliminar duplicados, no dos registros de empleados.
- 11RepasoAjusta la salida a la pregunta
Un resultado de personal conserva campos identificativos; un listado de ciudades selecciona solo la ciudad con DISTINCT. Las columnas seleccionadas determinan las comparaciones de duplicados, mientras que ORDER BY determina el orden de las filas. Al cambiar una consulta, comprueba tanto los campos de salida como lo que representa una fila del resultado.
2Construye un filtro que exprese lo que buscas
13 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónCada filtro plantea una pregunta precisa
- 2ExplicaciónTraduce el umbral salarial
- 3DesafíoIncluye el límite cuando sea necesario
- 4ConsejoEscribe los literales numéricos sin adornos
- 5ExplicaciónPon un valor de texto entre comillas
- 6EjemploMantén un apóstrofo dentro del valor
- 7ExplicaciónUtiliza una fecha completa como límite
- 8DesafíoComprueba una fecha con hora
- 9ExplicaciónUne las condiciones
- 10EjemploAplica una misma regla de ciudad a las alternativas
- 11DesafíoInvierte el grupo
- 12DesafíoCombina una fecha y un grupo de departamentos
- 13RepasoSigue una fila que revele el error
3Elige una lista exacta, un intervalo o un patrón
15 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónTres significados de una coincidencia
- 2ExplicaciónEmpieza con opciones de categoría completas
- 3EjemploAplica una regla de existencias a la lista
- 4DesafíoPredice una exclusión
- 5ExplicaciónSitúa un precio dentro de un intervalo
- 6DesafíoExcluye los extremos de forma deliberada
- 7ConsejoAbarca un mes completo con horas
- 8ExplicaciónDecide dónde debe aparecer el fragmento
- 9EjemploCuenta un carácter con un guion bajo
- 10EjemploHaz que el comodín sea literal
- 11DesafíoComprueba un patrón en sus extremos
- 12ConexiónComprueba cómo trata la base de datos las mayúsculas y minúsculas
- 13DesafíoTen en cuenta un teléfono ausente
- 14DesafíoCombina los tres tipos de coincidencia
- 15RepasoElige la forma a partir del significado
4Encuentra y analiza los datos ausentes
10 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónUna cantidad sin registrar queda sin resolver
- 2EjemploDistingue cero de ausente
- 3ExplicaciónComprueba directamente la presencia
- 4DesafíoComprueba la cadena vacía
- 5ExplicaciónSigue una comparación y su opuesta
- 6EjemploDeja que decida una rama OR verdadera
- 7DesafíoUna rama AND falsa puede resolverlo
- 8Idea claveEvita NULL dentro de una lista de exclusión
- 9DesafíoIncluye los departamentos ausentes y exige teléfonos
- 10RepasoRevisa los datos ausentes por separado
5Construye una página ordenada reproducible
15 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónUna página es una parte de una respuesta ordenada
- 2EjemploElige el mayor primero
- 3DesafíoOrdena solo los productos que cumplen las condiciones
- 4ConsejoReconoce si la ordenación es numérica
- 5ExplicaciónLee las prioridades de ordenación desde la izquierda
- 6DesafíoDa a cada columna de ordenación su dirección
- 7ExplicaciónResuelve los empates restantes
- 8ConexiónSitúa explícitamente los valores ausentes
- 9EjemploConserva las tres primeras filas ordenadas
- 10EjemploPasa de la primera página
- 11Idea claveLa posición de una fila difiere de la posición de un valor distinto
- 12DesafíoRevisa un punto de corte con empate
- 13ConsejoReconoce otra forma de limitar filas
- 14DesafíoObtén la segunda página por ciudad
- 15RepasoEstablece el orden antes de tomar una parte
6Traduce y comprueba una petición del entorno laboral
12 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónSepara las decisiones de una petición
- 2ExplicaciónEscribe las cláusulas en un orden válido
- 3EjemploSigue el modelo lógico
- 4DesafíoFiltra antes de elegir al primero
- 5ExplicaciónIdentifica la petición sobre personal
- 6EjemploHaz explícita la regla de departamento
- 7EjemploAplica el requisito del teléfono
- 8EjemploOrdena los registros que cumplen las condiciones
- 9DesafíoComprueba la decisión sobre valores ausentes
- 10DesafíoConecta las cláusulas en una secuencia
- 11ConsejoElige comprobaciones que revelen errores
- 12RepasoContrasta la respuesta con la petición
Ejercicios de Consultas con SELECT
Set 1: Columnas, comparaciones y condiciones claras10 Preguntas de Práctica
Pregunta 1 de 10
zone sea North o West?Mostrar respuestaOcultar respuesta
Pregunta 2 de 10
rooms tiene 12 filas. ¿Qué estructura tiene el resultado de SELECT floor, room_name FROM rooms;?Mostrar respuestaOcultar respuesta
Pregunta 3 de 10
parcels almacena weight_kg numérico. ¿Qué condición conserva los paquetes que pesan como máximo 8 kilogramos?Mostrar respuestaOcultar respuesta
Pregunta 4 de 10
D'Arcy en una columna surname?Mostrar respuestaOcultar respuesta
Pregunta 5 de 10
tickets tiene status y priority numérico. ¿Qué condición selecciona incidencias abiertas o pendientes, todas con prioridad de al menos 4?Mostrar respuestaOcultar respuesta
Pregunta 6 de 10
visits contiene los pares (site, day) ('East', 'Mon'), ('East', 'Mon'), ('East', 'Tue') y ('West', 'Mon'). ¿Cuántas filas devuelve SELECT DISTINCT site, day FROM visits;?Mostrar respuestaOcultar respuesta
Pregunta 7 de 10
team = 'Blue', city = 'Austin' y score = 62. ¿Cumple WHERE team = 'Blue' OR city = 'Miami' AND score >= 80 y por qué?Mostrar respuestaOcultar respuesta
Pregunta 8 de 10
YYYY-MM-DD. ¿Qué condición selecciona fechas posteriores al año natural 2025?Mostrar respuestaOcultar respuesta
Pregunta 9 de 10
loans tiene valores numéricos de days_late de 0, 2, 5 y NULL. ¿Cuántas filas cumplen WHERE days_late <> 0?Mostrar respuestaOcultar respuesta
Pregunta 10 de 10
stockrooms tiene las filas (room_id, building) (1, 'C'), (2, 'A'), (3, 'A'), (4, 'B'), (5, 'C'). ¿Qué valores ordenados produce SELECT DISTINCT building FROM stockrooms ORDER BY building DESC LIMIT 2;?Mostrar respuestaOcultar respuesta
Set 2: Listas, intervalos y patrones de caracteres10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
fee tiene los valores 12, 18, 24 y 30. ¿Qué valores cumplen WHERE fee BETWEEN 18 AND 30?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
report?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
requests tiene las filas (request_id, region) (31, 'South'), (32, 'East'), (33, 'South'). ¿Qué conjunto de identificadores cumple WHERE region IN ('South', 'South')?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
labels, ¿qué conjunto de valores coincide con label LIKE '__7%': 'AB7', 'A7', 'AB70' y 'ABC7'?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
temperature contiene 4, 9, 14, 19 y NULL. ¿Qué valores cumplen WHERE temperature NOT BETWEEN 9 AND 14?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
promo_code contiene 'VIP_2', 'VIPA2', 'VIP_' y 'VIP2'. ¿Qué conjunto coincide con WHERE promo_code LIKE 'VIP!_%' ESCAPE '!'?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
appointments almacena texto con hora en el formato de longitud fija YYYY-MM-DD HH:MM:SS. ¿Qué condición selecciona todas las citas de febrero de 2028?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
word LIKE 'map%' entre 'Maple', 'map', 'roadmap' y 'MAPS'?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
members tiene las filas (member_id, tier) (41, 'Gold'), (42, 'Silver'), (43, NULL). ¿Qué conjunto de identificadores cumple WHERE tier IN ('Silver', NULL)?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
shipments registra un port por fila. ¿Qué condición excluye tanto Oakland como Tacoma cuando todos los valores de puerto están registrados?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 3: Valores ausentes y filtros combinados10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
contacts de SQLite almacena los valores de phone NULL, '', 'NULL' y '555-0188'. ¿Cuántas filas cumplen WHERE phone IS NULL?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
devices tiene battery_pct = NULL y status = 'ready'. ¿Qué ocurre con WHERE battery_pct > 50 OR status = 'ready'?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
email registrado, incluida una cadena vacía si está almacenada como valor en PostgreSQL?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
jobs contiene las filas (job_id, hours, urgent) (51, NULL, 'yes'), (52, 6, 'no'), (53, 2, 'yes'), (54, NULL, 'no'). ¿Qué conjunto cumple WHERE NOT (hours > 4) OR urgent = 'yes'?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
files tiene los valores de folder 'Archive', 'Active' y NULL. ¿Qué condición incluye Active y la carpeta ausente, y excluye Archive?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
routes tiene las filas (route_id, depot) (61, 'A'), (62, 'B'), (63, NULL). ¿Qué conjunto de identificadores cumple WHERE depot NOT IN ('A', NULL) OR depot IS NULL?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
load: 0, 3, 7, NULL, NULL. Dos consultas utilizan WHERE load > 3 y WHERE NOT (load > 3). ¿Cuáles son sus recuentos de filas, en ese orden?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
deliveries tiene los valores de district 'Hill', NULL, 'Hill', NULL y 'Lake'. ¿Cuántas filas devuelve SELECT DISTINCT district FROM deliveries;?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
WHERE rating >= 4 y después comprueba las filas excluidas con WHERE NOT (rating >= 4). Algunos registros no aparecen en ninguno de los resultados. ¿Qué prueba adicional revela los registros cuya valoración no se registró?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
messages tiene los asuntos 'Note A', 'Alert', NULL y 'Note B'. ¿Cuántas filas cumplen WHERE subject NOT LIKE 'Note%'?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 4: Ordenación, empates y páginas posteriores10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
duration_minutes tiene los valores 16, 4 y 23. ¿Cuál es su orden con ORDER BY duration_minutes?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
racers tiene las filas (racer_id, group_name, points) (71, 'A', 8), (72, 'B', 12), (73, 'A', 15). ¿Qué orden de identificadores produce ORDER BY group_name, points DESC?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
orders tiene valores únicos de order_id, y varias filas comparten tanto order_date como total. ¿Qué ORDER BY da las fechas más recientes primero, los totales más altos dentro de una fecha y un orden total?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
offers tiene las filas (offer_id, rate) (81, 40), (82, 40), (83, 35), (84, 30). ¿Qué tarifa devuelve SELECT DISTINCT rate FROM offers ORDER BY rate DESC LIMIT 1 OFFSET 1;?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
queues contiene los nombres 'Delta', NULL y 'Alpha'. Con el orden predeterminado de ORDER BY queue_name ASC, ¿dónde queda la fila NULL en SQLite y PostgreSQL?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
sales tiene las filas (sale_id, amount) (91, 70), (92, 70), (93, 55), (94, 55), (95, 20). En PostgreSQL, ¿cuántas filas devuelve SELECT sale_id, amount FROM sales ORDER BY amount DESC FETCH FIRST 3 ROWS WITH TIES;?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
'6', '12' y '100' con intercalación binaria. ¿Cuál es su orden ascendente?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
ORDER BY item_id LIMIT 4 OFFSET 4 sobre filas sin cambios con identificadores únicos del 1 al 12. Antes de la siguiente consulta de página, se elimina la fila 2. ¿Qué identificadores devuelve ahora LIMIT 4 OFFSET 8 con la misma ordenación?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
tasks tiene las filas (task_id, owner, hours) (101, 'Lee', 9), (102, 'Ari', 8), (103, 'Lee', 5), (104, 'Lee', 3). ¿Qué identificador devuelve SELECT task_id FROM tasks WHERE owner = 'Lee' ORDER BY hours DESC LIMIT 1 OFFSET 1;?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 5: Consultas completas y comprobaciones de resultados10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
courses tiene title, fee numérico y places_left numérico. ¿Qué consulta muestra los títulos y las tarifas de cursos de menos de 75 u.m. con plazas disponibles, los más baratos primero?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
cases tiene las filas (case_id, team, opened_on, phone) (111, 'Red', '2026-06-12', 'x'), (112, NULL, '2026-06-20', 'y'), (113, 'Blue', '2026-06-18', NULL), (114, 'Blue', '2026-06-10', 'z'). ¿Qué identificadores ordenados corresponden a los dos casos más recientes fuera de Red, incluidos los equipos sin asignar, con un teléfono registrado?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
rentals tiene branch = 'East' y returned = 'yes'. Una consulta debería mostrar alquileres sin devolver de East o West, pero aparece esta fila. El filtro es branch = 'East' OR branch = 'West' AND returned = 'no'. ¿Qué corrección aplica la regla de devolución a ambas sucursales?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
catalog tiene nombres de productos ASCII. ¿Qué condición encuentra nombres que contienen steel sin distinguir mayúsculas y minúsculas ASCII tanto en SQLite como en PostgreSQL?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
'G', 'G1', 'H2', 'J' y 'J1' con intercalación binaria. ¿Qué conjunto cumple WHERE code BETWEEN 'G' AND 'J' AND code NOT LIKE 'H%'?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
logs contiene las filas (region, channel) ('East', 'web'), ('East', 'web'), ('East', 'store'), ('West', 'web'), ('West', 'store'). ¿Qué filas ordenadas produce SELECT DISTINCT region, channel FROM logs WHERE channel = 'web' ORDER BY region DESC LIMIT 1;?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
bids tiene las filas (bid_id, amount) (121, 90), (122, 90), (123, 80), (124, 80). ¿Cuántas filas devuelve SELECT bid_id, amount FROM bids ORDER BY amount DESC, bid_id FETCH FIRST 3 ROWS WITH TIES;?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
sensors contiene las filas (sensor_id, reading, enabled) (131, NULL, 'yes'), (132, 8, 'yes'), (133, 2, 'no'), (134, NULL, 'no'). ¿Qué conjunto cumple WHERE NOT (reading > 5 AND enabled = 'yes')?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
fee > 50 y los únicos registros de prueba disponibles tienen tarifas de 20 y 80. ¿Qué tarifa de prueba adicional revela el error de forma más directa?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
¿Te atascas con una pregunta tuya? Ayuda con Tareas
Términos Clave
A
AND
ASC
price ASC coloca primero el producto de Lighting más barato y último el más caro.B
BETWEEN
price BETWEEN 15.50 AND 89.00 incluye los productos con un precio exacto de 15.50 o 89.00, los dos extremos indicados.C
Cadena vacía
phone = '' comprueba si hay cadenas vacías y no encuentra los valores de teléfono ausentes de los empleados.Cláusula ESCAPE
LIKE 'SPRING!_%' ESCAPE '!' hace que el guion bajo después de SPRING sea un carácter literal.Cláusula FROM
SELECT name, price FROM products; identifica products como el origen de ambos campos.Cláusula SELECT
SELECT city, first_name FROM employees; coloca la ciudad antes del nombre del empleado.Cláusula WHERE
WHERE salary < 50000 conserva a los empleados que cobran menos de 50 000, incluso cuando la salida oculta sus salarios.Columna de ordenación
Columna principal de ordenación
ORDER BY city, last_name, que mantiene los apellidos de Boston antes que los de Chicago.Combinación de valores seleccionados
Comentario SQL
-- puede explicar por qué un filtro incluye al personal sin asignar sin modificar sus condiciones.Comodín de guion bajo
Comodín de porcentaje (%)
'Lamp%' permite cualquier sufijo después de Lamp, incluida la ausencia de sufijo para el valor Lamp.Comprobación de límites
Comprobación del resultado
Conjunto de resultados
SELECT city FROM employees; tiene ocho filas y permite valores de ciudad repetidos.Construcción incremental de consultas
Consulta
SELECT first_name FROM employees; solicita a la base de datos el campo de nombre de cada empleado.Criterio de desempate
D
DESC
ORDER BY hire_date DESC coloca a un empleado contratado en 2024 antes de uno contratado en 2023 en la lista de empleados.Dialecto SQL
DISTINCT
SELECT DISTINCT city FROM employees; enumera solo esas tres ciudades.E
Extremo
BETWEEN 15.50 AND 89.00 está incluido, por lo que los productos con un precio exacto de 15.50 o 89.00 cumplen la condición.F
Fila duplicada en el resultado
Formato de fecha ISO
hire_date >= '2023-01-01' incluye a los empleados contratados en esa fecha o después en las comparaciones por orden cronológico.I
Identificador
hire_date nombra una columna, mientras que el texto entre comillas '2024-02-19' representa un valor.ILIKE
name ILIKE '%desk%' puede coincidir con nombres de productos que contengan el texto Desk con mayúscula inicial.IN
department IN ('IT', 'Marketing') selecciona a todos los empleados de IT o Marketing sin repetir una comparación de departamento.Intercalación
'Chicago' de 'chicago', así que un filtro por 'chicago' no encuentra las filas almacenadas como Chicago.Intervalo de fechas semiabierto
'2024-04-01' y conserva las últimas horas del día final.IS NOT DISTINCT FROM
IS NOT NULL
phone IS NOT NULL conserva a un empleado cuyo teléfono está registrado aunque falte el departamento de ese empleado.IS NULL
phone IS NULL encuentra a los empleados cuyos registros no tienen un valor de teléfono registrado.L
LIKE
name LIKE '%Lamp%' encuentra todos los nombres de productos que contienen Lamp, ya aparezca Lamp al principio, en medio o al final.LIMIT
Límite inferior
price BETWEEN 89.00 AND 15.50 supera el límite superior y no deja coincidencias.Lista IN
(6, 2, 2, 4) coincide con los mismos registros de empleados que (2, 4, 6), a pesar de su orden y repetición.Literal de texto
'O''Neill' coincide con el apellido O’Neill porque sus comillas duplicadas representan un apóstrofo.Literal numérico
20.50 de price < 20.50 no tiene comillas, separador de millares ni símbolo monetario.Lógica trivalente
price > 100 es verdadera.N
NOT
stock > 10 no incluye un producto con existencias ausentes, porque esa fila sigue dando una condición desconocida.NOT BETWEEN
stock NOT BETWEEN 5 AND 40 conserva un producto con existencias cero y otro con sesenta, pero excluye las existencias ausentes.NOT IN
city NOT IN ('Chicago', 'Denver') conserva al personal de Boston porque sus ciudades difieren de ambos elementos.NULL
NULLS LAST
department NULLS LAST coloca a los empleados sin departamento registrado después de los departamentos registrados en consultas de las versiones actuales de SQLite y PostgreSQL.O
OFFSET
Operador de comparación
>= incluye a un empleado que cobra exactamente 60 000 en salary >= 60000 porque ese salario es igual al umbral.Optimizador de consultas
OR
Orden de las cláusulas
Orden lógico de procesamiento
Orden total
ORDER BY city, employee_id resuelve la posición de cada empleado mediante el identificador único.ORDER BY
ORDER BY salary DESC coloca primero al empleado mejor pagado sin modificar ningún registro de empleado almacenado.P
Página
Precedencia de operadores
T
Tipo DATE
DATE '2022-01-01'; SQLite no utiliza esta sintaxis de literal con tipo.TOP
SELECT TOP (3) puede sustituir una lista breve de tres filas con LIMIT cuando la consulta se escribe para SQL Server.U
Umbral inclusivo
salary >= 60000.V
Valor de verdad desconocido
stock > 10, por lo que esa fila no supera el filtro.W
WITH TIES
Sobre esta unidad
Crea tus propios Materiales de Estudio
Convierte tus notas, diapositivas y documentos en Guías de Estudio, Preguntas de Práctica, Flashcards y 6 herramientas más.