Solo hay mucho sobre las declaraciones SQL

Capítulo 1 Introducción a SQL

1.1 que es sql

  • SQL: lenguaje de consulta de estructura. (lenguaje de consulta estructurado), operar la base de datos a través de sql (base de datos de operaciones, tabla de operaciones, datos de operaciones)
  • SQL fue identificado por el Instituto Nacional Estadounidense de Estándares (ANSI) como el estándar estadounidense para lenguajes de bases de datos relacionales, y luego fue adoptado por la Organización Internacional de Estándares (ISO) como un estándar internacional para lenguajes de bases de datos relacionales.
  • Todos los proveedores de bases de datos (MySql, Oracle, sql server) admiten el estándar ISO SQL.
  • Cada proveedor de bases de datos ha realizado sus propias extensiones sobre la base del estándar. Cada base de datos tiene su propia sintaxis específica

1.2 Clasificación de sql

  • Lenguaje de definición de datos (lenguaje de definición de datos DDL) como: base de datos operativa, mesa de operaciones
  • Lenguaje de manipulación de datos (lenguaje de manipulación de datos DML), como: agregar, eliminar y modificar registros en una tabla
  • Lenguaje de consulta de datos (lenguaje de consulta de datos DQL), como: operaciones de consulta sobre datos en tablas
  • Lenguaje de control de datos (Lenguaje de control de datos DCL), como: configuración de permisos de usuario

1.3 Especificaciones y requisitos de sintaxis de MySQL

(1) la sintaxis sql de mysql no distingue entre mayúsculas y minúsculas

Las palabras clave y los nombres de funciones de MySQL no distinguen entre mayúsculas y minúsculas, pero si los valores de los datos distinguen entre mayúsculas y minúsculas o no, está relacionado con los conjuntos de caracteres y las reglas de clasificación.

ci (no distingue entre mayúsculas y minúsculas), cs (distingue entre mayúsculas y minúsculas), _bin (binario, es decir, la comparación se basa en el valor de la codificación de caracteres y no tiene nada que ver con el idioma, distingue entre mayúsculas y minúsculas)

(2) Al nombrar: intente usar 26 letras en inglés en mayúsculas y minúsculas, números 0-9, guión bajo, no use otros símbolos user_id

(3) Se recomienda no utilizar palabras clave de mysql como nombres de tablas, nombres de campos, etc. Si las utiliza accidentalmente, utilice ` (signo flotante) en la instrucción SQL para causar

(4) No contenga espacios entre nombres de objetos, como bases de datos y nombres de tablas, nombres de campos, etc.

(5) En el mismo software mysql, las bases de datos no pueden tener el mismo nombre, en la misma biblioteca, las tablas no pueden tener el mismo nombre y en la misma tabla, los campos no pueden tener el mismo nombre

(6) Signos de puntuación:

debe estar en parejas

El método de entrada de medio ancho inferior debe estar en inglés

Los tipos de cadena y fecha pueden usar comillas simples ''

El alias de la columna puede usar comillas dobles "", y no use comillas dobles para el alias del nombre de la tabla. como se puede omitir al tomar un alias

Si el alias de la columna no contiene espacios se pueden omitir las comillas dobles, si hay espacios no se pueden omitir las comillas dobles.

(7) Cómo agregar comentarios en scripts SQL

Comentario de una sola línea: #contenido del comentario

Comentario de una sola línea: – contenido de comentario de espacio donde – el espacio detrás debe tener

Comentario de varias líneas: /* contenido del comentario */

#以下两句是一样的,不区分大小写
show databases;
SHOW DATABASES;

#创建表格
#create table student info(...); #表名错误,因为表名有空格
create table student_info(...); 

#其中name使用``飘号,因为name和系统关键字或系统函数名等预定义标识符重名了。
CREATE TABLE t_stu(
    id INT,
    `name` VARCHAR(20)
);

select id as "编号", `name` as "姓名" from t_stu; #起别名时,as都可以省略
select id as 编号, `name` as 姓名 from t_stu; #如果字段别名中没有空格,那么可以省略""
select id as 编 号, `name` as 姓 名 from t_stu; #错误,如果字段别名中有空格,那么不能省略""

Capítulo 2 - Base de datos de operaciones DDL

2.1 Crear una base de datos (maestra)

  • gramática
create database 数据库名 [character set 字符集][collate  校对规则]     注: []意思是可选的意思

Conjunto de caracteres (charset): es un conjunto de símbolos y codificaciones.

  • práctica

Crear una base de datos del día 01 (conjunto de caracteres predeterminado)

create database day01;

Cree una base de datos day01_2, especifique el conjunto de caracteres como gbk (entendido)

create database day01_2 character set gbk;

2.2 Ver todas las bases de datos

2.2.1 Ver todas las bases de datos

  • gramática
show databases; 

2.2.2 Ver la estructura de definición de la base de datos 【comprender】

  • gramática
show create database 数据库名;
  • Ver la definición de la base de datos day01
show create database day01; 

2.3 Eliminar la base de datos

  • gramática
drop database 数据库名;
  • Eliminar la base de datos day01_2
drop database day01_2;

2.4 Modificar la base de datos 【comprender】

  • gramática
alter database 数据库名 character set 字符集;
  • Modificar el juego de caracteres (gbk) de la base de datos del día 01
alter database day01 character set gbk;

Aviso:

  • es utf8, no utf-8
  • no modificar el nombre de la base de datos

2.5 Otras operaciones

  • Cambiar base de datos, seleccionar qué base de datos
use 数据库名;   		//注意: 在创建表之前一定要指定数据库. use 数据库名
  • Ejercicio: uso dia01
use day01;
  • Comprobar la base de datos en uso
select database();

Capítulo 3 - Tabla de operaciones DDL

3.1 Crear tabla

3.1.1 Sintaxis

create table 表名(
	列名 类型 [约束],
	列名 类型 [约束]
	...
		
);

3.1.2 Tipo

3.1.2.1 Tipos numéricos

  • Serie entera: xxxInt

int(M), se debe usar con zerofill sin firmar para que tenga sentido

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leeching, se recomienda guardar la imagen y cargarla directamente (img-8kBz3iew-1638520841000)(imgs/1560933629123.png)]

  • Serie de punto flotante: flotante, doble (o real)

double(M,D): indica que el más largo tiene M dígitos, de los cuales D dígitos después del punto decimal

Por ejemplo: el rango de datos representado por double(5,2) [-999.99,999.99], si excede este rango, se reportará un error.

  • Serie de punto fijo: decimal (la capa inferior en realidad se almacena usando cadenas)

decimal(M,D): Indica que el más largo es M dígitos, de los cuales D dígitos después del punto decimal

  • Tipo de bit: bit

El rango de bytes es: 1-8, el rango de valores es: bit (1) ~ bit (64), el bit predeterminado (1)

Se utiliza para almacenar números binarios. Para los campos de bits, usar el comando de selección directamente no verá el resultado. Se puede leer usando las funciones bit() o hex(). Al insertar un campo de tipo bit, utilice la función bit() para convertirlo en un valor binario antes de insertarlo, porque el código binario es "01".

3.1.2.2 Tipo de fecha y hora

Tipo de fecha y hora: año, fecha, fecha y hora, marca de tiempo

Presta atención al rango de representación de cada fecha y hora

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo de enlace antirrobo, se recomienda guardar la imagen y cargarla directamente (img-K8WWW1HO-1638520841002)(imgs/1560933691657.png)]

La diferencia entre marca de tiempo y fecha y hora:

  • El rango de marca de tiempo es relativamente pequeño
  • la marca de tiempo está relacionada con la zona horaria
    • mostrar variables como 'time_zone';
    • establecer time_zone = '+8:00';
  • la marca de tiempo se ve muy afectada por la versión de MySQL y el SQLMode del servidor
  • Si el primer campo de marca de tiempo no vacío en la tabla se inserta y actualiza como NULL, se establecerá automáticamente en la hora del sistema.

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leeching, se recomienda guardar la imagen y cargarla directamente (img-jXNxTuad-1638520841003)(imgs/image-20200406171844833.png)]

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leeching, se recomienda guardar la imagen y cargarla directamente (img-MznPFSM6-1638520841008)(imgs/image-20200406171900814.png)]

3.1.2.3 Tipo de cadena

MySQL proporciona una variedad de tipos de almacenamiento para datos de caracteres y las diferentes versiones pueden ser diferentes. Los comunes son:

char, varchar, xxtext, binary, varbinary, xxblob, enum, set, etc.

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leeching, se recomienda guardar la imagen y subirla directamente (img-Ds5F1r7Y-1638520841015)(imgs/image-20200406180437224.png)]

  • Tipo de cadena char, varchar(M)

char Si no se especifica el ancho, el valor predeterminado es 1 carácter

varchar(M), se debe especificar el ancho

  • binary y varbinary son similares a char y varchar excepto que contienen cadenas binarias y no admiten cosas como consultas difusas.

  • Generalmente, al guardar un pequeño número de cadenas, elegiremos char y varchar; al guardar texto grande, generalmente elegimos usar series de texto o blob. Los valores de blob y texto causarán algunos problemas de rendimiento, especialmente cuando se realiza una gran cantidad de operaciones de eliminación, se dejará un gran "agujero" en la tabla de datos. Para mejorar el rendimiento, se recomienda utilizar la optimización función de tabla en dichas tablas con regularidad Hacer la desfragmentación. Los índices sintéticos (sintéticos) se pueden usar para mejorar el rendimiento de las consultas de campos de texto grandes.Si necesita realizar consultas difusas en campos de texto grandes, MySql proporciona índices de prefijos. Pero aún así evite recuperar grandes valores de blob o texto cuando no sea necesario.

  • tipo de enumeración enum, su rango de valores debe especificarse explícitamente por enumeración al crear una tabla, para una enumeración con 1 ~ 255 miembros, se requiere 1 byte de almacenamiento; para 255`65535 miembros, se requieren 2 bytes de almacenamiento. Por ejemplo: género enum('masculino','femenino'). Si se inserta un valor diferente al valor de enumeración, se procesará como el primer valor. Solo se puede seleccionar uno de los valores de enumeración a la vez.

  • El tipo de colección de conjuntos puede contener de 0 a 64 miembros. Se pueden seleccionar varios miembros de un conjunto a la vez. Si se selecciona un conjunto de 1 a 8 miembros, ocupa 1 byte, 2 y 3 a la vez. . 8 bytes Por ejemplo: conjunto hoppy('comer', 'dormir', 'jugar', 'viajar'), al seleccionar 'comer, dormir' o 'dormir, jugar, viajar'

