2017-06-13 46 views
0

第一次在这里。除了询问SQL查询外,我完全不熟悉SQL,没有任何经验。我在查询中遇到困难。我很难理解它们,什么时候使用它们,而不是写它们。我通过ONLC参加了一个SQL基础课程,但是我没有从中学到很多东西。该课程花费太多时间将表添加到数据库。我不需要,我将成为一个阅读用户,只需要编写查询。当我在课外寻求帮助时,导师也表示“在课外有生活”。了解子查询

为了解决我的问题,我将无法访问我公司的沙箱数据库至少一个月。我有Oracle 11g Express Edition的人力资源数据库,并且正在使用SQL开发人员。我已经确认我们将要使用的程序将使用Oracle数据库。更糟的是,我没有任何人,我的公司里没有人,据我所知,他知道SQL。我可能能够联系我的老公司的某个人,但如果是这样的话,这是一个很大的问题。我试图看看例子,但他们仍然让我感到困惑。甚至不要从相关的子查询开始。

对我来说,似乎你可以使用连接和其他策略来避免子查询。我花了很长时间才了解加入,而且我仍然不是最适合他们的人。任何和所有的建议将会有所帮助。如果有人能帮助我,我愿意使用Skype。我通过看例子和听到它解释给我的最好的东西学习。当我说解释我的意思是一行一行。我必须为我的工作学习这个,否则我会被解雇。

我意识到,我问了很多,但我的背景是作为一个医务人员/ RN,编程是一个全新的世界对我来说。

谢谢!

+0

抱歉,SO不是辅导服务。 – OldProgrammer

+0

也许尝试hackhands,如果你需要Skype /逐行解释。 – artm

+0

谁或手什么? – brtnremtp

回答

2

如果你(因为你写的)手头的“雇员”表,您可以从中选择3列,并创建一个新的表像这样:

create table ls 
as 
select 
    employee_id 
, last_name 
, department_id 
from employees; 

请注意,这是一个组合一个SELECT和一个CREATE TABLE。按照......选择首先执行的思路,其输出用于“写入”称为ls的新表。

现在,你可以尝试这样的事情(下面的查询说明):

select * 
from ls 
where department_id = ( 
    select department_id 
    from ls 
    where last_name = 'De Haan' 
    ) 
; 

看(主查询)WHERE子句。 department_id必须与名字为'De Haan'的人工作的department_id相等。首先,子查询(写在圆括号中)选择一个department_id。这个department_id然后在主查询的WHERE中使用。在主查询中使用“相等”符号时,子查询必须返回一个值。您可以尝试这一点通过自身即

select department_id from ls where last_name = 'De Haan'; 

运行子查询如果你的子查询返回多个值,使用IN(...),例如

select * 
from ls 
where department_id in ( 
    select department_id 
    from ls 
    where last_name = 'King' 
    ) 
; 

您可以使用Oracle的APEX( apex.oracle.com)如果你需要一个练习环境。只需要一个工作区。

补遗(实施例2页涉及的表):假设,在后一阶段中,我们发现,对LS表需要一salary列,所以我们添加一个。

alter table ls 
add salary number ; 

这一栏是空的 - 通过执行检查:

select * from ls; 

现在,我们希望从员工表中的原始工资值来填充新列。我们可以为此使用子查询。请注意,UPDATE没有WHERE子句,即它将更新所有行。 SELECT的WHERE子句与2个表的employee_id匹配。

update ls 
set salary = (
    select salary 
    from employees 
    where ls.employee_id = employees.employee_id 
) 
; 

运行检查,使用内加入(全 “差异” 必须为0):

select 
    employees.employee_id 
, employees.salary 
, ls.salary 
, employees.salary - ls.salary difference 
from employees join ls on (employees.employee_id = ls.employee_id) ; 
+0

让它听起来很简单。我理解这个例子,但它花了很多时间去点击它。任何有多个表的子查询的想法? – brtnremtp

+0

很高兴知道这个例子很有帮助!请参阅“附录”中的2表格场景。 – stefan