精华内容
下载资源
问答
  • 多个sql查询不可以嵌套执行
    千次阅读
    2020-04-25 21:50:11

    语法格式

    SELECT 列名表达式
    FROM 表名
    WHERE 表达式 运算符 (SELECT 子查询)

    其中运算符包含IN、关系运算符、ANY、ALL、EXISTS五类
    【注意】
    1.SQL允许多层嵌套查询
    2.子查询中不能使用ORDER BY子句(但可以使用GROUP BY等分组查询)

    带有IN谓词的子查询

    带有IN谓词的子查询指父查询与子查询之间用IN进行连接,判断某个属性列值是否在子查询的结果中

    例:查询与“刘晨”在同一个系学习的学生
    #step 1:确定“刘晨”所在系名
    SELECT Sdept
    FROM Student
    WHERE Sname = '刘晨'
    #step 2:查找所有在IS系学习的学生
    SELECT Sno,Sname,Sdept
    FROM Student
    WHERE Sdept = 'IS'
    #step 3:用子查询来实现将第一步查询嵌入到第二步查询中用以构造第二步查询的条件
    SELECT Sno,Sname,Sdept
    FROM Student
    WHERE Sdept IN
    	(SELECT Sdept
    	FROM Student
    	WHERE Sname = '刘晨')
    
    #同时我们这道题也可以用自连接查询完成
    SELECT S1.Sno,S1.Sname,S1.Sdept
    FROM Student S1,Student S2
    WHERE S1.Sno = S2.Sno AND S2.Sname = '刘晨'
    
    #同时也可以像自身连接那样用别名将父查询和子查询的Student表区分开
    SELECT Sno,Sname,Sdept
    FROM Student S1
    WHERE S1.Sdept IN
    	(SELECT Sdept
    	FROM Student S2
    	WHERE S2.Sname = '刘晨')
    

    IN谓词实现交运算

    例:查询选修课程1的学生集合与选修课程2的学生集合的交集
    SELECT Sno
    FROM SC
    WHERE Cno = '1' AND Sno IN
    	(SELECT Sno
    	FROM SC
    	WHERE Cno = '2')
    

    IN谓词实现差运算

    例:查询选修课程1的学生集合与选修课程2的学生集合的差集
    SELECT Sno
    FROM SC
    WHERE Cno = '1' AND Sno NOT IN
    	(SELECT Sno
    	FROM SC
    	WHERE Cno = '2')
    

    带有比较运算符的子查询

    带有比较运算符的子查询指父查询与子查询之间用比较运算符进行连接,当用户能确切知道内层查询返回的是单值时可以用>、<、=、>=、<=、!=、<>等比较运算符
    【注意】
    子查询一定要跟在比较符之后

    例:查询选修课程为“信息系统”的学生学号和姓名
    SELECT Sno,Sname
    FROM Student
    WHERE Sno IN  --选修该课程的学生并非只有一个,所以要用IN谓词
    	(SELECT Sno
    	FROM SC
    	WHERE Cno = --信息系统课程号唯一因此可以用=完成
    		(SELECT Cno
    		FROM Course
    		WHERE Cname = '信息系统'))
    
    #以下是错误写法:
    SELECT Sno,Sname
    FROM Student
    WHERE Sno IN  --选修该课程的学生并非只有一个,所以要用IN谓词
    	(SELECT Sno
    	FROM SC
    	WHERE --子查询一定要跟在比较符之后
    		(SELECT Cno
    		FROM Course
    		WHERE Cname = '信息系统' = Cno)
    

    带有ANY谓词的子查询

    子查询返回多值时可以使用关系运算符与ANY或ALL谓词的各种组合方式

    例:查询其他系中比IS系某一学生年龄小的学生姓名
    #方法1
    SELECT Sname
    FROM Student
    WHERE Sage < ANY --年龄比IS系某位同学小
    	(SELECT Sage
    	FROM Student
    	WHERE Sdept = 'IS') AND Sdept <> 'IS' --所在系不是IS
    
    #方法2
    SELECT Sname
    FROM Student
    WHERE Sage < 
    	(SELECT MAX(Sage) --通过集函数实现
    	FROM Student
    	WHERE Sdept = 'IS') AND Sdept <> 'IS'
    

    带有ALL谓词的子查询

    例:查询其他系中比IS系所有学生年龄小的学生姓名
    #方法1
    SELECT Sname
    FROM Student
    WHERE Sage < ALL  --年龄小于所有IS系学生年龄
    	(SELECT Sage
    	FROM Student
    	WHERE Sdept = 'IS') AND Sdept <> 'IS'
    
    #方法2
    SELECT Sname
    FROM Student
    WHERE Sage <
    	(SELECT MIN(Sage) --集函数实现,找出IS系最小年龄
    	FROM Student
    	WHERE Sdept = 'IS') AND Sdept <> 'IS'
    

    相关子查询

    • 不相关子查询:子查询独立执行,且只执行一次
    • 相关子查询:子查询的条件依赖于外部父查询中的某狗字段值,其不可单独执行,且要执行多次
      执行过程:
      (1)父查询每执行一次子查询都会被执行一次,并且每次父查询都将查询引用字段值传给子查询
      (2)如果子查询中任何元组与其匹配,父查询就返回元组
      (3)循环(1)(2)直至处理完父查询的每一个元组

    引用子查询的值

    将父查询中的列的值使用关系运算符与子查询中的值进行比较

    例:查询成绩高于本人平均成绩的学号、课程号和成绩
    SELECT Sno,Cno,Score
    FROM SC X
    WHERE Score > 
    	(SELECT AVG(Score)
    	FROM SC Y
    	WHERE Y.Sno = X.Sno)
    

    不引用子查询的值(EXISTS)

    不引用子查询值的这类查询只是检查子查询是否返回了记录,需要使用EXISTS关键字,它只产生逻辑真值(TRUE)或逻辑假值(FALSE),即子查询的结果中至少包含一个元组则EXISTS子查询返回TRUE;子查询结果集合为空则EXISTS子查询返回FALSE

    例:查询选修了全部课程的学生姓名
    #SQL语言没有全称量词,因此必须利用谓词演算将带有全称量词的谓词转换为等价带有存在量词的谓词
    针对这道题,我们应该查询这样的学生,不存在有一门课程是其不选修的
    SELECT Sname
    FROM Student
    WHERE NOT EXISTS
    	(SELECT *  --由于返回的值是逻辑真值或逻辑假值而并非元组中某一列的值,因此直接写SELECT *即可
    	FROM SC
    	WHERE NOT EXISTS
    		(SELECT *
    		FROM Course
    		WHERE Cno = SC.Cno AND Student.Sno = SC.Sno))
    
    例:查询至少选修了学生95002选修的全部课程的学号
    #SQL语言也没有蕴含逻辑运算因此也需要利用谓词演算将一个逻辑蕴涵的谓词转换为带有存在量词的谓词
    这道题语义为:不存在有这样一门课程y,学生95002选修了y但是学生x没有选修y
    SELECT Sno
    FROM Student
    WHERE NOT EXISTS
    	(SELECT *
    	FROM SC SCY
    	WHERE SCY = '95002' AND NOT EXISTS
    		(SELECT *
    		FROM SC SCX
    		WHERE Student.Sno = SCX.Sno AND SCX.Cno = SCY.Cno))
    

    基于派生表的查询

    子查询也可以出现在FROM子句中即基于子查询生成的临时派生表进行查询

    例:查询选课门数唯一的学生学号(若只有S1学号的学生选了2门课则S1应为结果之一)
    #step 1 查询学生学号及其修读的课程门数
    SELECT Sno,COUNT(Cno)
    FROM SC
    GROUP BY Sno
    #step 2 查询门数唯一的课程号
    SELECT CT
    FROM(SELECT Sno,COUNT(Cno) AS CT
    	FROM SC
    	GROUP BY Sno) AS T1(Sno,CT)
    GROUP BY CT
    HAVING COUNT(*) = 1
    #step 3 输出学生学号
    SELECT T3.Sno 
    FROM(SELECT CT
    	FROM(SELECT Sno,COUNT(Cno) AS CT
    		FROM SC
    		GROUP BY Sno) AS T1(Sno,CT)
    	GROUP BY Sno) AS T2(CT), --门数唯一的课程号表T2(CT)
    	(SELECT Sno,COUNT(Cno) AS CT FROM SC GROUP BY Sno) AS T3(Sno,CT) --学生及其选修课程门数表T3(Sno,CT)
    WHERE T2.CT = T3.CT --将T2和T3做等值连接
    

    本文到此就结束了,如有错误欢迎指出!

    更多相关内容
  • SQL Server 数据库之嵌套查询

    千次阅读 2022-03-16 13:59:32
    SQL Server 数据 嵌套查询

    1. 概述

    在 SQL 中,一个形如 SELECT-FROM-WHERE的语句称为一个查询快;当一个查询块存在于另一个查询块的 WHERE子句或 HAVING子句中时,称前一个查询块为子查询,称包含它的查询块为父查询或外部查询;
    采用子查询的查询称为嵌套查询,嵌套查询可将多个简单的查询构造成一个复杂的查询,体现了 SQL 强大的查询能力;
    嵌套查询在执行时由内向外处理语句,因为处理父查询时要用到子查询的查询结果,所以子查询的处理要先于它的父查询;

    2. 普通子查询

    普通子查询指子查询可独立完成的查询,它的执行过程为:先执行子查询,然后将子查询的结果用于构造父查询的查询条件,再由父查询根据查询条件确定结果集合;
    普通子查询一般可分为如下两种:

    2.1. 子查询执行后返回一个值时,可在子查询与父查询之间用比较运算符连接

    2.2. 子查询执行后返回一组值时,不能直接用比较运算符连接子查询,可在比较运算符与子查询之间插入关键字 ANYALL实现查询过程

    1. ANY的含义为任意一个,与比较运算符连接并写在自子查询之前,表示与查询结果中的任意值进行比较;
      例子:从数据表 B,O 中查询就读 “工商” 专业的学生姓名
    select Name
    from B
    where b= any (select b from O where b='工商')
    

    20220202

    1. ALL的含义为全部,与比较运算符连接并写在子查询之前,表示与查询结果中的所有值进行比较;

    3. 相关子查询

    相关子查询指子查询的查询条件需要引用父查询中相关属性值的查询,是特殊的嵌套查询;
    这类查询在执行时,先选取父查询中的数据表的第一个元组,内部的子查询对其中的先关属性值进行查询,再由父查询根据子查询返回的结果判断是否满足查询条件,重复此过程,知道处理完父查询中数据表的每一个元组;
    例子:从数据表 B,O 中国查询没有就读“工商”专业的学生姓名

    select distinct Name
    from B
    where '2022090102'<> all (select ID from O where ID=B.ID )
    

    20220202
    <> all 表示不等于子查询结果中的任何一个值,可使用 NOT IN 代替;
    例子:用 EXISTS关键字从数据表 B,O 中国查询没有就读“工商”专业的学生姓名

    select distinct Name
    from B
    where not exists (select * from O where ID=B.ID and ID='2022090102')
    

    20220202
    EXISTS表示存在,用来判断子查询的结果是否为空,若查询结果不为空返回逻辑值“真”,反之返回逻辑值 “假”;在 EXISTS 前加上 NOT表示不存在,返回值与 EXISTS 相反;

    注意: EXISTSNOT EXISTS的返回值不含有任何数据,只要逻辑值 “真” 或 “假”,即一般在子查询的 SELECT的语句后用 “*” 简写列名;

    展开全文
  • sql查询 嵌套查询In the real world, there are times when we need a particular set of data but we don’t have the exact details for getting the data set. In such cases, we try to get the information ...

    sql 子查询 嵌套查询

    In the real world, there are times when we need a particular set of data but we don’t have the exact details for getting the data set. In such cases, we try to get the information from the available set of information that we have. To achieve such target we use SQL subquery.

    在现实世界中,有时候我们需要特定的数据集,但是我们没有获取数据集的确切细节。 在这种情况下,我们尝试从现有的可用信息集中获取信息。 为了实现这样的目标,我们使用SQL子查询。

    SQL子查询 (SQL Subquery)

    SQL subquery is a query nested inside another query. Most of the subqueries are used with WHERE clause of a query.

    SQL子查询是嵌套在另一个查询中的查询。 大多数子查询与查询的WHERE子句一起使用。

    SQL子查询规则 (SQL Subquery Rules)

    • A Subquery can be used with different SQL clauses like WHERE clause, HAVING clause and FROM clause.

      子查询可以与不同SQL子句(如WHERE子句,HAVING子句和FROM子句)一起使用。
    • Subqueries can be used with SELECT, UPDATE, INSERT and DELETE statements also.

      子查询也可以与SELECTUPDATEINSERTDELETE语句一起使用。
    • The order of execution starts from subquery first then the main query.

      执行顺序从子查询开始,然后是主查询。
    • The Subquery must be enclosed in parentheses.

      子查询必须用括号括起来。
    • An ORDER BY command cannot be used in a subquery, even though the main query can use an ORDER BY. The GROUP BY command can be used to perform the same function as the ORDER BY in a subquery.

      一个借命令命令不能在子查询中使用,即使主查询就可以使用ORDER BY。 GROUP BY命令可用于执行与子查询中的ORDER BY相同的功能。
    • When a subquery is used along with a comparison operator it should be on the right side of the comparison operator.

      当子查询与比较运算符一起使用时,它应位于比较运算符的右侧。

    SQL子查询语法 (SQL Subquery Syntax)

    SELECT column_name FROM table_name 
    WHERE column_name OPERATOR (SELECT column_name FROM table_name WHERE condition);

    The query inside the parenthesis after the OPERATOR is the subquery and the query outside the parenthesis is the main query.

    OPERATOR之后在圆括号内的查询是子查询,而在圆括号外的查询是主查询。

    SQL子查询示例 (SQL Subquery Example)

    Let us consider the following two tables in order to understand Subquery in a better way.

    让我们考虑以下两个表,以便更好地理解子查询。

    Student

    学生

    Roll NoNameAgeGender
    1Amit12M
    2John13M
    3Diana14F
    4Henry15M
    卷号 名称 年龄 性别
    1个 阿米特 12 中号
    2 约翰 13 中号
    3 戴安娜 14 F
    4 亨利 15 中号

    Class

    ClassSectionRoll No
    6A1
    7A2
    8A3
    9B4
    部分 卷号
    6 一个 1个
    7 一个 2
    8 一个 3
    9 4

    Please find below the MySQL queries to create the tables and insert the data.

    请在下面MySQL查询中查找以创建表并插入数据。

    CREATE TABLE `student` (
      `RollNo` INT NOT NULL,
      `Name` VARCHAR(45) NULL,
      `Age` INT NULL,
      `Gender` VARCHAR(45) NULL,
      PRIMARY KEY (`RollNo`));
      
      
      CREATE TABLE `class` (
      `ClassNo` INT NOT NULL,
      `Section` VARCHAR(45) NULL,
      `RollNo` INT NULL,
      PRIMARY KEY (`ClassNo`));
      
      
      INSERT INTO `student` (`RollNo`, `Name`, `Age`, `Gender`)
    VALUES
    	(1, 'Amit', 12, 'M'),
    	(2, 'John', 13, 'M'),
    	(3, 'Diana', 14, 'F'),
        (4,'Henry', 15,'M');
    	
    	 INSERT INTO `class` (`ClassNo`, `Section`, `RollNo`)
    VALUES
    	(6, 'A', 1),
    	(7, 'A', 2),
    	(8, 'A', 3),
        (9,'B', 4);

    Let us try to look into some examples using SQL subqueries.

    让我们尝试研究一些使用SQL子查询的示例。

    1. SQL subquery for getting all the student’s name with section ‘A’

      SQL子查询,用于获取“ A”部分的所有学生姓名
    2. SELECT Name FROM student 
      WHERE RollNo IN (SELECT RollNo FROM class WHERE section = 'A')
      Name
      Amit
      John
      Diana
      名称
      阿米特
      约翰
      戴安娜
      SQL nested query example

      SQL SubQuery with IN operator

      带IN运算符SQL SubQuery

    3. SQL subquery with class greater than 7

      类大于7SQL子查询
    4. SELECT * FROM student 
      WHERE RollNo IN (SELECT RollNo FROM class WHERE ClassNo>7)
      RollNoNameAgeGender
      3Diana14F
      4Henry15M
      卷号 名称 年龄 性别
      3 戴安娜 14 F
      4 亨利 15 中号
    SQL Subquery with where clause

    SQL subquery with Greater than operator

    具有大于运算符SQL子查询

    翻译自: https://www.journaldev.com/23945/sql-subquery-nested-query-sql

    sql 子查询 嵌套查询

    展开全文
  • SQL Server--嵌套查询

    千次阅读 2021-04-11 13:43:18
      在SQL语言中,一 SELECT-FROM-WHERE 语句称为一个查询块。将一个查询嵌套在另一个查询块的WHERE 子句或 HAVING 短语的条件中的查询称为嵌套查询(nested query)。 举一例子: select Sname from ...

    嵌套查询

    1.带有IN谓词的子查询。

      在SQL语言中,一个 SELECT-FROM-WHERE 语句称为一个查询块。将一个查询块嵌套在另一个查询块的WHERE 子句或 HAVING 短语的条件中的查询称为嵌套查询(nested query)。

    举一个例子:

     select Sname
     from Student
     where Sno in
    		(select Sno
    		from SC
    		where Cno='2'
    		);
    

      上层的查询称为外层查询父查询,下层查询块称为内层查询子查询

      SQL语言允许多层嵌套查询,即一个子查询还可以嵌套其他子查询。但是子查询的select语句中不能使用 order by 子句,order by 子句只能对最终的查询结果排序。

      嵌套查询使用户可以用多个简单查询构成复杂的查询,从而增强 SQL 的查询能力。以层层嵌套的方式来构造程序正是SQL“结构化”的含义所在。
     

    1.带有IN谓词的子查询。

      在嵌套查询中,子查询的结果往往是一个集合。

    【例 3.55】 査询与“刘晨”在同一个系学习的学生。

    (1)先分步进行,最后在嵌套查询,验证结果。

      ①先找出“刘晨”的所在系。

      select Sdep
      from Student
      where Sname='刘晨';
    

    结果如图:
    在这里插入图片描述
      ②然后查找所有在CS系学习的学生。

      select Sno,Sname,Sdep
      from Student
      where Sdep='CS';
    

    在这里插入图片描述
    (2)也可以直接嵌套查询。

    select Sno,Sname,Sdep
    from Student
    where Sdep in
    		(select Sdep
    		from Student
    		where Sname='刘晨'
    		);
    

    在这里插入图片描述
      本例中,子查询的查询条件不依赖父查询,称为不相关查询。

    (3)本例中也可以使用自身连接完成。

    select S1.Sno,S2.Sname,S3.Sdep
    from Student S1,Student S2
    where S1.Sdep=S2.Sdep and S2.Sname='刘晨';
    

    在这里插入图片描述
      可以发现运行完结果都是一样的。

      实现同一个查询请求可以有多种方法,不同的方法其执行效率可能也会有差别。

    【例 3.56】 查询选修了课程名为“信息系统”的学生学号和姓名。

      本题要涉及三个表,具体代码如下:

      select Sno,Sname
      from Student
      where Sno in
    		(select Sno
    		from SC
    		where Cno in
    				(select Cno
    				from Course
    				where Cname='信息系统'
    				)
    		);
    

    在这里插入图片描述
      本题也可以使用连接查询实现。

      select Student.Sno,Sname
      from Student,SC,Course
      where Student.Sno=SC.Sno and
    	  SC.Cno=Course.Cno and
    	  Course.Cname='信息系统';
    

    在这里插入图片描述
      有些嵌套查询可以用连接运算替代,有些是不能替代的。在涉及多个关系时,用嵌套查询逐步求解层次清楚,易于构造,但是在实际生活中,用连接运算表达的查询尽可能采用连接查询。

      子查询的查询条件不依赖父查询,这类查询称为不相关子查询。不相关子查询是较简单的一类子查询。如果子查询的查询条件依赖父查询,这类子查询称为相关子查询,整个查询语句称为相关嵌套查询

    2.带有比较运算符的子查询

     
    2.带有比较运算符的子查询

      带有比较运算符的子查询是指父查询与子查询之间用比较运算符进行连接。当用户能确切知道内层返回的是单个值时,可以使用>,<,=,>=,<=,!=或<>等比较运算符。

    【例 3.57】 找出每个学生超过(或等于)他自己选修课程平均成绩的课程号。

      select Sno,Cno
      from SC x
      where Grade >=(select avg(Grade)
    				from SC y
    				where y.Sno=x.Sno
    				);				
    

    在这里插入图片描述
    求解相关子查询和求解不相关子查询不同,内层查询由于与外层查询有关,所以必须反复求值

      1.从外层查询中取出SC的一个元组 x ,将元组 x 的Sno值传递给内层查询。

      2.执行内层查询,可以得到一个值,用这个值替代内层查询,代入到外层查询中。

      3.执行查询,得到部分结果

    然后外层查询取出下一个元祖重复上述操作,直到外层的 SC 元祖全部处理完毕。(类似两层for循环

    3.带有ANY(SOME)或 ALL 谓词的子查询。

     
    3.带有ANY(SOME)或 ALL 谓词的子查询

      子查询返回单值时可以使用比较运算符,但返回多值时要用 ANY 或 ALL 谓词修饰符。而使用 ANY 或 ALL 谓词时必须同时使用比较运算符。

      使用谓词 any 与 all 必须同时使用 比较运算符。

    在这里插入图片描述
    【例 3.58】 査询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄。

      select Sname,Sage
      from Student
      where Sage<any(select Sage
     			   from Student
    			   where Sdep='CS')
    	    and Sdep<>'CS';
    

    根据题意,本例也可以使用聚集函数来实现。

      select Sname,Sage
      from Student
      where Sage <
    		  (select max(Sage)
    		   from Student
    		   where Sdep='CS')
    	    and Sdep <>'CS';
    

    在这里插入图片描述
      子查询返回是一个集合,因为是多值。

    【例 3.59】 査询非计算机科学系中比计算机科学系所有学生年龄都小的学生姓名及年龄。

      select Sname,Sage
      from Student
      where Sage < all(select Sage
      			   from Student
    			   where Sdep='CS')
    	    and Sdep<>'CS';
    

    同理,本例也可以使用聚集函数来实现。

      select Sname,Sage
      from Student 
      where Sage <
    		     (select min(Sage)
    		      from Student 
    			  where Sdep='CS')
    	    and Sdep <>'CS';
    

    在这里插入图片描述
    对应关系如下:

    在这里插入图片描述
      =ANY等价于 IN 谓词,< ANY 等价于 < MAX,<>ALL 等价于 NOT IN 谓词,<ALL 等价于<MIN,等等。

    4.带有 EXISTS 谓词的子查询。

     
    4.带有 EXISTS 谓词的子查询

      EXISTS 代表存在量词 ∃。带有 EXISTS 谓词的子查询不返回任何数据,只产生逻辑真值 “true” 和 “false” 。

    【例 3.61】 査询所有选修了 1号课程的学生姓名。

      本査询涉及Student和SC表。可以在Student中依次取每个元组的Sno值,用此值去检査SC表。若SC中存在这样的元组,其Sno值等于Student.Sno值,并且其Cno = T,则取此Student.Sname送入结果表。

    select Sname
    from Student
    where exists
    		(select *
    		 from SC
    		 where Sno=Student.Sno and Cno='1');
    		
    

    在这里插入图片描述
      使用存在量词exists后,若内层査询结果非空,则外层的where子句返回真值,否则返回假值。

      由EXISTS引出的子査询,其目标列表达式通常都用*,因为带exists的子査询只返回真值或假值,给出列名无实际意义。

    【例 3.61】 査询没有选修1号课程的学生姓名。

    select Sname
    from Student
    where not exists
    		(select *
    		 from SC
    		 where Sno=Student.Sno and Cno='1');
    

    在这里插入图片描述
      所有带有 IN 谓词,比较运算符,ANY 和 ALL 谓词的子查询都能用带 EXISTS 谓词的子查询等价替换。并且由于EXISTS量词的相关子查询只关心内层查询是否有返回值,并不需要具体值,所以效率并不一定低于不相关子查询。

    【例 3.62】 査询选修了全部课程的学生姓名。

      SQL中没有全称量词(fbrall),但是可以把带有全称量词的谓词转换为等价的带有存在量词的谓词:

      ( ∀ x ) P ≡ ( ∃ x ( ¬ P ) )

      select Sname
      from Student
      where not exists
    		(select *
    		 from Course
    		 where not exists
    				(select *
    				 from SC
    				 where Sno=Student.Sno and
    				       Cno=Course.Cno));
    

    在这里插入图片描述
    因为是查找选修所有课程的同学的姓名,但是表中的数据较少,所以没有数据。。。

    【例 3.63】 査询至少选修了学生201215122选修的全部课程的学生号码。

      本查询可以用逻辑蕴涵来表达:査询学号为x的学生,对所有的课程y,只要201215122学生选修了课程y,则x也选修了 y。形式化表示如下:

    用p表示谓词“学生201215122选修了课程y”
    用q表示谓词“学生x选修了课程y” ,则上述査询为
    (∀ y) ( p → q )

    SQL语言中没有蕴涵(implication)逻辑运算,但是可以利用谓词演算将一个逻辑蕴涵的谓词等价转换为
    p → q ≡ ¬ p ∨ q

    该査询可以转换为如下等价形式:
    ( ∀ y ) p → q ≡ ¬ ( ∃ y ( ¬ ( ¬ p ∨ q ) ) ) ≡ ¬ ∃ y ( p ∧ ¬ q )

    它所表达的语义为:不存在这样的课程y,学生201215122选修了 y,而学生x没有选。

    select distinct Sno
    from SC SCX
    where not exists
    		(select *
    		 from SC SCY
    		 where SCY.Sno='201215122' and
    		       not exists
    			   (select *
    			    from SC SCZ
    				where SCZ.Sno=SCX.Sno and
    				      SCZ.Cno=SCY.Cno));
    

    在这里插入图片描述

    总结

      注意区分任意一个和所有,跟平时的有点不太一样,后面的使用 EXISTS 去实现全程量词和逻辑蕴涵可能会有一点比较难理解,还得多记忆,多复习。

    展开全文
  • 多个sql语句嵌套查询

    千次阅读 2017-09-19 09:33:54
    法一: // 设置 connection连接 ...//存储查询sql语句的数组 let sqlArr = []; //存储查询结果的对象 let resObj = {}; async.eachSeries(sqlArr, function(item, callback){  db.query(item, function(er
  • 数据库sql嵌套查询

    千次阅读 2021-04-14 16:12:19
    sql语言中,一select-from-where语句成为一个查询块,将一个查询嵌套在另一个查询块的where子句或having短语的条件中的查询成为嵌套查询。外层的查询块称为外层查询或父查询,内层的查询称为内层查询或子查询...
  • SQL语句 - 嵌套查询

    千次阅读 2021-02-05 20:02:35
    嵌套查询的意思是,一个查询语句(select-from-where)查询语句块可以嵌套在另外一个查询块的where子句中,称为嵌套查询。其中外层查询也称为父查询,主查询。内层查询也称子查询,从查询嵌套查询的工作方式是:先...
  • SQL--两exists嵌套使用的执行过程

    千次阅读 2020-11-22 22:10:34
    嵌套使用两not exists 的sql语句执行过程的理解
  • 一、子查询嵌套查询) 1、单行子查询 SELECT * FROM stu WHERE ID > (SELECT ID FROM stu WHERE NAME ='王五'); 2、多行子查询 --IN 在什么范围内 SELECT * FROM stu WHERE ID IN (SELECT ID FROM stu WHERE...
  • sql嵌套查询慢的原因

    2021-05-01 16:15:21
    为了查询字段,使用了五层嵌套循环,但是花费了约1分钟 但是5表的数据每最多只有10条,怎么会这么慢呢? 解决 比如查询语句 SELECT * FROM studet 分析器会先看语句的第一词,如果它发现第一词是SELECT...
  • SQL连接查询嵌套查询详解

    千次阅读 2020-08-19 14:30:02
    SQL连接查询嵌套查询详解 连接查询 若一个查询同时涉及两或两以上的表,则称之为连接查询。连接查询是数据库中最最要的查询, 包括1、等值与非等值连接查询2、自然连接查询 1、等值连接查询 2、自然连接查询 3...
  • 最近学习MyBatis框架 用到查询比较,以前学的不是很好,今特意回来补上。呜呜呜。 文章目录先看我的数据库表1. INNER JOIN2 .LEFT JOIN 左查询3. RIGHT JOIN 右查询4. UNION 全外连接5. LIMIT 分页查询6. ...
  • 说明 在日常开发中,经常会需要写条件的数据库查询...比如需要执行这样一条sql语句 select * from homework where (id between 1 and 10 or id between 50 and 70) and complete = 1 and (title like 'a%' o
  • SQL Server 使用游标嵌套循环

    千次阅读 2020-04-08 14:30:12
    关于SQL Server 游标嵌套 关于SQL Server 游标嵌套 作者:灵感联盟 游标(Cursor)是处理数据的一种方法,...我们可以把游标当作一指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。 ...
  • mysql 嵌套查询优化

    千次阅读 2021-10-12 00:05:04
    嵌套查询简单来说就是有子查询SQL语句,子查询可以出现在SLECT, FROM或者WHERE 子句中,也可以单独用WITH子句来定义一个子查询。使用时子查询可以将一复杂的查询拆分成一个个独立的部分,逻辑上更易于理解以及...
  • 多SQL Server程序员对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这问题。有两种子查询类型:标准和相关。标准子查询执行一次,结果...
  • mysql多个嵌套查询

    千次阅读 2019-03-06 16:33:13
    MySQL 中多个Left join 子查询 好久没写sql了,今天突然接到产品的需求,要拉取线上数据一个文章的统计,我心里就万马奔腾…TM,不是有前端埋点和事件埋点。。。 简单的联表查询 SELECT a.id, a.thumbNail, a. ...
  • SQL嵌套SELECT语句精讲

    千次阅读 2021-03-21 23:02:18
    嵌套SELECT语句也叫子查询,形如: SELECT name FROM bbc WHERE region = (SELECT region FROM bbc WHERE name = 'Brazil') 一SELECT语句的查询结果可以作为另一语句的输入值。 上面的SQL语句作用为获得和'...
  • SQL语句 - 嵌套查询SQLServer)

    千次阅读 2017-08-21 14:46:16
     嵌套查询的意思是,一个查询语句(select-from-where)查询语句块可以嵌套在另外一个查询块的where子句中,称为嵌套查询。其中外层查询也称为父查询,主查询。内层查询也称子查询,从查询。  嵌套查询的工作方式是...
  • 背景之前一直以为MySQL的表关联查询语句是首先对FROM语句的前两张表执行笛卡尔积,产生一张虚拟表,然后使用ON过滤和OUTER JOIN添加外部行,再使用过滤后的虚拟表跟第三张表进行笛卡尔乘积,重复执行上述步骤。...
  • 从例子引入 小结 用子查询创建计算字段(注意完全限定列名) 小结 子查询这节有点难度了 子查询其实就是嵌套查询嵌套的select语句,把多个有序的查询任务嵌套为一个select语句,逐步完成,从内到外执行 ...
  • 多层for循环嵌套使用sql优化

    千次阅读 2020-05-16 16:54:28
    从图可以看出来很有规律性,可以知道这是某个定时脚本的原因,根据执行时间可以定位到该定时脚本。看一看定时脚本的逻辑原来这脚本是对过去30天每一天--每种票类型--每省份完成订单总数和售票总数的统计和更新...
  • 1.select A.END from 2. tableA A,tableB B 3.where A.X=B.Y 4.and A.END = ( 5. select MAX(END) from tableA 6. where tableA.X = B.Y ...按理max只有一个最值,为何这样写...能详细说一下这个sql 完整的执行过程么
  • SQL Server查询,包括连接操作和嵌套子查询 名称解释(区分大小写) student:学生表,属性分别为sno学号、sname学生姓名、age年龄、sex性别、dno学院编号、birthday生日 sc选课信息表:sno学号、cno课程号、...
  • MyBatis SQL语句 条件嵌套

    千次阅读 2018-08-14 13:42:02
    今天在做审核时出现分条件查询:审核转态有:审核通过、审核失败、未审核三种转态。新增的默认转态为未审核转态。需要在审核管理页面进行审核、   后台查询需要查询出未审核的所有数据。审核完成后,在管理页面...
  • 当一个查询是另一个查询的条件时,称之为子查询。子查 询可以使用几简单命令构造功能强大...SQL Server 执行时,先执行查询部分,求出子查询部分的值,再执行整个父查询,返回最后的结果。 查看表的数据也可使用
  • Mysql中嵌套查询和连接查询的区别

    千次阅读 2022-04-28 20:16:42
    一、嵌套查询 嵌套查询我们以mybatis中的嵌套查询举例: 1.1、创建数据库 CREATE TABLE `teacher` ( `id` INT(10) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT ...
  • sql 视图嵌套视图_SQL视图

    千次阅读 2020-08-03 03:06:37
    sql 视图嵌套视图 SQL | 观看次数 (SQL | Views) Views in SQL are virtual tables. A view also has rows and columns as they're during a real table within the database. We will create a view by selecting ...
  • sql嵌套查询很慢——优化方案

    千次阅读 2019-03-05 18:00:00
    这里子查询出来的groupname只有一个,是单一值,所以可以使用等号,但如果groupname查询出来的结果是多个,再使用等号就会出错,此时只能使用in来查询了。 由于groupname有可能会出现有多个值的情况,所以为了...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 112,820
精华内容 45,128
热门标签
关键字:

多个sql查询不可以嵌套执行