☻基本的一些常识

Day1

标准版 Standard

企业版 Enterprise

开发版 Developer

Express版 

文件组是现代词,是一个专有名词,指的是SQL文件组就是文件的逻辑集合。

目的

它的目的是为了方便数据的管理和分配.文件组可以把指定是文件组合在一起。

临时表

Select * into  #temp  from sys.objects

 

数据库文件

 

 

配置SQLServer

 

常用数据库操作

 

数据库级别:可以分内存,分cpu核数给SQLServer

创建,修改

     选项:恢复模式、Owner等

     文件

     文件组

联机、离线数据库

分离数据库  附加数据库——数据库可以拷走。

备份、恢复数据库 —— 一般是完整、差异、日志备份三种都用。

完整备份可以一月备份一次

差异备份可以一天备份一次

 

收缩数据库

删除数据库

 

索引

 

聚集索引

索引和内容的物理位置都是有序的,索引后面紧跟内容。

非聚集索引,就类似也按偏旁部首查字。

 

视图

就是起了个包装作用,就是把比较复杂的sql查询包装成一个视图,然后我们就可以通过查询该视图得到我们想要的数据。

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Day2 

数据库查询

 

子查询,深入理解:

1.Select   中的某个字段,可不可以用子查询做? 可以的

子查询可以用在select中的,这里只能返回一个字段值

子查询可以用在from后的,这里返回一个集合。

 

 

2.查询优化

            需要哪些字段就查哪些字段,差多了没有用就会慢了。

  

3.什么时候,需要创建一个临时表

    什么时候不用创建,就写select  into #table  from  

            上面的两种方式用法一样,就写select  into #table  from 是快捷操作。

 

    两种方式各有优缺点

直接创建的临时表,表里面有已经创建好的我需要的字段名,

   b.     就写select  into #table  from创建的临时表相对上面的不是固定的字段名,只是查出来的字段插入到临时表中了。

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Day3

给变量赋值

Set

Select

两个赋值语句内部执行的复杂度差不多一样,因此我们推荐使用select 赋值语句,因为select语句可以带from做查询赋值。

存储过程中如何输出参数

 

在存储过程的定义变量中要定义一个接收输出参数的变量,在存储过程中需要输出的字段后跟out   ,这样就可以把输出参数的值赋给定义好的变量了。

 

Sq_helptext 存储过程名

意思是输出存储过程的定义内容。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

☻删除姓名、年龄重复的记录(常考)

Id  name  age  salary
1   yzk    80  1000
2   yzk    80  2000
3   tom    20  20000
4   tom    20  20000
5   im     20  20000
 
//取得不重复的数据
select * from Persons
where Id in
(
SELECT  MAX(Id) AS Expr1
FROM Persons
GROUP BY Name, Age
)

 

根据姓名、年龄分组,取出每组的Id最大值,然后将Id最大值之外的排除。

删除重复的数据:

delete from Persons
where Id not in
(
SELECT MAX(Id) AS Expr1
FROM Persons
GROUP BY Name, Age
)

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

☻数据修改包括:添加数据,更改数据,删除数据。

1.添加数据

添加数据包含两种方式,一种是一次插入一条数据(单行数据插入),另一种是一次添加一批数据(多行数据插入)。

插入单行数据的语句:

INSERT   INTO Table_name(列名……) VALUES(值列表)

插入多行数据的语句:

INSERT   INTO  Table_name(列名……)  SELECT ……

插入数据

①SELECT  INTO

SELECT   INTO语句不向调用者返回结果集,而是创建一个包含查询结果集的新表。

例如:SELECT *

              INTO  dbo.MyOrders

              FROM Northwind.dbo.Orders

 

从其他数据库中查询数据插入到目表数据库(过程分析:查询数据——创建表——插入数据)

SELECT   *
INOT   NEW_TableName                 //这里注意:NEW_TableName  是物理上的表,如果是想使用临时表则是表名前带"#"
FROM  NorthWind.dbo.TableName
WHERE  ……

☻ROWNUM()函数的用法。

例:

SELECT CustomerID,ROW_NUMBER()OVER(ORDER BY CUSTOMERID) AS RN

FROM Northwind.dbo.Customers

WHERE Country =N'UK'

ROWNUM()函数的返回值是行号。

2.更新数据

更新数据指的是修改表中的列的值

UPDATE   Table_name  SET  列名=值 ,…… WHERE  ……

