Express&&Mysql的问题
我想请问一下大家,像数据量大时的分类的数据库设计。如:有好几个不同的班级或者好几个不同的系,但他们中存储的都是学生的信息。这种情况,我认为最优解是,给每一个班级都建立一张mysql表,可我只会使用express对数据库进行增删改查,那么建表使用express应该如何操作呢
s_name | 数学 | 语文 | 英语 |
---|---|---|---|
张三 | 90 | 85 | 92 |
李四 | 88 | 91 | 99 |
李四 | 100 | 82 | 88 |
思路:
第一步可以将每一行根据学科s_sub分成数学,语文,英语三列 , sql语句:
case s_sub when '数学' then s_score else 0 end 数学
完整sql:
select s_name,
case s_sub when '数学' then s_score else 0 end 数学,
case s_sub when '语文' then s_score else 0 end 语文,
case s_sub when '英语' then s_score else 0 end 英语
from student_score
结果:
最后,需要按照s_name为维度group by聚合一下
select s_name,
sum(case s_sub when '数学' then s_score else 0 end) 数学,
sum(case s_sub when '语文' then s_score else 0 end) 语文,
max(case s_sub when '英语' then s_score else 0 end) 英语
from student_score group by s_name
最终结果:
如果不是int类型而是 varchar 那么上面是行不通的,因为sum里面不能跟字符串,需要用group_concat()函数替代sum,可先看多行转一行之后再看下方sql
select s_name,
GROUP_CONCAT(case s_sub when '数学' then CAST(s_score AS char) else null end) 数学,
GROUP_CONCAT(case s_sub when '语文' then CAST(s_score AS char) else null end) 语文,
GROUP_CONCAT(case s_sub when '英语' then CAST(s_score AS char) else null end) 英语
from student_score group by s_name
我可以为您提供以下步骤来在Express中建立一个大型学生信息管理系统的MySQL数据库,并对不同班级和系别进行分类设计:
首先,安装MySQL并在本地服务器上启动MySQL服务。可以按照参考资料中“MySQL安装指南”的步骤进行安装和启动。
创建一个数据库,可以使用MySQL命令行或MySQL Workbench进行操作。
CREATE DATABASE students;
CREATE TABLE students ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(255) NOT NULL, stud_no INT(11) NOT NULL, class VARCHAR(255), major VARCHAR(255), PRIMARY KEY (id), INDEX (stud_no), INDEX (class), INDEX (major) );
以上SQL语句创建了一个名为students的表,其中包含了以下列:id、name、stud_no、class 和 major。它还创建了一个主键、一个stud_no索引、一个class索引和一个major索引。您可以根据需要添加或删除列和索引,以满足您的特定需求。
``` const mysql = require('mysql2');
const dbConfig = { host: 'localhost', user: 'yourusername', password: 'yourpassword', database: 'students' };
const connection = mysql.createPool(dbConfig); ```
请务必将“yourusername”和“yourpassword”替换为您用于连接MySQL的实际用户名和密码。
exports.createStudent = (req, res) => { const { name, stud_no, class, major } = req.body; connection.query( 'INSERT INTO students(name, stud_no, class, major) VALUES(?, ?, ?, ?)', [name, stud_no, class, major], (error, results, fields) => { if (error) throw error; res.send('New student has been created successfully.'); } ); }
该控制器从请求体中获取学生信息,并使用以下SQL语句将其插入到students表中。
INSERT INTO students(name, stud_no, class, major) VALUES(?, ?, ?, ?)
可以根据您的需要更改或扩展该控制器,以实现特定的查询和操作。
这些步骤应该能够帮助您在Express中建立一个大型学生信息管理系统的MySQL数据库,并对不同班级和系别进行分类设计。如果您遇到任何问题,可以查看参考资料或通过其他资源获得帮助。