Consultas con SELECT

Aprende a responder preguntas a partir de los datos de una tabla de base de datos. Elige columnas con SELECT y FROM, conserva las filas que necesitas con WHERE, operadores de comparación, AND, OR y NOT, y busca coincidencias con listas, intervalos y patrones de texto mediante IN, BETWEEN y LIKE. Encuentra y gestiona los valores ausentes con IS NULL, enumera valores distintos con DISTINCT y ordena y limita los resultados con ORDER BY y LIMIT. Los ejemplos utilizan SQL que se ejecuta en SQLite y PostgreSQL, incluida la cláusula LIMIT, muy utilizada, con notas sobre la sintaxis estándar y las diferencias con MySQL, SQL Server y Oracle.

PrincipianteUnidad 2 de 6 del curso Curso de Fundamentos de SQL

Lo que aprenderás

  1. 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ásica
      Indica 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 DISTINCT
      Elimina las filas repetidas de un resultado con SELECT DISTINCT y predice cuántas filas quedan, también cuando intervienen varias columnas o valores ausentes.
  2. 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ón
      Utiliza 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 correctamente
      Escribe 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 NOT
      Une 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.
  3. 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 IN
      Utiliza 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 BETWEEN
      Utiliza 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 LIKE
      Encuentra 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.
  4. 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 NULL
      Distingue 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 condiciones
      Aplica 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.
  5. 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 BY
      Ordena 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 NULL
      Ordena 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 OFFSET
      Devuelve 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.
  6. 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 consulta
      Escribe 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 respuesta
      Convierte 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.

Guía de estudio de Consultas con SELECT

6 capítulos

1

Elige 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_idfirst_namelast_namedepartmentcitysalaryhire_datephone
1AnaLopezSalesChicago52 0002019-03-15312-555-0147
2BenCarterITDenver71 0002021-07-01NULL
3ChloeNguyenSalesChicago48 0002023-01-09312-555-0198
4DavidKimMarketingBoston60 0002020-11-23617-555-0110
5EmmaBrownSalesDenver65 0002018-05-30NULL
6FaridHaddadITChicago83 0002017-09-12312-555-0175
7GraceOkaforNULLBoston45 0002024-02-19617-555-0133
8HugoO'NeillMarketingChicago58 0002022-08-05NULL

La tabla products registra los precios en u.m. y las existencias en unidades del almacén.

product_idnamecategorypricestock
1Desk LampLighting24,9940
2Floor LampLighting89,0012
3Lamp ShadeLighting15,500
4Office ChairFurniture149,008
5Standing DeskFurniture349,005
6Desk OrganizerStorage18,7560
7BookshelfFurniture120,00NULL
8Paper TrayStorage9,9925
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

  • SELECT elige las columnas que se muestran; FROM identifica 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

  • DISTINCT elimina 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.
2

Conserva 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ónOperadorCondició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-DD para 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.
3

Busca 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ónSignificadoNombres de productos coincidentes
'Lamp%'Empieza por LampLamp Shade
'%Lamp'Termina en LampDesk Lamp, Floor Lamp
'%Lamp%'Contiene LampDesk Lamp, Floor Lamp, Lamp Shade
'Lamp'Exactamente LampNinguno

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.
4

Ten 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:

PreguntaCondiciónResultado
¿Qué productos están agotados?stock = 0Lamp Shade
¿Qué cantidades de existencias son desconocidas?stock IS NULLBookshelf
¿Qué cantidades están registradas?stock IS NOT NULLLos 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 SQLQué representa
NULLUn 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.
  • = NULL y <> NULL no 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ónResultado
Desconocido AND falsoFalso
Desconocido AND verdaderoDesconocido
Desconocido AND desconocidoDesconocido
Desconocido OR verdaderoVerdadero
Desconocido OR falsoDesconocido
Desconocido OR desconocidoDesconocido

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.
5

Ordena 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ónNúmerosFechas completasTexto
ASCEl menor primeroLa más antigua primeroOrden de intercalación
DESCEl mayor primeroLa más reciente primeroOrden 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 datosNULL en orden ASCNULL en orden DESC
SQLite, MySQL, SQL ServerAl principioAl final
PostgreSQL, OracleAl finalAl 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 datosUn límite de tres filas
SQLite, PostgreSQL, MySQLORDER BY salary DESC LIMIT 3
PostgreSQL, Oracle 12c o posteriorORDER BY salary DESC FETCH FIRST 3 ROWS ONLY
SQL ServerSELECT 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.
6

Construye 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ógicaQué ocurre en el ejemplo
FROMLeer las filas de empleados.
WHEREConservar a Ana, Chloe y Emma, de Sales.
SELECTConservar sus valores de ciudad: Chicago, Chicago, Denver.
DISTINCTReducir esos valores a Chicago y Denver.
ORDER BYPoner Chicago antes que Denver.
OFFSET y LIMITNo 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
  1. ¿Qué tabla contiene los registros? Elige FROM.
  2. ¿Qué registros cumplen los requisitos? Construye WHERE.
  3. ¿Qué campos responden a la pregunta? Elige SELECT.
  4. ¿Son útiles los valores repetidos en el resultado? Decide si usar DISTINCT.
  5. ¿Qué debe ir primero? Construye ORDER BY.
  6. ¿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

6 Lecciones Interactivas

1

De los registros de empleados a una lista de ciudades

