Jandren

  博客园 :: 首页 :: 新随笔 :: 联系 :: :: 管理 ::

首先创建两个表:

CREATE TABLE [dbo].[tb_orderdetail](
 [id] [int] NOT NULL,
 [OrderId] [int] NULL,
 [ProductId] [int] NULL,
 [UnitPrice] [decimal](18, 3) NULL,
 [Quantity] [int] NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[tb_orders](
 [id] [int] NOT NULL,
 [CustomerId] [int] NULL,
 [OrderDate] [datetime] NULL
) ON [PRIMARY]

 

一:insert语句
into 关键字是可选的
values关键字前面的()是可选的,这里是要接收数据的列
values后面,有两种方式提供值
1:显式的给出值  2:从select语句中导出值

insert语句注意几点
1:不要理标志列,系统会给你插入的
2:给出实际的值,如果没有,那就null
3:给出默认的值,default关键字,告诉数据库取默认值

insert into ... select
什么时候会这么用,当成批的数据来自
1:数据库中的另一个表
2:同一台服务器完全不同的数据库
3:另一个SQLSERVER的数据库
4:来自同一个表中的数据
说实在的2和3我从来没用过

好,看一个例子
declare @mytable table(
  id int,
    SortId int
);
insert into @mytable select id,CustomerId From tb_orders;
select * From @mytable;

注意我定义了一个表的对象
每一句之间是用分号隔开的
(id,SortId)  是可以忽略的

二:update语句
看例子
update tb_orders set tb_orders.CustomerId = 20 From tb_orders join tb_orderdetail on tb_orders.id = tb_orderdetail.OrderId
这里用到了join子句,当然是可以用的
如果修改不止一列  只要加一个逗号
set   num = num * 1.2当然可以写表达式

三:delete语句

--select o1.*,o2.* from tb_orders o1 left outer join tb_orderdetail o2 on o1.id = o2.OrderId where o2.id is null;

--delete From tb_orders From tb_orders o1 left outer join tb_orderdetail o2 on o1.id = o2.OrderId where o2.OrderId is null

--删除tb_orders表中的记录在tb_orderdetail表中的记录返回是null的值---即2行为NULL的记录

outer连接将在没有匹配的一端返回null,
这里也就是tb_orderdetail表没有匹配的行是null
注意   is null  的写法

四:select语句

  不好意思,这部分将以后补充,比较多,也是最复杂的一块

五:where子句
1:
=    >     <    >=  <=    <>  !=  !>  !<
其中<>  与 !=都是不相等的意思
!>与!<不怎么常见,但仔细想想也没什么用处 

2:
and   or   not  
如果一个where子句中同时出现这三个操作符
最先评估not   然后是and  然后是or 

3:
between 例子 between 1 and 5    也等于  @myInt >= 1 and @myInt<=5

4:
like   例子:like "xland%"
%和_是通配符
%代表零个或多个任意字符
_表示单个任意字符
把字符包括在方括号中
[a-c]表示a b c都可行
[ab]表示a或b
^与not表示下一个字符将被排除掉 

5:
in  例子  in ( 1,2,3)  表示在此范围内

六:order by子句
order by由于比较常用  我这里就不多说了
1:order by username  是可以识别中文的(sql先把中文转换成拼音再进行排序)
2:可以对 查询到的表中的任何列 进行排序  无论该列是否包含在select列表中
3:基于多个列的order by  
      例如:order by addtime,id
      先按时间排序,再在这个基础上根据id排序,你也看到了,性能是有很大幅度的降低的

七:distinct关键字
select count(distinct Quantity) From tb_orderdetail;

检索某一列中不重复的记录数

八:group by  聚集函数  和 having子句
先看例子:
select OrderId,sum(Quantity) as Total From tb_orderdetail where OrderId between 1 and 20 group by OrderId
注意这里的OrderId在表里是有可能重复的
这个语句的作用是检索出OrderId从1到20的记录,
然后在这个记录集合上  以OrderId分组
把OrderId相同的数据分到一组  (这一组就是最终结果的一条记录)
然后通过sum函数把各组的Quantity数据相加,
结果是最终结果的第二个字段

我发现用group  by子句基本上都是和聚集函数一起用的
举几个聚集函数的例子
sum 求和
avg求平均数
min/max求最大和最小值
count(表达式|*)获取一个查询中的行数
只说说count吧:
count(coloum)如果这一列有null,那么这些null的行将不会计算在内 
count(*)将得到表里的所有行的数目
聚集函数不一定非和group by一起使用不可
(另外avg基本上都是和group by一起使用的)

having子句是在组上放置条件的
看例子
select OrderId,sum(Quantity) as Total From tb_orderdetail where OrderId between 1 and 20 group by OrderId having sum(Quantity)>20
group by得到了一个记录的集合
然后通过having子句,再在这个集合上做筛选

 

  

posted on 2010-07-06 13:57  Jandren  阅读(218)  评论(0)    收藏  举报