SQL关系和查询

标签 sql

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

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

为帮助干杯。

最佳答案

尽管您已经正确定义了表中的外键关系,但在执行查询时仍必须指定连接条件。否则,您将获得两个表的笛卡尔积(一个表的所有行乘以另一个表的所有行)

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%'

关于SQL关系和查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11006633/

相关文章:

sql - 选择分组 ID 中的最大值

java - jOOQ mock : Why does insert require me to prepare a MockResult for a subsequent select?

mysql - 你如何用sql语句计算树的深度?

android,如何在 sqlitedatabase 中执行 sql 文件

sql - Firebird 2.5 更新或插入

sql - 索引 View 和执行计划

sql - 使用 objection.js 或 knex.js 在 postgres 中的字符串列的 json 数组中查询

sql - 返回字段仅包含非字母数字字符的 SQL 行

sql - C#/SQL 2005 中读取 BLOB 数据的内存有效方法

php - Mysql子查询带百分比分割(难查询)