用WHERE子句指定更新数据的条件时,分为两种情况:一种是基于本表条件的更新,即要更新的记录和更新记录的条件在同一张表中。另一种是基于其他表条件的更新,即要更新的记录在一张表中,而更新的条件来自其他表。基于其他表条件的更新的实现方法有两种:一种是使用多表连接的方式实现,另一种是使用子查询实现。

例1:基于本表条件的更新。将商品名为“最新款光波炉”的商品的单价降低100元。

 

UPDATE     Table_Goods     SET    SaleUnitPrice=SaleUnitPrice-- 100
         WHERE      GoodsName = "最新款光波炉"

例2:基于其他表条件的更新。将家用电器类商品的单价降低5%

   ①用子查询实现

   

UPDATE     Table_Goods  SET  SaleUnitPrice=SaleUnitPrice-SaleUnitPrice*0.05
   WHERE      GoodsClassID   IN(
       SELECT    GoodsClassID   FROM   Table_GoodsClass
       WHERE    GoodsClassName="家用电器" )

   ② 用多表连接实现

  

UPDATE      Table_Goods  SET  SaleUnitPrice=SaleUnitPrice-SaleUnitPrice*0.05
   FROM   Table_Goods A JOIN Table_GoodsClass  B   ON A.GoodsClassID   =B.GoodsClassID  
      WHERE     GoodsClassName="家用电器"

例3:对商品的单价进行分情况修改,家用电器类商品单价降低5%,服装类商品单价增加6%,食品类商品单价降低2%,其他类商品单价不变。

    

UPDATE     Table_Goods  SET  SaleUnitPrice= CASE  GoodsClassName  WHEN '家用电器'  THEN  SaleUnitPrice=SaleUnitPrice-SaleUnitPrice*0.05
                                                                 WHEN '服装'  THEN  SaleUnitPrice=SaleUnitPrice-SaleUnitPrice*0.06
                                                                 WHEN '食品'  THEN  SaleUnitPrice=SaleUnitPrice-SaleUnitPrice*0.02
                                                                 ELSE  SaleUnitPrice
                                                               END
    FROM    Table_Goods A JOIN Table_GoodsClass  B   ON A.GoodsClassID   =B.GoodsClassID

3.删除数据

    删除数据使用的是DELETE 语句

 

DELETE     FROM  Table_Name  WHERE ……
    WHERE 子句说明只删除表中满足where子句条件的记录

。如果省略where子句,则表示要无条件删除表中的全部记录。

     同UPDATE语句一样,删除数据也有无条件删除(删除表中的全部数据)和有条件的删除(删除满足条件的数据)两种。当用where子句指定删除条件时,又分为两种情况:一种是基于本表条件的删除,另一种是基于其他表条件的删除。基于其他表条件的删除可用两种方法实现:一种是使用多表连接实现,另一种是使用子查询实现。

 例1.基于本表条件的删除。删除没有身份证号码的顾客。

       

DELETE    FROM  Table_Customer  WHERE IdentityCard  IS NULL

例2.基于其他表条件的删除。删除销售日期在2000年1月1日之前的销售单据明细表中的记录。

   ① 用于子查询实现

   

DELETE     FROM  Table_SaleBillDetail
       WHERE SaleBillID  IN (
           SELECT   SaleBillID   FROM  Table_SaleBill
            WHERE  SaleDate < '2000/1/1')

  ② 用多表连接实现

     

DELETE     FROM  Table_SaleBillDetail
         FROM  Table_SaleBillDetail  A JOIN Table_SaleBill  B
         ON  A.SaleBillID    =  B.SaleBillID  
                    WHERE   SaleDate < '2000/1/1'

总结:TRUNCATE TABLE  删除表中的数据是不记录日志的,删除数据不可执行回滚操作

              DELETE  FROM 删除表中的数据是记录日志的,删除数据可以执行回滚操作。

TRUNCATE在各种表上无论是大的还是小的都非常快。如果有ROLLBACK命令Delete将被撤销,而TRUNCATE则不会被撤销

 

 

T-SQL 支持基于联接的DELETE 和UPDATE 语法

☻基于联接的DELETE

基于联接的DELETE与基于联接的SELECT 类似。用DELETE  FROM <目标表>  代替SELECT 子句即可,其中的<目标表>是你要从中删除行的表。需要注意的是,如果为表提供了别名则应该指定别名。

='19980506'" src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image001.png" width="576" height="156">