【MySql】Consulta básica


CRUD: Crear (crear), Recuperar (leer), Actualizar (actualizar), Eliminar (eliminar)

Crea una tabla primero:

mysql> create table students (
    -> id int unsigned primary key auto_increment,
    -> sn int unsigned unique key,
    -> name varchar(20) not null,
    -> qq varchar(32) unique key
    -> );
Query OK, 0 rows affected (0.26 sec)

insertar operación insertar

-- 指定列插入
mysql> insert into students (sn,name,qq) values (123,'张三','456789');
Query OK, 1 row affected (0.03 sec)

-- 全列插入
mysql> insert into students values (10,124,'关羽','123456');
Query OK, 1 row affected (0.04 sec)

-- 多行插入
mysql> insert into students values (13,127,'王五','14678909'),(14,128,'赵七','567890'),(15,129,'陈九','7890123');
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

Por supuesto, la inserción falla porque el valor correspondiente a la clave principal o clave única ya existe

Sintaxis de operación de actualización síncrona opcional:

INSERT ... ON DUPLICATE KEY UPDATE
column = value [, column = value] ...

imagen-20230612190626621

mysql> insert into students values (13,132,'许攸','111111') on duplicate key update sn=132,name='xuyyou',qq='1111';
Query OK, 2 rows affected (0.04 sec)


-- 0 row affected: 表中有冲突数据,但冲突数据的值和 update 的值相等
-- 1 row affected: 表中没有冲突数据,数据被插入
-- 2 row affected: 表中有冲突数据,并且数据已经被更新

Se produce un conflicto de clave principal y una operación de inserción se cambia a una operación de actualización

reemplazar

-- 主键 或者 唯一键 没有冲突,则直接插入;
-- 主键 或者 唯一键 如果冲突,则删除后再插入
mysql> replace into students (sn,name,qq) values (140,'许攸','34567812');
Query OK, 1 row affected (0.03 sec)
-- 1 row affected: 表中没有冲突数据,数据被插入
-- 2 row affected: 表中有冲突数据,删除后重新插入

Selección de operación de consulta

SELECT
[DISTINCT] {* | {column [, column] ...}
[FROM table_name]
[WHERE ...]
[ORDER BY column [ASC | DESC], ...]
LIMIT ...

Crea una tabla:

-- 创建表结构
CREATE TABLE exam_result (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL COMMENT '同学姓名',
chinese float DEFAULT 0.0 COMMENT '语文成绩',
math float DEFAULT 0.0 COMMENT '数学成绩',
english float DEFAULT 0.0 COMMENT '英语成绩'
);


-- 插入测试数据
INSERT INTO exam_result (name, chinese, math, english) VALUES
('唐三藏', 67, 98, 56),
('孙悟空', 87, 78, 77),
('猪悟能', 88, 98, 90),
('曹孟德', 82, 84, 67),
('刘玄德', 55, 85, 45),
('孙权', 70, 73, 78),
('宋公明', 75, 65, 30);

seleccionar consulta

consulta de columna completa

imagen-20230612194518939

-- 通常情况下不建议使用 * 进行全列查询
-- 1. 查询的列越多,意味着需要传输的数据量越大;
-- 2. 可能会影响到索引的使用。

Consulta de columna especificada

-- 指定列的顺序不需要按定义表的顺序来
SELECT id, name, english FROM exam_result;

imagen-20230612194726928

El campo de consulta es una expresión.

-- 表达式不包含字段
SELECT id, name, 10 FROM exam_result;

imagen-20230612195259892

-- 表达式包含多个字段
SELECT name,math, chinese + math + english FROM exam_result;

imagen-20230612195502482

Especificar un alias para los resultados de la consulta

SELECT column [AS] alias_name [...] FROM table_name;

Por ejemplo, nuestro nombre de consulta anterior es demasiado largo, solo agréguelo como:

imagen-20230612195601375

Por supuesto, también es posible lo siguiente:

imagen-20230612195741439

Resultado de la deduplicación distinta

select distinct math from exam_result;

imagen-20230612200152730

Donde condiciona el juicio

Operadores de comparación:

运算符 									说明
>, >=, <, <= 						大于,大于等于,小于,小于等于
= 									等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL
<=>									等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1)
!=, <> 								不等于
BETWEEN a0 AND a1 					范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1)
IN (option, ...) 					如果是 option 中的任意一个,返回 TRUE(1)
IS NULL 							是 NULL
IS NOT NULL 						不是 NULL
LIKE 								模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符

Operadores logicos:

运算符 						说明
AND 				多个条件必须都为 TRUE(1),结果才是 TRUE(1)
OR 					任意一个条件为 TRUE(1), 结果为 TRUE(1)
NOT					条件为 TRUE(1),结果为 FALSE(0)

Estos son algunos ejemplos para practicar:

  • Estudiantes que fallan en inglés y sus puntajes en inglés ( < 60 )
select name,english from exam_result where english<60;

imagen-20230612201151019

  • Estudiantes con puntajes de chino en [80, 90] y sus puntajes de chino
select name,chinese from exam_result where chinese>=80 and chinese<=90;

imagen-20230612201333958

 select name,chinese from exam_result where chinese between 80 and 90;

imagen-20230612201447761

  • Estudiantes cuyos puntajes de matemáticas son 58 o 59 o 98 o 99 y sus puntajes de matemáticas
select name,math from exam_result where math=58 or math=59 or math=98 or math=99;

imagen-20230612201639111

select name,math from exam_result where math in (58,59,98,99);

imagen-20230612201751705

  • Un compañero de clase de apellido Sun y un compañero de clase de nombre Sun
select name from exam_result where name like '孙%';

select name from exam_result where name like '孙_';

imagen-20230612202256140

  • Estudiantes cuyos puntajes en chino son mejores que sus puntajes en inglés
select name,chinese,english from exam_result where chinese > english;

imagen-20230612202402744

  • Estudiantes con una puntuación total de 200 o menos
select name,chinese+english+math from exam_result where chinese+english+math<200;

imagen-20230612202657562

Nota: Es incorrecto escribir lo siguiente:

mysql> select name,chinese+english+math total from exam_result where total<200;
ERROR 1054 (42S22): Unknown column 'total' in 'where clause'
mysql> 

Esto se debe al impacto del orden de ejecución de sql: el orden de ejecución aquí es muy importante, y aquí no se pueden usar alias. Es muy simple: esto se debe a que primero se ejecuta from, y de qué tabla filtrar los datos primero Al filtrar, las condiciones del filtro deben establecerse primero

imagen-20230612203353738

Por supuesto, lo siguiente también es incorrecto: no puede cambiar el nombre en la condición de filtro

imagen-20230612203623043

  • Estudiantes cuya puntuación en chino sea > 80 y cuyo apellido no sea Sun
select name,chinese from exam_result where chinese >80 and name not like '孙%';

imagen-20230612203919113

  • Student Sun, de lo contrario, el puntaje total> 200 y el puntaje chino <el puntaje de matemáticas y el puntaje de inglés> 80
select name,chinese,math,english,chinese+math+english 总分 from exam_result where name like'孙_' or  (chinese+math+english>200 and chinese < math and english>80);

imagen-20230612204322235

  • consulta por NULL

Para demostrarlo, primero cree una tabla de prueba:

imagen-20230612204712628

select * from test where name is null;

imagen-20230612204745578

ordenar porordenar

-- ASC 为升序(从小到大)
-- DESC 为降序(从大到小)
-- 默认为 ASC
SELECT ... FROM table_name [WHERE ...]
ORDER BY column [ASC|DESC], [...];

Para consultas sin una cláusula ORDER BY, el orden devuelto no está definido y nunca se debe confiar en él

A continuación, se utilizan algunos casos para comprender el orden mediante la clasificación:

  • Compañeros de clase y puntajes de matemáticas, mostrados en orden ascendente de puntajes de matemáticas
 select name,math from exam_result order by math asc;

imagen-20230612205303662

  • compañeros de clase ordenados
-- NULL 视为比任何值都小,升序出现在最上面

imagen-20230612205532311

  • Consulte los puntajes de los estudiantes en varias materias y muéstrelos en orden descendente de matemáticas, orden ascendente de inglés y orden ascendente de chino
select name,math,english,chinese from exam_result order by math desc,english asc,chinese asc

imagen-20230612205902228

Nota: orden por defecto a la clasificación asc ascendente

  • Consulta compañeros de clase y puntajes totales, de menor a mayor
select name,math+chinese+english as total from exam_result order by total;

imagen-20230612210207058

¿Por qué se pueden volver a utilizar los alias? Los alias no se pueden usar después de dónde, ¿por qué es posible ordenar por clasificación aquí?

Para ordenar los datos en la estructura de la tabla, primero debe haber datos y luego ordenarlos.

inserte la descripción de la imagen aquí

  • Consulte los puntajes de matemáticas de los estudiantes de apellido Sun o de los estudiantes de apellido Cao, y los resultados se muestran en orden descendente de puntajes de matemáticas
