我在使用 sql 查询时遇到问题,该查询应该查找至少出版了一本价格为 13 美元或更高的书的作者。只要作者至少出版了一本价格在 13 美元或以上的书,IT 就应该显示名字和姓氏,按姓氏排序。以下是我到目前为止的查询:
SELECT authors.au_fname, authors.au_lname, titles.price
FROM authors, titles ORDER BY au_lname ASC
WHERE titles.price > "13";
Run Code Online (Sandbox Code Playgroud)
第一张图显示了数据库的第一个表作者,第二张图显示了包含价格列的标题。

我究竟做错了什么?我无法弄清楚我的语法有什么问题。
谢谢!
字符串用单引号表示。
WHERE titles.price > '13'
Run Code Online (Sandbox Code Playgroud)
如果您的价格列是 int/decimal/float(或任何数字)数据类型,则不必使用字符串。
WHERE titles.price > 13
Run Code Online (Sandbox Code Playgroud)
使用第二个 WHERE可能更好,因为它比较的是 NUMERIC 值,而不是字符串值。即使 price 列是一个字符串,它也会将值转换为一个数字,以便将它与 13 进行比较。它的性能不是很好,但与比较字符串相比,它更准确。
此外,您的 WHERE 在您的 ORDER BY 之前。
SELECT
FROM
JOIN
WHERE
GROUP BY
HAVING
ORDER BY
Run Code Online (Sandbox Code Playgroud)
编辑:下面的代码解释了隐式比较数字和将数字作为字符串比较之间的区别。注释的 WHERE 子句产生不同的结果,因为它在比较之前将价格 (StringNumber) 列转换为数字。
WITH CTE_NumberStrings
AS
(SELECT '1' AS StringNumber
UNION SELECT '2'
UNION SELECT '3'
UNION SELECT '12'
UNION SELECT '23'
)
SELECT StringNumber
FROM CTE_NumberStrings
WHERE StringNumber > '13'
--WHERE StringNumber > 13
Run Code Online (Sandbox Code Playgroud)
小智 5
您正在authors和titles表之间进行笛卡尔连接(即将作者中的每一行连接到标题中的每一行),这几乎不是您想要做的。
您需要指定如何将每个表中的行相互“链接”,在这种情况下,您的表看起来与连接表具有多对多关系titleauthor,因此查询应该类似于
选择 a.au_fname
,a.au_lname
,t.价格
来自作者 a
JOIN titleauthor ta ON a.au_id = ta.au_id
JOIN titles t ON t.title_id = ta.title_id
哪里 t.price > 13
按 a.au_lname 排序
;
我个人不写INNER JOIN出于同样的原因,因为我不写LEFT OUTER JOIN或使用ASC中的ORDER BY-这是写同样的事情的一个更长的路。我确实很欣赏这只是风格偏好的问题。