精华内容
下载资源
问答
  • 2020-11-26 11:20:45

    如何创建仅包含一个空元组(即(()))的元组? 我尝试了tuple(tuple()),tuple(tuple(tuple())),tuple([])和tuple(tuple([])),它们都给了我()。

    我使用这种东西的原因如下:假设您有n个袋子和m个物品。 为了表示包中的项目列表,我使用了长度为n的tuple,其中该元组的每个元素都是包的代表。 袋子可能是空的,用()标记。 现在,在一开始的时候,我只有一个装满空东西的袋子!

    空元组文字是(),而不是(,)

    @vaultah已更正。 :)

    "现在,在某个开始的时候,我只有一个装满空东西的袋子!"请注意,元组是不可变的,因此空元组基本上是无用的,因为您以后无法向其中添加项目。如果需要,您应该考虑使用列表。

    @DeepSpace没错。然后使用该元组创建一个新的元组,并将所有元组存储在某个地方以进行日志记录。

    IMO似乎您应该使用列表而不是元组。然后,创建列表列表,在外部列表或内部列表中添加和删除项目非常简单。 a = [[]]

    内部有5个元组的元组是((),)*5。

    @jeffery_the_wind这不会创建我想要的那个,但是感谢您提供lists。它在以下工作代码tuple([tuple()])中为我提供了帮助。同样,以下答案只是基于元组,这是非常可取的。

    @DeepSpace:一个空的元组是没有用的,因为与None不同,您仍然可以对其执行any()和len()之类的序列操作。测试None的需求可能会使原本优雅的迭代循环变得混乱,并且不对其进行测试可能会导致意外的异常。

    除了逗号混淆之外,这里的主要见解是tuple()构造函数是转换器,而不是容器。也就是说,您必须为其提供某种容器(从技术上讲是迭代器)。这就是为什么tuple(1)是TypeError的原因。因此,尽管tuple()确实是一个空元组,但tuple(tuple())只是将其转换为另一个空元组。

    空元组是()(或更冗长和较慢的tuple()),而只有一项(例如整数1)(称为单例)的元组是(1,)。 。因此,仅包含空元组的元组为

    1((),)

    以下是一些显示效果的结果:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11>>> a=((),)

    >>> type(a)

    >>> len(a)

    1

    >>> a[0]

    ()

    >>> type(a[0])

    >>> len(a[0])

    0

    这是对实际问题的正确答案,但请注意,这并未显示如何创建简单的空元组。 如果您只是看一个空的元组,而不是包含一个空元组的元组,请小心!

    @ innov8:我的答案以"空元组为()"开头。 它确实"显示了如何创建一个简单的空元组"。 然后继续说明如何"创建只包含一个空元组的元组"。

    @rory_daulton您的答案是对问题的完美答案。 我的观点是,您可以在该页面上登陆另一个问题,即如何创建一个空元组-这是另一个问题。 当然,您没有集中在没有被问到的问题上!

    我不惊讶这个(())没有起作用,因为外部括号被解释为-括号。所以(()) == (),就像(2) == 2。这应该起作用,但是:

    1((),)

    tuple()是唯一真正的空元组,但是()和((),)创建一个长度为1的元组,其中包含长度为0的元组-本身不是长度为零的元组。

    如果您想回答"如何创建一个空(或长度为零)的元组...。",我发现此帖子的搜索内容为"如何创建一个空的元组",那么您会发现这不是一个相同的问题,但是可以被误认为是这个问题(就像搜索一样),所以我尽管会提供以下答案:

    您如何简单地创建一个空元组?

    原始问题可能会误导您,因为原始答案几乎可以作为一个空的元组使用,但确实无法通过一项测试。

    (),会按照前面的答案使用((),)创建一个'空'元组,({[((((((((),))))))也会起作用,实际上您可以使用任何数字在您选择的外括号中,它们仅用作括号。但是,python在打印元组时会添加一组外括号。

    空括号是"无价值"的非标准表示形式,并且在末尾加上逗号会使"无价值"成为元组。但这是一个具有"无值"条目的元组,而不是一个空元组。

    注意:这不是零长度的元组,如其他示例所示。外部元组是一个具有一个值的元组,只有该值本身才是空元组。因此,这会在另一个元组内部创建一个空的元组,而另一个元组不为空。对于一个真正的空元组,请使用tuple(),尽管()的行为类似,但这并不完全正确。

    1

    2

    3

    4

    5

    6

    7

    8

    9>>> a = (),

    >>> type(a)

    >>> len(a)

    1

    >>> a

    ((),)

    >>> len(a[0]) # the inside tuple is empty, just not the outside one

    0

    类似地,对于长度为1但值(在b的情况下为零,在c的示例中为")的元组

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17>>> b = 0,

    >>> type(b)

    >>> len(b)

    1

    >>>b

    (0,)

    # now with an empty string

    >>> c ="",

    >>> type(c)

    >>> len(c)

    1

    >>>c

    ('',)

    >>> len (c[0]) # same len of c[0] as with 'empty' tuple

    0

    因此,包含了用于显示元组的外括号,但实际上不是元组的一部分,也不需要用于创建元组。

    但是,所有这些方括号方法在外层都不是真正的空白,这也是有用例的。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15>>> a = ((),) # extra brackets just to show same as other answers

    >>> len(a)

    1

    >>> if a:

    print("not empty")

    not empty

    >>> e = tuple()

    >>> len(e)

    0

    >>> type(e)

    >>> if e:

    print("not empty")

    >>> # note...did not print...so e acts as false as an empty tuple should

    因此,如果您确实需要真正的空元组,请使用tuple(),但是如果您所需要的足够多,可以使用(),或((),)

    其中的一部分似乎仅对python 2有效,在python 3中a = (); len(a)返回0

    是的,您必须使用a =(),; len(a),因为没有结尾的逗号,您将无法获得所需的结果。 您得到一个元组,而不是一个元组中的一个元组

    更多相关内容
  • 数据更新 数据更新操作的目的是修改表中的数据。 有三种操作: ...DBMS 在执行插入语句会检查所插元组是否破坏上已定义的完整性规则。 举例说明: 如果表中已经建立了索引,对索引关键字的更新,...

    数据更新

          数据更新操作的目的是修改表中的数据。

                  有三种操作:

                    向表中添加若干行数据( INSERT )

                    修改表中的数据( UPDATE

                    删除表中的若干行数据( DELETE )。

            DBMS 在执行插入语句时会检查所插元组是否破坏表上已定义的完整性规则

           举例说明:

            如果表中已经建立了索引,对索引关键字的更新, DBMS 会同时对索引进行更新。

    插入数据

          INSERT 支持两种插入数据方式:

            1、插入单个元组

            2、插入子查询结果

          插入单个元组

            插入单个元组语句格式:

    INSERT 
    INTO <表名>[(<属性列1>[,<属性列2>]…)]
    VALUES (<常量1>[,<常量2>]…)
    //中括号里面的内容可有可无 

         插入单个元组语句说明:

            功能:

            将新元组插入指定表中。

           INTO 子句说明:

            ■指定插入数据的表名属性列
            ■属性列的顺序可与定义中的顺序不一致
            ■没有指定属性列:表示要插入的是一条完整的元组,且属性列属性与表定义中的顺序一致

            ■指定部分属性列:插入的元组在其余属性列上取空值

           VALUES 子句

            ■提供的值(值的个数和类型必须与 INTO 子句匹配

            ■字符串常量必须用单引号括起来

             插入单个元组例1:

            将一个新学生记录(学号:200215128;姓名:陈冬;性别:男;所在系: IS ;
    18岁)插入到 Student 表中。

    INSERT INTo Student ( Sno , Sname , Ssex , Sdept , Sage )
    VALUES (‘200215128’,‘陈冬,‘男'' IS ,18);

            或

     INSERT INTO Student 
     VALUES (‘200215128’,‘陈冬’‘男',18, IS ');

            插入单个元组例2:

            插入一条选课记录(‘200215128,‘1')

     INSERT 
     INTO SC ( Sno , Cno )
     VALUES ('200215128','1');

            插入单个元组练习

            1、向 SC 表中插入一条选课元组。学生201215122选了5号课程,得分89)

     insert into SC values( '201215122','5',89 );

            2、向 Course 表中插入一条元组。8号课程, C 语言,没有先行课,4学分)

    insert into Course values( '8','C语言',NULL,4 ); 

            3、对每一个系,求学生的平均年龄,并把结果存入数据库。
            分析:

     CREATE TABLE Deptage ( 
            Sdept CHAR (15),
            Avgage NUMERIC (6,1)
    )
     INSERT INTo Deptage ( Sdept , Avgage )
     SELECТ Sdept , AVG ( Sage )
     FROM Student 
     GROUP BY Sdept ;

            4、建立学生选课情况分析表,包括学号、门数和总学分三个属性列,插入每个学生的选修课程门数和总学分
     

    create table 学生选课情况分析表(
    学号 char (9),
    门数 smallint, 
    总学分 smallint 
    )
    
    insert into 学生选课情况分析表
    select sno , count (*), sum ( ccredit )
    from sc , course 
    where sc . cno = course . cno 
    group by sno 
    
    select * from 学生选课情况分析表 

    修改数据:修改表中已有的元组(记录)

            语句格式:

    UPDATE <表名>
     SET <列名>=<表达式>[,<列名>=<表达式>]…
    [ WHERE <条件>];

          修改数据语句说明:

            功能:

            1、修改指定表中满足 WHERE 子句条件的元组

            注:如果省略 WHERE 子句,则修改表中的所有元组

            2、SET 子句中,表达式的值用于修改相应的属性列

            修改数据例1:

            将学生200215121的年龄改为22岁。(修改满足条件的元组

    UPDATE Student 
    SET Sage = 22 WHERE Sno =‘200215121’

            修改数据例2:

            将所有学生的年龄增加1岁。(修改所有的元组)

    UPDATE Student
    SET Sage = Sage +1;

            修改数据例3:

            将计算机科学系全体学生的成绩置零。(带有子查询的修改语句) 

    UPDATE SC 
    SET Grade = 0
    WHERE Sno in
    ( SELETE Sno
      FROM Student
      WHERE Sdept ='CS')

           修改数据练习:

            1、将8号课程改名为“高级语言程序设计”,先行课为6号课程,学分为5学分。

    update course 
    set cname ='高级语言程序设计’. cpo ='6, ccredit =5 where cno ='8'
    select * from course where cno ='8'

            2、将计算机系所有女生成绩提高10%。

    update sc 
    set grade = grade *1.1
    where sno in ( select sno from student where sdept =' CS ' and ssex ='女)

            3、将没有先行课的课程的成绩提高5分。

     update sc 
     set grade = grade +5
     where cno in ( select cno from course where cpno is null )

    删除数据(删除元组)

            删除数据语句格式:

    DELETE 
    FROM <表名>[ WHERE <条件>];

             删除数据语句说明:

                   1、删除指定表中满足 WHERE 子句条件的元组。如果 WHERE 省略删除全部元组

                   2、有可能破坏参照完整性规则。(级联删除是一种解决办法)

                删除数据语句例1:

                    删除学号为200215128的学生记录(删除满足条件的元组)。

    DELETE FROM Student WHERE Sno =‘200215128’

                删除数据语句例2:

                    删除所有的学生选课记录(删除所有元组)。

    DELETE FROM sc 

                删除数据语句例2:

                    删除计算机科学系所有学生的选课记录(带子查询的删除语句)。

     DELETE 
     FROM sc 
     WHERE sno in ( SELECT sno 
                    FROM student
                    WHERE sdept =' CS ')
    展开全文
  • 一定要先删除sc表中的某元组行,,, 再删除course表中元组行 course SC 删除course表中元组行,,出现错误 sc ---->参照 course P155 删除元组 行 破坏 参照完整性 转载于:...

    一定要  先删除 sc表 中的  某元组   行,,,

    再删除  course表中的  元组行

     

    course表

     

    SC表

     

     

    删除  course表中的  元组行,,出现错误

     sc    ---->参照 course

    P155 删除元组 行    破坏 参照完整性   

     

     

     

    转载于:https://www.cnblogs.com/wangprince2017/p/7678021.html

    展开全文
  • sql删除元组_SQL笔记

    千次阅读 2020-11-21 01:42:12
    SQL笔记MARCUS_YANGSQL基本概念SQL(Structured Query Language)结构化查询语言,是关系数据库的标准语言特点:...//从表 SC 选取学号 Sno 和成绩 Grade 满足条件课程号 Cno=“3”按照成绩 Gradel 降序排列 综合统...

    SQL笔记

    MARCUS_YANG

    SQL基本概念

    SQL(Structured Query Language)结构化查询语言,是关系数据库的标准语言特点:

    SELECT Sno, Grade
    FROM SC
    WHERE Cno= '3'
    ORDER BY Grade DESC;
    //从表 SC 中选取学号 Sno 和成绩 Grade 满足条件课程号 Cno=“3”按照成绩 Gradel 降序排列
    
    • 综合统一:
      • 集数据定义语言(DDL),数据操纵语言(DML),数据控制语言(DCL)功能于一体。
      • 定义和修改、删除关系模式,定义和删除视图,插入数据,建立数据库;
      • 对数据进行增删改查
      • 数据库的重构和维护
      • 数据库安全性、完整性控制,以及事务控制
      • 嵌入式和动态SQL定义
    • 高度非过程化:SQL 只要提出“做什么”,无须了解存取路径。
    • 面向集合的操作方式:
      • 非关系数据模型采用面向记录的操作方式,操作对象是一条记录
      • 采用集合操作方式
      • 操作对象、查找结果可以是元组的集合
      • 一次插入、删除、更新操作的对象可以是元组的集合
    • 以同一种语法结构提供多种使用方式:独立使用和嵌入高级语言中
    • 语言简洁,易学易用

    5ef9104ad4c4cf8b9fc5482226885ef5.png
    • SQL支持关系数据库三级模式结构:

    38364e68b53b4344b616a4729cc65afc.png
      • 基本表:
        • 本身独立存在的表
        • SQL 中一个关系就对应一个基本表
        • 一个(或多个)基本表对应一个存储文件
        • 一个表可以带若干索引
      • 存储文件:
        • 逻辑结构组成了关系数据库的内模式
        • 物理结构对用户来说是隐蔽的
      • 视图:
        • 用户可以在视图上再定义视图
        • 视图是一个虚表
        • 数据库中只存放视图的定义而不存放视图对应的数据
        • 从一个或几个基本表导出的表

    贯彻这门课的三个样例表:

    student table:

    SNO 学号Sname 姓名Ssex 性别Sage 年龄Sdept 系17150011001MarcusMA21CS

    Course表

    Cno课程号Cname 课程名Cpno 先修课Ccredit 学分1数据库542数学NULL23信息系统144操作系统635数据结构746数据处理NULL27PASCAL64

    学生课程表SC

    Sno 学号Cno 课程号Grade 成绩171500110011100


    数据定义

    SQL 的数据定义功能:定义各种数据库的“对象”

    • 模式定义
    • 表定义
    • 视图定义
    • 索引定义
    • [ ]

    4752b0d5cec7a197b2b0205f179a52ac.png

    定义模式:

    example: 定义模式实际上定义了一个命名空间(或者说目录)

    [例3.1] 为用户WANG定义一个学生-课程模式S-T

    CREATE SCHEMA “S-T” AUTHORIZATION WANG;

    [例3.2] CREATE SCHEMA AUTHORIZATION WANG;

    该语句没有指定<模式名,<模式名隐含为<用户名

    • 在 CREATE SCHEMA 中可以接受 CREATETABLE CREATE VIEW 和 GRANT 子句。
    • [例3.3]为用户ZHANG创建了一个模式TEST,并且在其中定义一个表 TAB1CREATE SCHEMA TEST AUTHORIZATION ZHANGCREATE TABLE TAB1(COL1 SMALLINT,
      COL2 INT,
      COL3 CHAR(20),
      COL4 NUMERIC(10,3),
      COL5 DECIMAL(5,2)
      );

    删除模式

    DROP SCHEMA <模式名<CASCADE|RESTRICT

    • CASCADE删除模式的同时把该模式中所有的数据库对象全部删除
    • RESTRICT如果该模式中定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行。仅当该模式中没有任何下属的对象时才能执行。

    [例3.4] DROP SCHEMA ZHANG CASCADE;

    删除模式ZHANG

    同时该模式中定义的表TAB1也被删除

    基本表的定义

    6c84fb53de0acc7f107f2f2db6fd16dc.png
    • 列级完整性约束条件:涉及相应属性列的完整性约束条件
    • 表级完整性约束条件:涉及一个或多个属性列的完整性约束条件
    • 如果完整性约束条件涉及到该表的多个属性列,则必须定义在表级上。

    [例3.5] 建立“学生”表Student。学号是主码,姓名取值唯一。

    CREATE TABLE Student
     (Sno CHAR(9) PRIMARY KEY,
     /* 列级完整性约束条件,Sno是主码*/
    Sname CHAR(20) UNIQUE,
    Ssex CHAR(2),
    Sage SMALLINT,
    Sdept CHAR(20)
    );
    

    [例3.6 ] 建立一个“课程”表Course

    CREATE TABLE Course
     (Cno CHAR(4) PRIMARY KEY,
    Cname CHAR(40),
    Cpno CHAR(4),/*先修课*/
    Ccredit SMALLINT,
    FOREIGN KEY (Cpno) REFERENCES Course(Cno)/*Cpno是外码,被参照表是Course,被参照列是Cno*/
    );
    

    [例3.7] 建立一个学生选课表SC

    CREATE TABLE SC
     (Sno CHAR(9),
    Cno CHAR(4),
    Grade SMALLINT,
    PRIMARY KEY (Sno,Cno),/* 主码由两个属性构成,必须作为表级完整性进行定义*/
    FOREIGN KEY (Sno) REFERENCES Student(Sno),/* 表级完整性约束条件,Sno是外码,被参照表是Student */
    FOREIGN KEY (Cno)REFERENCES Course(Cno)/* 表级完整性约束条件, Cno是外码,被参照表是Course*/
    );
    

    数据类型

    关系模型中“域”的概念:

    MYSQL:https://www.runoob.com/mysql/mysql-data-types.html

    作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。

    类型大小范围(有符号)范围(无符号)用途TINYINT1 byte(-128,127)(0,255)小整数值SMALLINT2 bytes(-32 768,32 767)(0,65 535)大整数值MEDIUMINT3 bytes(-8 388 608,8 388 607)(0,16 777 215)大整数值INT或INTEGER4 bytes(-2 147 483 648,2 147 483 647)(0,4 294 967 295)大整数值BIGINT8 bytes(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)极大整数值FLOAT4 bytes(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)0,(1.175 494 351 E-38,3.402 823 466 E+38)单精度 浮点数值DOUBLE8 bytes(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)双精度 浮点数值DECIMAL对DECIMAL(M,D) ,如果MD,为M+2否则为D+2依赖于M和D的值依赖于M和D的值小数值


    日期和时间类型

    表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

    每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。

    TIMESTAMP类型有专有的自动更新特性,将在后面描述。

    类型大小 ( bytes)范围格式用途DATE31000-01-01/9999-12-31YYYY-MM-DD日期值TIME3'-838:59:59'/'838:59:59'HH:MM:SS时间值或持续时间YEAR11901/2155YYYY年份值DATETIME81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值TIMESTAMP41970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07YYYYMMDD HHMMSS混合日期和时间值,时间戳


    字符串类型

    字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

    类型大小用途CHAR0-255 bytes定长字符串VARCHAR0-65535 bytes变长字符串TINYBLOB0-255 bytes不超过 255 个字符的二进制字符串TINYTEXT0-255 bytes短文本字符串BLOB0-65 535 bytes二进制形式的长文本数据TEXT0-65 535 bytes长文本数据MEDIUMBLOB0-16 777 215 bytes二进制形式的中等长度文本数据MEDIUMTEXT0-16 777 215 bytes中等长度文本数据LONGBLOB0-4 294 967 295 bytes二进制形式的极大文本数据LONGTEXT0-4 294 967 295 bytes极大文本数据

    注意:char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。

    修改基本表

    • ALTER TABLE <表名
      • [ADD[COLUMN] <新列名 <数据类型 [ 完整性约束 ] ]
      • [ADD <表级完整性约束]
      • [DROP [ COLUMN ] <列名 [CASCADE| RESTRICT] ]
      • [DROP CONSTRAINT<完整性约束名[ RESTRICT | CASCADE ] ]
      • [ALTER COLUMN <列名<数据类型 ] ;
      • ADD子句用于增加新列、新的列级完整性约束条件和新的表级完整性约束条件
      • DROP COLUMN子句用于删除表中的列
        • CASCAD:则自动删除引用了该列的其他对象
        • RESTRICT:如果该列引用了其他对象,则关系数据库解决删除
      • DROP CONSTRAINT子句用于删除指定的完整性约束条件
      • ALTER COLUMN子句用于修改原有的列定义,包括修改列名和数据类型
    • [例3.8] 向Student表增加“入学时间”列,其数据类型为日期型
      ALTER TABLE Student ADD S_entrance DATE;
    • [例3.9] 将年龄的数据类型由字符型(假设原来的数据类型是字符型)改为整数。
      ALTER TABLE Student ALTER COLUMN Sage INT;[例3.10] 增加课程名称必须取唯一值的约束条件。
      ALTER TABLE Course ADD UNIQUE(Cname);

    删除基本表

    • DROP TABLE <表名[RESTRICT| CASCADE];
      • RESTRICT:删除表是有限制的。
      • CASCADE:删除该表没有限制。
    • [例3.11] 删除Student表
      DROP TABLE Student CASCADE;

    c46ce50daf3eb024ed5cbc8a6fc4f839.png

    索引

    常见的索引:

    • 顺序文件上的索引
    • B+树索引
    • 散列(hash)索引
    • 位图索引

    创建索引

    CREATE [UNIQUE] [CLUSTER] INDEX <索引名

    ON <表名(<列名[<次序][,<列名[<次序] ]…);

    • 升序:ASC(默认)
    • 降序:DESC

    [例3.13] 为学生-课程数据库中的Student,Course,SC三个 表建立索引。Student表按学号升序建唯一索引,Course表 按课程号升序建唯一索引 , SC 表按学号升序和课程号降序 建唯一索引

    CREATE UNIQUE INDEX Stusno ON Student(Sno);
    CREATE UNIQUE INDEX Coucno ON Course(Cno);
    CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);
    

    修改索引

    ALTER INDEX<旧索引名RENAME TO<新索引名

    例 3.149 将 SC 表的 SCno 索引名改为 Scsno

    ALTER INDEX Scno RENAME TO Scsno

    删除索引

    DROP INDEX <索引名;

    [例3.15] 删除Student表的Stusname索引

    DROP INDEX Stusname;


    数据查询_1

    单表查询

    一共有 6 个子句

    3b3e58dac3f9ee72694c4ef4180129e5.png
    • SELECT选择基本表的行和列 ,初始状态下不去重复,
      • DISTINC 关键字可以去重
    • Group BY-HAVING (聚集函数)
    • order by 排序

    SELECT子句

    [例3.16] 查询全体学生的学号与姓名。

    SELECT Sno,Sname
    FROM Student;
    

    [例3.18] 查询全体学生的详细记录

    SELECT Sno,Sname,Ssex,Sage,Sdept
    FROM Student;
    或
    SELECT *
    FROM Student;
    

    查询计算表达式:

    [例3.19] 查全体学生的姓名及其出生年份

    SELECT Sname,2020-Sage
    FROM Student;
    

    [例3.20] 查询全体学生的姓名、出生年份和所在的院系,要 求用小写字母表示系名。

    SELECT Sname,'Year of Birth: ',2014-Sage,LOWER(Sdept)
    FROM Student;
    

    使用列别名改变查询结果的列标题:

    SELECT Sname NAME,'Year of Birth:' BIRTH,2014-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT
    FROM Student;
    

    [例3.21] 查询选修了课程的学生学号。

    SELECT DISTINCT Sno
    FROM SC;
    

    bcea7f020858094ec1b5dc47c8b48c07.png

    [例3.22] 查询计算机科学系全体学生的名单。

    SELECT Sname
    FROM Student
    WHERE Sdept=‘CS’;

    [例3.23]查询所有年龄在20岁以下的学生姓名及其年龄。

    SELECT Sname,Sage
    FROM Student
    WHERE Sage < 20;

    [例3.24]查询考试成绩有不及格的学生的学号。

    SELECT DISTINCT Sno
    FROM SC
    WHERE Grade<60;

    [例3.25] 查询年龄在20~23岁(包括20岁和23岁)之间的学生 的姓名、系别和年龄

    SELECT Sname, Sdept, Sage
    FROM Student
    WHERE Sage BETWEEN 20 AND 23;

    [例3.26] 查询年龄不在20~23岁之间的学生姓名、系别和年龄

    SELECT Sname, Sdept, Sage
    FROM Student
    WHERE Sage NOT BETWEEN 20 AND 23;
    

    [例3.27]查询计算机科学系(CS)、数学系(MA)和信息 系(IS)学生的姓名和性别。

    SELECT Sname, Ssex
    FROM Student
    WHERE Sdept IN ('CS','MA’,'IS' );
    

    [ 例 3.28] 查询既不是计算机科学系 、 数学系 , 也不是信息系 的学生的姓名和性别。

    SELECT Sname, Ssex
    FROM Student
    WHERE Sdept NOT IN ('CS','MA’,'IS' );
    

    字符串匹配:

    %:如a%b表示以a开头,以b结尾的任意长度的字符串

    _:a_b表示以a开头,以b结尾的长度为3的任意字符串

    [例3.29] 查询学号为201215121的学生的详细情况。

    SELECT *
    FROM Student
    WHERE Sno LIKE ‘201215121';//WHERE Sno = ' 201215121 ';
    

    [例3.30] 查询所有刘某学生的姓名、学号和性别。

    SELECT Sname, Sno, Ssex
    FROM Student
    WHERE Sname LIKE '刘%';
    

    [例3.31] 查询姓"欧阳"且全名为三个汉字的学生的姓名。

    SELECT Sname
    FROM Student
    WHERE Sname LIKE '欧阳__';
    

    [例3.32] 查询名字中第2个字为"阳"字的学生的姓名和学号。

    SELECT Sname,Sno
    FROM Student
    WHERE Sname LIKE '__阳%';
    

    [例3.33] 查询所有不姓刘的学生姓名、学号和性别。

    SELECT Sname, Sno, Ssex
    FROM Student
    WHERE Sname NOT LIKE '刘%';
    

    [例3.34] 查询DB_Design课程的课程号和学分。

    SELECT Cno,Ccredit
    FROM Course
    WHERE Cname LIKE 'DB_Design' ESCAPE ' ' ;
    

    _转义表示_

    [例3.35] 查询以"DB_"开头,且倒数第3个字符为 i的课程的 详细情况。

    SELECT *
    FROM Course
    WHERE Cname LIKE 'DB_%i_ _' ESCAPE ' ' ;
    

    [例3.36] 某些学生选修课程后没有参加考试,所以有选课记 录,但没 有考试成绩。查询缺少成绩的学生的学号和相应 的课程号。

    SELECT Sno,Cno
    FROM SC
    WHERE Grade IS NULL
    
    

    [例3.37] 查所有有成绩的学生学号和课程号。

    SELECT Sno,Cno
    FROM SC
    WHERE Grade IS NOT NULL;
    
    

    [例3.38] 查询计算机系年龄在20岁以下的学生姓名。

    SELECT Sname
    FROM Student
    WHERE Sdept= 'CS' AND Sage<20;
    
    

    [例3.27] 查询计算机科学系(CS)、数学系(MA)和信息系 (IS)学生的姓名和性别。

    SELECT Sname, Ssex
    FROM Student
    WHERE Sdept IN ('CS','MA’,'IS' );
    
    

    [ 例 3.28] 查询既不是计算机科学系 、 数学系 , 也不是信息系 的学生的姓名和性别。

    SELECT Sname, Ssex
    FROM Student
    WHERE Sdept NOT IN ('IS','MA’,'CS' );
    
    

    [例3.29] 查询学号为201215121的学生的详细情况。

    SELECT *
    FROM Student
    WHERE Sno LIKE ‘201215121';
    
    

    [例3.30] 查询所有姓刘学生的姓名、学号和性别。

    SELECT Sname, Sno, Ssex
    FROM Student
    WHERE Sname LIKE '刘%';
    
    

    [例3.31] 查询姓"欧阳"且全名为三个汉字的学生的姓名。

    SELECT Sname
    FROM Student
    WHERE Sname LIKE '欧阳__';
    
    

    [例3.32] 查询名字中第2个字为"阳"字的学生的姓名和学号。

    SELECT Sname,Sno
    FROM Student
    WHERE Sname LIKE '__阳%';
    
    

    [例3.33] 查询所有不姓刘的学生姓名、学号和性别。

    SELECT Sname, Sno, Ssex
    FROM Student
    WHERE Sname NOT LIKE '刘%';
    
    

    [例3.34] 查询DB_Design课程的课程号和学分。

    SELECT Cno,Ccredit
    FROM Course
    WHERE Cname LIKE 'DB_Design' ESCAPE ' ' ;
    
    

    [例3.35] 查询以"DB_"开头,且倒数第3个字符为 i的课程的 详细情况。

    SELECT *
    FROM Course
    WHERE Cname LIKE 'DB_%i_ _' ESCAPE ' ' ;
    
    

    [例3.36] 某些学生选修课程后没有参加考试,所以有选课记 录,但没 有考试成绩。查询缺少成绩的学生的学号和相应 的课程号。

    SELECT Sno,Cno
    FROM SC
    WHERE Grade IS NULL //IS”不能用“=”代替
    
    

    [例3.37] 查所有有成绩的学生学号和课程号。

    SELECT Sno,Cno
    FROM SC
    WHERE Grade IS NOT NULL;
    
    

    [例3.38] 查询计算机系年龄在20岁以下的学生姓名。

    SELECT Sname
    FROM Student
    WHERE Sdept= 'CS' AND Sage<20;
    
    

    ORDER BY 子句

    可以按一个或多个属性列排序

    升序:ASC;降序:DESC;缺省值为升序

    [例3.39]查询选修了3号课程的学生的学号及其成绩,查询结 果按分数降序排列。

    SELECT Sno, Grade
    FROM SC
    WHERE Cno= ' 3 '
    ORDER BY Grade DESC;
    
    

    [例3.40]查询全体学生情况,查询结果按所在系的系号升序 排列,同一系中的学生按年龄降序排列。

    SELECT *
    FROM Student
    ORDER BY Sdept, Sage DESC;
    
    

    聚集函数

    • DISTINCT 去重
    • ALL 所有(默认)
    • 统计元组个数COUNT(*)
    • 统计一列中值的个数COUNT([DISTINCT|ALL] <列名)
    • 计算一列值的总和SUM([DISTINCT|ALL] <列名)
    • 计算一列值的平均值AVG([DISTINCT|ALL] <列名)
    • 求一列中的最大值和最小值:
      • MAX([DISTINCT|ALL] <列名)
      • MIN([DISTINCT|ALL] <列名)

    [例3.41] 查询学生总人数。

    SELECT COUNT(*)
    FROM Student;
    
    

    [例3.42] 查询选修了课程的学生人数。

    SELECT COUNT(DISTINCT Sno)
    FROM SC;
    
    

    [例3.43] 计算1号课程的学生平均成绩。

    SELECT AVG(Grade)
    FROM SC
    WHERE Cno= ' 1 ';
    
    

    [例3.44] 查询选修1号课程的学生最高分数。

    SELECT MAX(Grade)
    FROM SC
    WHERE Cno='1';
    

    [例3.45 ] 查询学生201215012选修课程的总学分数。

    SELECT SUM(Ccredit)
    FROM SC,Course
    WHERE Sno='201215012' AND SC.Cno=Course.Cno;
    

    GROUP BY 子句:细化聚集函数的作用对象

    [例3.46] 求各个课程号及相应的选课人数。

    SELECT Cno,COUNT(Sno)
    FROM SC
    GROUP BY Cno;
    

    7dc6c302e0dcd9397b3d3ddf7e7afe56.png

    [例3.47] 查询选修了3门以上课程的学生学号。

    SELECT Sno
    FROM SC
    GROUP BY Sno HAVING COUNT(Cno) 3;
    

    [例3.48 ]查询平均成绩大于等于90分的学生学号和平均成绩

    SELECT Sno, AVG(Grade)
    FROM SC
    GROUP BY Sno HAVING AVG(Grade)=90;
    

    HAVING 短语与 WHERE 子句的区别:

    • 作用对象不同
    • WHERE 子句作用于基表或视图,从中选择满足条件的元组
    • HAVING 短语作用于组,从中选择满足条件的组

    综合练习

    [练习1] 列出计算机系姓刘的同学的信息,按照学号大小 排序

    SELECT *
    FROM Student
    WHERE Sdept=‘CS’ AND Sname LIKE ‘刘%’
    ORDER BY Sno;
    

    [练习2] 按系并区分男女统计各系学生的人数、并按照人 数降序排序

    SELECT Sdept, Ssex,COUNT(Sno)
    FROM Student
    GROUP BY Sdept,Ssex
    ORDER BY COUNT(Sno) DESC;
    

    数据连接

    不像关系代数中“连接”是用一个特殊符号来表达的, 在 SQL中“连接”是用“连接条件”来表达的。

    一般格式:[<表名1.]<列名1 <比较运算符 [<表名2.]<列名2

    • 等值连接
    • 自身连接
    • 外连接
    • 多表连接

    等值连接

    连接运算符为 “=”

    [例 3.49] 查询每个学生及其选修课程的情况

    SELECT Student.*, SC.*
    FROM Student, SC
    WHERE Student.Sno = SC.Sno;
    

    bbc76d3984952b490f5b8a3adad53313.png
    • 嵌套循环法(NESTED-LOOP)
    • 排序合并法(SORT-MERGE)
    • 索引连接(INDEX-JOIN)

    [例 3.51 ]查询选修2号课程且成绩在90分以上的所有学生的学号和姓名。

    SELECT Student.Sno, Sname
    FROM Student, SC
    WHERE Student.Sno=SC.Sno AND
    SC.Cno=' 2 ' AND SC.Grade90;
    
    

    自身连接

    自身连接:一个表与其自己进行连接,是一种特殊的连接

    !!!需要给表起别名以示区别

    !!!由于所有属性名都是同名属性,因此必须使用别名前缀

    [例 3.52]查询每一门课的直接先修课的名称

    SELECT FIRST.Cname , SECOND.Cname
    FROM Course FIRST, Course SECOND
    WHERE FIRST.Cpno = SECOND.Cno;
    
    

    71af799156d2de703d6dc0b5e9203ac2.png

    e6e6cf67abfb9c0ef3d9905172ba9e2a.png

    外连接

    • 外连接操作以指定表为连接主体,将主体表中不满足连 接条件的元组一并输出
    • 普通连接操作只输出满足连接条件的元组

    [例 3.49] 查询每个学生及其选修课程的情况

    SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
    FROM Student LEFT OUT JOIN SC ON
    (Student.Sno=SC.Sno);
    //或
    SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
    FROM Student,SC
    WHERE Student.Sno(+)=SC.Sno;
    
    

    多表连接

    [例3.54]查询每个学生的学号、姓名、选修的课程名及成绩

    SELECT Student.Sno, Sname, Cname, Grade
    FROM Student,SC,Course /*多表连接*/
    WHERE Student.Sno = SC.Sno AND SC.Cno = Course.Cno;
    
    

    嵌套查询

    不相关子查询:

    子查询的查询条件不依赖于父查询

    由里向外逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。

    相关子查询:

    子查询的查询条件依赖于父查询

    带 IN 谓词

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

    分步法:

    ① 确定“刘晨”所在系名

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

    ② 查找所有在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 = '刘晨';
    
    

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

    SELECT Sno,Sname  //③ 最后在Student关系中取出Sno和Sname
    FROM Student
    WHERE Sno IN
     (SELECT Sno //② 然后在SC关系中找出选修了3号课程的学生学号
      FROM SC
    WHERE Cno IN
      (SELECT Cno //① 首先在Course关系中找出“信息系统”的课程号,为3号
       FROM Course
       WHERE Cname= '信息系统')
    );
    
    

    或:

    SELECT Sno,Sname
    FROM Student,SC,Course
    WHERE Student.Sno = SC.Sno AND
     SC.Cno = Course.Cno AND
     Course.Cname='信息系统';
    
    

    带有比较运算符的子查询

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

    SELECT Sno,Sname,Sdept
    FROM Student
    WHERE Sdept=
     (SELECT Sdept/*由于一个学生只可能在一个系学习 , 用=代替*/
    FROM Student
    WHERE Sname= '刘晨');
    
    

    [例 3.57 ]找出每个学生超过他选修课程平均成绩的课程号。(自身嵌套的例子)

    SELECT Sno, Cno
    FROM SC x
    WHERE Grade =(SELECT AVG(Grade)
            FROM SC y
                 WHERE y.Sno=x.Sno);
    
    

    带有 ANY (SOME)或 ALL 谓词的子査询

    • ANY 大于子查询结果中的某个值
    • =ANY 大于等于子査询结果中的某个值
    • !=(或<) ANY 不等于子査询结果中的某个值
    • !=(或<) ALL 不等于子查询结果中的任何一个值

    c8da81f9d43a8c134c25e41d8643d2b7.png

    image-20200430001129003

    [例 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] 查询非计算机科学系中比计算机科学系所有学 生年龄都小的学生姓名及年龄。

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

    带有EXISTS谓词的子查询

    • 带有EXISTS谓词的子查询产生逻辑真值“true”或逻辑假值“false”。
    • 由 EXISTS引出的子查询,其目标列表达式通常都用 *
    • 可以把带有全称量词的谓词转换为等价的带有存在量词的谓词:
    • 可以利用谓词演算将逻辑蕴涵谓词等价转换为:

    [例 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 ');
    

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

    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]查询至少选修了学生17150011001选修的全部课程的 学生号码。

    用逻辑蕴涵表达该查询:

    用P表示谓词 “学生201215122选修了课程y”

    用q表示谓词 “学生x选修了课程y”

    则上述查询为:

    SELECT DISTINCT SCX.Sno
    FROM SC SCX
    WHERE NOT EXISTS(SELECT *
                  FROM SC SCY
                  WHERE SCY.Sno = '17150011001' AND
                  NOT EXISTS(SELECT *
                             FROM SC SCZ
                             WHERE SCZ.Sno=SCX.Sno 
                             AND SCZ.Cno=SCY.Cno));
    

    数据查询_2_

    集合查询

    • 并操作UNION
      • UNION:将多个查询结果合并起来时,系统自动去掉重复元组(系统默认)
      • UNION ALL:将多个查询结果合并起来时,保留重复元组
    • 交操作INTERSECT
    • 差操作EXCEPT

    !参加集合操作的各查询结果的列数必须相同;对应 项的数据类型也必须相同

    [例 3.64] 查询计算机科学系的学生及年龄不大于19岁的学生。

    SELECT *
    FROM Student
    WHERE Sdept= 'CS'
    
    UNION
    
    SELECT *
    FROM Student
    WHERE Sage<=19;
    

    [例 3.65] 查询选修了课程1或者选修了课程2的学生。

    SELECT Sno
    FROM SC
    WHERE Cno=' 1 '
    
    UNION
    
    SELECT Sno
    FROM SC
    WHERE Cno= ' 2 ';
    

    [例3.66] 查询计算机科学系的学生与年龄不大于19岁的学生 的交集。

    SELECT *
    FROM Student
    WHERE Sdept='CS'
    
    INTERSECT
    
    SELECT *
    FROM Student
    WHERE Sage<=19
    
    

    [例 3.66] 实际上就是查询计算机科学系中年龄不大 于19岁的学生。

    SELECT *
    FROM Student
    WHERE Sdept= 'CS' AND Sage<=19;
    
    

    [例 3.67]查询既选修了课程1又选修了课程2的学生。

    SELECT Sno
    FROM SC
    WHERE Cno=' 1 '
    
    INTERSECT
    
    SELECT Sno
    FROM SC
    WHERE Cno='2 ';
    
    
    SELECT Sno
    FROM SC
    WHERE Cno=' 1 ' AND Sno IN(SELECT Sno
                            FROM SC
                            WHERE Cno=' 2 ');
    
    
    //下面是一个典型的错误例子
    SELECT Sno
    FROM SC
    WHERE Cno='1' and Cno='2'
    
    

    [例 3.68] 查询计算机科学系的学生与年龄不大于19岁的 学生的差集。

    SELECT *
    FROM Student
    WHERE Sdept='CS'
    
    EXCEPT
    
    SELECT *
    FROM Student
    WHERE Sage <=19;
    
    
    SELECT *
    FROM Student
    WHERE Sdept= 'CS' AND Sage19;
    
    

    数据更新

    插入数据

    插入元组

    INSERT INTO <表名 [(<属性列1[,<属性列2 …)]

    VALUES (<常量1 [,<常量2]… );

    INTO 子句

    四种情况:

    • 属性列的顺序可与表定义中的顺序不一致
    • 指定要插入数据的表名及属性列
    • 没有指定属性列:表示要插入的是一条完整的元组,且 属性列属性与表定义中的顺序一致
    • 指定部分属性列:插入的元组在其余属性列上取空值

    VALUES子句

    提供的值必须与INTO子句匹配

    [例3.69]将一个新学生元组(学号:201215128;姓名:陈冬; 性别:男;所在系:IS;年龄:18岁)插入到Student表中。

    INSERT INTO Student (Sno,Sname,Ssex,Sdept,Sage)
    VALUES ('17150011001','陈扬','男','CS',21);
    

    [例3.71] 插入一条选课记录( '200215128','1 ')。

    INSERT INTO SC(Sno,Cno)
    VALUES ('201215128 ',' 1 ');
    

    或:

    INSERT INTO SC
    VALUES (' 201215128 ',' 1 ',NULL);
    

    [例3.70]将学生张成民的信息插入到Student表中。

    INSERT INTO Student
    VALUES ('201215126','张成民','男’,18,'CS');
    

    在 student 后没有定义每个元素的意义,就必须和表一一对应

    插入子查询结果

    INSERT INTO <表名 [(<属性列1 [,<属性列2… )]子查询;

    [例3.72] 对每一个系,求学生的平均年龄,并把结果存入数据库

    建表:

    CREATE TABLE Dept_age(Sdept CHAR(15)/*系名*/
                          Avg_age SMALLINT);/*学生平均年龄*/
    

    插入数据:

    INSERT INTO Dept_age(Sdept,Avg_age)
     SELECT Sdept,AVG(Sage)
     FROM Student
     GROUP BY Sdept;
    

    插入数据的时候会检测完整性:

    • 实体完整性
    • 参照完整性
    • 用户定义的完整性
      • NOT NULL约束
      • UNIQUE约束
      • 值域约束

    修改数据

    UPDATE <表名

    SET <列名=<表达式[,<列名=<表达式]…

    [WHERE <条件];

    三种修改方式:

    • 修改某一个元组的值
    • 修改多个元组的值
    • 带子查询的修改语句

    [例3.73] 将学生201215121的年龄改为22岁

    UPDATE Student
    SET Sage=22
    WHERE Sno=' 201215121 ';
    
    

    [例3.74] 将所有学生的年龄增加1岁。

    UPDATE Student
    SET Sage= Sage+1;
    
    

    [例3.75] 将计算机科学系全体学生的成绩置零。

    UPDATE SC
    SET Grade=0
    WHERE Sno IN(SELETE Sno
                 FROM Student
                 WHERE Sdept= 'CS' );
    
    

    更新数据同样会检测完整性约束

    删除数据

    DELETE FROM <表名

    [WHERE <条件];

    删除指定表中满足WHERE子句条件的元组,无该子句将会删除表中的全部元组

    三种删除方式:

    • 删除某一个元组的值
    • 删除多个元组的值
    • 带子查询的删除语句

    [例3.76] 删除学号为201215128的学生记录。

    DELETE FROM Student
    WHERE Sno= 201215128 ';
    
    

    [例3.77] 删除所有的学生选课记录。

    DELETE FROM SC;
    
    

    [例3.78] 删除计算机科学系所有学生的选课记录。

    DELETE
    FROM SC
    WHERE Sno IN(SELETE Sno
                 FROM Student
                 WHERE Sdept= 'CS') ;
    
    

    空值的处理

    空值不等于 NULL,表示本来应该有一个值,但是现在未知

    判断一个属性的值是否为空值,用IS NULL或IS NOT NULL来表示。

    [例 3.81]找出漏填了性别或者年龄信息的记录

    SELECT *
    FROM Student
    WHERE Ssex IS NULL OR Sage IS NULL ;
    

    约束条件:

    • 有NOT NULL约束条件的不能取空值
    • 加了UNIQUE限制的属性不能取空值
    • 码属性不能取空值

    [例3.82] 找出选修1号课程的不及格的学生。

    SELECT Sno
    FROM SC
    WHERE Grade < 60 AND Cno='1';
    

    [例 3.83] 选出选修1号课程的不及格的学生以及缺考的学生。

    SELECT Sno
    FROM SC
    WHERE Cno='1' AND (Grade<60 OR Grade IS NULL);
    

    视图view

    视图是定义在基本表之上的虚表,是从一个或几个基本表(或视图)导出的表

    • 只存放视图的定义,不存放视图对应的数据
    • 基表中的数据发生变化,从视图中查询出的数据也随之改变

    视图的定义

    CREATE VIEW

    <视图名 [(<列名 [,<列名]…)]

    AS <子查询

    [WITH CHECK OPTION];

    • WITH CHECK OPTION:子查询中的条件表达式约束
    • 子查询可以是任意的SELECT语句
    • 关系数据库管理系统执行 CREATE VIEW 语句时只是把视图定义存入数据字典,并不执行其中的SELECT 语句。
    • 对视图查询时,按视图的定义从基本表中将数据查出。
    • 若一个视图是从单个基本表导出的,并且只是去掉了基本表的某些行和某些列,但保留了主码,我们称这类视图为行列子集视图

    [例3.84] 建立信息系学生的视图。

    CREATE VIEW IS_Student
    AS
    SELECT Sno,Sname,Sage
    FROM Student
    WHERE Sdept= 'IS';
    
    

    [例3.85]建立信息系学生的视图,并要求进行修改和插入 操作时仍需保证该视图只有信息系的学生 。

    CREATE VIEW IS_Student
    AS
    SELECT Sno,Sname,Sage
    FROM Student
    WHERE Sdept= 'IS'
    //对该视图进行插入、修改和删除操作会自动加上Sdept='IS'的条件。
    WITH CHECK OPTION;
    
    

    [例3.86] 建立信息系选修了1号课程的学生的视图(包括 学号、姓名、成绩)

    CREATE VIEW IS_S1(Sno,Sname,Grade)
    AS
    SELECT Student.Sno,Sname,Grade
    FROM Student,SC
    WHERE Sdept= 'IS' AND
      Student.Sno=SC.Sno AND
      SC.Cno= '1';
    
    

    [例3.87] 建立信息系选修了1号课程且成绩在90分以上的学生的视图。

    在视图上定义视图(套娃)

    CREATE VIEW IS_S2
    AS
    SELECT Sno,Sname,Grade
    FROM IS_S1
    WHERE Grade=90;
    
    

    [例3.88] 定义一个反映学生出生年份的视图。

    CREATE VIEW BT_S(Sno,Sname,Sbirth)
    AS
    SELECT Sno,Sname,2014-Sage
    FROM Student;
    
    

    [例3.89] 将学生的学号及平均成绩定义为一个视图

    [聚集函数]

    CREAT VIEW S_G(Sno,Gavg)
    AS
    SELECT Sno,AVG(Grade)
    FROM SC
    GROUP BY Sno;
    
    

    [例3.90]将Student表中所有女生记录定义为一个视图

    CREATE VIEW F_Student(F_Sno,name,sex,age,dept)
    AS
    SELECT *
    FROM Student
    WHERE Ssex=‘女’;
    //* 有可能导致在后面修改 student 表的时候视图出错
    
    

    删除视图

    DROP VIEW <视图名[CASCADE];

    • 该语句从数据字典中删除指定的视图定义
    • 如果该视图上还导出了其他视图,使用CASCADE级联删除语句
    • 删除基本表时需要DROP由该表导出的视图

    [例3.91 ] 删除视图BT_S和IS_S1

    DROP VIEW BT_S;/*成功执行*/
    
    DROP VIEW IS_S1;/*拒绝执行*/
    DROP VIEW IS_S1 CASCADE;/*成功执行*/
    
    

    查询视图

    • 查询视图与查询基本表相同

    [例3.92] 在信息系学生的视图中找出年龄小于20岁的学生。

    SELECT  Sno,Sage
    FROM IS_Student
    WHERE Sage<20;
    
    

    [例3.93] 查询选修了1号课程的信息系学生

    SELECT IS_Student.Sno,Sname
    FROM IS_Student,SC
    WHERE IS_Student.Sno =SC.Sno AND SC.Cno= '1';
    
    

    [例3.94]在S_G视图中查询平均成绩在90分以上的学生学号 和平均成绩

    CREATE VIEW S_G(Sno,Gavg)
    AS
    SELECT Sno,AVG(Grade)
    FROM SC
    GROUP BY Sno;
    
    SELECT *
    FROM S_G
    WHERE Gavg=90;
    

    SELECT *
    FROM (SELECT Sno,AVG(Grade)
          FROM SC
          GROUP BY Sno) 
          AS 
          S_G(Sno,Gavg)
    WHERE Gavg=90;
    

    更新视图

    [例3.95] 将信息系学生视图IS_Student中学号”201215122”的学生姓名改为”刘辰”。

    UPDATE IS_Student
    SET Sname= '刘辰'
    WHERE Sno= ' 201215122 ';
    
    UPDATE Student
    SET Sname= '刘辰'
    WHERE Sno= ' 201215122 ' AND Sdept= 'IS';
    

    [例3.96] 向信息系学生视图IS_Student中插入一个新的学生记录,其中学号为”201215129”,姓名为”赵新”,年龄 为20岁

    INSERT
    INTO IS_Student
    VALUES(‘201215129’,’赵新’,20);
    
    INSERT
    INTO Student(Sno,Sname,Sage,Sdept)
    VALUES('200215129','赵新',20,'IS' );
    

    [例3.97]删除信息系学生视图IS_Student中学号为”201215129”的记录

    DELETE
    FROM IS_Student
    WHERE Sno= ' 201215129 ';
    
    DELETE
    FROM Student
    WHERE Sno= ' 201215129 ' AND Sdept= 'IS';
    

    注意!聚集函数的视图在修改的时候聚集函数那一列是不可更新的

    UPDATE S_G
    SET Gavg=90
    WHERE Sno= ‘201215121’;
    //以上为反例
    
    • 允许对行列子集视图进行更新
    • 两个以上基本表导出视图原则上也不允许更新
    • 若视图的字段来自集函数,则此视图不允许更新。
    • 若视图定义中含有 GROUP BY 子句,则此视图不允许更新。
    • 若视图定义中含有 DISTINCT 短语,则此视图不允许更新 。
    • 若视图定义中有嵌套查询,并且内层查询的子句中涉及的表也是FROM导出该视图的基本表,则此视图不允许更新
    展开全文
  • 本文实例讲述了Python元组操作。分享给大家供大家参考,具体如下: #coding=utf8 ''''' ...#使用tuple创建一个元组并给元组赋值 tuple_3=tuple("hello") #使用tuple创建一个空的元组 tuple_4=tupl
  • How can I remove the comma from each tuple in the list.I want to make a list of tuples from 1 list, like this:l = [1,2,3,5,4]l1 = [ ]l2 = [ ]for i in l:l1.append (i)t = tuple(l1)l2.append(t)l1 = []pr....
  • 一个元组里面套有元组的形式,需要将其转化为以下形式 [‘133626’,‘133627’,‘133690’] 上代码: a =(('133626',), ('133627',), ('133690',)) a = [i[0] for i in a] print(a) 结果: ['133626','133627','...
  • 在python中从元组删除花括号

    千次阅读 2021-03-06 01:35:36
    我正在创建一个测试模块,以便最终使用python导入到一个更大的程序。在我的测试模块使用tkinter小部件来显示一个数字列表,当按下按钮,这些数字会增加。在import tkinterimport math#Defining Variablesglobal ...
  • 列表和元组

    2020-12-22 01:26:36
    目录一、序列1.序列的概述2.索引和元素二、通用序列操作三、列表1.列表元素的特点2.基本列表操作(1)创建函数list()(2)元素的增加(3)元素的删除(4)元素的修改(5...序列的每个元素都分配一个数字,该数字代表了该元素的
  • 删除元组的聪明方法

    2020-12-18 19:55:10
    因为元组是排序的,所以只需搜索值低于阈值的第一个元组,然后使用切片表示法删除其余值:index = next(i for i, (t1, t2) in enumerate(myTup) if t2 < threshold)del myTup[index:]正如沃恩·卡托所指出的那样...
  • Python元组中元素怎么删除和修改?

    千次阅读 2020-09-21 08:25:00
    阅读文本大概需要 3分钟大家好,我是一行,今天给大家分享下元组的用法。简单用法先说下元组的创建,我们都知道用 () 就可以直接创建了。如果我们创建只包含一个元素的元组呢?是下面这样吗?...
  • 即一张的某个记录,被另一张一个或多个记录通过外键的方式关联,当要删除该记录,可以采取以下三种策略: 1.级联删除 将参照关系中外码值与被参照关系删除元组主码值相对应的元组一起删除。 2.受限...
  • Python如何将一个列表拆分,将多个数据作为一个元素存放到元组中 问题描述:在编写脚本的过程,需要从一个文件获取服务器信息,包含IP地址、端口号、用户名和密码,获取文件信息的时候,是将所有的每一个字段...
  • Python有3种内建的数据结构:列表、...一旦你创建了一个列表,你可以添加、删除或是搜索列表的项目。由于你可以增加或删除项目,我们说列表是 可变的 数据类型,即这种类型是可以被改变的。 例: #!/usr/bin/env
  • Python 元组

    2020-12-06 08:13:08
    Python的元组与列表类似...元组创建很简单,只需要在括号添加元素,并使用逗号隔开即可。如下实例:#!/usr/bin/python3if __name__ == '__main__':tup0= () #空元组,因为创建后就不能修改,所以这样没意义tup1 = (1) ...
  • python列表和元组

    2020-12-20 22:23:10
    文章目录建立访问列表元素修改、添加和删除元素修改列表元素在列表添加元素在列表末尾添加元素:append()在列表插入元素:insert()列表中删除元素使用del 语句删除元素使用方法pop() 删除元素弹出列表任何...
  • Python 的列表和元组

    2021-01-30 17:31:57
    Python 的列表和元组要编写一个高效的程序,我们需要了解几件事:首先,程序的输入内容是什么,其次是我们应该如何选择最合适的数据结构来处理该输入。在这篇博文,我们将会在与 dict,set 等其他数据结构的比较...
  • python的列表和元组

    2020-11-21 03:45:56
    1. 什么是列表定义: 能装对象的对象在python使用[]来描述列表, 内部元素用逗号隔开. 对数据类型没有要求,列表...所以直接就在原来的对象上进行操作).append() 在结尾追加一个.insert(位置,元素) 插入元素在指定...
  • 元组与列表类似,但是元组中的元素不可修改。元组用小括号,列表用方括号。>>>tup1 = ('python', '... tup3 = "z", "x", "c", "v" # 不需要括号也可以创建空元组tup1 = ()元组中只有一个元素,要在元素...
  • 元组、列表

    2021-01-06 21:18:35
    元组() tuple 1,定义 2,t = ()空的元组 t = (1,“a”,“2”,3.14) 元组值不可变 3,切片与字符串相等 4,操作 count index 首次出现的下标 sorted排序 5,复制 浅复制 (复制地址) , 深复制 (开辟空间复制...
  • 元组是Python种重要的序列结构,与列表类似,也是由系列按特定顺序排列的元素组成,但是他是不可变序列。因此,元组也可以称为不可变的列表。在形式上,元组的所有元素都放在(),两相邻元素间使用 , 隔...
  • 字典字典的定义dict字典:字典是组键(key)和值(value)的组合,通过键(key)进行查找,没有顺序,使用大括号{}操作示例增dic = {}dic[‘name’] = ‘Mac’ # 增:key不存在print(dic)改dic[‘name’] = ‘Big Mac’ ...
  • 我有很长的元组列表 , 并且想要使用Python删除其中包含 nan 的任何元组 .我目前所拥有的:???x = [ ( ‘记录开始’ ,0 ) , ( nan,4 ) , ( nan,7 ) , … , ( ‘事件标记 1 ’ ,150 ) ]结果我正在寻找:??x = [ ( ...
  • Python的列表和元组

    千次阅读 2020-12-13 23:08:01
    定义100个变量,每个变量存放一个学生的姓名可行吗?有更好的办法吗?答:列表列表的格式变量 namesList的类型为列表namesList = ['xiaoWang','xiaoZhang','xiaoHua']比C语言的数组强大的地方在于列表的元素可以是...
  • python元组操作

    2020-12-06 05:08:46
    元组操作元组也是组有序数据的组合,和列表唯一的不同是,元组不可修改列表 = 用铅笔写的清单(能擦能改)元组 = 用钢笔写的清单(不能擦改)创建元组创建空元组方式1:变量 = ()方式2:变量 = tuple()创建单个元素的...
  • 将两个元组组合形成一个新的元组删除整个元组2.将元组转换为列表,然后对其列表的元素进行修改和删除操作,再转换为元组例:Python 语言之 元组修改和删除的的示例分享#maomao365.com#元组修改和删除的示例分...
  • 数据结构 列表 元组 ...如果不需要对元素进行添加、删除、修改的时候,可以考虑使用元组,如果一个方法要返回多个值,使用元组也是不错的选择。  元组在创建时间和占用的空间上都优于列表。可以使
  • (3.0分)【判断题】python集合是有序的(3.0分)【单选题】随机删除一个集合内的元素(3.0分)【单选题】a = {1: 'a', 2:'b'},则a[1] 是多少?(3.0分)【单选题】student = dict(姓名='张三', 年龄=20, 性别='男')...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 136,019
精华内容 54,407
关键字:

从一个表中删除元组时