SQL语言简介(二)

来源:互联网 发布:javascript 关键字 编辑:程序博客网 时间:2024/06/03 20:13
  10、Group By子句

                 SELECT fieldnameList [ , func(fieldname1) [ AS alias][ , func(fieldname2)...]

                                FROM table_source

                                [ GROUP BY [ ALL ] expression [ , .... n ]

                                [ WITH { CUBE | ROLLUP } ]]

                   // ALL : 该参数包含于选定列表中匹配的所有组合结果集,用户可以指定包含那些行都不满足WHERE子句指定的搜

                                     索条件的组和结果集。如果用户指定了ALL,将对组中不满足搜索条件的汇总列返回空值

                   // expression :该参数是对查询执行分组的表达式,expression也称为分组列,可以是列或列的非聚集表达式。在选择

                                            列表内定义的列的别名不能用于指定分组列。

                  // CUBE :该参数指定在查询的结果集内不仅包含由GROUP BY提供的正常行,还包括汇总行。在结果集内返回每个

                                 可能的组和子组组合的GROUP BY汇总行,GROUP BY汇总行在结果中显示为null , 但可用来表示所有值

                  // ROLLUP:该参数是指定在结果集内不仅包含由GROUP BY子句提供的正常行,还包含汇总行。按层次结构顺序,

                                 从组内的最低级别到最高级别汇总组。组的层次结构取决于指定分组列时所使用的顺序。更改分组列的顺序

                                 会影响在结果集内生成的行数

                  注意事项:

                  a) 在SELECT子句中的列名列表中,除了聚集函数外,其他所出现的列一定要在GROUP BY子句中有定义才行

                  b) SELECT子句的一列名列表中不一定要有聚集函数,但至少要用到GROUP BY子句列表中的一个项目

                  c) 在SQL Server中text , ntext , image数据类型的列不能作为GROUP BY 子句的分组依据

                  d) GROUP BY子句不能使用列别名

     11、HAVING子句

             用于指定组或聚合的搜索条件,它只能与SELECT语句一起使用,能常在GROUP BY子句中使用它,若不使用GROUP

             BY子句,则它的行为与WHERE子句相同。

             它可对GROUP BY子句分组的结果进行再次筛选,最后输出符合HAVING子句中指定条件的记录。

              它可以包含聚合函数, 不能使用text, image , ntext数据类型。

     12、带SOME和ANY的子查询

              是否有返回值满足搜索要求,且SOME 与 ANY完全等价

             SELECT fieldlist FROM table_source

                            WHERE scalar_expression {=|<>|!=|>|>=|!>|<|<=|!<} {SOME / ANY}(subquery)

              // SOME / ANY:指定进行比较

              // subquery :包含某列结果集的子查询

              定量比较运算符不支持取反操作,不能在SOME或ANY前加NOT,但可以使用不等号<>获取相同的查询结果。

     13、带ALL的子查询

             表达式的值与子查询结果中的所有值相比都必须满足比较运算符

              SELECT fieldlist FROM table_source WHERE scalar_expression {=|<>|!=|>|>=|!>|<|<=|!<} ALL (subquery)

      14、带EXISTS子查询

              该子查询不产生任何数据,只返回true 或 false

              SELECT fieldlist FROM table_source WHERE [ NOT ] EXISTS (subquery)

              // EXISTS : 指满足条件的那些记录,一旦找到第一条匹配的记录后,就马上停止查找

              // subquery : 返回单列结果集的子查询,子查询是一个受限的SELECT语句,不允许有COMPUTE子句和INTO关键字

       15、内连接查询

              内连接返回的结果集是两个表中符合条件的数据,而舍弃不符合条件的数据

              SELECT fieldlist FROM tb_name1 [ INNER ] JOIN tb_name2 ON join_condition [ WHERE <search_condition> ]

       16、外连接查询

              外连接返回的是至少一个表中的所有行,只要这些行符合WHERE或HAVING搜索条件。

              a) 左外连接:返回的结果集包含左表中的所有数据(符合WHERE或HAVING)及右表中的符合连接条件的数据,对于

                                      左表中缺少的右表中的属性值用null表示。                

                  SELECT fieldlist FROM tb_name1 LEFT [ OUTER ] JOIN tb_name2 ON join_condition [ WHERE <search_condition>]

              b)右外连接:返回的结果集包含右表中的所有数据(符合WHERE 或 HAVING)及左表中的符合连接条件的数据,对于

                                     右表中缺少的左表中的属性值用null表示。

                  SELECT fieldlist FROM tb_name1 RIGHT [ OUTER ] JOIN tb_name2 ON join_condition [ WHERE <search_condition>]

              c)全外连接:返回的结果集包含左表与右表中所有符合WHERE或HAVING搜索条件的数据,对于缺少的左表或右表中的

                                     属性值用null表示。

                 SELECT fieldlist FROM tb_name1 FULL [ OUTER ] JOIN tb_name2 ON join_condition [ WHERE <search_condition>]

          17、交叉连接

                 返回的结果集是两个表的迪卡儿乘积,行数等于第一个表的行数与第二个表的行数的乘积,若在交叉连接中指定

                  WHERE条件,则交叉连接等于内连接

                 SELECT fieldlist FROM tb_name1 CROSS JOIN tb_name2 [ WHERE <search_condition>]

                  在交叉连接中不能使用ON设置连接条件。

          18、自连接

                  指表与其自身进行连接,使用自连接时,必须为每个连接表起一个别名。

                   例:SELECT DISTINCT a.* from tb_name a INNER JOIN tb_name b ON a.basicpay=b.basicpay WHERE b.name='wgh'