3.1.2.4 Ejemplos

+----------------+--------------+------+-----+---------+----------------+
| Field          | Type         | Null | Key | Default | Extra          |
+----------------+--------------+------+-----+---------+----------------+
| eid            | int(11)      | NO   | PRI | NULL    | auto_increment |
| ename          | varchar(20)  | NO   |     | NULL    |                |
| tel            | char(11)     | NO   |     | NULL    |                |
| gender         | char(1)      | YES  |     | 男        |                |
| salary         | double       | YES  |     | NULL    |                |
| commission_pct | double(3,2)  | YES  |     | NULL    |                |
| birthday       | date         | YES  |     | NULL    |                |
| hiredate       | date         | YES  |     | NULL    |                |
| job_id         | int(11)      | YES  |     | NULL    |                |
| email          | varchar(32)  | YES  |     | NULL    |                |
| mid            | int(11)      | YES  |     | NULL    |                |
| address        | varchar(150) | YES  |     | NULL    |                |
| native_place   | varchar(10)  | YES  |     | NULL    |                |
| did            | int(11)      | YES  |     | NULL    |                |
+----------------+--------------+------+-----+---------+----------------+

3.1.3 Restricciones

  • Es decir, normas, reglas y reglamentos;
  • Función: garantizar que los datos introducidos por el usuario se guarden en la base de datos de conformidad con la especificación
restricción palabra clave de restricción
Clave primaria Clave primaria No vacío y único, y una tabla solo puede tener una clave principal
solo único Único, los mismos datos no pueden aparecer en la columna actual
no vacío no nulo No está vacío, la columna actual no puede ser nula
por defecto por defecto Especifica los datos predeterminados si la columna actual no tiene datos

Tipo de restricción:

  • no nulo: no vacío; por ejemplo: nombre de usuario varchar(40) no nulo nombre de usuario Esta columna no puede tener un valor nulo

  • único: restricción única, los siguientes datos no se pueden repetir con los anteriores, por ejemplo: cardNo char(18) único, no se pueden repetir datos en la columna cardNo

  • clave principal; restricción de clave principal (no vacía + única); generalmente se usa en la columna de identificación de la tabla. Una tabla básicamente tiene una columna de identificación, y la columna de identificación se usa como un identificador único

    • auto_increment: crecimiento automático, debe establecer la clave principal antes de poder usar auto_increment
  • id int clave principal auto_incremento; id no necesita ser mantenido por nosotros mismos. Al insertar datos, inserte nulo directamente, y crezca y complete automáticamente para evitar la duplicación.

Aviso:

  1. Primero configure la clave principal y luego configure auto_increment
  2. Nulo se puede insertar solo cuando se establece auto_increment, de lo contrario, se informará un error al insertar nulo

columna de identificación:

  1. Establezca id en tipo int, agregue restricción de clave principal y crecimiento automático
  2. O establezca la identificación en un tipo de cadena, agregue una restricción de clave principal y no pueda establecer el crecimiento automático

3.1.4 Ejercicios

  • Cree una tabla de estudiantes (con un campo de identificación, el campo de nombre no se puede repetir, el campo de género no puede estar vacío, el valor predeterminado es masculino y la clave principal de identificación crece automáticamente)