11 pasos
Elige las columnas del resultado y después decide qué debe contar como duplicado.
  1. 1
    Introducció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.

  2. 2
    Explicació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.

  3. 3
    EjemploLee 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.

  4. 4
    Desafí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.

  5. 5
    ConsejoLocaliza 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.

  6. 6
    Explicació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.

  7. 7
    EjemploCompara 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.

  8. 8
    Desafí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.

  9. 9
    Idea 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 = NULL sea desconocida.

  10. 10
    Desafí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.

  11. 11
    RepasoAjusta 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.

2

Construye un filtro que exprese lo que buscas

13 pasos
Traduce umbrales, valores entre comillas y grupos de condiciones en pruebas sobre filas.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónCada filtro plantea una pregunta precisa
  2. 2
    ExplicaciónTraduce el umbral salarial
  3. 3
    DesafíoIncluye el límite cuando sea necesario
  4. 4
    ConsejoEscribe los literales numéricos sin adornos
  5. 5
    ExplicaciónPon un valor de texto entre comillas
  6. 6
    EjemploMantén un apóstrofo dentro del valor
  7. 7
    ExplicaciónUtiliza una fecha completa como límite
  8. 8
    DesafíoComprueba una fecha con hora
  9. 9
    ExplicaciónUne las condiciones
  10. 10
    EjemploAplica una misma regla de ciudad a las alternativas
  11. 11
    DesafíoInvierte el grupo
  12. 12
    DesafíoCombina una fecha y un grupo de departamentos
  13. 13
    RepasoSigue una fila que revele el error
3

Elige una lista exacta, un intervalo o un patrón

15 pasos
Utiliza la forma de coincidencia que se ajuste a la pregunta y comprueba sus límites.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónTres significados de una coincidencia
  2. 2
    ExplicaciónEmpieza con opciones de categoría completas
  3. 3
    EjemploAplica una regla de existencias a la lista
  4. 4
    DesafíoPredice una exclusión
  5. 5
    ExplicaciónSitúa un precio dentro de un intervalo
  6. 6
    DesafíoExcluye los extremos de forma deliberada
  7. 7
    ConsejoAbarca un mes completo con horas
  8. 8
    ExplicaciónDecide dónde debe aparecer el fragmento
  9. 9
    EjemploCuenta un carácter con un guion bajo
  10. 10
    EjemploHaz que el comodín sea literal
  11. 11
    DesafíoComprueba un patrón en sus extremos
  12. 12
    ConexiónComprueba cómo trata la base de datos las mayúsculas y minúsculas
  13. 13
    DesafíoTen en cuenta un teléfono ausente
  14. 14
    DesafíoCombina los tres tipos de coincidencia
  15. 15
    RepasoElige la forma a partir del significado
4

Encuentra y analiza los datos ausentes

10 pasos
Distingue NULL de los valores conocidos y sigue el valor desconocido a través de un filtro.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónUna cantidad sin registrar queda sin resolver
  2. 2
    EjemploDistingue cero de ausente
  3. 3
    ExplicaciónComprueba directamente la presencia
  4. 4
    DesafíoComprueba la cadena vacía
  5. 5
    ExplicaciónSigue una comparación y su opuesta
  6. 6
    EjemploDeja que decida una rama OR verdadera
  7. 7
    DesafíoUna rama AND falsa puede resolverlo
  8. 8
    Idea claveEvita NULL dentro de una lista de exclusión
  9. 9
    DesafíoIncluye los departamentos ausentes y exige teléfonos
  10. 10
    RepasoRevisa los datos ausentes por separado
5

Construye una página ordenada reproducible

15 pasos
Ordena las filas que cumplen las condiciones, resuelve los empates y aplica un límite y un desplazamiento.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónUna página es una parte de una respuesta ordenada
  2. 2
    EjemploElige el mayor primero
  3. 3
    DesafíoOrdena solo los productos que cumplen las condiciones
  4. 4
    ConsejoReconoce si la ordenación es numérica
  5. 5
    ExplicaciónLee las prioridades de ordenación desde la izquierda
  6. 6
    DesafíoDa a cada columna de ordenación su dirección
  7. 7
    ExplicaciónResuelve los empates restantes
  8. 8
    ConexiónSitúa explícitamente los valores ausentes
  9. 9
    EjemploConserva las tres primeras filas ordenadas
  10. 10
    EjemploPasa de la primera página
  11. 11
    Idea claveLa posición de una fila difiere de la posición de un valor distinto
  12. 12
    DesafíoRevisa un punto de corte con empate
  13. 13
    ConsejoReconoce otra forma de limitar filas
  14. 14
    DesafíoObtén la segunda página por ciudad
  15. 15
    RepasoEstablece el orden antes de tomar una parte
6

Traduce y comprueba una petición del entorno laboral

12 pasos
Construye una consulta completa sobre una sola tabla y revisa cómo cambia la respuesta cada cláusula.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónSepara las decisiones de una petición
  2. 2
    ExplicaciónEscribe las cláusulas en un orden válido
  3. 3
    EjemploSigue el modelo lógico
  4. 4
    DesafíoFiltra antes de elegir al primero
  5. 5
    ExplicaciónIdentifica la petición sobre personal
  6. 6
    EjemploHaz explícita la regla de departamento
  7. 7
    EjemploAplica el requisito del teléfono
  8. 8
    EjemploOrdena los registros que cumplen las condiciones
  9. 9
    DesafíoComprueba la decisión sobre valores ausentes
  10. 10
    DesafíoConecta las cláusulas en una secuencia
  11. 11
    ConsejoElige comprobaciones que revelen errores
  12. 12
    RepasoContrasta la respuesta con la petición

Ejercicios de Consultas con SELECT

50 Preguntas de Práctica en 5 sets

Set 1: Columnas, comparaciones y condiciones claras10 Preguntas de Práctica

Pregunta 1 de 10

