我的亿家我的亿家程序SQL数据库 30条经典的SQL语句,或是T-SQL语句

1  /  2  页   12 跳转 查看:1817

30条经典的SQL语句,或是T-SQL语句

30条经典的SQL语句,或是T-SQL语句

那就贴一个吧:
DECLARE  @idoc  int
DECLARE  @doc  varchar(1000)
SET  @doc  = '
<ROOT>
<Customer  CustomerID= "VINET "  C>
      <Order  CustomerID= "VINET "  EmployeeID= "5 "  OrderDate= "1996-07-04T00:00:00 ">
            <OrderDetail  OrderID= "10248 "  ProductID= "11 "  Quantity= "12 "/>
            <OrderDetail  OrderID= "10248 "  ProductID= "42 "  Quantity= "10 "/>
      </Order>
</Customer>
<Customer  CustomerID= "LILAS "  C>
      <Order  CustomerID= "LILAS "  EmployeeID= "3 "  OrderDate= "1996-08-16T00:00:00 ">
            <OrderDetail  OrderID= "10283 "  ProductID= "72 "  Quantity= "3 "/>
      </Order>
</Customer>
</ROOT> '
--Create  an  internal  representation  of  the  XML  document.
EXEC  sp_xml_preparedocument  @idoc  OUTPUT,  @doc
--  Execute  a  SELECT  statement  that  uses  the  OPENXML  rowset  provider.
SELECT        *
FROM              OPENXML  (@idoc,  '/ROOT/Customer ',1)
                        WITH  (CustomerID    varchar(10),
                                    ContactName  varchar(20))
EXEC  sp_xml_removedocument  @idoc
我的亿家社区,请大家多支持!
 

回复:30条经典的SQL语句,或是T-SQL语句

关于索引,推荐转载的这篇文章
http://blog.csdn.net/dutguoyi/archive/2006/01/10/575617.aspx

改善SQL语句的效率
http://community.csdn.net/Expert/topic/5087/5087396.xml?temp=.345669
数据量很大怎样加快索检速度
http://community.csdn.net/Expert/topic/5058/5058320.xml?temp=.1229517
索引建立方法的区别
http://community.csdn.net/Expert/topic/5068/5068154.xml?temp=.3010218
频繁插入删除数据需要更新索引
http://community.csdn.net/Expert/topic/4937/4937910.xml?temp=.8428614
测试了一下sql  server  2005  全文检索
http://community.csdn.net/Expert/topic/4878/4878430.xml?temp=.6049311

其他关于效率的高频问题

判断一个表的数据不在另一个表中最优秀方法?
http://community.csdn.net/Expert/topic/5038/5038742.xml?temp=.4704553
删除千万级表中重复记录的办法
http://community.csdn.net/Expert/topic/5089/5089261.xml?temp=.7907068

数据库数据查询变得不正常类型问题

大数据量,稳定运行一段时候以后无法得到查询结果。
http://community.csdn.net/Expert/topic/4810/4810464.xml?temp=9.014529E-02
我的亿家社区,请大家多支持!
 

回复:30条经典的SQL语句,或是T-SQL语句

返回表的字段名称

select  name  from  syscolumns  where  id=object_id( 'jobs ')
 

回复:30条经典的SQL语句,或是T-SQL语句

一些不错的sql语句,自己根据需要收藏吧,分给多点哦
1、说明:复制表(只复制结构,源表名:a  新表名:b)  (Access可用)
法一:select  *  into  b  from  a  where  1 <> 1
法二:select  top  0  *  into  b  from  a

2、说明:拷贝表(拷贝数据,源表名:a  目标表名:b)  (Access可用)
insert  into  b(a,  b,  c)  select  d,e,f  from  b;

3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径)  (Access可用)
insert  into  b(a,  b,  c)  select  d,e,f  from  b  in  ‘具体数据库’  where  条件
例子:..from  b  in  ' "&Server.MapPath( ". ")& "\data.mdb "  & " '  where..

4、说明:子查询(表名1:a  表名2:b)
select  a,b,c  from  a  where  a  IN  (select  d  from  b  )  或者:  select  a,b,c  from  a  where  a  IN  (1,2,3)

