Tabla de contenido
Manipulación básica de datos (CRUD)
tipo de datos básicos
Entero: modificación opcional sin firmar
intyint 8 bits (-128 - 127)
smallint 16 bits (-32768 - 32767)
mediumint 24 bits (-8388608 - 8388607)
int 32 bits aproximadamente más o menos 2100 millones
bigint 64 bits
Números reales (con punto decimal): cálculos aproximados usando aritmética de punto flotante estándar
float 4 bytes
double 8 bytes
decimal permite hasta 65 dígitos
Ejemplo: decimal(5,2), descripción: longitud de 5 dígitos, 2 dígitos de precisión decimal, si la parte entera + 2 dígitos de decimales es demasiado larga, se producirá un error informado, si Solo si la parte decimal excede de 2, se redondeará a dos decimales
cuerda
char : longitud fija: msql asigna suficiente espacio a la vez de acuerdo con la longitud de la cadena definida
Escenarios aplicables: cadenas más cortas y todos los valores están cerca de la misma longitudcadena de longitud variable varchar
- Ahorra espacio en comparación con los tipos de longitud fija
- Pero ROW_FOMAT=FIXED usa una longitud fija para cada fila
- Escenarios aplicables: la longitud máxima de la cadena es mucho mayor que la longitud de evaluación y la columna se actualiza menos
- Desventajas: la división de la página puede ocurrir cuando se realizan modificaciones frecuentes y grandes cambios en la longitud de la cadena.
- No le dé a ciegas una longitud excesiva
- Puede encontrar problemas de memoria de asignación de longitud máxima en tablas temporales o clasificación
Texto, Mancha
1. Ambos están diseñados para almacenar datos grandes
2. A diferencia de otros datos, se almacenan como objetos independientes
3. Cuando el valor es demasiado grande, use el área de almacenamiento externo para almacenar, solo use 1-4 bytes para almacenar cada fila un puntero
el texto almacena datos de caracteres : texto
pequeño
texto
pequeño texto medio texto
largo
Los blobs almacenan datos binarios : tinyblob
smallblob
blob
mediumblob
longblob
fecha y hora
precisión de fecha y hora: segundos independientes
de la zona horaria,
rango de almacenamiento de 8 bytes: 1001 a 9999 añostimestamp
guarda la cantidad de segundos desde la medianoche del 1 de enero de 1970,
ocupa 4 bytes de espacio de almacenamiento
. El rango: 1970 a 2038
está relacionado con la zona horaria.
El valor predeterminado es NOT NULL .
Por lo general, intente usar la
precisión de la marca de tiempo: segundosfecha
aaaa-MM-ddtiempo
HH:mm:ss
seleccionar identificador
- solía asociar
- como clave foránea en otra tabla
- Los números enteros suelen ser la mejor opción para las columnas de identidad.
- Usar el mismo tipo de datos en tablas relacionadas
- Trate de evitar las cadenas como columnas de identidad, especialmente las cadenas generadas aleatoriamente (como: uuid) hacen que tanto la inserción como la selección sean lentas
- Los valores insertados se escriben aleatoriamente en diferentes posiciones del índice. Las inserciones son lentas y conducen fácilmente a divisiones de página y lecturas de disco aleatorias.
- Lógicamente, las filas adyacentes se distribuyen en diferentes lugares en el disco y en la memoria, y la selección es lenta
- Invalidar caché de consultas mysql
- Si necesita almacenar uuid, debe eliminar "-"
(Los valores de inserción se escriben aleatoriamente en diferentes posiciones en el índice, la inserción es lenta y es fácil causar divisiones de página, las lecturas aleatorias del disco
lógicamente las filas adyacentes se distribuyen en diferentes lugares en el disco y la memoria, la selección lenta
hace que mysql consulte el caché inválido .
Si necesita almacenar uuid, "-" debe eliminarse)
comando de base de datos
Crear la base de datos:
create database 数据库名 create database if not exists 数据库名 default charset utf8 collate utf8_general_ci; //默认的数据库编码集:utf8 //collate表示校验规则为utf8_general_ci //常用排序类型 //utf8_general_cs(区分大小写) //utf8_genera_ci(不区分大小写)
Ver todas las bases de datos:
show databases
Eliminar la base de datos:
drop database 数据库名
Nota: Eliminar la base de datos es una operación peligrosa, si desea eliminarla, se recomienda hacer una copia de seguridad primero
Crear tablas y restricciones
construir mesa
Formato de comando: crear tabla nombre de tabla (
nombre de columna 1 tipo de datos no nulo,
nombre de columna 2 tipo de datos,
nombre de columna 3 tipo de datos,
único (nombre de columna 1 [, nombre de columna 2,..., nombre de columna N])
)Ejemplo:
create table t_student ( sid int not null comment '学号', sname varchar(60) not null comment '姓名', sex tinyint not null default 1 comment '性别:1男, 2女', age tinyint not null comment ' 年龄', icard varchar(18) not null comment '身份证,唯一约束', primary key (sid), unique key AK_Key_2 (icard) ) comment '学生信息表';
restricción
Restricción de clave principal : clave principal
agregar clave principal (alterar nombre de tabla de tabla agregar clave principal (nombre de clave principal))
eliminar clave principal (llave de alerta de nombre de tabla eliminar clave principal)
restricción no vacía:sid int not null comment'学号',
Restricciones de clave externa:
create table t_score ( id int not null comment'记录流水号', sid int not null comment'学号', cid int not null comment'课程ID', score float comment'成绩', primary key(id), foreign key(sid) references t_student (sid) on delete restrict on update redtrict , unique key ak_key_2(sid, cid) ); //说明: sid为本表的外键,关联t_student表中的的sid主键,on delete restrict on update redtrict说明在本表有数据的情况下,主表的关联键不能删除或更新。
Agregar clave principal (nombre de la tabla de la tabla de alerta agregar clave externa (nombre de la clave externa) hace referencia al nombre de la tabla principal (nombre de la clave principal))
Elimine la clave principal (nombre de la tabla de la tabla de alertas, nombre de la restricción de la clave externa)
Restricción única : nombre de restricción de clave única (campo)
Cree una restricción única: nombre de tabla de tabla de alerta agregar único (nombre de columna 1 [, nombre de columna 2, ..])
crear un índice único UserNameIndex en 't_user' ('username')
Eliminar restricción única: tabla de alerta nombre de tabla índice de caída restricción única nombre epítome
Restricción de valor predeterminado: predeterminado
Manipulación básica de datos (CRUD)
preparación de datos
create database db_t281
use db_t281
-- 1.学生表-t_student
-- sid 学生编号,sname 学生姓名,sage 学生年龄,ssex 学生性别
create table t_student
(
sid int not null auto_increment comment '学号',
sname varchar(40) not null comment '名称',
birthday date not null comment '年龄',
ssex tinyint not null default 1 comment '1男,2女',
primary key (sid)
);
INSERT INTO t_student VALUES(1, '赵雷' , '1990-01-01' , 1);
INSERT INTO t_student VALUES(2 , '钱电' , '1990-12-21' , 1);
INSERT INTO t_student VALUES(3 , '孙风' , '1990-12-20' , 1);
INSERT INTO t_student VALUES(4 , '李云' , '1990-12-06' , 1);
INSERT INTO t_student VALUES(5 , '周梅' , '1991-12-01' , 2);
INSERT INTO t_student VALUES(6 , '吴兰' , '1992-01-01' , 2);
INSERT INTO t_student VALUES(7 , '郑竹' , '1989-01-01' , 2);
INSERT INTO t_student VALUES(9 , '张三' , '2017-12-20' , 2);
INSERT INTO t_student VALUES(10 , '李四' , '2017-12-25' , 2);
INSERT INTO t_student VALUES(11 , '李四' , '2012-06-06' , 2);
INSERT INTO t_student VALUES(12 , '赵六' , '2013-06-13' , 2);
INSERT INTO t_student VALUES(13 , '孙七' , '2014-06-01' , 2);
-- 2.教师表-t_teacher
-- tid 教师编号,tname 教师名称
CREATE TABLE t_teacher
(
tid INT NOT NULL AUTO_INCREMENT COMMENT '教师ID',
tname VARCHAR(40) NOT NULL COMMENT '教师名称',
PRIMARY KEY (tid)
);
INSERT INTO t_teacher VALUES(1 , '张五哥');
INSERT INTO t_teacher VALUES(2 , '李卫');
INSERT INTO t_teacher VALUES(3 , '年羹尧');
-- 3.课程表-t_course
-- cid 课程编号,cname 课程名称,tid 教师名称
CREATE TABLE t_course
(
cid INT NOT NULL COMMENT '课程ID',
cname VARCHAR(50) COMMENT '课程名称',
tid INT COMMENT '教师id',
PRIMARY KEY (cid)
);
INSERT INTO t_course VALUES(1 , '语文' , 2);
INSERT INTO t_course VALUES(2 , '数学' , 1);
INSERT INTO t_course VALUES(3 , '英语' , 3);
-- 4.成绩表-t_score
-- sid 学生编号,cid 课程编号,score 成绩
CREATE TABLE t_score
(
sid INT NOT NULL COMMENT '学号,外键',
cid INT NOT NULL COMMENT '课程id',
score decimal(5,2) COMMENT '成绩',
UNIQUE KEY ak_key_sid_cid (sid, cid)
);
INSERT INTO t_score VALUES(1 , 1 , 80);
INSERT INTO t_score VALUES(1 , 2 , 90);
INSERT INTO t_score VALUES(1 , 3 , 99);
INSERT INTO t_score VALUES(2 , 1 , 70);
INSERT INTO t_score VALUES(2 , 2 , 60);
INSERT INTO t_score VALUES(2 , 3 , 80);
INSERT INTO t_score VALUES(3 , 1 , 80);
INSERT INTO t_score VALUES(3 , 2 , 80);
INSERT INTO t_score VALUES(3 , 3 , 80);
INSERT INTO t_score VALUES(4 , 1 , 50);
INSERT INTO t_score VALUES(4 , 2 , 30);
INSERT INTO t_score VALUES(4 , 3 , 20);
INSERT INTO t_score VALUES(5 , 1 , 76);
INSERT INTO t_score VALUES(5 , 2 , 87);
INSERT INTO t_score VALUES(6 , 1 , 31);
INSERT INTO t_score VALUES(6 , 3 , 34);
INSERT INTO t_score VALUES(7 , 2 , 89);
INSERT INTO t_score VALUES(7 , 3 , 98);
select * from t_student;
select * from t_teacher;
select * from t_course;
select * from t_score;
La tabla de datos es la siguiente:
t_student tabla de estudiantes t_teacher tabla de profesores
t_course currículum t_score tabla de puntuación
1) Consultar la información y puntajes del curso de los estudiantes cuyas calificaciones en el curso "1" son más altas que las del curso "2"
SELECT stu.sid,stu.sname,stu.ssex,c1.cid, c1.score, c2.cid, c2.score FROM t_student stu INNER JOIN (SELECT t1.sid, t1.cid, t1.score FROM t_score t1 WHERE t1.cid = 1 ) c1 ON stu.sid = c1.sid INNER JOIN (SELECT t2.sid, t2.cid, t2.score FROM t_score t2 WHERE t2.cid = 2) c2 ON stu.sid = c2.sid WHERE c1.score > c2.score
2) Consultar la información de los alumnos que cursan tanto los cursos "1" como los cursos "2"
//方法一 SELECT stu.sid,stu.sname,stu.ssex,c1.cid, c1.score, c2.cid, c2.score FROM t_student stu INNER JOIN (SELECT t1.sid, t1.cid, t1.score FROM t_score t1 WHERE t1.cid = 1 ) c1 ON stu.sid = c1.sid INNER JOIN (SELECT t2.sid, t2.cid, t2.score FROM t_score t2 WHERE t2.cid = 2) c2 ON stu.sid = c2.sid //方法二 SELECT stu.`sid`,stu.`sname`, stu.`ssex`, tmp.c1num, tmp.c2num FROM t_student stu INNER JOIN ( SELECT t.`sid`, SUM(CASE WHEN t.cid = 1 THEN t.`score` ELSE 0 END) c1num, SUM(CASE WHEN t.cid = 2 THEN t.`score` ELSE 0 END) c2num FROM t_score t GROUP BY t.`sid` ) tmp ON stu.sid = tmp.sid AND tmp.c1num > 0 AND tmp.c2num > 0;
3) Infórmese sobre los cursos electivos "1" pero no sobre los cursos electivos "2"
SELECT stu.* FROM t_student stu WHERE stu.sid IN(SELECT t1.sid FROM t_score t1 WHERE t1.cid = 1) AND stu.sid NOT IN (SELECT t1.sid FROM t_score t1 WHERE t1.cid = 2) SELECT stu.`sid`,stu.`sname`, stu.`ssex`, tmp.c1num, tmp.c2num FROM t_student stu INNER JOIN ( SELECT t.`sid`, SUM(CASE WHEN t.cid = 1 THEN t.`score` ELSE 0 END) c1num, SUM(CASE WHEN t.cid = 2 THEN t.`score` ELSE 0 END) c2num FROM t_score t GROUP BY t.`sid` ) tmp ON stu.sid = tmp.sid AND tmp.c1num > 0 AND tmp.c2num = 0;
4) Consultar el caso donde el curso "1" no existe pero existe el curso "2"
SELECT t1.sid,t1.cid,t1.score FROM t_score t1 WHERE t1.cid = 2 AND t1.sid NOT IN (SELECT t2.sid FROM t_score t2 WHERE t2.cid = 1);
Consulte el puntaje más alto, el puntaje más bajo y el puntaje promedio de cada materia:
1) Columna de visualización: ID del curso, nombre del curso, puntaje más alto, puntaje más bajo, puntaje promedio, número de asignaturas optativas, índice de aprobación, índice promedio, índice excelente
2) El índice excelente la tasa es >=60, media: 70-80, excelente: 80-90, excelente: >=90
3) Los resultados de la consulta deben ordenarse en orden descendente por número de personas.SELECT t2.cid '课程ID', t2.cname '课程名称', MAX(t1.score) '最高分', MIN(t1.score) '最低分', ROUND(AVG(t1.score), 2) '平均分', COUNT(t1.sid) '选修人数', ROUND(SUM(CASE WHEN t1.score >= 60 THEN 1 ELSE 0 END) / COUNT(t1.sid), 2) '及格率', ROUND(SUM(CASE WHEN t1.score >=70 AND t1.score < 80 THEN 1 ELSE 0 END)/COUNT(t1.sid),2) '中等率', ROUND(SUM(CASE WHEN t1.score >=80 AND t1.score < 90 THEN 1 ELSE 0 END)/COUNT(t1.sid),2) '优良率', ROUND(SUM(CASE WHEN t1.score >= 90 THEN 1 ELSE 0 END)/COUNT(t1.sid), 2) '优秀率' FROM t_score t1 INNER JOIN t_course t2 ON t1.cid = t2.cid GROUP BY t2.cid, t2.cname ORDER BY COUNT(t1.sid) DESC, t2.cid ASC;