一:基本的SELECT 语句

select [ALL|DISTINCT] [TOP() [PERCENT] [WITH TIES] ] [FROM ][WHERE ][GROUP BY ][HAVING ][ORDER BY ][[FOR XML {RAW|AUTO|EXPLICIT|PATH[()]}[, xmldata][,elements][,BINARY base 64]][OPTION(,[,...n])]


   1:SELECT 语句 和FROM 语句

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

SELECT @price = startMoneyFROMProductWHEREid = @goodsId

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

SELECT startMoneyFROMProductWHEREid = @goodsId

select 哪一列 返回哪一列

SELECT startMoneyFROMProductWHEREid = 60

执行结果
SouthEast

SouthEast


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

查出来所有的表:

SouthEast

SouthEast


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

   2:WHERE 子句

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

SouthEast


例子:

SELECT id , categoryIdFROMProductWHERE[state] <> 3AND productType &#61; &#64;typeAND convert(VARCHAR(10), productDate, 120) BETWEEN convert(VARCHAR(10), getdate(), 120) AND convert(VARCHAR(10), getdate() &#43; 3, 120)


上面使用了<>  AND  &#61;  BETWEEN  AND

简单点说&#xff1a;where 控制的是某个列的值要满足某种条件

   3&#xff1a;ORDER BY 子句

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


SouthEast

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



SouthEastSouthEast


小结一下&#xff1a;

   1&#xff1a;select 控制查询结果

   2&#xff1a;from 控制查询数据的源头&#xff08;哪个表&#xff09;

   3&#xff1a;where&#xff1a;控制查询的条件&#xff08;满足什么样条件的数据&#xff09;

   4&#xff1a;order by &#xff1a;控制查询结果的排序

SouthEast


   4&#xff1a;使用GROUP BY 子句聚合数据

 group by 和order by 很像

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

 group&#xff1a;群 &#xff0c;组  group by 是以群&#xff0c;组&#xff0c;为单位进行排序  &#xff0c;输出结果也是 &#xff1a;一组只能占一个记录  

先看&#xff1a;没有group by 的 搜索结果

SouthEast

SouthEast


使用了group by 之后  &#xff0c;group之后sum求和返回的是某一组的和  否则 返回所有列的和&#xff08;只有一个select的情况下&#xff09;

SouthEast


记住以下例子&#xff1a;

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

比如 sum &#xff08;productID&#xff09;是对以employeeID分组的的结果 一个组的productid的相加和


注意&#xff1a;

1&#xff1a;使用GROUP BY 子句中&#xff0c;select 列表只有两种1&#xff1a;聚合列2&#xff1a;group by中的包括的列

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


SouthEastSouthEast


SouthEastSouthEast



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


SouthEast


聚合函数

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

AVG  

MAX/MIN

COUNT&#xff08;&#xff09;计算返回的行数  count &#xff08;&#xff09;不会忽略NULL值


SouthEast



聚合信息

先补充下AS的基本知识&#xff1a;给返回结果提供一个列名&#xff08;返回的是一个表&#xff09;返回max&#xff08;buyMoney&#xff09;值 在buyMoney列名下

SELECT max(buyMoney) AS buyMoneyFROMBuyHistoryWHEREproductId &#61; &#64;goodsId


SouthEastSouthEast



SELECT &#64;price AS buyMoney, &#64;state AS [state], &#64;zongCount AS zongCount, &#64;date AS endTime, &#64;delayNo AS delayNo
END


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

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


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

   5&#xff1a;使用 HAVING 子句给分组设置条件

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


SouthEast

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

SouthEast

   6&#xff1a;使用 FOR XML 子句输出XML

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

   7&#xff1a;通过 OPTION子句 利用提示

最优化运行SQL查询

   8&#xff1a;DISTINCT 和ALL谓词

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

COUNT&#xff08;DISTINCT[state]&#xff09;


SouthEast

SouthEast


二&#xff1a;使用INSERT语句添加数据

SouthEast

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


INTO 没有太大意义&#xff0c;只是增强可读性。

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

   1&#xff1a;多行插入

仅需逗号将括号隔开即可&#xff1a;&#xff08;&#xff09;&#xff0c;&#xff08;&#xff09;&#xff0c;&#xff08;&#xff09;

SouthEast

   2&#xff1a;insert into ... select语句

一次插入一个数据块

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

SouthEast

三&#xff1a;使用UPDATE语句更改数据

update 基本语法

SouthEast

四&#xff1a;DELETE 语句

每次删除都是删除整个记录&#xff0c;所以不存在列名

delete [Look]
where id &#61; 8

delete FROM [Look]
where id &#61; 8


都是一样

五&#xff1a;小结

T_SQL是SQL的方言版&#xff0c;大部分都相同