5、说明:显示文章、提交人和最后回复时间
select  a.title,a.username,b.adddate  from  table  a,(select  max(adddate)  adddate  from  table  where  table.title=a.title)  b

6、说明:外连接查询(表名1:a  表名2:b)
select  a.a,  a.b,  a.c,  b.c,  b.d,  b.f  from  a  LEFT  OUT  JOIN  b  ON  a.a  =  b.c

7、说明:在线视图查询(表名1:a  )
select  *  from  (SELECT  a,b,c  FROM  a)  T  where  t.a  >  1;

8、说明:between的用法,between限制查询数据范围时包括了边界值,not  between不包括
select  *  from  table1  where  time  between  time1  and  time2
select  a,b,c,  from  table1  where  a  not  between  数值1  and  数值2

9、说明:in  的使用方法
select  *  from  table1  where  a  [not]  in  (‘值1’,’值2’,’值4’,’值6’)

10、说明:两张关联表,删除主表中已经在副表中没有的信息 
delete  from  table1  where  not  exists  (  select  *  from  table2  where  table1.field1=table2.field1  )

11、说明:四表联查问题:
select  *  from  a  left  inner  join  b  on  a.a=b.b  right  inner  join  c  on  a.a=c.c  inner  join  d  on  a.a=d.d  where  .....

12、说明:日程安排提前五分钟提醒 
SQL:  select  *  from  日程安排  where  datediff( 'minute ',f开始时间,getdate())> 5

13、说明:一条sql  语句搞定数据库分页
select  top  10  b.*  from  (select  top  20  主键字段,排序字段  from  表名  order  by  排序字段  desc)  a,表名  b  where  b.主键字段  =  a.主键字段  order  by  a.排序字段

14、说明:前10条记录
select  top  10  *  form  table1  where  范围

15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
select  a,b,c  from  tablename  ta  where  a=(select  max(a)  from  tablename  tb  where  tb.b=ta.b)

16、说明:包括所有在  TableA  中但不在  TableB和TableC  中的行并消除所有重复行而派生出一个结果表
(select  a  from  tableA  )  except  (select  a  from  tableB)  except  (select  a  from  tableC)

17、说明:随机取出10条数据
select  top  10  *  from  tablename  order  by  newid()

18、说明:随机选择记录
select  newid()

19、说明:删除重复记录
Delete  from  tablename  where  id  not  in  (select  max(id)  from  tablename  group  by  col1,col2,...)

20、说明:列出数据库里所有的表名
select  name  from  sysobjects  where  type= 'U ' 

21、说明:列出表里的所有的
select  name  from  syscolumns  where  id=object_id( 'TableName ')

22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select  中的case。
select  type,sum(case  vender  when  'A '  then  pcs  else  0  end),sum(case  vender  when  'C '  then  pcs  else  0  end),sum(case  vender  when  'B '  then  pcs  else  0  end)  FROM  tablename  group  by  type
显示结果:
type  vender  pcs
电脑  A  1
电脑  A  1
光盘  B  2
光盘  A  2
手机  B  3
手机  C  3

23、说明:初始化表table1
TRUNCATE  TABLE  table1

24、说明:选择从10到15的记录
select  top  5  *  from  (select  top  15  *  from  table  order  by  id  asc)  table_别名  order  by  id  desc
 

回复:30条经典的SQL语句,或是T-SQL语句

--如何将exec执行结果放入变量中? 

declare  @num  int, 
@sqls  nvarchar(4000) 
set  @sqls= 'select  @a=count(*)  from  tableName  ' 
exec  sp_executesql  @sqls,N '@a  int  output ',@num  output 
select  @num 


--------------------------------------------------------------------------------

动态sql语句基本语法 
1  :普通SQL语句可以用Exec执行 

eg:  Select  *  from  tableName 
Exec( 'select  *  from  tableName ') 
Exec  sp_executesql  N 'select  *  from  tableName '  --  请注意字符串前一定要加N 

2:字段名,表名,数据库名之类作为变量时,必须用动态SQL 

eg: 
declare  @fname  varchar(20) 
set  @fname  =  'FiledName ' 
Select  @fname  from  tableName  --  错误,不会提示错误,但结果为固定值FiledName,并非所要。 
Exec( 'select  '  +  @fname  +  '  from  tableName ')  --  请注意  加号前后的  单引号的边上加空格 

