Solución á práctica DML sobre 7 consultas frecuentes

De MediaWiki
Ir a la navegación Ir a la búsqueda

Consultas

Máximo valor dunha columna

Cal é o número de artigo máis alto?

1 SELECT MAX(article) AS article FROM shop;
2 +---------+
3 | article |
4 +---------+
5 |       4 |
6 +---------+

A fila que ten o valor máximo dunha certa columna

Cal é o número de artigo, vendedor e prezo do artigo máis caro?

Cunha subquerý:

1 SELECT article, dealer, price
2 FROM   shop
3 WHERE  price=(SELECT MAX(price) FROM shop);
4 +---------+--------+-------+
5 | article | dealer | price |
6 +---------+--------+-------+
7 |    0004 | D      | 19.95 |
8 +---------+--------+-------+

Cun LEFT JOIN:

1 SELECT s1.article, s1.dealer, s1.price
2 FROM shop s1
3 LEFT JOIN shop s2 ON s1.price < s2.price
4 WHERE s2.article IS NULL;

Con ordenación descendente de filas obtendo a primera fila coa claúsula LIMIT

1 SELECT article, dealer, price
2 FROM shop
3 ORDER BY price DESC
4 LIMIT 1;
De haber varios artigos empatados a prezo máis caro (19.95) amosaríase só un deles

Máximo dunha columna por grupo

Cal é o prezo máis caro por artigo?

 1 SELECT article, MAX(price) AS price
 2 FROM   shop
 3 GROUP BY article
 4 ORDER BY article;
 5 +---------+-------+
 6 | article | price |
 7 +---------+-------+
 8 |    0001 |  3.99 |
 9 |    0002 | 10.99 |
10 |    0003 |  1.69 |
11 |    0004 | 19.95 |
12 +---------+-------+

Filas que teñen o valor maximo grupal dunha certa columna

Para cada artigo, atopa o vendedor ou vendedores co prezo máis caro,

 1 SELECT article, dealer, price
 2 FROM   shop s1
 3 WHERE  price=(SELECT MAX(s2.price)
 4               FROM shop s2
 5               WHERE s1.article = s2.article)
 6 ORDER BY article;
 7 +---------+--------+-------+
 8 | article | dealer | price |
 9 +---------+--------+-------+
10 |    0001 | B      |  3.99 |
11 |    0002 | A      | 10.99 |
12 |    0003 | C      |  1.69 |
13 |    0004 | D      | 19.95 |
14 +---------+--------+-------+
Existen outras posibles solucións (e máis eficientes en termos de rendemento)

Usando variables definidas polo usuario

Atopa or artigos co precio máis baixo e máis alto.

Podes empregar as variables de usuario de MySQL para recordar resultados sen ter que almacenalos nunha varible temporal no cliente (ver User-Defined Variables)

1 mysql> SELECT @min_price:=MIN(price),@max_price:=MAX(price) FROM shop;
2 mysql> SELECT * FROM shop WHERE price=@min_price OR price=@max_price;
3 +---------+--------+-------+
4 | article | dealer | price |
5 +---------+--------+-------+
6 |    0003 | D      |  1.25 |
7 |    0004 | D      | 19.95 |
8 +---------+--------+-------+
Outra opción sería almacenar o nome de un obxecto de base de datos como unha táboa ou columna unha variable de usuario e despois usala nunha sentenza SQL (isto require o uso de prepared statements)

Usando claves foráneas

Buscando por dúas claves

Calculando visitas por día

Usando AUTO_INCREMENT