SQL语句如何使用join?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL语句如何使用join?相关的知识,希望对你有一定的参考价值。

查询两个或更多表之间的结果,如何用 join 来连接语句?

join分为left join, inner join, right join, 默认是inner join
left join 表示结果已左侧为准,当右侧没有左侧的记录是,字段值已null表示
right join 表示结果已右侧为准,当左侧没有右侧的记录是,字段值已null表示
inner join 表示获取两个表的共有记录,和连表查询相同

select id,name,title,type1 from table1
join
select type2 from table2
on table1.id=table2.id
参考技术A 哥们儿,我无语。
首先你使用的是sql server 还是oracle,还是mysql?
sql server自己带了查询分析器,他就可以完全满足你的要求。
oracle自己带的工具不是很好用,你可以下个TOAD或PLSQL Developer之类的,都比较好用
如果你用的是mysql,推荐你使用sqlyog,非常不错的mysql客户端工具。
参考技术B select * from table1
join
select * from table2
on table1.id=table2.id
.....
参考技术C select t1.id,t1.name,t2.name,t3.name from t1 left join t2 on t1.id=t2.id left join t3 on t1.id=t3.id

如何在SQL中使用JOIN执行UPDATE语句?

我需要使用其“父”表中的数据更新SQL Server 2005中的此表,如下所示:

拍卖

id (int)
udid (int)
assid (int)

id  (int)
assid  (int)

sale.assid包含更新ud.assid的正确值。

什么查询会这样做?我在想一个join,但我不确定它是否可能。

答案

语法严格依赖于您正在使用的SQL DBMS。以下是ANSI / ISO(也就是应该适用于任何SQL DBMS),MySQL,SQL Server和Oracle的一些方法。请注意,我建议的ANSI / ISO方法通常比其他两种方法慢得多,但如果您使用的是MySQL,SQL Server或Oracle以外的SQL DBMS,那么它可能是唯一的方法(例如如果您的SQL DBMS不支持MERGE):

ANSI / ISO:

update ud 
     set assid = (
          select sale.assid 
          from sale 
          where sale.udid = ud.id
     )
 where exists (
      select * 
      from sale 
      where sale.udid = ud.id
 );

MySQL的:

update ud u
inner join sale s on
    u.id = s.udid
set u.assid = s.assid

SQL Server:

update u
set u.assid = s.assid
from ud u
    inner join sale s on
        u.id = s.udid

PostgreSQL的:

update ud
  set ud.assid = s.assid
from sale s 
where ud.id = s.udid;

请注意,不能在Postgres的FROM子句中重复目标表。

甲骨文:

update
    (select
        u.assid as new_assid,
        s.assid as old_assid
    from ud u
        inner join sale s on
            u.id = s.udid) up
set up.new_assid = up.old_assid

SQLite的:

update ud 
     set assid = (
          select sale.assid 
          from sale 
          where sale.udid = ud.id
     )
 where RowID in (
      select RowID 
      from ud 
      where sale.udid = ud.id
 );
另一答案

MySQL

如果忘记where子句并将所有条件放在ON表达式中,您将获得最佳性能。

我认为这是因为查询首先必须连接表然后在那里运行where子句,所以如果你可以减少加入所需的内容,那么这是获得结果的快捷方式/执行udpate。

Scenario

你有一个用户表。他们可以使用他们的用户名或电子邮件或account_number登录。这些帐户可以是活动的(1)或非活动的(0)。该表有50000行

然后你有一个用户表可以一次性禁用,因为你发现他们都做了坏事。但是,此表有一列包含用户名,电子邮件和帐号。它还有一个“has_run”指示器,当它运行时需要设置为1(真)

Query

UPDATE users User
    INNER JOIN
        blacklist_users BlacklistUser
        ON
        (
            User.username = BlacklistUser.account_ref
            OR
            User.email = BlacklistedUser.account_ref
            OR
            User.phone_number = BlacklistUser.account_ref
            AND
            User.is_active = 1
            AND
            BlacklistUser.has_run = 0
        )
    SET
        User.is_active = 0,
        BlacklistUser.has_run = 1;

Reasoning

如果我们必须只加入OR条件,它基本上需要检查每一行4次以查看它是否应该加入,并可能返回更多行。但是,通过给予它更多条件,如果它们在加入时不满足所有条件,它可以“跳过”许多行。