¿Qué condición selecciona los registros cuyo valor completo de zone sea North o West?
  1. zone IN 'North', 'West'
  2. zone IN ('North, West')
  3. zone IN ('North', 'West')
  4. zone = 'North' AND zone = 'West'
Mostrar respuestaOcultar respuesta
Respuesta: C
IN recibe una lista entre paréntesis con un literal entre comillas por cada valor permitido. Poner ambos nombres dentro de un solo par de comillas crea un valor de texto combinado, no dos opciones. Un AND entre igualdades no puede hacer que una zona coincida con dos valores completos distintos a la vez.

Pregunta 2 de 10

Una tabla rooms tiene 12 filas. ¿Qué estructura tiene el resultado de SELECT floor, room_name FROM rooms;?
  1. 2 filas y 12 columnas
  2. 12 filas y 2 columnas
  3. 12 filas y todas las columnas
  4. 2 filas y todas las columnas
Mostrar respuestaOcultar respuesta
Respuesta: B
Cada habitación aporta una fila porque la consulta no tiene filtro ni límite. La lista SELECT indica dos columnas de salida, primero floor y después room_name. Enumerar dos campos no restringe el resultado a dos registros; aquí SELECT controla las columnas mostradas.

Pregunta 3 de 10

Una tabla parcels almacena weight_kg numérico. ¿Qué condición conserva los paquetes que pesan como máximo 8 kilogramos?
  1. weight_kg < 8
  2. weight_kg >= 8
  3. weight_kg > 8
  4. weight_kg <= 8
Mostrar respuestaOcultar respuesta
Respuesta: D
«Como máximo 8» incluye 8 y cualquier peso menor, así que utiliza <=. La condición < 8 excluiría un paquete situado exactamente en el límite permitido. Comprobar ese peso exacto es una forma útil de distinguir estos dos filtros, que por lo demás son similares.

Pregunta 4 de 10

¿Qué condición SQL coincide con el valor de texto exacto D'Arcy en una columna surname?
  1. surname = 'D''Arcy'
  2. surname = 'D'Arcy'
  3. surname = "D'Arcy"
  4. surname = D'Arcy
Mostrar respuestaOcultar respuesta
Respuesta: A
Un literal de texto necesita comillas simples alrededor del valor completo y un apóstrofo interior se representa con dos comillas simples contiguas. El apóstrofo sin duplicar terminaría el literal demasiado pronto. Las comillas dobles estándar identifican un nombre, por lo que no son la forma de escribir un literal de texto.

Pregunta 5 de 10

Una tabla tickets tiene status y priority numérico. ¿Qué condición selecciona incidencias abiertas o pendientes, todas con prioridad de al menos 4?
  1. status = 'open' OR status = 'pending' AND priority >= 4
  2. (status = 'open' AND status = 'pending') OR priority >= 4
  3. (status = 'open' OR status = 'pending') AND priority >= 4
  4. (status = 'open' OR status = 'pending') AND priority > 4
Mostrar respuestaOcultar respuesta
Respuesta: C
Las alternativas de estado forman un grupo y cada fila de ese grupo debe cumplir también el umbral de prioridad. Sin paréntesis, AND aplica la regla de prioridad solo a las incidencias pendientes y admite incidencias abiertas de prioridad baja. «Al menos 4» incluye el límite, así que necesita >=.

Pregunta 6 de 10

Una tabla 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;?
  1. 2 filas
  2. 3 filas
  3. 4 filas
  4. 1 fila
Mostrar respuestaOcultar respuesta
Respuesta: B
DISTINCT compara conjuntamente el lugar y el día seleccionados. Solo las dos filas East-Mon son duplicadas, por lo que quedan East-Mon, East-Tue y West-Mon: tres filas. Contar solo los dos nombres de lugar ignora que East aparece con dos días seleccionados distintos.

Pregunta 7 de 10

Una fila tiene team = 'Blue', city = 'Austin' y score = 62. ¿Cumple WHERE team = 'Blue' OR city = 'Miami' AND score >= 80 y por qué?
  1. Sí; la prueba verdadera del equipo basta para OR.
  2. No; la prueba de puntuación se aplica a ambas ubicaciones.
  3. Sí; OR exige que ambas comparaciones de texto sean verdaderas.
  4. No; la prueba de ciudad es falsa y siempre debe cumplirse.
Mostrar respuestaOcultar respuesta
Respuesta: A
AND se evalúa antes que OR, así que la condición agrupa las pruebas de Miami y de puntuación. La rama independiente del equipo Blue es verdadera y basta para conservar esta fila. Exigir también una puntuación de 80 para Blue requeriría paréntesis alrededor de las alternativas de texto antes de AND.

Pregunta 8 de 10

Una columna de texto almacena fechas completas como YYYY-MM-DD. ¿Qué condición selecciona fechas posteriores al año natural 2025?
  1. event_date > '2025'
  2. event_date > '2025-01-01'
  3. event_date >= '2025-12-31'
  4. event_date >= '2026-01-01'
Mostrar respuestaOcultar respuesta
Respuesta: D
La primera fecha posterior al año 2025 completo es el 1 de enero de 2026, por lo que una comparación que incluya esa fecha da el intervalo buscado. El límite de texto '2025' también incluiría fechas de 2025 porque una fecha completa se ordena después de ese prefijo coincidente más corto.

Pregunta 9 de 10

Una tabla loans tiene valores numéricos de days_late de 0, 2, 5 y NULL. ¿Cuántas filas cumplen WHERE days_late <> 0?
  1. 4 filas
  2. 2 filas
  3. 3 filas
  4. 1 fila
