数据库技术-postgresql

数据库技术-postgresql,sql,database,postgresql,Sql,Database,Postgresql,我对postgresql还很陌生。请任何专家帮我解决这个问题 考虑以下为大学系统创建的PostgreSQL表,记录哪些学生学习哪些模块: CREATE TABLE module (id bigserial, name text); CREATE TABLE student (id bigserial, name text); CREATE TABLE takes (student_id bigint, module bigint); 重写SQL以包含合理的主键 CREATE TABLE mod

我对postgresql还很陌生。请任何专家帮我解决这个问题

考虑以下为大学系统创建的PostgreSQL表,记录哪些学生学习哪些模块:

CREATE TABLE module (id bigserial, name text);
CREATE TABLE student (id bigserial, name text);
CREATE TABLE takes (student_id bigint, module bigint);
重写SQL以包含合理的主键

CREATE TABLE module
(
m_id bigserial,
name text,
CONSTRAINT m_key PRIMARY KEY (m_id)
);

CREATE TABLE student
(
s_id bigserial,
name text
CONSTRAINT s_key PRIMARY KEY (s_id)
);

CREATE TABLE takes
(
student_id bigint,
module bigint,
CONSTRAINT t_key PRIMARY KEY (student_id)
);
鉴于此模式,我有以下问题:

编写一个SQL查询来计算有多少学生正在使用数据库

SELECT COUNT(name) 
FROM student
WHERE module = 'DATABASE' AND student_id=s_id 
编写一个SQL查询来显示学生ID和姓名,但不显示所有学生数据库的其他内容

SELECT s_id, name
FROM Student, take 
WHERE module = 'DATABASE' AND student_id = s_id
编写一个SQL查询以显示学生ID和姓名,但不显示所有未使用数据库的学生的其他信息

SELECT s_id, name
FROM Student, take 
WHERE student_id = s_id AND module != 'DATABASE'

以上是我的答案。如果我错了,请纠正我,并说明原因。谢谢你的专业知识。

这看起来像是家庭作业,所以我不打算给出详细的答案。一些提示:

我发现有一个例子,你用“引号”代替“撇号”。这表明您正在用类似MicrosoftWord的东西编写SQL,它提供了所谓的智能引号。不要那样做。使用合理的文本编辑器。如果您使用的是Windows,则记事本++是一种流行的选择。在重新设置问题格式时修复了它,但希望提及它

不要使用传统的非ANSI联接语法联接表1、表2、表3,其中。。。。读起来很恐怖,而且更容易出错。你一开始就不应该被教会。此外,还要限定您的列-take.module,而不仅仅是module。始终编写ANSI连接,例如,在上面的示例中:

FROM Student, take 
WHERE module = 'DATABASE' AND student_id = s_id
变成

FROM student 
INNER JOIN take 
        ON take.module = 'DATABASE' 
       AND take.student_id = student.s_id;
如果表名很长,您可以使用别名,如FROM student s然后s.s_id

问题3完全错了。想象一下,如果take为一名学生设置了两行,一行学生正在学习数据库,另一行学生正在学习烹饪。您的查询仍将为它们返回结果,即使它们正在访问数据库。它还会多次返回相同的学生ID,这是您不希望看到的。考虑您需要使用NOT EXISTS SELECT…查询学生表。。。。从采取。。。筛选出不参加数据库学习的学生。剩下的你自己去弄清楚


此外,您的模式实际上并不强制学生一次只能获取一次数据库。或者在你的查询中考虑学生可能会为数据库注册两次。

这看起来很像学校的工作。如果您尝试查询,但仍然无法得到答案,请发布您尝试的内容,我们将提供帮助。此外,您还需要更正CREAT TABLE的拼写。。。我能给你的最好答案就是做你自己的家庭作业。让别人为你做这件事,你是学不到的。你可能想继续读下去。它们有助于在一个查询中使用多个表。如果这是学校作业/家庭作业,请这样说。如果你被困在这里,这里的许多人都会乐于帮助你,给你提示,为你指明正确的方向。不过,这里的大多数人都对被要求只写一大堆问题感到非常恼火。伙计们,虽然我并不比下一个家伙更热衷于做家庭作业问题,但这个人已经尝试了这些问题,并且正在寻求建议。这比为我做这件事要好一点,我认为为他们指出正确的方向是合理的。所以投票重开。谢谢你,谢谢你抽出时间。关于连接内部连接和表1之间有什么不同。。。从表1到表2,两者给出相同的答案。@user3159044:区别在于可读性。始终编码,就好像最终维护你的代码的人将是一个知道你住在哪里的暴力精神病患者。