SQL关系和查询

时间:2012-06-13 00:18:47

标签: sql

我正在尝试创建一个包含两个表的数据库。如果有帮助,我已经包含了create_tables.sql代码。我正在尝试设置关系以使STKEY成为定义键,以便可以使用查询来搜索thr键并显示该学生已经遇到的问题。在我搜索时使用:

SELECT *
FROM student, student_log
WHERE 'tilbun' like student.stkey 

无论STKEY如何,它都会显示表中的所有问题。我想我可能错误地设置了外键。我在这里包含了create_tables.sql。

CREATE TABLE `student`
(
`STKEY` VARCHAR(10),
`first_name` VARCHAR(15),
`surname` VARCHAR(15),
`year_group` VARCHAR(4),
PRIMARY KEY (STKEY)
)
;

CREATE TABLE `student_log`
(
`issue_number` int NOT NULL AUTO_INCREMENT,
`STKEY` VARCHAR(10),
`date_field` DATETIME,
`issue` VARCHAR(150),
PRIMARY KEY (issue_number),
INDEX (STKEY),
FOREIGN KEY (STKEY) REFERENCES student (STKEY)
)
;   

欢呼帮助。

1 个答案:

答案 0 :(得分:4)

虽然您已在表中正确定义了外键关系,但在执行查询时仍必须指定连接条件。否则,你将得到两个表的笛卡尔积(所有行都是另一个行的所有行)

SELECT
  student.*,
  student_log.*
FROM student INNER JOIN student_log ON student.STKEY = student_log.STKEY
WHERE student.STKEY LIKE 'tilbun'

请注意,我没有使用隐式连接(以逗号分隔的表列表),而是使用了显式的INNER JOIN,这是首选的现代语法。

最后,使用LIKE子句而不是=几乎没用,除非你也使用通配符

WHERE student.STKEY LIKE '%tilbun%'