Mostrar respuestaOcultar respuesta
Respuesta: B
Los valores conocidos 2 y 5 difieren de cero, así que dos filas cumplen la condición. La fila con cero es falsa y la comparación con NULL es desconocida; WHERE no conserva ninguna de las dos. Contar tres supone que se sabe que un número ausente difiere de cero, algo que una comparación ordinaria no puede establecer.

Pregunta 10 de 10

Una tabla 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;?
  1. C, C
  2. A, B
  3. B, A
  4. C, B
Mostrar respuestaOcultar respuesta
Respuesta: D
DISTINCT reduce primero los valores seleccionados a A, B y C. El orden descendente da C, B, A, y el límite conserva C y B. Tomar dos filas almacenadas antes de eliminar duplicados cambiaría la pregunta; el límite cuenta los valores distintos de edificio después de ordenar.
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

Una columna numérica fee tiene los valores 12, 18, 24 y 30. ¿Qué valores cumplen WHERE fee BETWEEN 18 AND 30?
  1. Solo 24
  2. 18, 24
  3. 18, 24, 30
  4. 12, 18, 24
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

¿Qué patrón LIKE selecciona texto que termina en report?
  1. '%report'
  2. 'report%'
  3. '%report%'
  4. '_report'
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

Una tabla requests tiene las filas (request_id, region) (31, 'South'), (32, 'East'), (33, 'South'). ¿Qué conjunto de identificadores cumple WHERE region IN ('South', 'South')?
  1. {31, 31, 33, 33}
  2. {31}
  3. {31, 32, 33}
  4. {31, 33}
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

En una tabla labels, ¿qué conjunto de valores coincide con label LIKE '__7%': 'AB7', 'A7', 'AB70' y 'ABC7'?
  1. {AB7, A7, AB70}
  2. {AB7, AB70}
  3. {AB70, ABC7}
  4. {A7, AB7}
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Una columna numérica temperature contiene 4, 9, 14, 19 y NULL. ¿Qué valores cumplen WHERE temperature NOT BETWEEN 9 AND 14?
  1. 4, 19
  2. 4, 9, 14, 19
  3. 4, 19, NULL
  4. 9, 14
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Una columna promo_code contiene 'VIP_2', 'VIPA2', 'VIP_' y 'VIP2'. ¿Qué conjunto coincide con WHERE promo_code LIKE 'VIP!_%' ESCAPE '!'?
  1. {VIP_2, VIPA2, VIP_}
  2. {VIP_2}
  3. {VIP_2, VIP_}
  4. {VIPA2, VIP2}
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

Una tabla 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?
  1. starts_at BETWEEN '2028-02-01' AND '2028-02-29'
  2. starts_at >= '2028-02-01' AND starts_at < '2028-03-01'
  3. starts_at > '2028-02-01' AND starts_at > '2028-03-01'
  4. starts_at >= '2028-02-01' AND starts_at <= '2028-03-01'
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Con el comportamiento predeterminado de LIKE en SQLite, ¿qué conjunto coincide con word LIKE 'map%' entre 'Maple', 'map', 'roadmap' y 'MAPS'?
  1. {map}
  2. {map, roadmap}
  3. {Maple, map}
  4. {Maple, map, MAPS}
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Una tabla members tiene las filas (member_id, tier) (41, 'Gold'), (42, 'Silver'), (43, NULL). ¿Qué conjunto de identificadores cumple WHERE tier IN ('Silver', NULL)?
  1. {}
  2. {42, 43}
  3. {41, 42}
  4. {42}
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Una tabla shipments registra un port por fila. ¿Qué condición excluye tanto Oakland como Tacoma cuando todos los valores de puerto están registrados?
  1. NOT (port = 'Oakland' OR port = 'Tacoma')
  2. NOT port = 'Oakland' OR port = 'Tacoma'
  3. port <> 'Oakland' OR port <> 'Tacoma'
  4. NOT (port <> 'Oakland' AND port <> 'Tacoma')
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

Una tabla contacts de SQLite almacena los valores de phone NULL, '', 'NULL' y '555-0188'. ¿Cuántas filas cumplen WHERE phone IS NULL?
  1. 2 filas
  2. 3 filas
  3. 4 filas
  4. 1 fila
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Una fila de devices tiene battery_pct = NULL y status = 'ready'. ¿Qué ocurre con WHERE battery_pct > 50 OR status = 'ready'?
  1. Se descarta porque cualquier NULL hace que OR sea desconocido.
  2. Se conserva porque la rama de estado es verdadera.
  3. Se descarta porque ambas ramas deben ser verdaderas.
  4. Se conserva porque OR siempre ignora las ramas NULL.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

¿Qué condición encuentra filas con un valor de email registrado, incluida una cadena vacía si está almacenada como valor en PostgreSQL?
  1. email <> NULL
  2. email <> ''
  3. email IS NOT NULL
  4. email = 'NULL'
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

Una tabla 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'?
  1. {51, 53}
  2. {53}
  3. {51, 53, 54}
  4. {51, 52, 53}
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Una tabla files tiene los valores de folder 'Archive', 'Active' y NULL. ¿Qué condición incluye Active y la carpeta ausente, y excluye Archive?
  1. folder <> 'Archive'
  2. folder <> 'Archive' OR folder IS NULL
  3. folder <> 'Archive' AND folder IS NULL
  4. folder NOT IN ('Archive', NULL)
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Una tabla 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?
  1. {62, 63}
  2. {}
  3. {61, 62, 63}
  4. {63}
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

