Consulta de datos de MySQL SQL
Declaración de consulta SQL: SELECT
Primero da una mesa
Recuperar datos seleccionar
Recuperar una sola columna
select 字段 from tbname;
# 例: select name from stu;
Si no hay una regla de orden clara, el orden de los datos devueltos, entonces el orden de los datos devueltos no tiene un significado especial.
El orden en el que se devuelven los datos puede ser o no el orden en el que se agregan los datos a la tabla. Siempre que se devuelva el mismo número, es normal.
Recuperar varias columnas
select 字段1,字段2,... from tbname;
# 例: select id,name,age,sex from stu;
Cuando seleccione varias columnas, asegúrese de agregar una coma entre los nombres de las columnas, pero no agregue una coma después del nombre de la última columna.
Si agrega una coma después del nombre de la última columna, se producirá un error.
Recuperar todas las columnas
select * from tbname;
# 例: select * from stu;
Generalmente no use comodines, a menos que realmente necesite cada columna de la tabla, es mejor no usar comodines *.
Utilice comodines para recuperar columnas con nombres desconocidos
DISTINTO de diferentes líneas de inspección
select distinct 字段1,字段2... from stu;
# 例: select distinct class_id from stu;
La palabra clave DISTINCT solo devuelve valores diferentes. Si hay muchos valores ay muchos valores b en la columna, solo se devuelven a y b.
Limita el resultado LIMIT
select * from tbname limit 3,4;
# 代表从第三行开始检索,检索四行数据
# 代替的语法: limit 4 offset 3 意为从行3开始检索四行,和上面一样
# 例: select * from stu limit 3,4;
Utilice nombres de tablas completamente calificados
select name from stu;
select stu.name from stu;
select stu.name from demoDB.stu;
Ordenar los datos recuperados ORDER BY
Ordenar datos ORDENAR POR
select * from tbname order by 字段;
Los datos consultados de forma predeterminada no se ordenan aleatoriamente. Si no se especifica una regla de clasificación, los datos generalmente se mostrarán en el orden en que aparecen en la tabla subyacente.
La teoría del diseño de bases de datos relacionales cree que si el orden de clasificación no se especifica claramente, no se debe suponer que el orden de los datos recuperados es significativo
Por lo general, la columna utilizada en la cláusula ORDER BY será la columna seleccionada para su visualización.
Pero este no es necesariamente el caso, y es completamente legal ordenar datos con columnas no recuperadas.
Ordenar por varias columnas
select * from tbname order by 字段1,字段2,...;
Cuando sea necesario ordenar varias columnas de datos, separe los nombres de las columnas con comas y la clasificación se comparará en el orden de la anterior y la siguiente, el valor predeterminado es ascendente
select * from tbname order by 字段1(desc),字段2(desc),...;
Ordene los nombres de columna especificados en orden ascendente o descendente, como select * from stu order by class_id, age desc; primero ordene class_id en orden ascendente y luego clasifique la edad en orden descendente
Nota
Cuando la cláusula ORDER BY se da en la posición de la cláusula ORDER BY, debe asegurarse de que esté ubicada después de la cláusula from.
Si se usa LIMIT, debe ubicarse después de que se complete la cláusula ORDER BY. El orden incorrecto de las cláusulas de uso resultará en un mensaje de error.
Filtro de condiciones de recuperación de datos DONDE
La base de datos generalmente contiene una gran cantidad de datos y rara vez es necesario recuperar todas las filas de la tabla.
Por lo general, solo se extrae un subconjunto de datos de la tabla en función de las necesidades de una operación o informe específico.
Para recuperar solo los datos requeridos, debe formular las condiciones de búsqueda
select 字段 from tbname where 条件;
Cuando se usa where y order by al mismo tiempo, where debe estar en el frente y ordenar en la parte de atrás
Operador de cláusula WHERE
Operador | Descripción |
---|---|
= | igual |
<> 、! = | no igual a |
< | Menos que |
<= | Menos que o igual a |
> | mas que el |
> = | Mayor qué o igual a |
En medio y … | Especificar entre dos valores |
ES NULO | Valor nulo |
Cláusula WHERE combinada
MySQL permite que se proporcionen múltiples cláusulas WHERE.
Dos formas: AND y OR conectan las dos cláusulas. También llamado operador lógico.
Y
AND se utiliza en la cláusula WHERE para recuperar todas las condiciones que deben cumplirse y conectarse antes de regresar. De lo contrario, devuelva el conjunto vacío
select 字段 from tbname where 字段=.. and 字段=..;
# 例:
select name from stu where age = 22 and sex = 'm';
O
OR se usa en la cláusula WHERE y se usa para recuperar solo una de las condiciones de la conexión o se puede devolver. De lo contrario, devuelva el conjunto vacío
AND y OR se pueden utilizar juntos, pero debe prestar atención al orden de cálculo de SQL. SQL dará prioridad al operador AND antes de procesar el operador OR.
Por ejemplo: consulte a las alumnas de la Clase 1 y la Clase 2.
select * from stu where class_id=1 or class_id=2 and sex='女';
De esta forma se producirá la siguiente situación
Debido al mecanismo de procesamiento de prioridad de AND, SQL cree que son las niñas de la clase dos y todos los estudiantes de la clase uno los que necesitan ser consultados.
La solución es la siguiente:
select * from stu where class_id=1 and sex='女' or class_id=2 and sex='女';
# 或者
select * from stu where (class_id=1 or class_id=2) and sex='女';
Los paréntesis tienen prioridad sobre y.
EN 和 NO
EN
El operador IN se utiliza para especificar el rango de condiciones, y cada condición en el rango se puede hacer coincidir. Se puede utilizar junto con AND y OR
select name from stu where class_id in (1,2) and sex='女';
¿Por qué utilizar el operador IN? Las ventajas son las siguientes:
- Cuando se utiliza una larga lista de opciones legales, la sintaxis del operador IN es más clara e intuitiva.
- Cuando se usa IN, el orden de cálculo es más fácil de entender (porque hay menos operadores)
- El operador IN es generalmente más rápido que la lista de operadores OR
- La mayor ventaja de IN es que puede contener otras sentencias SELECT, lo que hace posible crear cláusulas WHERE de forma más dinámica.
NO
El operador NOT se utiliza para especificar todos los datos excepto esta condición.
select name from stu where class_id not in (1);
Uso de comodines
LIKE y comodines
LIKE es adecuado para búsquedas difusas, como buscar todos los productos que contienen el texto a en el nombre del producto.
-
El comodín de signo de porcentaje (%) en la búsqueda
%
para representar cualquier carácter que aparezca cualquier número de veces.select name from stu where name like 'a%'; # 表示匹配第一个字符为a的所有数据 select name from stu where name like '%a'; # 表示匹配最后一个字符为a的所有数据 select name from stu where name like '%a%'; # 表示匹配包含字符a的所有数据
-
El
_
carácter comodín de guión bajo ( ), cuando se utilizan guiones bajos, un guión bajo es igual a un carácter.select name from stu where name like '_a';# 表示匹配最后一个字符为a且总长度为两个字符的数据 select name from stu where name like 'a_';# 表示第一个字符为a且总长度为两个字符的数据
Consejos para usar comodines
- No use en exceso los comodines. Si otros operadores pueden lograr el mismo propósito, se deben utilizar otros operadores.
- Cuando realmente necesite usar comodines, no los ponga al principio a menos que sea absolutamente necesario, como '% a'. Coloque el comodín al principio, la velocidad de búsqueda es la más lenta.
- Preste atención a la posición del comodín.
REGEXP regular
select name from stu where name regexp '[0-5]abc'; # 第一个字符为0-5,后面为abc的所有数据
Funciones estadísticas (funciones agregadas) en MySQL
Uso de funciones convergentes
A menudo necesitamos resumir los datos sin tener que recuperarlos todos, por lo que MySQL proporciona funciones especiales.
Con estas funciones, las consultas de MySQL se pueden utilizar para recuperar datos específicos, analizar y formar informes.
tal como:
- Determinar el número de filas en la tabla.
- Obtenga la suma de las columnas de la tabla.
- Descubra los valores máximo, mínimo y promedio de las columnas de la tabla (o todas las filas, algunas filas específicas).
función | Descripción |
---|---|
CONTAR() | Devuelve el número de filas en una columna. |
MAX () | Devuelve el valor máximo de una columna. |
MIN () | Devuelve el valor mínimo de una columna. |
SUMA() | Devuelve la suma de un valor de columna. |
AVG () | Devuelve el valor medio de una columna. |
Nota:
Cuando se usa count, si se especifica el nombre de la columna, se ignora la fila cuyo valor es NULL, pero si se usa el asterisco (*) en la función, no se ignora.
GRUPO POR Y TENIENDO
AGRUPAR POR
Las funciones agregadas de SQL se pueden utilizar para resumir datos. Aquí es donde podemos realizar técnicas en las filas, calcular la suma y el promedio, y obtener los valores máximo y mínimo sin recuperar todos los datos.
Hasta ahora, todos los cálculos se realizan en todos los datos de la tabla o datos que coinciden con una cláusula WHERE específica.
Pero luego podemos usar el grupo ... teniendo que filtrar nuevamente después de agrupar.
Por ejemplo: necesitamos obtener el número de estudiantes en todas las clases.
mysql> select class_id,count(*) as nums from stu where class_id=1;
+----------+------+
| class_id | nums |
+----------+------+
| 1 | 6 |
+----------+------+
1 row in set (0.00 sec)
mysql> select class_id,count(*) as nums from stu where class_id=2;
+----------+------+
| class_id | nums |
+----------+------+
| 2 | 4 |
+----------+------+
1 row in set (0.00 sec)
Necesitamos consultar dos veces.
Pero si necesitamos consultar el número de estudiantes en cada clase en una escuela, este método es obviamente inadecuado. ¿Qué debemos hacer?
En este momento, la agrupación es necesaria. La agrupación SQL permite que los datos se dividan en varios grupos lógicos para que cada grupo se pueda agregar y calcular (agrupar por).
Sintaxis: seleccionar campo, función (*) como nombre de columna de tbname agrupar por campo;
mysql> select class_id,count(*) as nums from stu group by class_id;
+----------+------+
| class_id | nums |
+----------+------+
| 1 | 6 |
| 2 | 4 |
+----------+------+
2 rows in set (0.00 sec)
¿Qué sucede si desea que el sistema devuelva una clase con menos de 5 personas o una clase con más de 5 personas?
Es necesario filtrar nuevamente a partir de los resultados devueltos arriba, que es el grupo de filtros TENIENDO a continuación
TENIENDO
Además de agrupar datos con GROUP BY, MySQL también permite filtrar grupos, incluidos esos grupos, y excluir esos grupos.
Por ejemplo, como se mencionó anteriormente, deje que el sistema devuelva una clase con menos de 5 personas
De hecho, todas las cláusulas WHERE mencionadas anteriormente pueden ser reemplazadas por HAVING, la única diferencia es que WHERE filtra filas y HAVING filtros grupos .
Sintaxis: Sintaxis: seleccionar campo, función (*) como nombre de columna del grupo tbname por campo que tenga condición;
# 大于五人的班级
mysql> select class_id,count(*) as nums from stu group by class_id having nums>5;
+----------+------+
| class_id | nums |
+----------+------+
| 1 | 6 |
+----------+------+
1 row in set (0.00 sec)
# 小于五人的班级
mysql> select class_id,count(*) as nums from stu group by class_id having nums<5;
+----------+------+
| class_id | nums |
+----------+------+
| 2 | 4 |
+----------+------+
1 row in set (0.00 sec)
Precauciones
Si ahora necesita agregar un campo class_name para almacenar el nombre de la clase, filtre class_id, class_name y el número de personas
mysql> select class_id,count(*) as '数量' from stu group by class_id;
+----------+--------+
| class_id | 数量 |
+----------+--------+
| 1 | 6 |
| 2 | 4 |
+----------+--------+
2 rows in set (0.00 sec)
-- 在select里面有class_id、class_name,group by后面只有id就会出错
mysql> select class_id,class_name,count(*) as '数量' from stu group by class_id;
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'yuge.stu.class_name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
-- 正确的语句,应该是吧select所有列都作为分组条件。
mysql> select class_id,class_name,count(*) as '数量' from stu group by class_id,class_name;
+----------+------------+--------+
| class_id | class_name | 数量 |
+----------+------------+--------+
| 1 | c1 | 6 |
| 2 | c2 | 4 |
+----------+------------+--------+
2 rows in set (0.00 sec)
no compatible con sql_mode = only_full_group_by
-La declaración correcta, debe seleccionar todas las columnas como condiciones de agrupación.
mysql> select class_id,class_name,count(*) as '数量' from stu group by class_id,class_name;
+----------+------------+--------+
| class_id | class_name | 数量 |
+----------+------------+--------+
| 1 | c1 | 6 |
| 2 | c2 | 4 |
+----------+------------+--------+
2 rows in set (0.00 sec)