mysql - 初级SQL数据库查询

标签 mysql sql database relational-database

我正在学习数据库和查询。通过下表 - 我无法重组 - 我试图找到两件事:

  1. 参加数据库类(class)的计算机科学专业学生姓名
  2. 修读少于 9 个学分且 GPA 低于 3.5 的学生姓名

StudentTable
SID  NAME  YEAR    MAJOR GPA
1111 Smith Senior   CS   3.51
2222 Jones Freshman IT   4.00
3333 Jacks Junior   CS   2.75
4444 Johns Senior   CS   3.12

CourseTable
COURSEID CNAME    CREDITS
1111     Reading    1
2222     Counting   1
3333     Drawing    3
4444     Swimming   3
5555     Physics    3
6666     Database   3
7777     Hacking    3
8888     Emailing   3
9999     Internship 1

EnrollmentTable
SID  COURSE1 COURSE2 COURSE3 COURSE4
1111  9999    null    null    null
2222  1111    2222    3333    4444
3333  6666    7777    8888    null
4444  8888    9999    null    null

我以这种方式开始了我的第一个查询,但出现语法错误:

DECLARE @courseID varchar(10) = (
    select COURSEID from Assignment5Schema.CourseTable
        where CNAME = 'Database'
)

SELECT StudentTable.NAME from EnrollmentTable
where (
    COURSE1=@courseID or
    COURSE2=@courseID or
    COURSE2=@courseID or
    COURSE3=@courseID or
    COURSE4=@courseID
) and StudentTable.MAJOR = 'CS'

更新:我现在正在根据另一个用户的回答尝试这种方式。我正在尝试修改它,因为我发现它不能正确过滤仅 CS 专业。我相信它现在正在发挥作用。

SELECT s.name
FROM student s
JOIN enrollment e ON e.sid = s.sid
JOIN course c ON s.major = 'CS' AND c.cname = 'Database' AND (c.courseid = e.course1 OR c.courseid = e.course2 OR c.courseid = e.course3 OR c.courseid = e.course4);

最佳答案

要获取参加数据库类(class)的 CS 专业的姓名,您需要将表内连接在一起。您可以将studentid 匹配的学生和注册表连接起来,然后将其与类(class)表连接起来。您还可以在连接条件中包含类名称为数据库的名称。看起来像这样:

SELECT s.name
FROM student s
JOIN enrollment e ON e.sid = s.sid
JOIN course c ON c.cname = 'Database' AND (c.courseid = e.course1 OR c.courseid = e.course2 OR c.courseid = e.course3 OR c.courseid = e.course4);

仅在学生行中的一列是数据库类的行上连接表。

对于第二个,首先将其分成几部分。查找 GPA 低于 3.5 的学生很容易,因为您只需要一个 where 子句:

SELECT s.name
FROM student s
WHERE s.gpa < 3.5;

我不想为您完成整个作业,因此我希望所提出的想法能够帮助您完成第二个作业。您需要做的是在注册表中搜索学分少于 9 学分的学生,并将其与上面的查询连接起来,以获取学分少于 9 且 GPA 低于 3.5 的学生

我已经在 SQL Fiddle 中测试了其中的一些内容您可以用它来测试您的工作。

编辑

为了解决第二个问题,我做的第一件事是在 courseid 匹配的任何条件下加入。这给出了一个表,其中包含每个学生和类(class)的一行。换句话说,一号学生占一行,二号学生占四行,依此类推。有关示例,请参阅下一个 Fiddle 链接。

SELECT *
FROM enrollment e
JOIN course c 
   ON c.courseid = e.course1 
   OR c.courseid = e.course2 
   OR c.courseid = e.course3 
   OR c.courseid = e.course4;

然后我意识到我可以按学生 ID 对行进行分组,并在总和小于 9 的情况下对它们求和:

SELECT e.sid, SUM(c.credits) AS totalCredits
FROM enrollment e
JOIN course c ON c.courseid = e.course1 OR c.courseid = e.course2 OR c.courseid = e.course3 OR c.courseid = e.course4
GROUP BY e.sid
HAVING totalCredits < 9;

然后,正如我所说,我可以将前两个子查询连接在一起并获取它们的名称,如下所示:

SELECT t.name
FROM(
  SELECT s.sid, s.name
  FROM student s
  WHERE s.gpa < 3.5) t
JOIN(
  SELECT e.sid, SUM(c.credits) AS totalCredits
  FROM enrollment e
  JOIN course c ON c.courseid = e.course1 OR c.courseid = e.course2 OR c.courseid = e.course3 OR c.courseid = e.course4
  GROUP BY e.sid
  HAVING totalCredits < 9) w ON w.sid = t.sid;

这是更新后的Fiddle .

关于mysql - 初级SQL数据库查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27366992/

相关文章:

Mysql连接多个表错误: not unique table/alias

mysql - mysql/mariadb(或 amazon aurora)中 Multi-Tenancy 方法的实际实现

mysql - MySQL 的新手,我坚持进行 SAKILA 练习

sql - 为什么有时在 Postgresql 中添加查询条件来加速它?

java - 如何使用索引使Web应用程序中的数据库访问更快?

Sqlite 在日期时间上更新日期

json - 为与 .Net 兼容的结构化/非结构化数据寻找可扩展的 NOSQL/NewSQL(混合?)数据库

php - 使用 jquery 动态向 li 元素添加类

PHP 聊天室。不显示用户名,仅显示消息

mysql - 如何按特定时间段内的时间间隔进行分组?