精华内容
下载资源
问答
  • 数据库嵌套查询
    2020-07-24 21:20:58

    数据库 嵌套查询

    加盟业务 (Join operations)

    Join operations and nested queries both works to combine the data, which is allocated in different tables to make a single result. Both the join and nested query operations are similar but there are some differences which help a user to choose between them on specific situations.

    连接操作和嵌套查询都可以合并数据,这些数据分配在不同的表中以产生单个结果。 连接和嵌套查询操作都相似,但是存在一些差异,可以帮助用户在特定情况下在它们之间进行选择。

    Let's look at how join works and what are its types?

    让我们看看联接的工作原理以及它的类型是什么?

    A join operation is used to combine related tuples or rows from two or more different tables or relations, if and only if, the condition which is given is satisfied.

    当且仅当满足给定条件时,联接操作才用于组合来自两个或多个不同表或关系的相关元组或行。

    Join operations are of two types,

    连接操作有两种类型,

    1. Inner join

      内部联接

      1. Theta join
      2. Equi join
      3. Natural join
    2. Outer join

      外加入

      1. Left outer join
      2. Right outer join
      3. Full outer join

    1)内部加入 (1) Inner join)

    An Inner Join is used when a user has to combine related tuples with similar attributes and the tuples which are left are discarded in resulting table or relation.

    当用户必须将具有相似属性的相关元组合并,而剩下的元组在结果表或关系中被丢弃时,将使用内部联接

    a) Theta join: Theta join is used when a user has to combine tuples from different tables or relations, If and only if they satisfy the theta condition. It is denoted by θ. Theta Join can use all types of comparative operators.

    a)Theta联接 :当用户必须组合来自不同表或关系的元组时,且仅当它们满足theta条件时,才使用Theta联接。 用θ表示。 Theta Join可以使用所有类型的比较运算符。

    Example: Suppose T1(A1, A2, ..., AN) and T2(B1, B2, ..., BN) are two tables given whose not a single value of attributes is same then the combined result will be T1 union T2= θ.

    示例 :假设给定T1(A1,A2,...,AN)和T2(B1,B2,...,BN)是两个表,它们的单个属性值都不相同,那么合并后的结果将为T1并集T2 =θ 。

    b) Equi Join: Equi Join is used when a user has to use equality operator in Theta join.

    b)等值连接 :当用户必须在Theta连接中使用等值运算符时,将使用等值连接。

    Example: Two tables are given Employee and Project.

    示例:给两个表Employee和Project。

    Employee:

    雇员:

    Emp.I.d.NameSection
    202Anubhav verma2B
    203Smita singh3B
    Emp.Id 名称 部分
    202 阿努巴夫维玛 2B
    203 史密塔·辛格(Smita Singh) 3B

    Project:

    项目:

    StandardProjects
    2BC++
    2BPython
    3BJava
    3BAdobe
    标准 专案
    2B C ++
    2B Python
    3B Java
    3B 土坯

    After combining them through Equi Join, we get

    通过Equi Join合并它们后,我们得到

    Employee Details:

    员工详细信息:

    Emp.I.d.NameSectionStandardProjects
    202Anubhav verma2B2BC++
    202Anubhav verma2B2BPython
    203Smita singh3B3BJava
    203Smita singh3B3BAdobe
    Emp.Id 名称 部分 标准 专案
    202 阿努巴夫维玛 2B 2B C ++
    202 阿努巴夫维玛 2B 2B Python
    203 史密塔·辛格(Smita Singh) 3B 3B Java
    203 史密塔·辛格(Smita Singh) 3B 3B 土坯

    C) Natural Join: Natural Join is used when there has to be at least one common tuples attribute between two tables or relations. The attributes must have the same name and domain. Natural Join does not use any comparative operator. Natural Join works between those tuples whose attributes values are the same in both the tables and relations. It is denoted by .

    C)自然联接 :当两个表或关系之间必须至少有一个公共元组属性时,使用自然联接。 这些属性必须具有相同的名称和域。 自然联接不使用任何比较运算符。 自然联接在表和关系中属性值相同的那些元组之间工作。 用表示。

    Example: Two tables are given Student and Subject.

    示例:给了两个表Student和Subject。

    Student:

    学生:

    Roll no.NameClass
    4Aman10
    7Raghav11
    8Sameer12
    卷号 名称
    4 阿曼 10
    7 拉加夫 11
    8 沙美尔 12

    Subject:

    学科:

    ClassSubjects
    10Maths
    11Science
    12Biology
    科目
    10 数学
    11 科学
    12 生物学

    The Resulting table is:

    结果表为:

    Student ⋈ Subjects

    学生⋈科目

    Roll no.NameClassSubjects
    4Aman10Maths
    7Raghav11Science
    8Sameer12Biology
    卷号 名称 科目
    4 阿曼 10 数学
    7 拉加夫 11 科学
    8 沙美尔 12 生物学

    2)外加入 (2) Outer Join)

    An Outer Join is used when a user has to combine all the tuples with attributes without any discarding in resulting table or relation.

    当用户必须将所有元组与属性组合而不会在结果表或关系中进行任何丢弃时,将使用外部联接。

    a) Left outer join: This operation is used when the user has to include tuples from the Left table in the resulting table. If the tuples in the Right side of the table are not similar to the Left side of the table then the tuples of the right side are made NULL.

    a)左外部联接 :当用户必须在结果表中包括“左”表中的元组时,将使用此操作。 如果表右侧的元组与表左侧的元组不同,则将右侧的元组设为NULL。

    Example,

    例,

    Left Side Table:

    左侧桌:

    AB
    203Taj Palace
    205Royal plaza
    207Hotel Villas
    一个
    203 泰姬陵宫
    205 皇家广场
    207 别墅酒店

    Right Side Table:

    右侧表:

    AB
    203Karan
    204Raghubir
    205Satyam
    一个
    203 卡兰
    204 拉格比尔
    205 萨蒂扬

    Resultant Table:

    结果表:

    ABCD
    203Taj Palace203Karan
    205Royal plaza205Satyam
    207Hotel Villas------
    一个 C d
    203 泰姬陵宫 203 卡兰
    205 皇家广场 205 萨蒂扬
    207 别墅酒店 --- ---

    b) Right outer join: This operation is used when the user has to include tuples from the right table in the resulting table. If the tuples in the left side of the table are not similar to the right side of the table then the tuples of the right side are made NULL.

    b)右外部联接:当用户必须在结果表中包括来自右表的元组时,使用此操作。 如果表左侧的元组与表的右侧不相似,则将右侧的元组设为NULL。

    Example,

    例,

    Left Side Table:

    左侧桌:

    AB
    203Taj Palace
    205Royal plaza
    207Hotel Villas
    一个
    203 泰姬陵宫
    205 皇家广场
    207 别墅酒店

    Right Side Table:

    右侧表:

    AB
    203Karan
    204Raghubir
    205Satyam
    一个
    203 卡兰
    204 拉格比尔
    205 萨蒂扬

    Resultant Table:

    结果表:

    ABCD
    203Taj Palace203Karan
    ------204Raghubir
    205Taj Palace205Satyam
    一个 C d
    203 泰姬陵宫 203 卡兰
    --- --- 204 拉格比尔
    205 泰姬陵宫 205 萨蒂扬

    c) Full outer join: This operation is used when the user has to include tuples from both sides in the resulting table. If the tuples are not the same in both the tables, then the not similar attributes are made NULL.

    c)完全外部联接:当用户必须在结果表的两侧都包含元组时,将使用此操作。 如果两个表中的元组都不相同,则将不相似的属性设置为NULL。

    Example,

    例,

    Left Side Table:

    左侧桌:

    AB
    203Taj Palace
    205Royal plaza
    207Hotel Villas
    一个
    203 泰姬陵宫
    205 皇家广场
    207 别墅酒店

    Right Side Table:

    右侧表:

    AB
    203Karan
    204Raghubir
    205Satyam
    一个
    203 卡兰
    204 拉格比尔
    205 萨蒂扬

    Resultant Table:

    结果表:

    ABCD
    203Taj Palace203Karan
    ------204Raghubir
    205Taj Palace205Satyam
    207Hotel Villas------
    一个 C d
    203 泰姬陵宫 203 卡兰
    --- --- 204 拉格比尔
    205 泰姬陵宫 205 萨蒂扬
    207 别墅酒店 --- ---

    Let's look at how nested query works?

    让我们看看嵌套查询是如何工作的?

    嵌套查询 (Nested query)

    A Nested query also is known as Subquery, sub-selector, an inner query is a SELECT query within another SQL query, which is embedded within the WHERE or HAVING Clause.

    嵌套查询也称为Subquerysub-selector ,内部查询是另一个SQL查询中的SELECT查询,该查询嵌入在WHERE或HAVING子句中。

    The data which is used in Nested query is returned by the nested query and used in the form of the condition in the main query, which further restricts so that the retrieval of the data should not be followed.

    嵌套查询返回的嵌套查询中使用的数据以主查询中条件的形式使用,这进一步受到限制,因此不应遵循对数据的检索。

    The rules which are followed by nested queries are,

    嵌套查询遵循的规则是:

    1. A nested query must always be enclosed within parentheses.

      嵌套查询必须始终用括号括起来。

    2. An ORDER BY command can be used by the main query but not by the nested query. For the ORDER BY command, in nested query GROUP BY command can be used to perform the same function.

      主查询可以使用ORDER BY命令,但嵌套查询不能使用。 对于ORDER BY命令,可以在嵌套查询GROUP BY命令中执行相同的功能。

    3. For the Column purpose, A nested query must return a single column within the Select* Clause.

      出于列目的,嵌套查询必须在Select *子句中返回单个列。

    4. For the Row purpose, a nested query may use to return multiple columns.

      出于行目的,嵌套查询可用于返回多个列。

    5. The nested queries that return more than one row can only be used with multiple value operators, such as IN or NOT IN operator.

      返回多行的嵌套查询只能与多个值运算符一起使用,例如IN或NOT IN运算符。

    6. Those values that evaluate to a BLOB, ARRAY, CLOB, or NCLOB cannot include any references in the SELECT LIST.

      那些评估为BLOB,ARRAY,CLOB或NCLOB的值不能在SELECT LIST中包含任何引用。

    7. A nested query cannot form towards a union. Only the statement, which is a single SELECT, is allowed.

      嵌套查询无法形成并集。 仅允许单个SELECT语句。

    8. A nested query cannot be appearing within a set function immediately.

      嵌套查询不能立即出现在set函数中。

    9. Within the nested query, The BETWEEN operator can be used but not with a nested query.

      在嵌套查询中,可以使用BETWEEN运算符,但不能与嵌套查询一起使用。

    Repeatedly, Nested queries are mostly used with the SELECT statement. They can also be used within another nested query, INSERT, UPDATE or DELETE.

    重复地, 嵌套查询通常与SELECT语句一起使用。 它们也可以在另一个嵌套查询INSERT,UPDATE或DELETE中使用。

    带有SELECT语句的嵌套查询 (Nested queries with the SELECT statement)

    Nested queries are most often used with the SELECT statement. Its syntax is as follows,

    嵌套查询最常与SELECT语句一起使用。 其语法如下,

    Example: The Engineers table with their salaries record is given,

    示例:给出了带薪水记录的Engineers表,

    IDNameAgeAddressSalary
    1Arun34Kanpur30,000
    2Kamal23Lucknow34,000
    3Ajay32Mumbai25,000
    4Shubham28Delhi26,000
    5Anurag26Bangalore24,000
    6Shivam27Hyderabad23,000
    7karan24Noida32,000
    8Himanshu33Chennai20,000
    ID 名称 年龄 地址 薪水
    1个 阿伦 34 坎普尔 30,000
    2 卡马尔 23 拉克瑙 34,000
    3 阿杰 32 孟买 25,000
    4 Shubham 28 新德里 26,000
    5 阿努拉格 26 班加罗尔 24,000
    6 湿婆 27 海得拉巴 23,000
    7 卡兰 24 野田 32,000
    8 Himanshu 33 钦奈 20,000

    Now, The Nested query for the following records,

    现在,嵌套查询以下记录,

    SQL> SELECT *
       FROM Engineers 
       WHERE ID IN (SELECT ID 
             FROM Engineers
             WHERE SALARY > 26,000) ;
    
    

    The result is,

    结果是

    IDNameAgeAddressSalary
    1Arun34Kanpur30,000
    2Kamal23Lucknow34,000
    7karan24Noida32,000
    ID 名称 年龄 地址 薪水
    1个 阿伦 34 坎普尔 30,000
    2 卡马尔 23 拉克瑙 34,000
    7 卡兰 24 野田 32,000

    带有UPDATE语句的嵌套查询 (Nested queries with the UPDATE statement)

    The nested query can be used with the UPDATE statement in Conjunction. By using the nested query with the UPDATE statement, we can update either single or multiple columns in the table.

    嵌套查询可以与Conjunction中的UPDATE语句一起使用。 通过将嵌套查询与UPDATE语句一起使用,我们可以更新表中的单列或多列。

    Example: Suppose the Engineers_rally table is already given with the data of Engineers table. Now through the nested query, we are going to update the salary section by 2 times in the Engineers table for all those engineers whose age is greater than 27.

    例如:假设Engineers_rally表已经与工程师表的数据给出。 现在,通过嵌套查询,对于年龄在27岁以上的所有工程师,我们将在Engineers表中将薪金部分更新2倍。

    QUERY: Nested query to update the data from one table to another

    查询:嵌套查询,用于将数据从一个表更新到另一个表

    SQL> UPDATE Engineers
           SET SALARY= SALARY * 2
           WHERE AGE IN (SELECT AGE FROM Engineers_rally)
           WHERE AGE >= 27);
    
    

    The result is,

    结果是

    IDNameAgeAddressSalary
    1Arun34Kanpur30,000
    2Kamal23Lucknow34,000
    3Ajay32Mumbai25,000
    4Shubham28Delhi26,000
    5Anurag26Bangalore24,000
    6Shivam27Hyderabad23,000
    7karan24Noida32,000
    8Himanshu33Chennai20,000
    ID 名称 年龄 地址 薪水
    1个 阿伦 34 坎普尔 30,000
    2 卡马尔 23 拉克瑙 34,000
    3 阿杰 32 孟买 25,000
    4 Shubham 28 新德里 26,000
    5 阿努拉格 26 班加罗尔 24,000
    6 湿婆 27 海得拉巴 23,000
    7 卡兰 24 野田 32,000
    8 Himanshu 33 钦奈 20,000

    带DELETE语句的嵌套查询 (Nested queries with the DELETE statement)

    The Nested query can be used with the DELETE statement in conjunction as the way it was used above with other statements.

    嵌套查询可以与DELETE语句一起使用,就像上面与其他语句一起使用时一样。

    Example: Suppose the Engineers_rally table is already given with the data of Engineers table. Now through the nested query, we are going to delete the records from the Engineers table of those engineers whose age is greater than 27.

    例如 :假设Engineers_rally表已经与工程师表的数据给出。 现在,通过嵌套查询,我们将从年龄超过27岁的工程师的工程师表中删除记录。

    Nested query to delete the data from the table,

    嵌套查询以从表中删除数据,

    SQL> DELETE FROM Engineers
           WHERE AGE IN (SELECT AGE FROM Engineers_rally
           WHERE AGE >= 27);
    
    

    The result is,

    结果是

    IDNameAgeAddressSalary
    2Kamal23Lucknow34,000
    5Anurag26Bangalore24,000
    7karan24Noida32,000
    ID 名称 年龄 地址 薪水
    2 卡马尔 23 拉克瑙 34,000
    5 阿努拉格 26 班加罗尔 24,000
    7 卡兰 24 野田 32,000

    连接操作和嵌套查询之间的区别 (Differences between join operations and nested queries)

    Now, the differences which we got from the above data between join operations and nested queries are:

    现在,我们从上述数据中得到的联接操作和嵌套查询之间的区别是:

    Join operationsNested queries
    Join operations are better in optimization.Nested queries are not better in optimization.
    Join operations takes more time because they fetch whole table data with attributes.Nested queries take less time because they fetch only relevant data from the tables.
    Join operations return index data, So on larger dataset working on them is faster.Nested queries return set of data with no cache facility, So on larger dataset working on them is slower.
    Joins operations are not easier to read, understand and evaluate.Nested queries are easier to read, understand and evaluate.
    Join operations can be used in return rows.Nested queries can be used to return either a scalar value or row set.
    Join operations are powerful relational operatorsNested queries are not powerful relational operators.
    加盟业务 嵌套查询
    连接操作在优化方面更好。 嵌套查询在优化方面并不更好。
    联接操作会花费更多时间,因为它们会获取具有属性的整个表数据。 嵌套查询花费的时间更少,因为它们仅从表中获取相关数据。
    联接操作返回索引数据,因此在较大的数据集上运行速度更快。 嵌套查询返回的数据集没有缓存功能,因此在较大的数据集上运行速度较慢。
    联接操作不容易阅读,理解和评估。 嵌套查询更易于阅读,理解和评估。
    连接操作可用于返回行。 嵌套查询可用于返回标量值或行集。
    联接操作是强大的关系运算符 嵌套查询不是强大的关系运算符。

    翻译自: https://www.includehelp.com/dbms/join-operation-vs-nested-query.aspx

    数据库 嵌套查询

    更多相关内容
  • 数据库嵌套查询总结

    2017-12-14 13:12:32
    数据库嵌套查询总结 还有其他数据库使用总结,稍后上传
  • 数据库嵌套查询

    2021-04-11 10:05:04
    SQL语言允许多层嵌套查询,即一个子查询中还可以嵌套其他子查询。需要特别指出的是,子查询的 SELECT语句中不能使用 ORDER BY子句, ORDER BY子句只能对最终查询结果排序。   1.带有IN谓词的子查询 在嵌套查询中,...

    SQL语言允许多层嵌套查询,即一个子查询中还可以嵌套其他子查询。需要特别指出的是,子查询的 SELECT语句中不能使用 ORDER BY子句, ORDER BY子句只能对最终查询结果排序

    1.带有IN谓词的子查询

    在嵌套查询中,子查询的结果往往是一个集合,所以谓词IN是嵌套查询中最经常使用的谓词

    例 3.55 查询与“刘晨”在同一个系学习的学生

    (1)确定“刘晨”所在系名

    SELECT Sdept
    FROM Student
    WHERE Sname='刘晨';
    

    在这里插入图片描述
    (2)查找所有在CS系学习的学生

    SELECT Sno,Sname,Sdept
    FROM Student
    WHERE Sdept='CS';
    

    在这里插入图片描述
    将上面的两步构造嵌套查询得:

    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.Sdept=S2.Sdept AND S2.Sname='刘晨';
    

    本例中子查询的查询条件不依赖于父查询,称为不相关子查询。一种求解方法是由内向外处理,既先执行子查询子查询的结果,用于建立其父查询的查找条件。

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

    例 3.57 找出每个学生超过他自己选修课程平均成绩的课程号

    SELECT Sno,Cno
    FROM SC x
    WHERE Grade>=(SELECT AVG(Grade)   /*某学生的平均成绩*/
    			  FROM SC y
    			  WHERE y.Sno=x.Sno);
    

    在这里插入图片描述
    x是表SC的别名,又称为元组变量,可以用来表示SC的一个元组。内层查询是求个学生所有选修课程平均成绩的,至于是哪个学生的平均成绩要看参数x.Sno的值,而该值是与父查询相关的,因此这类查询称为相关子查询

    理解:

    (1) 从外层查询中取出SC的一个元组x,将元组x的Sno值 (201215121)传送给内层查询

    SELECT AVG(Grade)
    FROM SC y
    WHERE y.Sno='201215121';
    

    (2) 执行内层查询,得到值88(近似值,用该值代替内层查询,得到外层查询

    SELECT Sno,Cno
    FROM SC x
    WHERE Grade>=88;
    

    (3) 执行这个查询,得到

    (201215121,1)
    (201215121,3)

    然后外层查询取出下一个元组重复做上述①至步骤的处理,直到外层的SC元组全部处理完毕。结果为
    在这里插入图片描述
    3.带有ANY(SOME)或ALL谓词的子查询

    =<>或!=<<=>>=
    ANYIN- -<MAX<=MAX>MIN>=MIN
    ALL- -NOT IN<MIN<=MIN>MAX>=MAX

    例 3.59 查询非机算机科学系比计算机科学系所有学生年龄都小的学生姓名及年龄

    SELECT Sname,Sage
    FROM Student
    WHERE Sage<ALL
    			(SELECT Sage
    			 FROM Student
    			 WHERE Sdept='CS')
    	AND Sdept<>'CS';
    

    关系数据库管理系统执行此查询时,首先处理子査询,找出CS系中所有学生的年龄构成一个集合(20,19)。然后处理父查询,找所有不是CS系且年龄既小于20,也小于19的学生。查询结果为
    在这里插入图片描述
    用聚集函数的方法:

    SELECT Sname,Sage
    FROM Student
    WHERE Sage<
    			(SELECT MIN(Sage)
    			 FROM Student
    			 WHERE Sdept='CS')
    	AND Sdept<>'CS';
    

    4.带有EXISTS谓词的子查询
    带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”

    例 3.62 查询选修了全部课程的学生姓名

    //即没有一门课程是他不选的
    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选修的全部课程的学生号码

    //不存在这样的课程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));
    

    同上

    展开全文
  • 内容索引:C#源码,数据库应用,嵌套 C#+SQL 数据库嵌套查询一例(附代码),以订单和职工信息为基准,来综合查询订单信息,先查询没有订单的员工信息,然后查询至少经过一次订单的员工信息查询,而后将嵌套查询结果...
  • 嵌套查询在数据库查询统计中的应用示例,Vb数据库嵌套查询操作实例源码。在本示例中可设置查询运算符,指定名称,指定条件选项,也就是可运用上部分的SQL操作符,比如“>”以及any等查询关键字,有VB6的用户,可打开...
  • 数据查询2—连接查询:同时涉及两个以上的表的查询 连接条件:用来连接两个表的条件 [.] [.] 连接字段:连接条件中的列名称(注意:连接字段类型必须是可比的,但名字不必相同) 连接查询—(1)等值与非等值连接查询:...
  • 数据库嵌套查询

    千次阅读 2021-04-06 12:44:44
    select Sname from Student where Sno in( select Sno from SC where Cno='2'); [例 3.55] 查询与“刘晨”在同一个系学习的学生。 ...[例 3.56]查询选修了课程名...[例 3.59] 查询非计算机科学系中比计算机科学...

    目录

    3.43 嵌套循环

    嵌套循环的简单例子: 

    1.带有in谓词的子查询

    [例 3.55]  查询与“刘晨”在同一个系学习的学生。

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

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

    [例 3.57 ]找出每个学生超过他选修课程平均成绩的课程号。

    3.带有any(some)或all谓词的子查询

    [例 3.58]  查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄。

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

    4.带有exists谓词的子查询

    [例 3.60]查询所有选修了1号课程的学生姓名。

    [例 3.61]  查询没有选修1号课程的学生姓名。

    [例 3.62] 查询选修了全部课程的学生姓名。

     [例 3.63]查询至少选修了学生201215122选修的全部课程的学生号码。

    心得:



    3.43 嵌套循环

    嵌套循环的简单例子: 

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

    上面有两个select,第二个循环嵌套在where语句里面。

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

    子查询的select语句中不能使用order by子句,order by语句只能对最终查询结果排序。

    1.带有in谓词的子查询

    [例 3.55]  查询与“刘晨”在同一个系学习的学生。

         分布查询

    select Sdept
    from Student
    where Sname='刘晨';
    
    select Sno,Sname,Sdept
    from Student
    where Sdept='CS';

    嵌套查询

    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.Sdept=s2.Sdept 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.带有比较运算符的子查询

    [例 3.57 ]找出每个学生超过他选修课程平均成绩的课程号。

    这是一个相关子查询。

    x,y均是表SC的别名。

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

    3.带有any(some)或all谓词的子查询

     

    使用ANYALL谓词时必须同时使用比较运算

    语义为:

          > ANY  大于子查询结果中的某个值      

    > ALL  大于子查询结果中的所有值

    < ANY  小于子查询结果中的某个值   

    < ALL  小于子查询结果中的所有值

    >= ANY  大于等于子查询结果中的某个值   

    >= ALL  大于等于子查询结果中的所有值

    [例 3.58]  查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄。

     

    select Sname,Sage
    from Student
    where Sage< any (select Sage
    					from Student
    					where Sdept='CS')
    		and Sdept<>'CS';--这是父查询块中的条件

    使用聚集函数的方法。

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

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

     

    方法一:用ALL谓词

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

     

           方法二:用聚集函数

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

    4.带有exists谓词的子查询

     
    带有 EXISTS 谓词的子查询不返回任何数据,只产生逻辑真值“ true” 或逻辑假值“ false”
    若内层查询结果 非空 ,则外层的 WHERE 子句 返回真值
    若内层查询结果为 ,则外层的 WHERE 子句 返回假值
     
    EXISTS 引出的子查询,其目标列表达式通常都用 * , 因为带 EXISTS 的子查询只返回真值或假值,给出列名无实际意义。
     
    NOT EXISTS 谓词
    若内层查询结果非空,则外层的 WHERE 子句返回假值
    若内层查询结果为空,则外层的 WHERE 子句返回真值
     

    [例 3.60]查询所有选修了1号课程的学生姓名。

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

     

    [例 3.61]  查询没有选修1号课程的学生姓名。

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

     

    所有IN谓词、比较运算符、ANYALL谓词的子查询

    用带EXISTS谓词的子查询 等价替换

     

    [3.55]查询与“刘晨”在同一个系学习的学生。

        用带EXISTS谓词的子查询替换IN

       

    select Sno,Sname,Sdept
    from Student S1
    where exists
    	(select *
    	from Student S2
    	where S2.Sdept=S1.Sdept and 
    	S2.Sname='刘晨');

    其他方法,可见上方。

     

    [例 3.62] 查询选修了全部课程的学生姓名。

    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选修的全部课程的学生号码。

    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));

     

     

    心得:

    这个嵌套有点难,(但是大部分的嵌套查询其实都是可以使用其他方法替代的)写的时候,还要不断地看着课本的答案,才能正确的写出来,要好好的学习这个部分。

    展开全文
  • 数据库第三次试验:数据库嵌套查询前言一、实验目的二、实验要求三、实验原理、方法和手段四、实验组织运行要求五、实验条件六、实验步骤七、实验总结八、实验总结 前言 为了帮助同学们完成痛苦的实验课程设计,本...

    前言

    为了帮助同学们完成痛苦的实验课程设计,本作者将其作出的实验结果及代码贴至CSDN中,供同学们学习参考。如有不足或描述不完善之处,敬请各位指出,欢迎各位的斧正!

    一、实验目的

    使学生进一步掌握 SQL Server 查询分析器的使用方法,加深对 SQL 语言的嵌套查询语句的理解。

    二、实验要求

    在SQL Server查询分析器中使用IN、比较符、ANY或ALL和EXISTS操作符进行嵌套查询操作。

    三、实验原理、方法和手段

    将查询要求用SQL语句表示;在SQL Server查询分析器的输入区中输入SQL查询语句;设置查询分析器的结果区Standard Execute(标准执行)或Execute to Grid(网格执行)方式;发布执行命令,并在结果区中查看结果;如果结果不正确,要进行修改,直到正确为止。

    四、实验组织运行要求

    本实验属于验证型实验,通过实验,加强对课堂讲授知识的理解。开始实验前,必须进行预习,写出实现所有查询要求的 SQL 语句。实验过程中,先集中由老师进行具体要求和注意事项的讲解,然后各自独立在机器上完成实验。实验过程中出现问题,在实验指导老师帮助下解决。

    五、实验条件

    (1)硬件条件:个人计算机。
    (2)软件条件:Windows;MS SQL Server。

    六、实验步骤

    1、基本操作实验
    用SQL语句表示,在学生选课库中实现其数据嵌套查询操作。
    (1)求选修了高等数学的学生学号和姓名。
    (2)求8号课程的成绩高于张三的学生学号和成绩。
    (3)求其它系中年龄小于计算机系年龄最大者的学生。
    (4)求其它系中比计算机系学生年龄都小的学生。
    (5)求选修了2号课程的学生姓名。
    (6)求没有选修2号课程的学生姓名。
    (7)查询选修了全部课程的学生姓名。
    (8)求至少选修了学号为“15122“的学生所选修的全部课程的学生学号和姓名。
    2、提高操作实验
    对自自己设计的数据库应用项目的数据查询操作分类,用SQL语句表示其中的简单、连接和嵌套查询,并通过SQL Server查询分析器实现其查询操作。

    七、实验总结

    附1:ST.dbo.SC:
    在这里插入图片描述
    附2:ST.dbo.Course:
    在这里插入图片描述
    附3:ST.dbo.Student:
    在这里插入图片描述
    1、基本操作实验
    用SQL语句表示,在学生选课库中实现其数据嵌套查询操作。
    (1)求选修了Math的学生学号和姓名。

    select sno,sname from st.dbo.Student where sno in(select sno from st.dbo.SC where cno in(select cno from st.dbo.Course where Cname='Math'))
    

    运行结果如下:
    在这里插入图片描述
    (2)求123号课程的成绩高于李勇的学生的学号和成绩。

    select sno,grade from st.dbo.SC where cno='123' and grade>(select grade from st.dbo.SC where cno='123' and sno=(select sno from st.dbo.Student where sname='李勇'))
    

    运行结果如下:
    在这里插入图片描述
    (3)求其它系中年龄小于计算机系年龄最大者的学生。

    select * from st.dbo.Student where sage < (select max(sage) from st.dbo.Student where Sdep='CS')and sdep<>'CS'
    

    运行结果如下:
    在这里插入图片描述
    (4)求其它系中比计算机系学生年龄都小的学生。

    select * from st.dbo.Student where sage < (select min(sage) from st.dbo.Student where Sdep='CS')and sdep<>'CS'
    

    运行结果如下:
    在这里插入图片描述
    (5)求选修了120号课程的学生姓名。

    select sname from st.dbo.Student where exists (select * from st.dbo.SC where st.dbo.Student.sno=sno and cno='120')
    

    运行结果如下:
    在这里插入图片描述
    (6)求没有选修120号课程的学生姓名。

    select sname from st.dbo.Student where not exists (select * from st.dbo.SC where st.dbo.student.sno=sno and cno='120')
    

    运行结果如下:
    在这里插入图片描述
    (7)查询选修了全部课程的学生姓名。

    select sname from st.dbo.Student where not exists(select * from st.dbo.Course where not exists(select * from st.dbo.sc where st.dbo.Student.sno=sno and st.dbo.Course.Cno=cno))
    

    运行结果如下:
    在这里插入图片描述
    (8)求至少选修了学号为“15122“的学生所选修的全部课程的学生学号和姓名。

    select sno,sname from st.dbo.Student where not exists(select * from st.dbo.sc a where a.Sno=15121 and not exists(select * from st.dbo.SC b where st.dbo.Student.sno=b.Sno and b.Cno=a.Cno))
    

    运行结果如下:
    在这里插入图片描述
    2、提高操作实验
    对自己设计的数据库应用项目的数据查询操作分类,用SQL语句表示其中的简单、连接和嵌套查询,并通过SQL Server查询分析器实现其查询操作。
    附1:librarydb.dbo.Book
    在这里插入图片描述
    附2:librarydb.dbo.Reader
    在这里插入图片描述
    附3:librarydb.dbo.BORROW
    在这里插入图片描述
    简单查询:

    select * from Book where Bno=3
    

    运行结果截图:
    在这里插入图片描述
    连接查询:

    select * from Book inner join BORROW on book.Bno=BORROW.Bno where Borrow.Bno=3
    

    运行结果截图:
    在这里插入图片描述
    嵌套查询:

    select * from book where Bprice < (select min(bprice) from book where Bclass='C')
    

    运行结果截图:
    在这里插入图片描述

    八、实验总结

    本次实验在宏观上增加了对SQL语句操作的熟练度,同时学习了表达同一目的而使用不同方式的不同SQL语句语法,并对数据库操作有了更深一步的了解。

    展开全文
  • SQL数据库嵌套查询

    千次阅读 2017-10-31 08:37:51
    嵌套查询 保存查询结果 从查询结果创建一个永久表: select 字段列表 into 新表名 from 原表名 where 查询条件嵌套查询 一个 select……from……where语句称为一个查询块。 将一个查询块嵌套在另一个查询块的where...
  • 数据库嵌套查询

    2021-04-20 19:24:53
    [例 3.55] 查询与“李勇”在同一个系学习的学生。 select * from student where Sdept in( select Sdept from student where Sname='李勇');...[例 3.56]查询选修了课程名为“数据库”的学生学号和姓名 select Sn
  • 摘要:C#源码,数据库应用,嵌套查询 C#实现SQLSERVER数据库嵌套查询功能,快速的嵌套查询程序,数据库文件在Database文件夹中,测试前请先附加数据库文件,然后设置数据库连接信息,怎么附加和设置这里就不说了。
  • SQL Server 数据库嵌套查询

    千次阅读 2022-03-16 13:59:32
    SQL Server 数据 嵌套查询
  • /*嵌套查询(nested query) select——from-where语句被称为语句块 一个语句块嵌入到另一个语句块的where或者having 语句短语条件的查询 称为嵌套查询 */ select sname from student --外层查询或者父查询 where ...
  • 数据库sql嵌套查询

    千次阅读 2021-04-14 16:12:19
    一、嵌套查询概念 在sql语言中,一个select-from-where语句成为一个查询块,将一个查询块嵌套在另一个查询块的where子句或having短语的条件中的查询成为嵌套查询。外层的查询块称为外层查询或父查询,内层的查询...
  • sql嵌套查询语句select a,b,c from tableD where a=(select a from tableD)sql嵌套查询语句select a,b,c from tableD where a=(select a from tableD)SQL中,在同一张表中用嵌套查询怎幺查需要用不同的别名....
  • 数据库嵌套查询和集合查询

    千次阅读 2019-04-26 22:04:46
    一、下面进行一些比较典型的查询例子: 1.在教学管理JXGL数据库中进行如下操作: (1) 求选修了数学的学生的学号和姓名。 SELECT DISTINCT SC.Sno,Sname FROM STUDENT,SC WHERE Cno='2'AND SC.Sno=STUDENT.Sno; (2)...
  • 嵌套查询 接着上一篇说 带有EXISTS谓词的查询 EXISTS:存在 带有EXISTS 谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。 如果返回true,主查询会执行,返回false,主查询就不再执行。 因为...
  • 达梦8数据库常用的嵌套查询题型 前言 最近学校安排了实践课,内容是学习达梦数据库的安装,以及常用的查询方法。下面我就列出一些常用的嵌套查询题型。 一、查询统计二级类型最多的一级类型数据 分析:分成两部...
  • 实验报告——数据库的简单查询和连接查询, 包括实验的基本要求,实验目的,试验运行要求,实验原理,实验步骤,实验内容,实验数据,实验总结。此报告仅供学习交流使用!
  • Oracle数据库嵌套查询

    千次阅读 2019-03-28 11:17:44
    在前面2个章节,我们比较详细的介绍了一些SQL语句的基本用法,但是在我们实际的项目开发中,其实很多时候这些基本的用法远远不能满足我们项目的需求,这个时候就需要我们的嵌套查询。 在SQL语句中,一个select-from-...
  • 数据库学习7 — 嵌套查询

    千次阅读 2021-04-15 14:53:48
    嵌套查询1.带有IN谓词的子查询2.带有比较运算符的子查询3.带有ANY(SOME)或ALL谓词的子查询比较运算符:ANY(或SOME)、ALL谓词与聚集函数、IN谓词的等价转换关系表:4. 带有 EXISTS 谓词的子查询 在SQL语言中,一...
  • 关于数据库嵌套查询的性能问题

    千次阅读 2021-11-19 15:40:10
    1、嵌套查询 首先大家都知道不管是子查询还是join查询他的效率都不高 原因在哪呢? 下面是一个简单地嵌套查询 SELECT id ,name ,age FROM teacher WHERE status=0 and name IN ( SELECT name FROM student WHERE...
  • 数据库原理与应用》课程实验报告 --数据库嵌套查询 一、实验目的 1.熟练掌握SQL Server Management Studio中查询分析的使用方法,加深对T-SQL结构化查询的理解。 2.掌握数据查询中嵌套查询语法格式,及使用IN,...
  • HBU数据库 实验4 嵌套查询和数据更新 实验目的: 1.熟练掌握SQL Server查询分析器的使用方法,加深对标准SQL查询语句的理解。 2.熟练掌握简单表的数据嵌套查询和数据更新的操作方法。 实验内容: 创建教学管理...
  • 数据库原理-数据查询-嵌套查询

    千次阅读 2020-02-24 17:55:24
    所谓嵌套查询就是在查询语句里面又嵌套一个完整的查询语句 注意:order by是对结果进行排序,只出现在外层 相关子查询有依赖 几种子查询 1、带有IN谓词的子查询 这里IN也可以用等号,因为只有一...
  • Elasticsearch(ES)数据库 嵌套属性的查询 nested类型 关于涉及到的表是看各自公司在配置ES数据库的时候是怎么定义的 1.嵌套属性的查询和根属性不一样:查询es表的所有数据 因为是nested类型,所以必须有一个nested...
  • 数据库基础总结(六)——嵌套查询嵌套查询1)带有in谓词的子查询2)带有比较运算符的子查询3)带有any或all谓词的子查询4)带有exists谓词的子查询 嵌套查询 ◼ 上层的查询块称为外层查询或父查询 ◼ 下层查询块...
  • 2.掌握数据查询中嵌套查询语法格式,及使用IN,ANY,ALL,EXISTS操作符和比较运算符对数据库进行嵌套查询的操作。 二、实验过程及分析 1.实验内容 在SQL Server Management Studio中使用IN、比较运算符、ANY或ALL、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 224,555
精华内容 89,822
关键字:

数据库嵌套查询

友情链接: Ackman_Model1.zip