当然将字符串改成变量的形式也可 
declare  @fname  varchar(20) 
set  @fname  =  'FiledName '  --设置字段名 

declare  @s  varchar(1000) 
set  @s  =  'select  '  +  @fname  +  '  from  tableName ' 
Exec(@s)  --  成功 
exec  sp_executesql  @s  --  此句会报错 


declare  @s  Nvarchar(1000)  --  注意此处改为nvarchar(1000) 
set  @s  =  'select  '  +  @fname  +  '  from  tableName ' 
Exec(@s)  --  成功 
exec  sp_executesql  @s  --  此句正确 

3.  输出参数 
declare  @num  int, 
@sqls  nvarchar(4000) 
set  @sqls= 'select  count(*)  from  tableName ' 
exec(@sqls) 
--如何将exec执行结果放入变量中? 

declare  @num  int, 
@sqls  nvarchar(4000) 
set  @sqls= 'select  @a=count(*)  from  tableName  ' 
exec  sp_executesql  @sqls,N '@a  int  output ',@num  output 
select  @num
 

回复:30条经典的SQL语句,或是T-SQL语句

一些不错的sql语句
1、说明:复制表(只复制结构,源表名:a  新表名:b)  (Access可用)
法一:select  *  into  b  from  a  where  1 <> 1
法二:select  top  0  *  into  b  from  a

2、说明:拷贝表(拷贝数据,源表名:a  目标表名:b)  (Access可用)
insert  into  b(a,  b,  c)  select  d,e,f  from  b;

3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径)  (Access可用)
insert  into  b(a,  b,  c)  select  d,e,f  from  b  in  ‘具体数据库’  where  条件
例子:..from  b  in  ' "&Server.MapPath( ". ")& "\data.mdb "  & " '  where..

4、说明:子查询(表名1:a  表名2:b)
select  a,b,c  from  a  where  a  IN  (select  d  from  b  )  或者:  select  a,b,c  from  a  where  a  IN  (1,2,3)

5、说明:显示文章、提交人和最后回复时间
select  a.title,a.username,b.adddate  from  table  a,(select  max(adddate)  adddate  from  table  where  table.title=a.title)  b

6、说明:外连接查询(表名1:a  表名2:b)
select  a.a,  a.b,  a.c,  b.c,  b.d,  b.f  from  a  LEFT  OUT  JOIN  b  ON  a.a  =  b.c

7、说明:在线视图查询(表名1:a  )
select  *  from  (SELECT  a,b,c  FROM  a)  T  where  t.a  >  1;

8、说明:between的用法,between限制查询数据范围时包括了边界值,not  between不包括
select  *  from  table1  where  time  between  time1  and  time2
select  a,b,c,  from  table1  where  a  not  between  数值1  and  数值2

9、说明:in  的使用方法
select  *  from  table1  where  a  [not]  in  (‘值1’,’值2’,’值4’,’值6’)

10、说明:两张关联表,删除主表中已经在副表中没有的信息 
delete  from  table1  where  not  exists  (  select  *  from  table2  where  table1.field1=table2.field1  )

11、说明:四表联查问题:
select  *  from  a  left  inner  join  b  on  a.a=b.b  right  inner  join  c  on  a.a=c.c  inner  join  d  on  a.a=d.d  where  .....

12、说明:日程安排提前五分钟提醒 
SQL:  select  *  from  日程安排  where  datediff( 'minute ',f开始时间,getdate())> 5

13、说明:一条sql  语句搞定数据库分页
select  top  10  b.*  from  (select  top  20  主键字段,排序字段  from  表名  order  by  排序字段  desc)  a,表名  b  where  b.主键字段  =  a.主键字段  order  by  a.排序字段

14、说明:前10条记录
select  top  10  *  form  table1  where  范围

15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
select  a,b,c  from  tablename  ta  where  a=(select  max(a)  from  tablename  tb  where  tb.b=ta.b)

16、说明:包括所有在  TableA  中但不在  TableB和TableC  中的行并消除所有重复行而派生出一个结果表
(select  a  from  tableA  )  except  (select  a  from  tableB)  except  (select  a  from  tableC)

17、说明:随机取出10条数据
select  top  10  *  from  tablename  order  by  newid()

