初学者SQL数据库查询

时间:2014-12-08 21:10:53

标签: mysql sql database relational-database

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

  1. 参加数据库课程的CS专业学生的姓名
  2. 学分低于9学分,GPA低于3.5
  3. 的学生姓名

    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);
    

2 个答案:

答案 0 :(得分:1)

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

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测试了一些你可以用来测试你的作品。

修改

我为解决第二个问题所做的第一件事就是加入了与赛道相匹配的任何条件。这给出了一个表格,其中包含每个学生和课程的行。换句话说,学生一行一行,学生二行四行,依此类推。有关示例,请参阅下一个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

答案 1 :(得分:0)

Select s.Name 
from StudentTable s 
left outer join Assignment5Schema a on s.SID = a.SID 
where (COURSE1=@courseID or
        COURSE2=@courseID or
        COURSE2=@courseID or
        COURSE3=@courseID or
        COURSE4=@courseID) 
        and s.Major = '%CS%'

如果您对表的结构有任何控制权,我会更改该分配表。分手。

| SID |课程#| SLOT |

插槽是1 - 4。

通过这种方式,您可以对课程编号进行查询,而不是对表格本身的属性进行查询......如果这有意义的话。