Una tabla tiene cinco valores numéricos de 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?
  1. 1 y 2
  2. 3 y 2
  3. 1 y 4
  4. 2 y 3
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Una tabla deliveries tiene los valores de district 'Hill', NULL, 'Hill', NULL y 'Lake'. ¿Cuántas filas devuelve SELECT DISTINCT district FROM deliveries;?
  1. 4 filas
  2. 2 filas
  3. 3 filas
  4. 5 filas
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Un informe utiliza 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ó?
  1. WHERE rating < 4
  2. WHERE rating = NULL
  3. WHERE rating IS NULL
  4. WHERE rating <> 4
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Una tabla messages tiene los asuntos 'Note A', 'Alert', NULL y 'Note B'. ¿Cuántas filas cumplen WHERE subject NOT LIKE 'Note%'?
  1. 2 filas
  2. 4 filas
  3. 3 filas
  4. 1 fila
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

Una columna numérica duration_minutes tiene los valores 16, 4 y 23. ¿Cuál es su orden con ORDER BY duration_minutes?
  1. 23, 16, 4
  2. 16, 23, 4
  3. 4, 16, 23
  4. 16, 4, 23
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Una tabla 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?
  1. 73, 71, 72
  2. 73, 72, 71
  3. 72, 73, 71
  4. 71, 73, 72
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

Un resultado ordenado fijo contiene 23 filas. ¿Qué LIMIT y OFFSET devuelven la página 3 con 6 filas por página?
  1. LIMIT 6 OFFSET 3
  2. LIMIT 6 OFFSET 18
  3. LIMIT 3 OFFSET 6
  4. LIMIT 6 OFFSET 12
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

Una tabla fija 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?
  1. ORDER BY order_date DESC, total DESC
  2. ORDER BY order_date DESC, total DESC, order_id
  3. ORDER BY order_id, order_date DESC, total DESC
  4. ORDER BY order_date, total DESC, order_id DESC
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Una tabla 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;?
  1. 40
  2. 35
  3. 30
  4. Ninguna tarifa
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Una tabla 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?
  1. Primero en SQLite; primero en PostgreSQL.
  2. Al final en SQLite; primero en PostgreSQL.
  3. Primero en SQLite; al final en PostgreSQL.
  4. Al final en SQLite; al final en PostgreSQL.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

Una tabla 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;?
  1. 4 filas
  2. 2 filas
  3. 5 filas
  4. 3 filas
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Una columna de texto de SQLite almacena los valores '6', '12' y '100' con intercalación binaria. ¿Cuál es su orden ascendente?
  1. 6, 12, 100
  2. 100, 6, 12
  3. 12, 100, 6
  4. 100, 12, 6
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Una consulta de página utiliza 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?
  1. 9, 10, 11, 12
  2. 8, 9, 10, 11
  3. 10, 11, 12
  4. 9, 10, 11
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Una tabla 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;?
  1. 103
  2. 102
  3. 101
  4. 104
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

¿Cuál es el orden escrito de las cláusulas de una consulta sobre una tabla con un filtro, una ordenación y un límite de filas?
  1. SELECT, FROM, ORDER BY, WHERE, LIMIT
  2. FROM, SELECT, WHERE, ORDER BY, LIMIT
  3. SELECT, FROM, WHERE, LIMIT, ORDER BY
  4. SELECT, FROM, WHERE, ORDER BY, LIMIT
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Una tabla 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?
  1. SELECT title, fee FROM courses WHERE fee < 75 AND places_left > 0 ORDER BY fee;
  2. SELECT title, fee FROM courses WHERE fee <= 75 AND places_left > 0 ORDER BY fee;
  3. SELECT title, fee FROM courses WHERE fee < 75 OR places_left > 0 ORDER BY fee;
  4. SELECT title, fee FROM courses WHERE fee < 75 AND places_left > 0 ORDER BY fee DESC;
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

Una tabla 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?
  1. 113, 114
  2. 112, 114
  3. 112, 113
  4. Solo 114
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

Una fila de 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?
  1. branch = 'East' AND branch = 'West' AND returned = 'no'
  2. branch = 'East' OR (branch = 'West' AND returned = 'no')
  3. (branch = 'East' OR branch = 'West') AND returned = 'no'
  4. (branch = 'East' OR branch = 'West') OR returned = 'no'
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Una tabla 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?
  1. LOWER(name) LIKE '%steel%'
  2. name LIKE 'steel%'
  3. LOWER(name) LIKE 'steel%'
  4. name = '%steel%'
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Una columna de texto de SQLite tiene los códigos 'G', 'G1', 'H2', 'J' y 'J1' con intercalación binaria. ¿Qué conjunto cumple WHERE code BETWEEN 'G' AND 'J' AND code NOT LIKE 'H%'?
  1. {G, H2, J}
  2. {G, G1, J, J1}
  3. {G1, J1}
  4. {G, G1, J}
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

Una tabla 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;?
  1. West-web, East-web
  2. East-web
  3. West-web
  4. West-store
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

En PostgreSQL, una tabla 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;?
  1. 4 filas
  2. 3 filas
  3. 2 filas
  4. 1 fila
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Una tabla 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')?
  1. {131, 133, 134}
  2. {133}
  3. {131, 133}
  4. {133, 134}
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Un informe debe incluir tarifas de al menos 50. Su filtro es 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?
  1. 49
  2. 50
  3. 51
  4. 100
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

¿Te atascas con una pregunta tuya? Ayuda con Tareas

Términos Clave

61 Términos Clave, cada uno con su definición

A