18、说明:随机选择记录
select  newid()

19、说明:删除重复记录
Delete  from  tablename  where  id  not  in  (select  max(id)  from  tablename  group  by  col1,col2,...)

20、说明:列出数据库里所有的表名
select  name  from  sysobjects  where  type= 'U '
我的亿家社区,请大家多支持!
 

回复:30条经典的SQL语句,或是T-SQL语句

1.日期算當月天數:
      select  Day(dateadd(day,-1,convert(datetime,convert(char(07),dateadd(m,1,getdate()),120)+ '-01 ')))
      select  32-Day(getdate()+(32-Day(getdate())))

2.簡單的分割字串:
      用 '  union  all  select  'replace '分割符 '
我的亿家社区,请大家多支持!
 

回复:30条经典的SQL语句,或是T-SQL语句

--修改用户数据库的排序规则
ater  database  dbname  collate  SQL_Latin1_General_CP1_CI_AS


--修改字段的排序规则
alter  table  a  alter  column  c2  varchar(50)  collate  SQL_Latin1_General_CP1_CI_AS


--按姓氏笔画排序
select  *  from  表名  order  by  列名  Collate  Chinese_PRC_Stroke_ci_as 


--按拼音首字母排序
select  *  from  表名  order  by  列名  Collate  Chinese_PRC_CS_AS_KS_WS


--查找一个Server下含有某个表名的数据库名字
EXEC  sp_msforeachdb  '
USE  [?]
IF  OBJECT_ID(N ' '表名 ' ')  IS  NOT  NULL
PRINT  N ' '? ' ' '


--查询所有表名、字段名及字段描述
select 
        表名=object_name(id), 
        列名=col_name(object_id(object_name(id)),smallid), 
        描述=value 
from    sysproperties 


--查询所有表的记录数明细
--方法(1)
select   
        a.name,b.rows   
from   
        sysobjects  a,  sysindexes  b
where   
        a.name=b.name  and    a.type= 'u ' 
--方法(2)
sp_msforeachtable  'select  ' '? ' '  as  ' '表名 ' ',(select  sum(1)  from  ?)  as  ' '记录数 ' ' ' 


--复制表(表结构)
--方法(1)
select  *  into  Employee_bak  from  Employee  where  1 <> 1
--方法(2)
select  top  0  *  into  Employee_bak  from  Employee
--方法(3)
--企业管理器中的右键表--> 复制,然后在查询分析器中粘贴查看SQL语句


--判断两字符是否完全(区分大小写)相等(如何判断字符的大小写)
declare    @v    nvarchar(10)   
declare    @p    nvarchar(10)   
set    @v= 'NIPSAN '   
if    cast(@v  as    varbinary)=  cast(@p  as  varbinary)   
        print  N '相等 '   
else       
        print  N '不等 '   


--得到数据库中所有表的空间/记录情况
exec  sp_MSForEachTable 
@precommand=N '
create  table  ##(
id  int  identity,
表名  sysname,
字段数  int,
记录数  int,
保留空间  Nvarchar(10),
使用空间  varchar(10),
索引使用空间  varchar(10),
未用空间  varchar(10)) ',
@command1=N 'insert  ##(表名,记录数,保留空间,使用空间,索引使用空间,未用空间)  exec  sp_spaceused  ' '? ' '

update  ##  set  字段数=(select  count(*)  from  syscolumns  where  id=object_id( ' '? ' ')) 
where  id=scope_identity() ',  @postcommand=N 'select  *  from  ##  order  by  id  drop  table  ## '


--查看硬盘分区:
EXEC  master..xp_fixeddrives


--Order  By的一个小技巧
/*
Order  By可以指定列序而不用指定列名,在下面的例子里说明它的用处(注意,第三列未指定别名)
Select  a.ID,a.Name,(Select  Count(*)  From  TableB  b  Where  a.ID=b.PID)  From  TableA  a  Order  By  3
*/
我的亿家社区,请大家多支持!
 

回复:30条经典的SQL语句,或是T-SQL语句

表结构新