select name,math from exam_result where name like '孙%' or name like '曹%' order by math desc;

imagen-20230614105603234

limitar los resultados de la paginación del filtro

-- 起始下标为 0
-- 从 s 开始(下标从0开始),筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n
-- 从 0 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;

-- 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;

imagen-20230614110244193

imagen-20230614110109012

Debe ordenarse por datos. Solo cuando los datos están listos, debe mostrarlos. La función esencial del límite es "mostrar".

Actualización de la operación de actualización

UPDATE table_name SET column = expr [, column = expr ...]
[WHERE ...] [ORDER BY ...] [LIMIT ...]

Actualizar el valor de la columna del resultado de la consulta

  • Cambia la puntuación matemática de Sun Wukong a 80 puntos
update exam_result set math=80 where name='孙悟空';

imagen-20230614111325331

  • Cambie la puntuación de matemáticas de Cao Mengde a 60 puntos y la puntuación de chino a 70 puntos
update exam_result set math=60,chinese=70 where name='曹孟德';

imagen-20230614111704366

  • Agregue 30 puntos a los puntajes de matemáticas de los tres estudiantes con los tres puntajes totales inferiores
 select name,math+chinese+english total from exam_result order by total asc limit 3;

imagen-20230614122933070

  • Actualice los puntajes de chino de todos los estudiantes para duplicar el original
update exam_result set chinese=chinese*2;

imagen-20230614123447406

Borrar operación borrar

DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
  • Eliminar los puntajes de las pruebas de Sun Wukong
delete from exam_result wherename='孙悟空';

imagen-20230614123917746

  • Eliminar todos los datos de la tabla
-- 准备测试表
CREATE TABLE for_delete (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
);
Query OK, 0 rows affected (0.16 sec)
-- 插入测试数据
INSERT INTO for_delete (name) VALUES ('A'), ('B'), ('C');


-- 删除整表数据
DELETE FROM for_delete;

-- 查看删除结果
SELECT * FROM for_delete;
Empty set (0.00 sec)

-- 再插入一条数据,自增 id 在原值上增长
INSERT INTO for_delete (name) VALUES ('D');
  • tabla truncada
  1. Solo puede operar en toda la tabla y no puede operar en datos parciales como DELETE;
  2. De hecho, MySQL no opera con datos, por lo que es más rápido que DELETE, pero TRUNCATE no pasa por cosas reales al eliminar datos, por lo que no se puede revertir.
  3. Restablecerá elementos AUTO_INCREMENT
TRUNCATE [TABLE] table_name

Por ejemplo:

-- 准备测试表
CREATE TABLE for_truncate (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
);

-- 插入测试数据
INSERT INTO for_truncate (name) VALUES ('A'), ('B'), ('C');

-- 截断整表数据,注意影响行数是 0,所以实际上没有对数据真正操作
TRUNCATE for_truncate;

imagen-20230614125301516

-- 再插入一条数据,自增 id 在重新增长
INSERT INTO for_truncate (name) VALUES ('E');

imagen-20230614125342791

-- 查看表结构,会有 AUTO_INCREMENT=2 项
SHOW CREATE TABLE for_truncate\G

imagen-20230614125423155

insertar resultado de consulta

INSERT INTO table_name [(column [, column ...])] SELECT ...
  • Eliminar registros duplicados en la tabla, solo puede haber una copia de datos duplicados
-- 创建原数据表
CREATE TABLE duplicate_table (id int, name varchar(20));

-- 插入测试数据
INSERT INTO duplicate_table VALUES
(100, 'aaa'),
(100, 'aaa'),
(200, 'bbb'),
(200, 'bbb'),
(200, 'bbb'),
(300, 'ccc');

imagen-20230614172612701

-- 创建一张空表 no_duplicate_table,结构和 duplicate_table 一样
CREATE TABLE no_duplicate_table LIKE duplicate_table;
-- 将 duplicate_table 的去重数据插入到 no_duplicate_table
INSERT INTO no_duplicate_table SELECT DISTINCT * FROM duplicate_table;
-- 通过重命名表,实现原子的去重操作
RENAME TABLE duplicate_table TO old_duplicate_table,
no_duplicate_table TO duplicate_table;
-- 查看最终结果
SELECT * FROM duplicate_table;

imagen-20230614184618308

¿Por qué se cambiará el nombre del modelo en el futuro? Solo quiero esperar hasta que todo esté listo y luego ponerlo, actualizarlo, que entre en vigor, etc.

Supongo que te gusta

Origin blog.csdn.net/weixin_60478154/article/details/131214014
Recomendado
Clasificación