AND
AND es un operador lógico que exige que ambas condiciones unidas sean verdaderas para que la condición completa supere un filtro WHERE.
La condición Sales AND Chicago conserva al personal de Sales en Chicago, pero excluye a un empleado de Sales cuya ciudad registrada es Denver.
ASC
ASC especifica el orden ascendente de una columna de ordenación, como el menor valor numérico o la fecha más antigua primero; es la dirección predeterminada.
Ordenar los productos de Lighting por price ASC coloca primero el producto de Lighting más barato y último el más caro.

B

BETWEEN
BETWEEN es una prueba de intervalo que exige que un valor sea al menos el extremo inferior y como máximo el superior, incluidos ambos.
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
Una cadena vacía es una cadena conocida con cero caracteres, escrita como dos comillas simples contiguas; la mayoría de las bases de datos la distinguen de NULL.
En SQLite, phone = '' comprueba si hay cadenas vacías y no encuentra los valores de teléfono ausentes de los empleados.
Cláusula ESCAPE
Una cláusula ESCAPE declara un carácter que hace literal el comodín que le sigue dentro de un patrón LIKE, lo que permite buscar % o _ literales.
La cláusula ESCAPE de LIKE 'SPRING!_%' ESCAPE '!' hace que el guion bajo después de SPRING sea un carácter literal.
Cláusula FROM
La cláusula FROM identifica la tabla que proporciona los registros de una consulta básica, para poder leer de ella las columnas seleccionadas.
La cláusula FROM de SELECT name, price FROM products; identifica products como el origen de ambos campos.
Cláusula SELECT
La cláusula SELECT indica las columnas que se mostrarán en el resultado de una consulta y establece el orden en que aparecen esas columnas de salida.
La cláusula SELECT de SELECT city, first_name FROM employees; coloca la ciudad antes del nombre del empleado.
Cláusula WHERE
La cláusula WHERE filtra los registros de origen mediante una condición y conserva solo las filas para las que esa condición se evalúa como verdadera.
La 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
Una columna de ordenación es un campo indicado en ORDER BY para determinar el orden de las filas del resultado; no tiene que mostrarse en una consulta SELECT ordinaria.
El salario puede ser la columna de ordenación cuando la salida muestra solo first_name, lo que produce una lista ordenada de nombres.
Columna principal de ordenación
Una columna principal de ordenación es el primer campo de ORDER BY, que controla el orden principal antes de que las columnas posteriores resuelvan los valores iguales.
La ciudad es la columna principal de ordenación en ORDER BY city, last_name, que mantiene los apellidos de Boston antes que los de Chicago.
Combinación de valores seleccionados
Una combinación de valores seleccionados es el grupo de valores que aparecen juntos en una fila del resultado; añadir una columna puede cambiar si esa combinación es única.
Añadir employee_id hace que cada combinación de valores seleccionados en un resultado de ciudades sea distinta porque los identificadores son únicos.
Comentario SQL
Un comentario SQL es texto explicativo que se ignora al ejecutar una sentencia; dos guiones inician un comentario que dura hasta el final de la línea.
Un comentario SQL después de -- puede explicar por qué un filtro incluye al personal sin asignar sin modificar sus condiciones.
Comodín de guion bajo
El comodín de guion bajo es el carácter _ dentro de un patrón LIKE, donde representa exactamente un carácter en esa posición.
Cuatro copias del comodín de guion bajo coinciden con nombres como Emma y Hugo porque cada uno tiene cuatro caracteres.
Comodín de porcentaje (%)
El comodín de porcentaje es el carácter % dentro de un patrón LIKE, donde representa cualquier secuencia de cero o más caracteres.
El comodín de porcentaje de 'Lamp%' permite cualquier sufijo después de Lamp, incluida la ausencia de sufijo para el valor Lamp.
Comprobación de límites
Una comprobación de límites prueba valores exactamente en un umbral, justo por debajo o justo por encima para verificar que la consulta incluye lo solicitado.
Una comprobación de límites con un salario de exactamente 60 000 distingue «al menos 60 000» de un filtro estricto de mayor que.
Comprobación del resultado
Una comprobación del resultado contrasta los campos, las filas que cumplen las condiciones, el orden y el número de filas de una consulta con la petición para detectar una respuesta que parece razonable, pero es incorrecta.
Una comprobación del resultado sobre un producto con existencias cero explica por qué no aparece en una lista de productos baratos con existencias.
Conjunto de resultados
Un conjunto de resultados es la tabla de filas y columnas que devuelve una consulta; puede contener menos campos o registros que su origen.
Para una tabla de ocho empleados, el conjunto de resultados de SELECT city FROM employees; tiene ocho filas y permite valores de ciudad repetidos.
Construcción incremental de consultas
La construcción incremental de consultas añade y comprueba una condición cada vez, lo que facilita explicar qué requisito elimina cada fila.
La construcción incremental de consultas añade una prueba del teléfono después de una prueba de departamento para mostrar qué empleados elimina la prueba del teléfono.
Consulta
Una consulta es una petición de datos a una base de datos, escrita como una sentencia que especifica qué registros o valores deben devolverse.
La consulta SELECT first_name FROM employees; solicita a la base de datos el campo de nombre de cada empleado.
Criterio de desempate
Un criterio de desempate es una columna de ordenación posterior que se consulta cuando los valores de ordenación anteriores son iguales; un valor único al final produce un orden total.
Añadir employee_id como criterio de desempate después de la ciudad decide cuál de varios empleados de Chicago ocupa el último puesto de una lista breve.

D