CREATE TABLE student(
	id INT PRIMARY KEY AUTO_INCREMENT, -- 主键自增长
	NAME VARCHAR(30) UNIQUE, -- 唯一约束
	gender CHAR(1) NOT NULL DEFAULT '男'
);

3.2 Verifique la tabla [entender]

3.2.1 Ver todas las tablas

show tables;

3.2.2 Ver la estructura de definición de la tabla

  • gramática

    nombre de la tabla de descripción;

  • Ejercicio: Ver la estructura de definición de la tabla de estudiantes

desc student;

3.3 Modificar tabla【Dominar, pero no memorizar】

3.3.1 Gramática

  • agregar una columna
alter table 【数据库名.]表名称 addcolumn】 字段名 数据类型;
alter table 【数据库名.]表名称 addcolumn】 字段名 数据类型 first;
alter table 【数据库名.]表名称 addcolumn】 字段名 数据类型 after 另一个字段;
  • Modifique la restricción de tipo de la columna:alter table 表名 modify 字段 类型 约束 ;
  • Modificar nombres de columnas, tipos, restricciones:alter table 表名 change 旧列 新列 类型 约束;
  • Eliminar una columna:alter table 表名 drop 列名;
  • Modifique el nombre de la tabla:rename table 旧表名 to 新表名;

3.3.2 Ejercicios

  • Agregue un campo de calificación a la tabla de estudiantes, el tipo es varchar (20), no puede estar vacío
ALTER TABLE student ADD grade VARCHAR(20) NOT NULL;
  • Cambie el campo de género de la tabla de estudiantes a un tipo int, que no puede estar vacío, y el valor predeterminado es 1
alter table student modify gender varchar(20);
  • Cambie el campo de calificación de la tabla de estudiantes a un campo de clase
ALTER TABLE student CHANGE grade class VARCHAR(20) NOT NULL;
  • Eliminar el campo de clase
ALTER TABLE student DROP class;
  • Cambiar la mesa del estudiante a la mesa del profesor (entender)
RENAME TABLE student TO teacher;

3.4 Borrar tabla【Maestro】

  • gramática

    soltar tabla nombre de tabla;

  • Eliminar la tabla de profesores

drop table teacher;

Capítulo 4 - Registros de la tabla de operaciones DML - Adiciones, eliminaciones y modificaciones [Puntos clave]

  • Preparativos: Cree una tabla de productos básicos (identificación de productos básicos, nombre de productos básicos, precio de productos básicos, cantidad de productos básicos).
create table product(
	pid int primary key auto_increment,
	pname varchar(40),
	price double,
	num int
);

4.1 Insertar registro

4.1.1 Sintaxis

  • Método 1: inserte la columna especificada. Si la columna no aparece en la lista, se asignará automáticamente como nula .

    por ejemplo: solo quiero insertar pname, precio, insertar en t_product (pname, precio) valores ('mac', 18000);

insert into 表名(列,列..) values(值,值..);

Nota: Si no se inserta ninguna columna y se establece una restricción no nula, se informará un error

  • Método 2: inserte todas las columnas, si una columna no desea insertar un valor, debe asignar un valor nulo
insert into 表名 values(,....);           

eg:
insert into product values(null,'苹果电脑',18000.0,10);
insert into product values(null,'华为5G手机',30000,20);
insert into product values(null,'小米手机',1800,30);
insert into product values(null,'iPhonex',8000,10);
insert into product values(null,'iPhone7',6000,200);
insert into product values(null,'iPhone6s',4000,1000);
insert into product values(null,'iPhone6',3500,100);
insert into product values(null,'iPhone5s',3000,100);

insert into product values(null,'方便面',4.5,1000);
insert into product values(null,'咖啡',11,200); 
insert into product values(null,'矿泉水',3,500);

4.2 Actualizar registros

4.2.1 Gramática

update 表名 set 列 =值, 列 =值 [where 条件]

4.2.2 Ejercicios

  • Modificar el precio de todos los productos a 5000 yuanes
update product set price = 5000;
  • Cambiar el precio del nombre del producto a Apple Computer a 18.000 yuanes
UPDATE product set price = 18000 WHERE pname = '苹果电脑';
  • Cambie el nombre del producto a Apple Computer, cambie el precio a 17000 y cambie la cantidad a 5
UPDATE product set price = 17000,num = 5 WHERE pname = '苹果电脑';
  • Aumentar el precio del producto cuyo nombre es fideos instantáneos en 2 yuanes sobre la base original
UPDATE product set price = price+2 WHERE pname = '方便面';

4.3 Eliminación de registros

4.3.1 eliminar

De acuerdo con las condiciones, elimine los datos uno por uno

  • gramática
delete from 表名 [where 条件]    注意: 删除数据用delete,不用truncate
  • tipo

Elimine el registro llamado 'Apple Computer' en la tabla

delete from product where pname = '苹果电脑';

Eliminar registros de materias primas cuyo precio sea inferior a 5001

delete from product where price < 5001;

Elimine todos los registros de la tabla (generalmente no se recomienda usar la declaración de eliminación para eliminar, la declaración de eliminación se ejecuta línea por línea, la velocidad es demasiado lenta)

delete from product;

4.3.2 truncado

DROP la tabla directamente y luego cree la misma tabla nueva. Los datos eliminados no se pueden recuperar. Se ejecuta más rápido que DELETE

truncate table 表;

4.3.3 Eliminar datos durante el trabajo

  • Eliminación física: en realidad se elimina, los datos no están allí y usar eliminar es una eliminación física
  • Borrado lógico: No hay un borrado real, los datos todavía están ahí. Haga una marca, de hecho, el borrado lógico es una actualización, por ejemplo: estado 1 habilitar 0 deshabilitar

Capítulo 5 - Registro de la tabla de operaciones de DQL - Consulta [Puntos clave]

5.1 Sintaxis de consulta básica

select 要查询的字段名 from 表名 [where 条件] 

5.2 Consulta sencilla

5.2.1 Consultar registros de todas las filas y columnas

  • gramática
select * form 表
  • Consultar todas las columnas en la tabla de productos
select * from product;

5.2.2 Consultar los registros de una columna específica en una tabla

  • gramática
select 列名,列名,列名... from 表
  • Consultar nombre y precio del producto
select pname, price from product;

5.2.3 Consulta de deduplicación distinta

  • gramática
SELECT DISTINCT 字段名 FROM 表名;   //要数据一模一样才能去重
  • Deduplicar el nombre del producto de consulta
SELECT DISTINCT pname,price FROM product

Nota: La deduplicación está dirigida a una determinada columna, y el nombre de la columna no puede aparecer antes de las distintas

5.2.4 Consulta de alias

  • gramática
select 列名 as 别名 ,列名  from 表   //列别名  as可以不写
select 别名.* from 表 as 别名      //表别名(多表查询, 明天会具体讲)
  • Para consultar la información del producto, utilice un alias
SELECT pid ,pname AS '商品名',price AS '商品价格',num AS '商品库存' FROM product