SELECT 
表名=case  when  a.colorder=1  then  d.name  else  ' '  end,
表说明=case  when  a.colorder=1  then  isnull(f.value, ' ')  else  ' '  end,
字段序号=a.colorder,
字段名=a.name,
标识=case  when  COLUMNPROPERTY(  a.id,a.name, 'IsIdentity ')=1  then  '√ 'else  ' '  end,
主键=case  when  exists(SELECT  1  FROM  sysobjects  where  xtype= 'PK '  and  parent_obj=a.id  and  name  in  (
SELECT  name  FROM  sysindexes  WHERE  indid  in(
SELECT  indid  FROM  sysindexkeys  WHERE  id  =  a.id  AND  colid=a.colid
)))  then  '√ '  else  ' '  end,
类型=b.name,
占用字节数=a.length,
长度=COLUMNPROPERTY(a.id,a.name, 'PRECISION '),
小数位数=isnull(COLUMNPROPERTY(a.id,a.name, 'Scale '),0),
允许空=case  when  a.isnullable=1  then  '√ 'else  ' '  end,
默认值=isnull(e.text, ' '),
字段说明=isnull(g.[value], ' '),
索引名称=isnull(h.索引名称, ' '),
索引顺序=isnull(h.排序, ' ')
FROM  syscolumns  a
left  join  systypes  b  on  a.xtype=b.xusertype
inner  join  sysobjects  d  on  a.id=d.id    and  d.xtype= 'U '  and  d.status> =0
left  join  syscomments  e  on  a.cdefault=e.id
left  join  sysproperties  g  on  a.id=g.id  and  a.colid=g.smallid   
left  join  sysproperties  f  on  d.id=f.id  and  f.smallid=0
left  join(--这部分是索引信息,如果要显示索引与表及字段的对应关系,可以只要此部分
select  索引名称=a.name,c.id,d.colid
,排序=case  indexkey_property(c.id,b.indid,b.keyno, 'isdescending ')
when  1  then  '降序 '  when  0  then  '升序 '  end
from  sysindexes  a
join  sysindexkeys  b  on  a.id=b.id  and  a.indid=b.indid
join  (--这里的作用是有多个索引时,取索引号最小的那个
select  id,colid,indid=min(indid)  from  sysindexkeys
group  by  id,colid)  b1  on  b.id=b1.id  and  b.colid=b1.colid  and  b.indid=b1.indid
join  sysobjects  c  on  b.id=c.id  and  c.xtype= 'U '  and  c.status> =0
join  syscolumns  d  on  b.id=d.id  and  b.colid=d.colid
where  a.indid  not  in(0,255)
)  h  on  a.id=h.id  and  a.colid=h.colid
--where  d.name= '要查询的表 '        --如果只查询指定表,加上此条件
order  by  a.id,a.colorder


--索引信息

--索引信息
select  索引名称=case  when  b.keyno=1  then  a.name  else  ' '  end
,表名=case  when  b.keyno=1  then  c.name  else  ' '  end
,列名=d.name
,排序=case  indexkey_property(c.id,b.indid,b.keyno, 'isdescending ')
when  1  then  '降序 '  when  0  then  '升序 '  end
,聚集=INDEXPROPERTY(c.id,a.name, 'IsClustered ')
,唯一=case  INDEXPROPERTY(c.id,a.name, 'IsUnique ')
when  0  then  '非唯一 '
when  1  then  case  when  e.id  is  null  then  '唯一索引 '  else  '唯一约束 '  end
end
,e.name
,填充因子=a.OrigFillFactor
from  sysindexes  a
join  sysindexkeys  b  on  a.id=b.id  and  a.indid=b.indid
-- join  (--这里的作用是有多个索引时,取索引号最小的那个
-- select  id,colid,indid=min(indid)  from  sysindexkeys
-- group  by  id,colid)  b1  on  b.id=b1.id  and  b.colid=b1.colid  and  b.indid=b1.indid
join  sysobjects  c  on  b.id=c.id  and  c.xtype= 'U '  and  c.status> =0
join  syscolumns  d  on  b.id=d.id  and  b.colid=d.colid
left  join  sysobjects  e  on  b.indid=e.id  and  e.xtype= 'UQ '
where  a.indid  not  in(0,255)
order  by  c.name,a.name
我的亿家社区,请大家多支持!
 

回复:30条经典的SQL语句,或是T-SQL语句