DESC
DESC especifica el orden descendente de su columna de ordenación e invierte el orden ascendente para colocar primero los números mayores o las fechas más recientes.
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
Un dialecto SQL es la versión de la sintaxis y el comportamiento de SQL de un sistema de bases de datos, incluidas las diferencias en límites de filas, coincidencias de texto y uso de comillas.
Cuando el dialecto SQL cambia de SQLite a SQL Server, una consulta con LIMIT necesita TOP u OFFSET/FETCH en su lugar.
DISTINCT
DISTINCT es un modificador de SELECT que elimina las filas completas duplicadas del resultado seleccionado y deja intactos los registros almacenados.
Cuando ocho empleados trabajan en tres ciudades, SELECT DISTINCT city FROM employees; enumera solo esas tres ciudades.

E

Extremo
Un extremo es un límite que define el inicio o el final de un intervalo; su inclusión depende de la comparación elegida.
Cada precio extremo de 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
Una fila duplicada en el resultado es aquella cuyos valores seleccionados coinciden todos con los de otra fila del resultado según las reglas aplicables de comparación de duplicados.
Dos empleados con el mismo departamento y ciudad generan una fila duplicada en el resultado de una lista de departamento y ciudad, así que DISTINCT conserva su par una sola vez.
Formato de fecha ISO
El formato de fecha ISO YYYY-MM-DD escribe el año antes de las partes de mes y día de longitud fija, lo que permite ordenar cronológicamente las fechas de texto.
Con el 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
Un identificador es el nombre de un objeto de base de datos, como una tabla o columna; su escritura y el uso de comillas deben seguir las reglas de la base de datos.
El identificador hire_date nombra una columna, mientras que el texto entre comillas '2024-02-19' representa un valor.
ILIKE
ILIKE es el operador de búsqueda de patrones de PostgreSQL que no distingue mayúsculas y minúsculas; ofrece una alternativa a LIKE ordinario específica de esa base de datos.
Una búsqueda en PostgreSQL con name ILIKE '%desk%' puede coincidir con nombres de productos que contengan el texto Desk con mayúscula inicial.
IN
IN es una prueba de pertenencia que comprueba si un valor completo es igual a cualquier elemento de una lista de valores permitidos entre paréntesis.
department IN ('IT', 'Marketing') selecciona a todos los empleados de IT o Marketing sin repetir una comparación de departamento.
Intercalación
Una intercalación es el conjunto de reglas utilizadas para comparar y ordenar texto, incluido el comportamiento de las mayúsculas, las minúsculas y los caracteres con tilde.
Una intercalación que distingue mayúsculas y minúsculas diferencia 'Chicago' de 'chicago', así que un filtro por 'chicago' no encuentra las filas almacenadas como Chicago.
Intervalo de fechas semiabierto
Un intervalo de fechas semiabierto incluye su límite inicial y excluye su límite final, a menudo el inicio del día o mes siguiente.
Un intervalo de fechas semiabierto para marzo termina antes de '2024-04-01' y conserva las últimas horas del día final.
IS NOT DISTINCT FROM
IS NOT DISTINCT FROM es una comparación que trata dos NULL como iguales y compara las entradas distintas de NULL como una igualdad ordinaria.
SQLite y PostgreSQL ofrecen IS NOT DISTINCT FROM cuando una comparación debe tratar dos marcadores de ausencia como iguales.
IS NOT NULL
IS NOT NULL es una prueba directa que es verdadera cuando una columna escalar contiene un valor presente, incluida una cadena vacía donde se distingue de NULL.
El filtro phone IS NOT NULL conserva a un empleado cuyo teléfono está registrado aunque falte el departamento de ese empleado.
IS NULL
IS NULL es una prueba directa de un valor escalar ausente; a diferencia de la igualdad con NULL, da un resultado definido de verdadero o falso.
phone IS NULL encuentra a los empleados cuyos registros no tienen un valor de teléfono registrado.

L

