一:基本的SELECT 语句

        select [ALL|DISTINCT] [TOP(<expression>) [PERCENT] [WITH TIES] ] <column list>
        [FROM <source tables/views>]
	[WHERE <restrictive condition>]
        [GROUP BY <column name or expression using a  column in the select List>]
	[HAVING <restrictive contidion base on the group by result>]
	[ORDER BY <column list>]
	[[FOR XML {RAW|AUTO|EXPLICIT|PATH[(<element>)]}[, xmldata][,elements][,BINARY base 64]][OPTION(<query hint>,[,...n])]


   1:SELECT 语句 和FROM 语句

从Product  表中 更具goodId 取得 startMoney 字段  并将startMoney 赋值给变量 @price

SELECT @price = startMoney
		FROM
			Product
		WHERE
			id = @goodsId

从Product  表中 更具goodId 取得 startMoney 字段  并将startMoney 赋值给变量 @price

SELECT startMoney
		FROM
			Product
		WHERE
			id = @goodsId

select 哪一列 返回哪一列

	SELECT startMoney
		FROM
			Product
		WHERE
			id = 60

执行结果
SouthEast

SouthEast


注意:INFORMATION_SCHEMA  特定路径 可以查出数据库系统信息

查出来所有的表:

SouthEast

SouthEast


SELECT 列表由查询中SELECT查询中要求输出的列名组成

   2:WHERE 子句

返回记录的限制条件  where 子句运算符

SouthEast


例子:

                        SELECT id , categoryId
			FROM
				Product
			WHERE
				[state] <> 3
				AND productType = @type
				AND convert(VARCHAR(10), productDate, 120) BETWEEN convert(VARCHAR(10), getdate(), 120) AND convert(VARCHAR(10), getdate() + 3, 120)


上面使用了<>  AND  =  BETWEEN  AND

简单点说:where 控制的是某个列的值要满足某种条件

   3:ORDER BY 子句

order by <column name>,下面说的不对  只要from表中有该列就可以了


SouthEast

	SELECT * --相同的state 按照电话号码降序排列
		FROM Employee  
		ORDER BY state ,phoneNo DESC



SouthEastSouthEast


小结一下:

   1:select 控制查询结果

   2:from 控制查询数据的源头(哪个表)

   3:where:控制查询的条件(满足什么样条件的数据)

   4:order by :控制查询结果的排序

SouthEast


   4:使用GROUP BY 子句聚合数据

 group by 和order by 很像

 order by 是  单个  为单位进行排序

 group:群 ,组  group by 是以群,组,为单位进行排序  ,输出结果也是 :一组只能占一个记录  

先看:没有group by 的 搜索结果

SouthEast

SouthEast


使用了group by 之后  ,group之后sum求和返回的是某一组的和  否则 返回所有列的和(只有一个select的情况下)

SouthEast


记住以下例子:

小结一下  select 的其中一项是对一组数据的一个处理结果。

比如 sum (productID)是对以employeeID分组的的结果 一个组的productid的相加和


注意:

1:使用GROUP BY 子句中,select 列表只有两种1:聚合列2:group by中的包括的列

2:反之  如果在select 列表中使用了聚合列 有两种选择:1:所有的列都必须是聚合列 2:必须得有order by 子句 ,oder by 的列不要求是聚合列----也就是说不是聚合语句的必须包含在group by 里面


SouthEastSouthEast


SouthEastSouthEast



也可以基于多列分组:只需要在多列列名之间加逗号 即可


SouthEast


聚合函数

聚合函数常用于Group BY 子句 用于聚合分组的数据。

AVG  

MAX/MIN

COUNT()计算返回的行数  count ()不会忽略NULL值


SouthEast



聚合信息

先补充下AS的基本知识:给返回结果提供一个列名(返回的是一个表)返回max(buyMoney)值 在buyMoney列名下

SELECT max(buyMoney) AS buyMoney
			FROM
				BuyHistory
			WHERE
				productId = @goodsId


SouthEastSouthEast



	SELECT @price AS buyMoney
		 , @state AS [state]
		 , @zongCount AS zongCount
		 , @date AS endTime
		 , @delayNo AS delayNo
END


前面的操作 都是对五个变量进行赋值  最后这个操作是提取出select列表。

       public IList<CateTemp> GetCategoryItem(int typeId)
        {
            IList<CateTemp> list = new List<CateTemp>();
            using (SqlDataReader reader = DBHelper.ExecuteReader("proc_GetCategoryAndProductCount", CommandType.StoredProcedure, new SqlParameter("@type",typeId)))
            {
                while (reader.Read())
                {
                    //一次只read一条出来
                    CateTemp cateTemp = new CateTemp();
                    cateTemp.id = Convert.ToInt32(reader[0].ToString());
                    cateTemp.picUrl = reader[1].ToString();
                    cateTemp.title = reader[2].ToString();
                    cateTemp.update = Convert.ToInt32(reader[3].ToString());
                    list.Add(cateTemp);
                    
                }
            }
  //         list.Sort(new );  
            return list;
        }


Reader 读出来的是一个(数据块)表,where 循环是对这个数据块进行操作,一次取一条,直到最终取完,reader.read()为null

   5:使用 HAVING 子句给分组设置条件

查询条件放到分组之后 用 HAVING 仅用于带有Group By的子句中


SouthEast

Having 是对组的内容的条件限制

SouthEast

   6:使用 FOR XML 子句输出XML

输出XML结果  第十六章详细介绍

   7:通过 OPTION子句 利用提示

最优化运行SQL查询

   8:DISTINCT 和ALL谓词

这两个谓词和 重复数据有关

COUNT(DISTINCT[state])


SouthEast

SouthEast


二:使用INSERT语句添加数据

SouthEast

 INSERT INTO [Artist]    
           ([name]    
           ,[dateofbirth]    
           ,[sex]    
           ,[photo]    
           ,[artistContent]    
           ,[phoneNo]    
           ,[qqNo]    
           ,[email]    
           ,[state]    
           ,[createDate]    
           ,[modifyDate]    
           ,[description])    
     VALUES    
           (@name    
           ,@dateofbirth    
           ,@sex    
           ,@photo    
           ,@artistContent    
           ,@phoneNo    
           ,@qqNo    
           ,@email    
           ,1    
           ,GETDATE()    
           ,null    
           ,@description)    


INTO 没有太大意义,只是增强可读性。

显式列列表:则值列对应,不显示列表 则默认一一对应。例外的是IDENTITY(ID 自动填充),注意:数据类型要匹配

   1:多行插入

仅需逗号将括号隔开即可:(),(),()

SouthEast

   2:insert into ... select语句

一次插入一个数据块

--------注意第十一章的批处理操作

SouthEast

三:使用UPDATE语句更改数据

update 基本语法

SouthEast

四:DELETE 语句

每次删除都是删除整个记录,所以不存在列名

delete  [Look]
where id = 8

delete FROM [Look]
where id = 8


都是一样

五:小结

T_SQL是SQL的方言版,大部分都相同