5.2.5 Consulta de operación (+,-,*,/,%, etc.)

  • Consultar el nombre del producto y el precio del producto +10: podemos agregar un valor fijo a un campo determinado y realizar operaciones en varios campos
select pname ,price+10 as 'price' from product;

select name,chinese+math+english as total from student

Aviso

  • Campo de consulta operativa, entre campos es posible
  • Los tipos como cadenas se pueden usar para consultas de operaciones, pero los resultados no tienen sentido

5.3 Consulta condicional (muy importante)

5.3.1 Sintaxis

select ... from 表 where 条件 
//取出表中的每条数据,满足条件的记录就返回,不满足条件的记录不返回

5.3.2 Operadores

1. Operadores de comparación

大于:>
小于:<
大于等于:>=
小于等于:<=
等于:=   不能用于null判断
不等于:!=  或 <>
安全等于: <=>  可以用于null值判断

2. Operadores lógicos (se recomienda el uso de palabras, en términos de legibilidad)

逻辑与:&& 或 and
逻辑或:|| 或 or
逻辑非:! 或 not
逻辑异或:^ 或 xor

3. Alcance

区间范围:between x  and  y
	    not between x  and  y
集合范围:in (x,x,x) 
	    not  in (x,x,x)

4. Consulta aproximada y coincidencia regular (solo para tipo de cadena, tipo de fecha)

like 'xxx'  模糊查询是处理字符串的时候进行部分匹配
如果想要表示0~n个字符,用%
如果想要表示确定的1个字符,用_
regexp '正则'

5. Manejo especial de valores nulos

#(1)判断时
xx is null
xx is not null
xx <=> null
#(2)计算时
ifnull(xx,代替值) 当xx是null时,用代替值计算

5.3.3 Ejercicios

  • Consultar productos cuyo precio sea superior a 3000
select * from product where price > 3000;
  • Consultar el producto con pid=1
select * from product where pid = 1;
  • Consultar el producto con pid<>1 (!=)
select * from product where pid <> 1;
  • Consulta por productos con precios entre 3000 y 6000
select * from product where price between 3000 and 6000;
  • Consultar productos cuyo pid esté en el rango de 1, 5, 7, 15
select * from product where id = 1;
select * from product where id = 5;
select * from product where id = 7;
select * from product where id = 15;

select * from product where id in (1,5,7,15);
  • Consultar productos cuyo nombre de producto comience con iPho (serie iPhone)
select * from product where pname like 'iPho%';
  • Consulta de artículos cuyo precio sea superior a 3000 y cuya cantidad sea superior a 20 (estado y estado y...)
select * from product where price > 3000 and num > 20;
  • Consulta artículos con id=1 o precio inferior a 3000
select * from product where pid = 1 or price < 3000;

5.4 Clasificación de consultas

La ordenación se escribe después de la consulta, lo que significa que los datos se consultan y luego se ordenan

5.4.1 Preparación del entorno

# 创建学生表(有sid,学生姓名,学生性别,学生年龄,分数列,其中sid为主键自动增长)
CREATE TABLE student(
	sid INT PRIMARY KEY auto_increment,
	sname VARCHAR(40),
	sex VARCHAR(10),
	age INT,
    score DOUBLE
);

INSERT INTO student VALUES(null,'zs','男',18,98.5);
INSERT INTO student VALUES(null,'ls','女',18,96.5);
INSERT INTO student VALUES(null,'ww','男',15,50.5);
INSERT INTO student VALUES(null,'zl','女',20,98.5);
INSERT INTO student VALUES(null,'tq','男',18,60.5);
INSERT INTO student VALUES(null,'wb','男',38,98.5);
INSERT INTO student VALUES(null,'小丽','男',18,100);
INSERT INTO student VALUES(null,'小红','女',28,28);
INSERT INTO student VALUES(null,'小强','男',21,95);

5.4.2 Clasificación de una sola columna

  1. Sintaxis: ordenar solo por un campo determinado, ordenar por una sola columna
SELECT 字段名 FROM 表名 [WHERE 条件] ORDER BY 字段名 [ASC|DESC];  //ASC: 升序,默认值; DESC: 降序
  1. Caso: consulta a todos los estudiantes en orden descendente de puntajes
SELECT * FROM student ORDER BY score DESC

5.4.3 Clasificación combinada

  1. Sintaxis: ordenar múltiples campos al mismo tiempo, si el primer campo es igual, ordenar por el segundo campo, y así sucesivamente
SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名1 [ASC|DESC], 字段名2 [ASC|DESC];
  1. Ejercicio: Consultar a todos los estudiantes en orden descendente de puntajes, si los puntajes son iguales, entonces en orden descendente de edad
SELECT * FROM student ORDER BY score DESC, age DESC

5.5 Funciones agregadas

Las funciones agregadas se usan para estadísticas y generalmente se usan junto con consultas de agrupación para contar los datos de cada grupo.

5.5.1 Lista de funciones agregadas

función agregada efecto
max (nombre de la columna) Encuentre el valor máximo de esta columna
min (nombre de la columna) Encuentre el valor mínimo de esta columna
promedio (nombre de la columna) Encuentre el promedio de esta columna
contar (nombre de la columna) Cuente cuántos registros hay en esta columna
suma (nombre de la columna) suma esta columna
  1. gramática
SELECT 聚合函数(列名) FROM 表名 [where 条件];
  1. el caso
-- 求出学生表里面的最高分数
SELECT MAX(score) FROM student
-- 求出学生表里面的最低分数
SELECT MIN(score) FROM student
-- 求出学生表里面的分数的总和(忽略null值)
SELECT SUM(score) FROM student
-- 求出学生表里面的平均分
SELECT AVG(score) FROM student
-- 求出学生表里面的平均分(缺考了当成0分处理)
SELECT AVG(IFNULL(score,0)) FROM student
-- 统计学生的总人数 (忽略null) 
SELECT COUNT(sid) FROM student
SELECT COUNT(*) FROM student

Nota: las funciones agregadas ignoran los valores NULL

Descubrimos que los registros NULL no se contarán. Se recomienda no usar columnas que pueden ser nulas si se cuenta el número, pero ¿qué pasa si es necesario contar NULL? Podemos resolver este problema mediante la función IFNULL (nombre de columna, valor predeterminado).Si la columna no es nula, devuelva el valor de esta columna. Si es NULL, se devuelve el valor predeterminado.

-- 求出学生表里面的平均分(缺考了当成0分处理)
SELECT AVG(IFNULL(score,0)) FROM student;

5.6 Consulta de grupo

GROUP BY trata el mismo contenido en los resultados del campo de agrupación como un grupo y devuelve el primer dato de cada grupo, por lo que la agrupación sola es inútil. El propósito de la agrupación es para las estadísticas. Generalmente, la agrupación se utilizará junto con las funciones de agregación.

5.6.1 Agrupación

  1. gramática
SELECT 字段1,字段2... FROM 表名  [where 条件] GROUP BY[HAVING 条件];
  1. el caso
