记录做牛客网sql题学到的新技能

  • 8-18:
    • 做了‘如何获取emp_v和employees有相同的数据no’,学到的东西如下:
      • 在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。
        create view emp_v as select * from employees where emp_no >10005;
        

        从as后面的语句的结果中创造了一个视图view

      • 视图可以完成像表一样的操作比如:

        select * from emp_v 
      • INTERSECT:是对两个 SQL 语句所产生的结果做处理的,求交集 

        SELECT * FROM employees INTERSECT SELECT * FROM emp_v
    • 做了‘分页查询employees表,每5行一页,返回第2页的数据’

      • 答案是

        select * from employees limit 5,5

        说明第一个5所在的位置是从0开始计数的,0,1,2,3,4,是前5个

  • 8-22

    • 今天做公司的事儿学到了很多

      • 查找一个表中重复的记录

        select * from vitae a where 
        (a.peopleId,a.seq) in 
        (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
        
      • 删除这些重复的东西时由于mysql的特殊性得多加一层select

      • 查找两个表不同的地方

        select * from vitae a where 
        (a.peopleId,a.seq) in 
        (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
        
  • 9-14:

    • 视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。

    • 事务处理

      • 事务(transaction)指一组SQL语句

      • 回退(rollback)指撤销指定SQL语句的过程;

      • 提交(commit)指将未存储的SQL语句结果写入数据库表

      • 使用事务处理(transaction processing),通过确保成批的SQL操作要么完全执行,要么完全不执行,来维护数据库的完整性。

      • 例子

        • 有的DBMS要求明确标识事务处理块的开始和结束。如在SQL Server中,标识如下:

          BEGIN TRANSACTION
          ...
          COMMIT TRANSACTION

          在这个例子中,BEGIN TRA NSA CTION和COMMIT TRA NSA CTION语句之间的SQL必须完全执行或者完全不执行。

        • SQL的ROLLBA CK命令用来回退(撤销)SQL语句,请看下面的语句:

          DELETE FROM Orders;
          ROLLBACK;

          在此例子中,执行DELETE操作,然后用ROLLBA CK语句撤销。

        • 一般的SQL语句都是针对数据库表直接执行和编写的。这就是所谓的隐式提交(implicit commit),即提交(写或保存)操作是自动进行的。在事务处理块中,提交不会隐式进行。下面是一个SQL Server的例子:

          BEGIN TRANSACTION
          DELETE OrderItems WHERE order_num = 12345
          DELETE Orders WHERE order_num = 12345
          COMMIT TRANSACTION

          在这个SQL Server例子中,从系统中完全删除订单12345。因为涉及更新两个数据库表Orders和OrderItems,所以使用事务处理块来保证订单
          不被部分删除。最后的COMMIT语句仅在不出错时写出更改。如果第一条DELETE起作用,但第二条失败,则DELETE不会提交。

    • 游标

      • 背景:SQL检索操作返回一组称为结果集的行,这组返回的行都是与SQL语句相匹配的行(零行或多行)。简单地使用SELECT语句,没有办法得到第一行、下一行或前10行。但这是关系DBMS功能的组成部分。

      • 定义:有时,需要在检索出来的行中前进或后退一行或多行,这就是游标的用途所在。游标(cursor)是一个存储在DBMS服务器上的数据库查询,
        它不是一条SELECT语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。

      • 创建游标:使用DECLA RE语句创建游标,这条语句在不同的DBMS中有所不同。DECLA RE命名游标,并定义相应的SELECT语句,根据需要带WHERE和其
        他子句。为了说明,我们创建一个游标来检索没有电子邮件地址的所有顾客,作为应用程序的组成部分,帮助操作人员找出空缺的电子邮件地
        址。

        DECLARE CustCursor CURSOR
        FOR
        SELECT * FROM Customers
        WHERE cust_email IS NULL

        DECLARE语句用来定义和命名游标,这里为CustCursor。SELECT语句定义一个包含没有电子邮件地址(NULL值)的所有顾客的游标。

      • 使用游标:使用OPEN CURSOR语句打开游标,这条语句很简单,在大多数DBMS中的语法相同:

        OPEN CURSOR CustCursor

        在处理OPEN CURSOR语句时,执行查询,存储检索出的数据以供浏览和滚动。现在可以用FETCH语句访问游标数据了。FETCH指出要检索哪些行,从何处检索它们以及将它们放于何处(如变量名)。第一个例子使用Oracle语法从游标中检索一行(第一行):

        DECLARE TYPE CustCursor IS REF CURSOR
            RETURN Customers%ROWTYPE;
        DECLARE CustRecord Customers%ROWTYPE
        BEGIN
            OPEN CustCursor;
            FETCH CustCursor INTO CustRecord;
            CLOSE CustCursor;
        END;

        在这个例子中,FETCH用来检索当前行(自动从第一行开始),放到声明的变量CustRecord中。对于检索出来的数据不做任何处理。下一个例子(也使用Oracle语法)中,从第一行到最后一行,对检索出来的数据进行循环:

        DECLARE TYPE CustCursor IS REF CURSOR
            RETURN Customers%ROWTYPE;
        DECLARE CustRecord Customers%ROWTYPE
        BEGIN
            OPEN CustCursor;
            LOOP
            FETCH CustCursor INTO CustRecord;
            EXIT WHEN CustCursor%NOTFOUND;
            ...
            END LOOP;
            CLOSE CustCursor;
        END;

        与前一个例子一样,这个例子使用FETCH检索当前行,放到一个名为CustRecord的变量中。但不一样的是,这里的FETCH位于LOOP内,因此它反复执行。代码EXIT WHEN CustCursor%NOTFOUND使在取不出更多的行时终止处理(退出循环)。这个例子也没有做实际的处理,实际例子中可用具体的处理代码替换占位符…。

      • 关闭游标

        CLOSE CustCursor

猜你喜欢

转载自blog.csdn.net/weixin_38104825/article/details/81811187