一:基本的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
执行结果
注意: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语句添加数据
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语句更改数据
update 基本语法
四:DELETE 语句
每次删除都是删除整个记录,所以不存在列名
delete [Look]
where id = 8
delete FROM [Look]
where id = 8
都是一样
五:小结
T_SQL是SQL的方言版,大部分都相同
转载于:https://blog.51cto.com/dingyusong/1350459