-- 根据性别分组, 统计每一组学生的总人数
SELECT sex '性别',COUNT(sid) '总人数' FROM student GROUP BY sex

-- 根据性别分组,统计每组学生的平均分
SELECT sex '性别',AVG(score) '平均分' FROM student GROUP BY sex

-- 根据性别分组,统计每组学生的总分
SELECT sex '性别',SUM(score) '总分' FROM student GROUP BY sex

5.6.2 Filtro que tiene después de agrupar

La condición después de agrupar no se puede escribir después de donde, la palabra clave donde debe escribirse antes de agrupar por

  • Según el agrupamiento por género, cuente el número total de estudiantes en cada grupo > 5 (selección tras agrupamiento)
SELECT sex, count(*) FROM student GROUP BY sex HAVING count(sid) > 5
  • Según la agrupación por género, solo la edad es mayor o igual a 18 años, y se requiere que el número de personas en el grupo sea mayor a 4
SELECT sex '性别',COUNT(sid) '总人数' FROM student WHERE age >= 18 GROUP BY sex HAVING COUNT(sid) > 4

5.6.3 La diferencia entre dónde y tener [Entrevista]

nombre de niño efecto
cláusula donde niño 1) Antes de agrupar los resultados de la consulta, elimine las filas que no cumplan la condición where, es decir, filtre los datos antes de agrupar, es decir, filtre primero y luego agrupe. 2) Las funciones de agregación no se pueden usar después de donde
tener cláusula 1) La función de la cláusula de tener es filtrar los grupos que cumplen las condiciones, es decir, filtrar los datos después de agrupar, es decir, agrupar primero y luego filtrar. 2) Las funciones de agregación se pueden usar después de haber

5.7 Consulta de paginación

5.7.1 Sintaxis

select ... from .... limit a ,b
LÍMITE a,b;
a representa el número de datos omitidos
b representa el número de datos a consultar

5.7.2 Caso

-- 分页查询
-- limit 关键字是使用在查询的后边,如果有排序的话则使用在排序的后边
-- limit的语法: limit offset,length  其中offset表示跳过多少条数据,length表示查询多少条数据
SELECT * FROM product LIMIT 0,3
-- 查询product表中的前三条数据(0表示跳过0条,3表示查询3条)

SELECT * FROM product LIMIT 3,3
-- 查询product表的第四到六条数据(3表示跳过3条,3表示查询3条)
-- 分页的时候,只会告诉你我需要第几页的数据,并且每页有多少条数据
-- 假如,每页需要3条数据,我想要第一页数据: limit 0,3
-- 假如,每页需要3条数据,我想要第二页数据: limit 3,3
-- 假如,每页需要3条数据,我想要第三页数据: limit 6,3
-- 结论: length = 每页的数据条数,offset = (当前页数 - 1)*每页数据条数
-- limit (当前页数 - 1)*每页数据条数, 每页数据条数

5.8 Resumen de sintaxis para consultas

select...from...where...group by...order by...limit

select...from...where...
select...from...where...order by...
select...from...where...limit...
select...from...where...order by...imit

Capítulo 6 Tres paradigmas de las bases de datos

Un buen diseño de la base de datos tendrá un impacto importante en el rendimiento del almacenamiento de datos y en el posterior desarrollo del programa. El establecimiento de una base de datos científica y estandarizada necesita cumplir con algunas reglas para optimizar el diseño y el almacenamiento de datos, estas reglas se denominan paradigmas.

6.1 Primera forma normal: asegurando que cada columna permanezca atómica

La primera forma normal es la forma normal más básica. Si todos los valores de campo en la tabla de la base de datos son valores atómicos indescomponibles, significa que la tabla de la base de datos satisface la primera forma normal.

El cumplimiento racional de la primera forma normal debe determinarse de acuerdo con las necesidades reales del sistema. Por ejemplo, algunos sistemas de bases de datos necesitan usar el atributo "dirección". Originalmente, el atributo "dirección" debe diseñarse directamente como un campo de una tabla de base de datos. Sin embargo, si el sistema accede con frecuencia a la parte "ciudad" del atributo "dirección", entonces el atributo "dirección" debe volver a dividirse en varias partes, como provincia, ciudad y dirección detallada para el almacenamiento. Será muy conveniente para algunas operaciones. Solo de esta manera el diseño puede satisfacer la primera forma normal de la base de datos, como se muestra en la siguiente tabla.

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leeching, se recomienda guardar la imagen y subirla directamente (img-ckfYJvC2-1638521360056)(imgs/tu_11.png)]

Si no se sigue la primera forma normal, los datos de consulta necesitan procesamiento adicional (la consulta es inconveniente). Cumpla con el primer formulario normal y consulte cualquier dato que requiera cualquier dato de campo (fácil de consultar)

6.2 Segunda forma normal: asegúrese de que cada columna de la tabla esté relacionada con la clave principal

La segunda forma normal es un paso más sobre la base de la primera forma normal. La segunda forma normal debe garantizar que cada columna en la tabla de la base de datos esté relacionada con la clave principal, no solo con una parte determinada de la clave principal (principalmente para la clave principal conjunta). Es decir, en una tabla de base de datos, solo se puede almacenar un tipo de datos en una tabla y no se pueden almacenar varios tipos de datos en la misma tabla de base de datos.

Por ejemplo, si desea diseñar una tabla de información de pedidos, ya que puede haber muchos tipos de productos en el pedido, debe usar el número de pedido y el número de producto como la clave principal conjunta de la tabla de la base de datos, como se muestra a continuación. mesa

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leeching, se recomienda guardar la imagen y subirla directamente (img-TclGdISW-1638521360057)(imgs/tu_12.png)]

Esto crea un problema: en esta tabla, el número de pedido y el número de producto se utilizan como clave primaria conjunta. De esta manera, la información como el nombre del producto, la unidad y el precio del producto en la tabla no está relacionada con la clave principal de la tabla, sino solo con el número de producto. Así que aquí se viola el principio de diseño de la segunda forma normal.

Y si la tabla de información del pedido se divide, la información del producto se separa en otra tabla y la tabla de artículos del pedido también se separa en otra tabla, será perfecto. Como sigue


<img src="imgs/tu_13.png" style="zoom: 67%;" />

Este diseño reduce en gran medida la redundancia de la base de datos. Si desea obtener la información del producto del pedido, utilice el número de producto para consultar en la tabla de información del producto

6.3 Tercera forma normal: asegúrese de que cada columna esté directamente relacionada con la columna de clave principal, no indirectamente

La tercera forma normal debe garantizar que cada columna de datos en la tabla de datos esté directamente relacionada con la clave principal, no indirectamente.

Por ejemplo, al diseñar una tabla de datos de pedidos, el número de cliente se puede utilizar como clave externa para establecer una relación correspondiente con la tabla de pedidos. No es posible agregar campos sobre otra información del cliente (como nombre, empresa, etc.) al formulario de pedido. El diseño que se muestra en las siguientes dos tablas es una tabla de base de datos que satisface la tercera forma normal.