--1、查找员工的编号、姓名、部门和出生日期,如果出生日期为空值,
--显示日期不详,并按部门排序输出,日期格式为yyyy-mm-dd。
select  emp_no  ,emp_name  ,dept  ,
              isnull(convert(char(10),birthday,120), '日期不详 ')  birthday
from  employee
order  by  dept

--2、查找与喻自强在同一个单位的员工姓名、性别、部门和职称
select  emp_no,emp_name,dept,title
from  employee
where  emp_name <> '喻自强 '  and  dept  in
      (select  dept  from  employee
        where  emp_name= '喻自强 ')

--3、按部门进行汇总,统计每个部门的总工资
select  dept,sum(salary)
from  employee
group  by  dept

--4、查找商品名称为14寸显示器商品的销售情况,
--显示该商品的编号、销售数量、单价和金额
select  a.prod_id,qty,unit_price,unit_price*qty  totprice
from  sale_item  a,product  b
where  a.prod_id=b.prod_id  and  prod_name= '14寸显示器 '

--5、在销售明细表中按产品编号进行汇总,统计每种产品的销售数量和金额
select  prod_id,sum(qty)  totqty,sum(qty*unit_price)  totprice
from  sale_item
group  by  prod_id

--6、使用convert函数按客户编号统计每个客户1996年的订单总金额
select  cust_id,sum(tot_amt)  totprice
from  sales
where  convert(char(4),order_date,120)= '1996 '
group  by  cust_id

--7、查找有销售记录的客户编号、名称和订单总额
select  a.cust_id,cust_name,sum(tot_amt)  totprice
from  customer  a,sales  b
where  a.cust_id=b.cust_id
group  by  a.cust_id,cust_name

--8、查找在1997年中有销售记录的客户编号、名称和订单总额
select  a.cust_id,cust_name,sum(tot_amt)  totprice
from  customer  a,sales  b
where  a.cust_id=b.cust_id  and  convert(char(4),order_date,120)= '1997 '
group  by  a.cust_id,cust_name

--9、查找一次销售最大的销售记录
select  order_no,cust_id,sale_id,tot_amt
from  sales
where  tot_amt=
      (select  max(tot_amt)
        from  sales)

--10、查找至少有3次销售的业务员名单和销售日期
select  emp_name,order_date
from  employee  a,sales  b 
where  emp_no=sale_id  and  a.emp_no  in
    (select  sale_id
      from  sales
      group  by  sale_id
      having  count(*)> =3)
order  by  emp_name

--11、用存在量词查找没有订货记录的客户名称
select  cust_name
from  customer  a
where  not  exists
      (select  *
        from  sales  b
        where  a.cust_id=b.cust_id)

--12、使用左外连接查找每个客户的客户编号、名称、订货日期、订单金额
--订货日期不要显示时间,日期格式为yyyy-mm-dd
--按客户编号排序,同一客户再按订单降序排序输出
select  a.cust_id,cust_name,convert(char(10),order_date,120),tot_amt
from  customer  a  left  outer  join  sales  b  on  a.cust_id=b.cust_id
order  by  a.cust_id,tot_amt  desc

--13、查找16M  DRAM的销售情况,要求显示相应的销售员的姓名、
--性别,销售日期、销售数量和金额,其中性别用男、女表示
select  emp_name  姓名,  性别=  case  a.sex    when  'm '  then  '男 '
                                                                              when  'f '  then  '女 ' 
                                                                              else  '未 '
                                                                              end,
                销售日期=  isnull(convert(char(10),c.order_date,120), '日期不详 '),
                qty  数量,  qty*unit_price  as  金额
from  employee  a,  sales  b,  sale_item  c,product  d
where  d.prod_name= '16M  DRAM '  and  d.pro_id=c.prod_id  and
            a.emp_no=b.sale_id  and  b.order_no=c.order_no

--14、查找每个人的销售记录,要求显示销售员的编号、姓名、性别、
--产品名称、数量、单价、金额和销售日期
select  emp_no  编号,emp_name  姓名,  性别=  case  a.sex  when  'm '  then  '男 '
                                                                              when  'f '  then  '女 ' 
                                                                              else  '未 '
                                                                              end,
            prod_name  产品名称,销售日期=  isnull(convert(char(10),c.order_date,120), '日期不详 '),
            qty  数量,  qty*unit_price  as  金额
