SQL Utilizando el carácter comodín para seleccionar todas las columnas en una consulta.


Ejemplo

Considere una base de datos con las siguientes dos tablas.

Tabla de empleados:

Carné de identidad FName LName DeptId
1 James Herrero 3
2 Juan Johnson 4

Mesa de departamentos:

Carné de identidad Nombre
1 Ventas
2 Márketing
3 Financiar
4 ESO

Declaración de selección simple

* es el carácter comodín utilizado para seleccionar todas las columnas disponibles en una tabla.

Cuando se utiliza como sustituto de los nombres de columna explícitos, devuelve todas las columnas en todas las tablas en las que una consulta selecciona FROM . Este efecto se aplica a todas las tablas a las que accede la consulta a través de sus cláusulas JOIN .

Considere la siguiente consulta:

SELECT * FROM Employees

Devolverá todos los campos de todas las filas de la tabla Employees :

Carné de identidad FName LName DeptId
1 James Herrero 3
2 Juan Johnson 4

Notación de puntos

Para seleccionar todos los valores de una tabla específica, el carácter comodín se puede aplicar a la tabla con notación de puntos .

Considere la siguiente consulta:

SELECT 
    Employees.*, 
    Departments.Name
FROM 
    Employees
JOIN 
    Departments 
    ON Departments.Id = Employees.DeptId

Esto devolverá un conjunto de datos con todos los campos en la tabla Employee , seguido solo por el campo Name en la tabla Departments :

Carné de identidad FName LName DeptId Nombre
1 James Herrero 3 Financiar
2 Juan Johnson 4 ESO

Advertencias contra el uso

En general, se recomienda que se evite el uso de * en el código de producción siempre que sea posible, ya que puede causar una serie de problemas potenciales, entre ellos:

  1. Exceso de E / S, carga de red, uso de memoria, etc., debido a que el motor de la base de datos lee datos que no son necesarios y los transmite al código frontal. Esto es particularmente preocupante cuando puede haber campos grandes como los que se usan para almacenar notas largas o archivos adjuntos.
  2. Un exceso adicional de carga de IO si la base de datos necesita poner en cola los resultados internos en el disco como parte del procesamiento de una consulta más compleja que SELECT <columns> FROM <table> .
  3. Procesamiento adicional (y / o incluso más IO) si algunas de las columnas innecesarias son:
    • Columnas computadas en bases de datos que las soportan.
    • en el caso de seleccionar de una vista, las columnas de una tabla / vista que el optimizador de consultas podría optimizar de otra manera
  4. El potencial de errores inesperados si las columnas se agregan a las tablas y vistas más adelante resulta en nombres de columnas ambiguos. Por ejemplo, SELECT * FROM orders JOIN people ON people.id = orders.personid ORDER BY displayname : si se agrega una columna llamada nombre de displayname a la tabla de pedidos para permitir a los usuarios dar nombres significativos a sus pedidos para futuras referencias, entonces aparecerá el nombre de la columna dos veces en la salida, por lo que la cláusula ORDER BY será ambigua, lo que puede causar errores ("nombre de columna ambiguo" en las últimas versiones de MS SQL Server), y si no, en este ejemplo, el código de la aplicación puede comenzar a mostrar el nombre del orden donde se encuentra el nombre de la persona previsto porque la nueva columna es el primero de ese nombre devuelto, y así sucesivamente.

¿Cuándo se puede usar * , teniendo en cuenta la advertencia anterior?

Aunque es mejor evitarlo en el código de producción, usar * está bien como una abreviatura cuando se realizan consultas manuales en la base de datos para investigación o trabajo de prototipo.

A veces, las decisiones de diseño en su aplicación lo hacen inevitable (en tales circunstancias, prefiera tablealias.* lugar de * solo cuando sea posible).

Cuando se utiliza EXISTS , como SELECT A.col1, A.Col2 FROM A WHERE EXISTS (SELECT * FROM B where A.ID = B.A_ID) , no SELECT A.col1, A.Col2 FROM A WHERE EXISTS (SELECT * FROM B where A.ID = B.A_ID) ningún dato de B. Por lo tanto, una combinación no es necesaria, y el motor sabe que no se deben devolver los valores de B, por lo que no hay un impacto de rendimiento para usar * . De manera similar, COUNT(*) está bien, ya que tampoco devuelve ninguna de las columnas, por lo que solo necesita leer y procesar aquellas que se utilizan para fines de filtrado.