<img src="imgs/tu_14.png" style="zoom:67%;" />

De esta manera, al consultar la información del pedido, el número de cliente se puede usar para consultar los registros en la tabla de información del cliente y no es necesario ingresar el contenido de la información del cliente en la tabla de información del pedido varias veces, lo que reduce la redundancia de datos.

Capítulo 7 Restricciones de clave externa

7.1 El concepto de restricciones de clave externa

Con la premisa de seguir los tres paradigmas, a menudo tenemos que dividir tablas y almacenar datos en varias tablas para reducir los datos redundantes. Sin embargo, existe una relación asociada entre las tablas divididas y las tablas. Debemos usar una restricción para acordar la relación entre las tablas. Esta restricción es la restricción de clave externa.

7.2 El papel de las restricciones de clave externa

La restricción de clave externa es para asegurar la integridad referencial entre una o dos tablas, y la clave externa es una relación referencial entre dos campos de una tabla o dos campos de dos tablas.

7.3 Sintaxis para crear restricciones de clave externa

7.3.1 Especificar restricciones de clave externa al crear tablas

create table [数据名.]从表名(
	字段名1 数据类型  primary key ,
	字段名2 数据类型 ,
	....,
    [constraint 外键约束名] foreign key (从表字段) references 主表名(主表字段) [on update 外键约束等级][on delete 外键约束等级]
    #外键只能在所有字段列表后面单独指定
    #如果要自己命名外键约束名,建议 主表名_从表名_关联字段名_fk
);

7.8.2 Especificación de restricciones de clave externa después de la creación de la tabla

alter table 从表名称 add [constraint 外键约束名] foreign key (从表字段名) references 主表名(主表被参照字段名) [on update xx][on delete xx];

7.4 Sintaxis para descartar restricciones de clave externa

ALTER TABLE 表名称 DROP FOREIGN KEY 外键约束名;
#查看约束名 SELECT * FROM information_schema.table_constraints WHERE table_name = '表名称';
#删除外键约束不会删除对应的索引,如果需要删除索引,需要用ALTER TABLE 表名称 DROP INDEX 索引名;
#查看索引名 show index from 表名称;

7.5 Requisitos para restricciones de clave externa

  • Cree una clave externa en la tabla secundaria y la tabla principal debe existir primero.

  • Una tabla puede crear múltiples restricciones de clave externa

  • Normalmente, la columna de clave externa de la tabla esclava debe apuntar a la columna de clave principal de la tabla principal

  • El nombre de la columna de clave externa de la tabla esclava y la columna referenciada de la tabla principal pueden ser diferentes, pero el tipo de datos debe ser el mismo

7.6 Niveles de restricción de clave externa

  • Modo en cascada: al actualizar/eliminar registros en la tabla maestra, actualice/elimine los registros coincidentes de la tabla esclava sincrónicamente

  • Establecer método nulo: al actualizar/eliminar registros en la tabla principal, establezca la columna del registro coincidente en la tabla esclava en nulo, pero preste atención al hecho de que la columna de clave externa de la subtabla no puede ser nula

  • Modo sin acción: si hay un registro coincidente en la tabla secundaria, no se permiten operaciones de actualización/eliminación en la clave candidata correspondiente de la tabla principal

  • Modo de restricción: igual que ninguna acción, ambos verifican las restricciones de clave externa de inmediato

  • Establecer método predeterminado (puede estar en blanco en la herramienta de visualización SQLyog): cuando se cambia la tabla principal, la tabla secundaria establece la columna de clave externa en un valor predeterminado, pero Innodb no puede reconocerlo

    Si no se especifica ningún nivel, es equivalente al método Restringir

7.7 Ejercicio de restricciones de clave externa

-- 部门表
create table dept( 
	id int primary key,
	dept_name varchar(50),
	dept_location varchar(50)
);
-- 员工表
CREATE TABLE emp(
	eid int primary key,
	name varchar(50) not null,
	sex varchar(10),
    dept_id int
);
-- 给员工表表的dept_id添加外键指向部门表的主键
alter table emp add foreign key(dept_id) references dept(id)

Capítulo 8 Relación entre tablas múltiples

8.1 Relación de uno a muchos

8.1.1 Concepto

Una relación de uno a varios significa que una fila de datos en la tabla maestra puede corresponder a varias filas de datos en la tabla esclava al mismo tiempo y, a su vez, varias filas de datos en la tabla esclava apuntan a la misma fila. de datos en la tabla maestra.

8.1.2 Escenarios de aplicación

Tabla de categorías y tabla de productos, tabla de clases y tabla de estudiantes, tabla de usuarios y tabla de pedidos, etc.

8.1.2 Principios de creación de tablas

Use un lado como tabla principal y el lado múltiple como tabla esclava, especifique un campo en la tabla esclava como clave externa, apuntando a la clave principal de la tabla maestra

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leeching, se recomienda guardar la imagen y subirla directamente (img-NGeGQWsp-1638521360059)(imgs/1536033119270.png)]

8.1.3 Práctica de creación de declaraciones de tabla

-- 创建分类表
CREATE TABLE category(
	cid INT PRIMARY KEY AUTO_INCREMENT,
	cname VARCHAR(50)
);

-- 创建商品表
CREATE TABLE product(
	pid INT PRIMARY KEY AUTO_INCREMENT,
	pname VARCHAR(50),
	price DOUBLE,
	cid INT
)
-- 给商品表添加一个外键
alter table product add foreign key(cid) references  category(cid)

8.2 Relaciones de muchos a muchos

8.2.1 Concepto

Ambas tablas tienen varias filas. Una fila de datos en la tabla A puede corresponder a varias filas de datos en la tabla B al mismo tiempo. Por el contrario, una fila de datos en la tabla B también puede corresponder a varias filas de datos en la tabla A.

8.2.2 Escenarios de aplicación

Tabla de pedidos y tabla de productos, tabla de estudiantes y tabla de cursos, etc.

8.2.3 Principios de creación de tablas

Debido a que las dos tablas son de varias partes, no se pueden crear claves foráneas en las dos tablas, por lo que se debe crear una nueva tabla intermedia y se definen dos campos en la tabla intermedia.Estos dos campos se utilizan como claves foráneas para apuntar a las dos tablas respectivamente clave primaria de

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leeching, se recomienda guardar la imagen y cargarla directamente (img-pVfaP80C-1638521360064)(imgs/tu_5.png)]

8.2.4 Práctica de creación de declaraciones de tablas

-- 创建学生表
CREATE TABLE student(
	sid INT PRIMARY KEY AUTO_INCREMENT,
	sname VARCHAR(50)
);

-- 创建课程表
CREATE TABLE course(
	cid INT PRIMARY KEY AUTO_INCREMENT,
	cname VARCHAR(20)
);