LIKE
LIKE es un operador de coincidencia de texto que comprueba un valor completo frente a un patrón con caracteres literales y comodines opcionales.
name LIKE '%Lamp%' encuentra todos los nombres de productos que contienen Lamp, ya aparezca Lamp al principio, en medio o al final.
LIMIT
LIMIT es una cláusula de número de filas que devuelve como máximo la cantidad especificada de filas del resultado, sin establecer una ordenación por sí sola.
Un filtro de empleados de Boston con LIMIT 5 devuelve solo dos filas cuando solo dos empleados de Boston cumplen las condiciones.
Límite inferior
Un límite inferior es el valor de la parte baja de un intervalo, situado antes de AND en BETWEEN ordinario; invertir los límites no hace que se intercambien.
El límite inferior 89,00 de price BETWEEN 89.00 AND 15.50 supera el límite superior y no deja coincidencias.
Lista IN
Una lista IN es una colección de posibles coincidencias separadas por comas dentro de paréntesis; el orden de sus elementos no ordena los resultados de la consulta.
Una lista IN de (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
Un literal de texto es un valor escrito directamente entre comillas simples en SQL; un apóstrofo dentro del valor se duplica para conservarlo.
El literal de texto 'O''Neill' coincide con el apellido O’Neill porque sus comillas duplicadas representan un apóstrofo.
Literal numérico
Un literal numérico es un número escrito directamente en SQL mediante cifras y, cuando hace falta, un punto decimal, sin notación monetaria.
El literal numérico 20.50 de price < 20.50 no tiene comillas, separador de millares ni símbolo monetario.
Lógica trivalente
La lógica trivalente es el sistema de SQL para combinar condiciones verdaderas, falsas y desconocidas mediante operadores como AND, OR y NOT.
Con la lógica trivalente, un producto con existencias ausentes supera una prueba de existencias OR precio cuando su rama price > 100 es verdadera.

N

NOT
NOT es un operador lógico que cambia verdadero por falso y falso por verdadero; en SQL mantiene desconocida una condición desconocida.
Negar stock > 10 no incluye un producto con existencias ausentes, porque esa fila sigue dando una condición desconocida.
NOT BETWEEN
NOT BETWEEN es la negación de una prueba de intervalo con ambos extremos incluidos; para un valor distinto de NULL, conserva los valores inferiores al extremo inferior o superiores al superior.
stock NOT BETWEEN 5 AND 40 conserva un producto con existencias cero y otro con sesenta, pero excluye las existencias ausentes.
NOT IN
NOT IN es una prueba de exclusión que exige que un valor difiera de todos los elementos de la lista; un NULL en la lista impide una coincidencia en WHERE.
city NOT IN ('Chicago', 'Denver') conserva al personal de Boston porque sus ciudades difieren de ambos elementos.
NULL
NULL es un marcador de un valor ausente, como un dato desconocido, sin registrar o no aplicable, y es distinto de un cero conocido.
Cuando un producto tiene existencias NULL, su fila no indica cuántas unidades hay actualmente en el almacén.
NULLS LAST
NULLS LAST es un modificador de ORDER BY que coloca explícitamente los valores ausentes después de los registrados en la columna de ordenación a la que se aplica.
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
OFFSET es una cláusula que omite un número especificado de filas del resultado antes de que el límite de filas cuente cuáles se devolverán.
Con salarios descendentes, LIMIT 3 OFFSET 3 omite a los tres que más ganan y devuelve al cuarto, al quinto y al sexto.
Operador de comparación
Un operador de comparación comprueba la relación entre dos valores, como la igualdad o cuál es mayor, y produce un estado de verdad.
El 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
Un optimizador de consultas elige un plan de ejecución interno que puede diferir del modelo lógico y conservar el resultado definido de la consulta.
Un optimizador de consultas puede encontrar coincidencias sin procesar físicamente toda la tabla en el orden lógico utilizado para enseñar.
OR
OR es un operador lógico cuya condición es verdadera cuando al menos una de las condiciones unidas es verdadera, también cuando ambas lo son.
Sales OR Chicago admite al personal de Sales en otras ciudades, al personal de Chicago en otros departamentos y al personal que coincide con ambos.
Orden de las cláusulas
El orden de las cláusulas es la secuencia escrita que exige SQL para las partes de una sentencia, incluido WHERE antes de ORDER BY y la limitación de filas después.
El orden de cláusulas requerido coloca WHERE antes de ORDER BY, por lo que invertirlos produce un error de sintaxis.
Orden lógico de procesamiento
El orden lógico de procesamiento es el modelo que explica el resultado de una consulta mediante la lectura, el filtrado, la selección, la eliminación de duplicados, la ordenación y la selección de una parte de las filas.
El orden lógico de procesamiento elimina las ciudades repetidas antes de que LIMIT cuente las filas de un resultado de ciudades con DISTINCT.
Orden total
Un orden total distingue cada fila del resultado por sus valores de ordenación y proporciona posiciones de fila reproducibles mientras los datos no cambien.
El orden total ORDER BY city, employee_id resuelve la posición de cada empleado mediante el identificador único.
ORDER BY
ORDER BY es la cláusula que ordena las filas del resultado según los valores de ordenación especificados; sin ella, SQL no garantiza el orden de las filas.
ORDER BY salary DESC coloca primero al empleado mejor pagado sin modificar ningún registro de empleado almacenado.

P

Página
Una página es una parte del resultado de una consulta; con n filas por página, la página k omite las filas de las k − 1 páginas completas anteriores.
Con tres filas por página, la tercera página utiliza OFFSET 6 y muestra las filas posteriores a la sexta en una ordenación salarial fija.
Precedencia de operadores
La precedencia de operadores es la prioridad para evaluar operadores mezclados sin paréntesis; entre los operadores lógicos, NOT precede a AND y después va OR.
La precedencia de operadores hace necesarios los paréntesis cuando un requisito de ciudad debe aplicarse a cada una de dos alternativas de departamento unidas por OR.

T

Tipo DATE
Un tipo DATE almacena fechas del calendario como valores de fecha y permite que una base de datos las compare por fecha en lugar de por su formato de texto local.
El tipo DATE de PostgreSQL acepta DATE '2022-01-01'; SQLite no utiliza esta sintaxis de literal con tipo.
TOP
TOP es la sintaxis de SQL Server para limitar filas en SELECT y se utiliza con ORDER BY cuando una petición necesita un conjunto concreto de las filas mayores o primeras.
SELECT TOP (3) puede sustituir una lista breve de tres filas con LIMIT cuando la consulta se escribe para SQL Server.

U

Umbral inclusivo
Un umbral inclusivo admite un valor exactamente igual a su límite; los operadores de comparación >= y <= expresan esa inclusión.
Un umbral inclusivo de 60 000 conserva a un empleado cuyo salario es exactamente 60 000 cuando el filtro utiliza salary >= 60000.

V

Valor de verdad desconocido
Desconocido es el tercer estado de verdad de SQL, que se produce cuando los datos ausentes impiden una comparación definida; WHERE descarta las filas en este estado.
Las existencias ausentes de un producto producen un valor de verdad desconocido para stock > 10, por lo que esa fila no supera el filtro.

W

WITH TIES
WITH TIES amplía un límite de filas FETCH para incluir filas adicionales iguales a la fila de corte en todos los valores de ORDER BY, donde se admite.
Con ORDER BY city, FETCH FIRST 3 ROWS WITH TIES devuelve todas las filas que comparten la ciudad de la tercera fila, no solo tres filas.

Sobre esta unidad

Por StudeliInformar de un error

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.

Comenzar