二、INSERT语句

        INSERT [ INTO ] table_name [ ( column_list )] VALUES (data_values)

三、UPDATE语句

        UPDATE <table_name | view_name> SET <column_name>=<expression> [ , ... , <last column_name>=<las expression>]

                         [WHERE <search_condition>]

四、DELETE语句

        DELETE FROM <table_name> [ WHERE <search condition>]

五、备份数据库

         BACKUP DATABASE database_name TO <backup_device> [ WITH [ Differential ] [ [ , ] Format | Noformat ] [ [ ,] {Init | Noinit }]

                           <backup_device> ::= { { Disk | Tape } = 'physical_backup_device_name'}

         // database_name:备份的数据库名称

         // TO:关键字,指定备份设备

        // <backup_device>:一个备份设备,用于存储备份数据,DISK表示在磁盘上存储备份数据, TAPE表示在磁带设备上存

                                            储, 'physical_backup_device_name'表示磁盘或磁带上的物理路径,通常用于指定一个备份文件

        // Differential:指定数据库备份或文件备份应该与上一次完整备份后改变的数据库或文件部分保持一致

        // Format: 表示重写媒体头

        // Noformat: 表示指定媒体头不应写入所有用于该备份操作的卷中,并且不重写该备份设备

        // Init:表示重写所有备份集,但保留媒体头

        // Noinit:表示备份集将追加到指定的磁盘或磁带设备上,以保留现有的备份集,该选项是默认设置

        例:在JavaBean "ConnDB"中增加executeCall( ) 方法:

                  public int executeCall (String sql ){

                         int result=0;

                         try{

                                 conn=DriverManager.getConnection

                                           ("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=master:user=sa;password="");

                                 CallableStatement cs=null;

                                 cs=conn.prepareCall(sql);

                                 cs.execute();

                                 result=1;

                          }catch(SQLException e){

                                  result=0;

                                  System.out.println(e.getMessage());

                          }

                          return result;

                  }

                在JSP中调用:

                <jsp:useBean id="conn" class="com.ConnDB" scope="page" />

                <%

                      request.setCharacterEncoding("gb2312");

                      String bakname=request.getParameter("bakname");

                      bakname=application.getRealPath("/")+"backup//"+bakname;

                      try{

                             String sql="BACKUP DATABASE db_jsdq11 TO DISK='"+bakname+" ' ";

                             int rtn=conn.executeCall(sql);

                             if(rtn==1){

                                     out.print("<script language='javascript'>alert('Database backup complete!');

                                                        window.location.href='index.jsp';</script>");

                                     System.out.println("Database backup location:"+bakname);

                             }else{

                                     out.print("<script language='javascript'>alert('Database backup failed!");

                                                        window.location.href='index.jsp';</script>);

                             }

                      }catch(SQLException e){

                             System.out.println("Database backup failed reason: "+e.getMessage( ));

                      }

                     conn.close();

                %>

          对于备份到磁盘的情况,如果输入一个相对路径名,备份文件将存储到默认的备份目录中,该目录在安装时被设置并存储

         在KEY_LOCAL_MACHINE/Software/Microsoft/MSSQLServer/MSSQLServer目录下的BackupDirection注册表键值中

六、还原数据库

        RESTORE DATABASE database_name [ From <backup_device> [ , ... n]] [With [ File=file_number] ]

        在进行还原时,保证当前没有用户访问要还原的数据库,否则会导致还原操作失败

七、附加数据库

        sp_attach_db [ @dbname= ] 'dbname' , [ @filename1=] 'filename_n' [ , ... ]

        // [ @dbname=] 'dbname':要附加到服务器的数据库的名称,该名称必须是唯一的

        // dbname:数据类型为sysname, 默认值为null

        // [ @filename1= ] 'filename_n':数据库文件的物理名称,包括路径。filename_n的数据类型为nvarchar(260),默认值为null。最多

                                                             可指定16个文件名,参数名称以@filename1开始,递增到@filename16。文件名列表必须包括

                                                              主文件,主文件包含指向数据库中其他文件的系统表。该列表还必须包括数据库分离后所有

                                                              被移动的文件。

原创粉丝点击