-- 创建中间表
CREATE TABLE s_c_table(
	sno INT,
	cno INT
);
-- 给sno字段添加外键指向student表的sid主键
ALTER TABLE s_c_table ADD CONSTRAINT fkey01 FOREIGN KEY(sno) REFERENCES student(sid);
-- 给cno字段添加外键指向course表的cid主键
ALTER TABLE s_c_table ADD CONSTRAINT fkey03 FOREIGN KEY(cno) REFERENCES course(cid);

8.3 Relación uno a uno (comprensión)

8.3.1 La primera relación uno a uno

Ya hemos aprendido acerca de las relaciones de uno a muchos. En una relación de uno a muchos, una fila de datos en la tabla maestra puede corresponder a múltiples filas de datos en la tabla esclava, mientras que una fila de datos en la tabla esclava solo puede corresponder a una fila de datos en la tabla maestra. Esta relación de una fila de datos correspondiente a una fila de datos se puede considerar como una relación de uno a uno.

3.3.2 La segunda relación uno a uno

Una fila de datos en la tabla A corresponde a una fila de datos en la tabla B y viceversa, una fila de datos en la tabla B también corresponde a una fila de datos en la tabla A. En este momento, podemos usar la tabla A como el la tabla principal y la tabla B como tabla esclava, o use B como tabla principal. La tabla se considera la tabla principal Una tabla se considera la tabla esclava

El principio de la creación de tablas
Cree una clave foránea especificando un campo en la tabla esclava y apunte a la clave principal de la tabla maestra, y luego agregue una restricción única al campo de clave foránea de la tabla esclava

Capítulo 9 Consulta de asociación de tablas múltiples

La consulta de asociación de múltiples tablas es usar una declaración SQL para consultar los datos de múltiples tablas asociadas

9.1 Preparación del entorno

-- 创建一张分类表(类别id,类别名称.备注:类别id为主键并且自动增长)
CREATE TABLE t_category(
		cid INT PRIMARY KEY auto_increment,
		cname VARCHAR(40)
);
INSERT INTO t_category values(null,'手机数码');
INSERT INTO t_category values(null,'食物');
INSERT INTO t_category values(null,'鞋靴箱包');


-- 创建一张商品表(商品id,商品名称,商品价格,商品数量,类别.备注:商品id为主键并且自动增长)

CREATE TABLE t_product(
		pid INT PRIMARY KEY auto_increment,
		pname VARCHAR(40),
		price DOUBLE,
		num INT,
		cno INT
);

insert into t_product values(null,'苹果电脑',18000,10,1);
insert into t_product values(null,'iPhone8s',5500,100,1);
insert into t_product values(null,'iPhone7',5000,100,1);
insert into t_product values(null,'iPhone6s',4500,1000,1);
insert into t_product values(null,'iPhone6',3800,200,1);
insert into t_product values(null,'iPhone5s',2000,10,1);
insert into t_product values(null,'iPhone4s',18000,1,1);

insert into t_product values(null,'方便面',4.5,1000,2);
insert into t_product values(null,'咖啡',10,100,2);
insert into t_product values(null,'矿泉水',2.5,100,2);

insert into t_product values(null,'法拉利',3000000,50,null);

-- 给 商品表添加外键
ALTER TABLE t_product ADD FOREIGN KEY(cno) REFERENCES t_category(cid);

9.2 Consulta cruzada【Comprender】

La consulta cruzada es en realidad la conexión incondicional de datos en varias tablas para mostrar

9.2.1 Sintaxis

select a.,a.,b.,b.from a,b ;  

select a.*,b.* from a,b ;  
--或者 
select * from a,b;

9.2.2 Ejercicios

Usar categorías y elementos de búsqueda cruzada

select * from t_category,t_product;

A partir de los resultados de la consulta, podemos ver que la consulta cruzada es en realidad un enfoque incorrecto. Hay muchos datos incorrectos en el conjunto de resultados de la consulta. Llamamos al conjunto de resultados de la consulta cruzada un producto cartesiano.

9.2.3 Producto cartesiano

Supongamos que el conjunto A={a,b}, el conjunto B={0,1,2}, entonces el producto cartesiano de los dos conjuntos es {(a,0),(a,1),(a,2),( b,0),(b,1),(b,2)}. Puede extenderse al caso de múltiples colecciones.

9.3 Consulta de combinación interna

El resultado de la consulta cruzada no es lo que queremos, por lo que la forma de eliminar los registros incorrectos y no deseados, por supuesto, es a través del filtrado condicional. Por lo general, hay una relación de asociación entre varias tablas que se van a consultar, luego el producto cartesiano se elimina por **asociación (relación de clave externa principal)**. Este tipo de consulta que elimina el producto cartesiano mediante filtrado condicional se denomina consulta conjunta. La consulta de combinación se puede dividir en consulta de combinación interna y consulta de combinación externa.Aprendamos primero la consulta de combinación interna.

9.3.1 Consulta de combinación interna implícita

No hay una palabra clave de combinación interna en la consulta de combinación interna implícita

select [字段,字段,字段] from a,b where 连接条件 (b表里面的外键 = a表里面的主键 ) 

9.3.2 Consultas explícitas de combinación interna

Hay una palabra clave de unión interna en la consulta de unión interna explícita

select [字段,字段,字段] from a [inner] join b on 连接条件 [ where 其它条件]

9.3.3 Ejercicio de consulta de unión interna

Consulte la información del producto en todas las categorías, si no hay ningún producto en esta categoría, no se mostrará

-- 1 隐式内连接方式 
select *from t_category  c, t_product  p WHERE c.cid = p.cno;

-- 2 显示内连接方式
-- 查询手机数码这个分类下的所有商品的信息以及分类信息
SELECT * FROM t_product tp INNER JOIN t_category tc ON tp.cno = tc.cid WHERE tc.cname = '手机数码';

SELECT * from t_category c INNER JOIN t_product p ON c.cid = p.cno

9.3.4 Características de la consulta de unión interna

Los datos de la tabla maestra y la tabla esclava se pueden consultar si cumplen las condiciones de conexión y no se consultarán si no cumplen las condiciones de conexión.

9.4 Consulta de combinación externa

Descubrimos que la consulta de conexión interna es la parte pública que cumple con las condiciones de conexión. Si desea consultar todos los datos en una tabla determinada, debe usar la consulta de conexión externa. La conexión externa se divide en conexión externa izquierda y conexión externa derecha. unión externa

9.4.1 Consulta de combinación externa izquierda

9.4.1.1 Concepto

Use la tabla a la izquierda de la combinación como tabla principal para mostrar todos los datos en la tabla principal, y consulte y conecte los datos en la tabla derecha de acuerdo con las condiciones. Si se cumplen las condiciones, se mostrará, si no, se mostrará como nulo. Puede entenderse como: sobre la base de la conexión interna, asegúrese de que se muestren todos los datos en la tabla de la izquierda

9.4.1.2 Sintaxis

select 字段 from a left [outer] join b on 条件

9.4.1.3 Ejercicios

Consulte la información del producto en todas las categorías, incluso si no hay productos en esta categoría, la información de esta categoría debe mostrarse