from  employee  a  left  outer  join  sales  b  on  a.emp_no=b.sale_id  ,  sale_item  c,product  d
where  d.pro_id=c.prod_id  and  b.order_no=c.order_no

--15、查找销售金额最大的客户名称和总货款
select  cust_name,d.cust_sum
from      customer  a,
              (select  cust_id,cust_sum
                from  (select  cust_id,  sum(tot_amt)  as  cust_sum
                            from  sales
                            group  by  cust_id  )  b
                where  b.cust_sum  = 
                              (  select  max(cust_sum)
                                  from  (select  cust_id,  sum(tot_amt)  as  cust_sum
                                              from  sales
                                              group  by  cust_id  )  c  )
                )  d
where  a.cust_id=d.cust_id 

--16、查找销售总额少于1000元的销售员编号、姓名和销售额
select  emp_no,emp_name,d.sale_sum
from      employee  a,
              (select  sale_id,sale_sum
                from  (select  sale_id,  sum(tot_amt)  as  sale_sum
                            from  sales
                            group  by  sale_id  )  b
                where  b.sale_sum  <1000                             
                )  d
where  a.emp_no=d.sale_id 

--17、查找至少销售了3种商品的客户编号、客户名称、商品编号、商品名称、数量和金额
select  a.cust_id,cust_name,b.prod_id,prod_name,d.qty,d.qty*d.unit_price
from  customer  a,  product  b,  sales  c,  sale_item  d
where  a.cust_id=c.cust_id  and  d.prod_id=b.prod_id  and 
            c.order_no=d.order_no  and  a.cust_id  in  (
            select  cust_id
            from    (select  cust_id,count(distinct  prod_id)  prodid
                          from  (select  cust_id,prod_id
                                      from  sales  e,sale_item  f
                                      where  e.order_no=f.order_no)  g
                          group  by  cust_id
                          having  count(distinct  prod_id)> =3)  h  )

--18、查找至少与世界技术开发公司销售相同的客户编号、名称和商品编号、商品名称、数量和金额
select  a.cust_id,cust_name,d.prod_id,prod_name,qty,qty*unit_price
from  customer  a,  product  b,  sales  c,  sale_item  d
where  a.cust_id=c.cust_id  and  d.prod_id=b.prod_id  and 
            c.order_no=d.order_no    and  not  exists
    (select  f.*
      from  customer  x  ,sales  e,  sale_item  f
      where  cust_name= '世界技术开发公司 '  and  x.cust_id=e.cust_id  and
                  e.order_no=f.order_no  and  not  exists
                      (  select  g.*
                          from  sale_item  g,  sales    h
                          where  g.prod_id  =  f.prod_id  and  g.order_no=h.order_no  and
                                      h.cust_id=a.cust_id)
        )
     
19、查找表中所有姓刘的职工的工号,部门,薪水
select  emp_no,emp_name,dept,salary
from  employee
where  emp_name  like  '刘% '

20、查找所有定单金额高于20000的所有客户编号
select  cust_id
from  sales
where  tot_amt> 20000

21、统计表中员工的薪水在40000-60000之间的人数
select  count(*)as  人数
from  employee
where  salary  between  40000  and  60000

22、查询表中的同一部门的职工的平均工资,但只查询"住址"是"上海市"的员工
select  avg(salary)  avg_sal,dept 
from  employee 
where  addr  like  '上海市% '
group  by  dept

23、将表中住址为 "上海市 "的员工住址改为 "北京市 "
update  employee   
set  addr  like  '北京市 '
where  addr  like  '上海市 '

24、查找业务部或会计部的女员工的基本信息。
select  emp_no,emp_name,dept
from  employee 
where  sex= 'F 'and  dept  in  ( '业务 ', '会计 ')

25、显示每种产品的销售金额总和,并依销售金额由大到小输出。
select  prod_id  ,sum(qty*unit_price)
from  sale_item 
group  by  prod_id
order  by  sum(qty*unit_price)  desc
我的亿家社区,请大家多支持!
 
1  /  2  页   12 跳转

版权所有 我的亿家社区  我的亿家  Sitemap

Powered by 我的亿家 2.0.1214    Copyright © 2001-2009 我的亿家.
Processed in 0.0625 second(s) , 17 queries.
返顶部