子查询中的SQL内部联接
此练习来自W3学校 给定两个表,子查询中的SQL内部联接,sql,join,subquery,Sql,Join,Subquery,此练习来自W3学校 给定两个表,Employees和Jobs,查找工资等于其工作等级最低工资的员工的姓名(名字、姓氏) 给出的解决方案是: SELECT first_name, last_name, salary FROM employees WHERE employees.salary = (SELECT min_salary FROM jobs WHERE
Employees
和Jobs
,查找工资等于其工作等级最低工资的员工的姓名(名字、姓氏)
给出的解决方案是:
SELECT
first_name, last_name, salary
FROM
employees
WHERE
employees.salary = (SELECT min_salary
FROM jobs
WHERE employees.job_id = jobs.job_id);
内部联接子查询
SELECT min_salary
FROM jobs
WHERE employees.job_id = jobs.job_id
由于Employees
表未与Jobs
表交叉连接,因此不应工作。但是,当它嵌套在父调用中时,它似乎可以工作。以这种方式调用表时,表是否自动交叉连接
有人能告诉我这是怎么回事吗
编辑:
本练习指导您使用子查询进行此操作,但我发现了一种更有意义的方法:
SELECT
first_name, last_name, salary
FROM
employees, jobs
WHERE
salary = min_salary
AND employees.job_id = jobs.job_id;
表由逗号(“,”)交叉连接,交叉连接或从中连接。(并通过外部联接添加的空扩展不匹配行进行交叉联接。)此处嵌套的SELECT位于WHERE中的表达式中,因此其值在概念上针对(交叉无联接)外部WHERE的每一行进行求值 碰巧,这个带有subselect的查询给出的答案与带有JOIN的简单查询相同。与算术表达式一样,您可以将SQL表达式重新排列为具有相同结果的不同形式。结果取决于它的编写方式,括号和优先级会影响它。实现可以做任何事情来获得这个结果。因此,您将阅读有关“概念”交叉联接的信息,这些信息以FROM或“概念”顺序进行评估,而不是实际执行的操作。主题是“查询优化”。(实际上,查询实现因为优化非常重要。例如,在这里,您确实不希望对外部where's from中的每一行实际计算嵌套SELECT。)(请参阅其链接重新查询语义(&t))
PS是的,本练习是针对次选择的。一个有子选择而不仅仅是连接的问题比一个适合引入子选择的问题要复杂得多。(在将
min\u salary
更改为min(salary)
后,您可以尝试重写以消除子选择)。在WHERE
子句中的子查询中,您可以将其视为对每个员工
行分别执行,因此您可以在子查询中使用父查询的字段
是的,可以使用联接以更简单的方式完成,但这只是子查询的练习。:)
您在问题末尾提出的查询是正确的,但无论如何,我更喜欢显式地使用JOIN
子句以提高清晰度
SELECT first_name,last_name,salary
FROM employees
JOIN jobs ON employees.job_id = jobs.job_id
WHERE employees.salary = jobs.min_salary AND ;
这里可能没有太大变化,但对于更复杂的查询,它会有所帮助。例如,通过这种方式,您将
JOIN
条件(通常像tab1.id=tab2.tab1_id
)与逻辑/过滤条件(像tab1.added>(…)
)分离开来。我认为SQL以不同的方式读取/解析代码,并且不考虑括号的优先级?因此,在读取嵌套的SELECT之前,它会在父行中生成FROM/WHERE语句。因为如果它先读取嵌套的INNERJOIN,它将返回一个错误。您的查询更有意义,但它被破坏了——在ANSI-92 SQL标准(20多年前)中,旧样式的逗号分隔表样式被正确的ANSIJOIN
语法所取代,并且它的使用也被破坏了discouraged@marc_s跛脚怎么了?“是有问题的”这个概念。(使用AS基本上所有的论点都失败了。)(外部连接需要ON。)我是新手,请原谅我的知识不足。所以我的it应该是从加入工作的员工那里读取?PS-philip谢谢格式化,看起来好多了。我添加了标签,其他的格式化了。(查看编辑按钮和帮助。)PS请参阅我之前的评论,了解“逗号被认为有害”的真实性检查。在第一个查询中,表没有交叉连接。这是一个相关联的子查询