SELECT * FROM t_category c LEFT OUTER JOIN t_product p ON c.cid = p.cno

9.4.2 Consulta de combinación externa derecha

9.4.2.1 Concepto

Utilice la tabla del lado derecho de la combinación como tabla principal para mostrar todos los datos de la tabla de la derecha y consulte los datos de la tabla del lado izquierdo de la combinación de acuerdo con las condiciones. Si se cumple, se mostrará, y si no se cumple, se mostrará como nulo. Puede entenderse como: sobre la base de la conexión interna, asegúrese de que se muestren todos los datos en la tabla de la derecha

9.4.2.2 Sintaxis

select 字段 from a right [outer] join b on 条件

9.4.2.3 Ejercicios

Consultar la información de categoría correspondiente a todas las mercancías

SELECT * FROM t_category c RIGHT  OUTER JOIN t_product p ON c.cid = p.cno

9.5 La consulta conjunta de unión realiza una consulta de conexión externa completa

En primer lugar, debe quedar claro que la consulta conjunta no es una forma de consulta conjunta de varias tablas. La consulta conjunta consiste en combinar los resultados de la consulta de varias declaraciones de consulta en un solo resultado y eliminar los datos duplicados.

La consulta de unión externa completa significa consultar los datos de la tabla izquierda y la tabla derecha, y luego conectarse de acuerdo con las condiciones de conexión

9.5.1 Sintaxis de unión

查询语句1 union 查询语句2 union 查询语句3 ...

9.5.2 Ejercicios

# 用左外的A union 右外的B
SELECT * FROM t_category c LEFT OUTER JOIN t_product p ON c.cid = p.cno
union
SELECT * FROM t_category c RIGHT  OUTER JOIN t_product p ON c.cid = p.cno

9.6 Consulta de autounión

La consulta de unión automática es una consulta especial de unión de varias tablas, porque las dos tablas de consulta asociadas son la misma tabla, virtualizadas en dos tablas mediante la adopción de un alias, y luego realizan una consulta de unión de las dos tablas.

9.6.1 Preparativos

-- 员工表
CREATE TABLE emp (
  id INT PRIMARY KEY, -- 员工id
  ename VARCHAR(50), -- 员工姓名
  mgr INT , -- 上级领导
  joindate DATE, -- 入职日期
  salary DECIMAL(7,2) -- 工资
);
-- 添加员工
INSERT INTO emp(id,ename,mgr,joindate,salary) VALUES 
(1001,'孙悟空',1004,'2000-12-17','8000.00'),
(1002,'卢俊义',1006,'2001-02-20','16000.00'),
(1003,'林冲',1006,'2001-02-22','12500.00'),
(1004,'唐僧',1009,'2001-04-02','29750.00'),
(1005,'李逵',1006,'2001-09-28','12500.00'),
(1006,'宋江',1009,'2001-05-01','28500.00'),
(1007,'刘备',1009,'2001-09-01','24500.00'),
(1008,'猪八戒',1004,'2007-04-19','30000.00'),
(1009,'罗贯中',NULL,'2001-11-17','50000.00'),
(1010,'吴用',1006,'2001-09-08','15000.00'),
(1011,'沙僧',1004,'2007-05-23','11000.00'),
(1012,'李逵',1006,'2001-12-03','9500.00'),
(1013,'小白龙',1004,'2001-12-03','30000.00'),
(1014,'关羽',1007,'2002-01-23','13000.00');
#查询孙悟空的上级
SELECT employee.*,manager.ename mgrname FROM emp employee,emp manager where employee.mgr=manager.id AND employee.ename='孙悟空'

9.6.2 Ejercicio de consulta de autounión

Consulta el número, nombre, salario del empleado y el número, nombre, salario de su líder

#这些数据全部在员工表中
#把t_employee表,即当做员工表,又当做领导表
#领导表是虚拟的概念,我们可以通过取别名的方式虚拟
SELECT employee.id "员工的编号",emp.ename "员工的姓名" ,emp.salary "员工的薪资",
	manager.id "领导的编号" ,manager.ename "领导的姓名",manager.salary "领导的薪资"
FROM emp employee INNER JOIN emp manager
#emp employee:employee.,表示的是员工表的
#emp manager:如果用manager.,表示的是领导表的
ON employee.mgr = manager.id  # 员工的mgr指向上级的id

#表的别名不要加"",给列取别名,可以用"",列的别名不使用""也可以,但是要避免包含空格等特殊符号。

Capítulo 10 Subconsultas

Si una declaración de consulta está anidada en otra declaración de consulta, esta declaración de consulta se denomina subconsulta, que se divide en: tipo de origen, tipo de origen y tipo de existencia de acuerdo con diferentes posiciones. Nota: No importa dónde esté la subconsulta, la subconsulta debe estar encerrada entre ().

10.1 donde tipo

① Si la subconsulta es un resultado de un solo valor (una sola fila y una sola columna), entonces se puede usar (=, > y otros operadores de comparación)

# 查询价格最高的商品信息
select * from t_product where price = (select max(price) from t_product)

②La subconsulta es un resultado de varios valores, por lo que se puede usar ([no] en (resultado de la subconsulta), o >todos (resultado de la subconsulta), o >=todos (resultado de la subconsulta), < all (resultado de subconsulta), <=all(resultado de subconsulta), o >cualquiera(resultado de subconsulta), o >=cualquiera(resultado de subconsulta), <cualquiera(resultado de subconsulta), <=cualquiera(resultado de subconsulta))

# 查询价格最高的商品信息
SELECT * FROM t_product WHERE price >=ALL(SELECT price FROM t_product)
select * from t_product order by price desc limit 0,1

10.2 del tipo

El resultado de una subconsulta es el resultado de múltiples filas y múltiples columnas, similar a una tabla.

Debe alias la subconsulta, es decir, el nombre de la tabla temporal, y no agregue "" ni espacios al alias de la tabla.

-- 思路一: 使用连接查询
-- 使用外连接,查询出分类表的所有数据
SELECT tc.cname,COUNT(tp.pid) FROM t_category tc LEFT JOIN t_product tp ON tp.cno = tc.cid GROUP BY tc.cname

-- 思路二: 使用子查询
-- 第一步:对t_product根据cno进行分组查询,统计每个分类的商品数量
SELECT cno,COUNT(pid) FROM t_product GROUP BY cno
-- 第二步: 用t_category表去连接第一步查询出来的结果,进行连接查询,此时要求查询出所有的分类
SELECT tc.cname,IFNULL(tn.total,0) '总数量' FROM t_category tc LEFT JOIN (SELECT cno,COUNT(pid) total FROM t_product GROUP BY cno) tn ON tn.cno=tc.cid

10.3 existe型

# 查询那些有商品的分类
SELECT cid,cname FROM t_category tc WHERE EXISTS (SELECT * FROM t_product tp WHERE tp.cno = tc.cid);

Supongo que te gusta

Origin blog.csdn.net/qq_42076902/article/details/121701974
Recomendado
Clasificación