Solución á práctica DML sobre 7 consultas frecuentes
Revisión del 16:01 10 nov 2021 de Joselv (discusión | contribuciones) (→Uando variables definidas polo usuario)
Sumario
- 1 Consultas
- 1.1 Máximo valor dunha columna
- 1.2 A fila que ten o valor máximo dunha certa columna
- 1.3 Máximo dunha columna por grupo
- 1.4 Filas que teñen o valor maximo grupal dunha certa columna
- 1.5 Usando variables definidas polo usuario
- 1.6 Usando claves foráneas
- 1.7 Buscando por dúas claves
- 1.8 Calculando visitas por día
- 1.9 Usando AUTO_INCREMENT
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)