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
执行结果
注意:INFORMATION_SCHEMA 特定路径 可以查出数据库系统信息
查出来所有的表:
SELECT 列表由查询中SELECT查询中要求输出的列名组成
2:WHERE 子句
返回记录的限制条件 where 子句运算符
例子:
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表中有该列就可以了
SELECT * --相同的state 按照电话号码降序排列 FROM Employee ORDER BY state ,phoneNo DESC
小结一下:
1:select 控制查询结果
2:from 控制查询数据的源头(哪个表)
3:where:控制查询的条件(满足什么样条件的数据)
4:order by :控制查询结果的排序
4:使用GROUP BY 子句聚合数据
group by 和order by 很像
order by 是 单个 为单位进行排序
group:群 ,组 group by 是以群,组,为单位进行排序 ,输出结果也是 :一组只能占一个记录
先看:没有group by 的 搜索结果
使用了group by 之后 ,group之后sum求和返回的是某一组的和 否则 返回所有列的和(只有一个select的情况下)
记住以下例子:
小结一下 select 的其中一项是对一组数据的一个处理结果。
比如 sum (productID)是对以employeeID分组的的结果 一个组的productid的相加和
注意:
1:使用GROUP BY 子句中,select 列表只有两种1:聚合列2:group by中的包括的列
2:反之 如果在select 列表中使用了聚合列 有两种选择:1:所有的列都必须是聚合列 2:必须得有order by 子句 ,oder by 的列不要求是聚合列----也就是说不是聚合语句的必须包含在group by 里面
也可以基于多列分组:只需要在多列列名之间加逗号 即可
聚合函数
聚合函数常用于Group BY 子句 用于聚合分组的数据。
AVG
MAX/MIN
COUNT()计算返回的行数 count ()不会忽略NULL值
等
聚合信息
先补充下AS的基本知识:给返回结果提供一个列名(返回的是一个表)返回max(buyMoney)值 在buyMoney列名下
SELECT max(buyMoney) AS buyMoney FROM BuyHistory WHERE productId = @goodsId
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的子句中
Having 是对组的内容的条件限制
6:使用 FOR XML 子句输出XML
输出XML结果 第十六章详细介绍
7:通过 OPTION子句 利用提示
最优化运行SQL查询
8:DISTINCT 和ALL谓词
这两个谓词和 重复数据有关
COUNT(DISTINCT[state])
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:多行插入
仅需逗号将括号隔开即可:(),(),()
2:insert into ... select语句
一次插入一个数据块
--------注意第十一章的批处理操作
update 基本语法
每次删除都是删除整个记录,所以不存在列名
delete [Look] where id = 8
delete FROM [Look]
where id = 8
都是一样
T_SQL是SQL的方言版,大部分都相同