📜  SQL |子查询

📅  最后修改于: 2022-05-13 01:54:47.355000             🧑  作者: Mango

SQL |子查询

在 SQL 中,子查询可以简单地定义为另一个查询中的查询。换句话说,我们可以说子查询是嵌入在另一个 SQL 查询的 WHERE 子句中的查询。

子查询的重要规则:

  • 您可以将子查询放在多个 SQL 子句中:WHERE 子句、HAVING 子句、FROM 子句。
    子查询可以与 SELECT、UPDATE、INSERT、DELETE 语句以及表达式运算符一起使用。它可以是相等运算符或运算符,例如 =、>、=、<= 和 Like运算符。
  • 子查询是另一个查询中的查询。外部查询称为主查询,内部查询称为子查询
  • 子查询一般先执行,其输出用于完成主查询或外查询的查询条件。
  • 子查询必须用括号括起来。
  • 子查询位于运算符的右侧。
  • ORDER BY 命令不能在子查询中使用。 GROUPBY 命令可用于执行与 ORDER BY 命令相同的函数。
  • 将单行运算符与单行子查询一起使用。对多行子查询使用多行运算符。

句法:
子查询没有任何通用语法。但是,可以看到子查询最常与 SELECT 语句一起使用,如下所示:

SELECT column_name
FROM table_name
WHERE column_name expression operator 
    ( SELECT COLUMN_NAME  from TABLE_NAME   WHERE ... );

样品表

数据库

NAMEROLL_NOLOCATIONPHONE_NUMBER
Ram101Chennai9988775566
Raj102Coimbatore8877665544
Sasi103Madurai7766553344
Ravi104Salem8989898989
Sumathi105Kanchipuram8989856868

学生

NAMEROLL_NOSECTION
Ravi104A
Sumathi105B
Raj102A

示例查询

  • 显示 DATABASE 表中部分为 A 的学生的 NAME、LOCATION、PHONE_NUMBER
    Select NAME, LOCATION, PHONE_NUMBER from DATABASE 
    WHERE ROLL_NO IN
    (SELECT ROLL_NO from STUDENT where SECTION=’A’); 
    

    解释:第一个子查询执行“SELECT ROLL_NO from STUDENT where SECTION='A'”从 SECTION 为'A'的 STUDENT 表返回 ROLL_NO。然后外查询执行它并从学生的 DATABASE 表中返回 NAME、LOCATION、PHONE_NUMBER从内部子查询返回其 ROLL_NO。
    输出:

    NAMEROLL_NOLOCATIONPHONE_NUMBER
    Ravi104Salem8989898989
    Raj102Coimbatore8877665544
  • 插入查询示例:

    表 1:学生 1

    NAMEROLL_NOLOCATIONPHONE_NUMBER
    Ram101chennai9988773344
    Raju102coimbatore9090909090
    Ravi103salem8989898989

    表 2:学生 2

    NAMEROLL_NOLOCATIONPHONE_NUMBER
    Raj111chennai8787878787
    Sai112mumbai6565656565
    Sri113coimbatore7878787878

    要将 Student2 插入 Student1 表:

    INSERT INTO Student1  SELECT * FROM Student2;
    

    输出:

    NAMEROLL_NOLOCATIONPHONE_NUMBER
    Ram101chennai9988773344
    Raju102coimbatore9090909090
    Ravi103salem8989898989
    Raj111chennai8787878787
    Sai112mumbai6565656565
    Sri113coimbatore7878787878
  • 从 Student2 表中删除其 rollno 与 Student1 表中相同且位置为 chennai 的学生
    DELETE FROM Student2 
    WHERE ROLL_NO IN ( SELECT ROLL_NO 
                       FROM Student1 
                       WHERE LOCATION = ’chennai’);
    

    输出:

    1 row delete successfully.
    

    显示 Student2 表:

    NAMEROLL_NOLOCATIONPHONE_NUMBER
    Sai112mumbai6565656565
    Sri113coimbatore7878787878
  • 将学生的名字更新为 Student2 表中的极客,其位置与 Student1 表中的 Raju、Ravi 相同
    UPDATE Student2 
    SET NAME=’geeks’ 
    WHERE LOCATION IN ( SELECT LOCATION 
                        FROM Student1 
                        WHERE NAME IN (‘Raju’,’Ravi’));
    

    输出:

    1 row updated successfully.
    

    显示 Student2 表:

    NAMEROLL_NOLOCATIONPHONE_NUMBER
    Sai112mumbai6565656565
    geeks113coimbatore7878787878