Bonus

它更具可读性。所有条件都在一个地方,要更新的行在一个地方

另一答案

使用FROM关键字的以下语句用于使用连接更新多个行

UPDATE users 
set users.DivisionId=divisions.DivisionId
from divisions join users on divisions.Name=users.Division
另一答案

在MS ACCESS中:

UPDATE ud 
INNER JOIN sale ON ud.id = sale.udid
SET ud.assid = sale.assid;
另一答案
UPDATE tblAppraisalBasicData
SET tblAppraisalBasicData.ISCbo=1
FROM tblAppraisalBasicData SI INNER JOIN  aaa_test RAN ON SI.EmpID = RAN.ID
另一答案

对于SQLite,使用RowID属性进行更新:

update Table set column = 'NewValue'
where RowID = 
(select t1.RowID from Table t1
join Table2 t2 on t1.JoinField = t2.JoinField
where t2.SelectValue = 'FooMyBarPlease');
另一答案

尝试这个,我认为这对你有用

update ud

set ud.assid = sale.assid

from ud 

Inner join sale on ud.id = sale.udid

where sale.udid is not null
另一答案

最简单的方法是使用SQL 2005中引入的the Common Table Expression (CTE)

with cte as
(select u.assid col1 ,s.assid col2 from ud u inner join sale s on u.id = s.udid)
update cte set col1=col2
另一答案

这应该在SQL Server中工作:

update ud 
set assid = sale.assid
from sale
where sale.udid = id
另一答案

Postgres的

UPDATE table1
SET    COLUMN = value
FROM   table2,
       table3
WHERE  table1.column_id = table2.id
       AND table1.column_id = table3.id
       AND table1.COLUMN = value
       AND table2.COLUMN = value
       AND table3.COLUMN = value 
另一答案

标准的SQL方法就是

UPDATE ud
SET assid = (SELECT assid FROM sale s WHERE ud.id=s.id)

在SQL Server上,您可以使用连接

UPDATE ud
SET assid = s.assid
FROM ud u
JOIN sale s ON u.id=s.id
另一答案

PostgreSQL

CREATE TABLE ud (id integer, assid integer);
CREATE TABLE sales (id integer, udid integer, assid integer);

UPDATE ud
SET assid = sales.assid
FROM sales
WHERE sales.id = ud.id;
另一答案

使用JOIN多个表简化更新查询。

   UPDATE
        first_table ft
        JOIN second_table st ON st.some_id = ft.some_id
        JOIN third_table tt  ON tt.some_id = st.some_id
        .....
    SET
        ft.some_column = some_value
    WHERE ft.some_column = 123456 AND st.some_column = 123456

注 - first_table,second_table,third_table和some_column(如123456)是演示表名,列名和ID。用有效名称替换它们。

另一答案

另一个例子为什么SQL不是真正可移植的。

对于MySQL,它将是:

update ud, sale
set ud.assid = sale.assid
where sale.udid = ud.id;

有关更多信息,请阅读多表更新:http://dev.mysql.com/doc/refman/5.0/en/update.html

UPDATE [LOW_PRIORITY] [IGNORE] table_references
    SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
    [WHERE where_condition]
另一答案

Teradata Aster提供了另一种有趣的方法来实现目标:

MERGE INTO ud --what trable should be updated
USING sale -- from what table/relation update info should be taken
ON ud.id = sale.udid --join condition
WHEN MATCHED THEN 
    UPDATE SET ud.assid = sale.assid; -- how to update
另一答案

我认为顶级帖子中的SQL-Server可以用于Sybase,因为它们都是T-SQL,但遗憾的是没有。

对于Sybase,我发现更新需要在表本身而不是别名:

update ud
set u.assid = s.assid
from ud u
    inner join sale s on
        u.id = s.udid

以上是关于SQL语句如何使用join?的主要内容,如果未能解决你的问题,请参考以下文章

操作方法:如何使用 SQL SELECT JOIN 提取最新记录

有join的sql语句如何写分页查询?

如何在sql中使用like和join?

sql join 的语句怎么写?

如何在 Laravel Controller 中创建 SQL Join 语句

使用 SQL JOIN,如何将一张表的结果限制为最近的记录