gpt4 book ai didi

mysql - 初级SQL数据库查询

转载 作者:行者123 更新时间:2023-11-29 12:31:56 25 4
gpt4 key购买 nike

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

  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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com