Select基础

本文介绍了SQL中的多种查询技巧,包括去除重复记录、选择特定行数、表达式使用、按位运算、CASE表达式、WHERE条件应用、结果排序及空值处理等内容。

1.从查询结果中消除重复的记录
select distinct sellid,setcr_name from d_sell

2.选取前面N行数据
select top 10 styleid,sum(set_nums) as '合计' from d_movesub
group by styleid order by '合计' desc
说明:
1.该代码可以查出发货量最大的前10名款式;
2.如不指明desc 默认会按升序排序;

另一种方法:
set rowcount 10      ----限定前面10行,如果设为0将不限定返回的行数
select clothingid,set_nums from d_movesub
order by set_nums desc

3.表达式:
select 15%4 as  Modulo,floor(1.25) as [Floor],ceiling(1.25) as [Ceiling]
执行结果如下:
Modulo         Floor     Ceiling
--------------  -----------  -----------
3                1           2
取模数学运算符(%)只会返回除法运算的余数;
Floor()函数返回小于或等于所给数字表达式的最大整数;
Ceiling()函数返回大于或等于所给数字表达式的最小整数;

select 123+456 as '加法','abc'+'def' as '字符'
返回:
加法             字符
-------------  ---------------
579             abcdef

select '款号:'+styleid,set_nums from d_movesub
说明:字符串与字段也可以合并

4.按位运算符:
‘与’ 用&符号表示  当两个运算对像都为真才会返回真值,如果其中一个对象为假则会返回一个假值;
‘或’ 用|符号表示  如果运算对象中有任何一个为真都会返回一个真值;
‘异或’者用^符号表示  如果两个运算对象中只有一个为真值它就返回一个真值;
‘按位非’ 用~符号表示   不太明白,估计用得很少

5.Case表达式
提示:系统不会为Case表达式提供列名,必须要为每个Case表达式提供列名
5-1.简单Case
select userid,username,case notuse         ----notuse  字段为bit类型,默认值为0
when 1 then '被禁用'  ----如果为1就显示被禁用
when 0 then '启用'      ----如果为0就显示为启用
else '-'                        ----如果都不是就用-表示
end as '有效否'             ----给字段取个别名:有效否
from j_user
返回:
userid    username       有效否
--------------------------------------------------------
1001 系统管理员    启用
1002 蒲少芳         启用
1003 刘友兵       启用
1004 李洁       被禁用
1005 邱礼芳       启用
1006 邓淑华       被禁用
1007 陈来灿       启用
1008 刘思一       被禁用
      ……

5-2布尔Case
select  case  when 1< 0  then  '生活糟透了!'      ----当1<0 就显示生活糟透了,但这是不可能的!
when convert(nvarchar(25),getdate(),111)='2011/09/26'       ----当我刚好三十岁时,那么就提醒我该结婚了!
  then '可以结婚了:)'
when 1>0 then '生活一切正常!'    ----当1>0时就显示生活一切正常
end as '生活状况'               ----取个别名:生活状况
提示:在布尔case中,如果遇到了第一个为真的when 的条件,
就不会再继续对其他when条件进行检查,而是直接返回这个when
条件所对应的then子句的值。

declare @A int,@B int    ---声明变量
set @A=2007                ---给变量赋值
set @B=25
select case
when @A=2007 and @B between 10 and 30 then 1
else NULL
end as Test
返回:
Test
---------
  1
总结:布尔case比简单的case更灵活,不但可以使用不同
的比较运算:< = > 而且还可以处理包含布尔and 和
布尔or的复杂条件

6.Where条件
where 条件对from 子句产生的数据进行筛选,挑出那些要放到结果集中的记录行。
一种提高客户/服务器数据库性能的有效途径是:
让数据库引擎来完成筛选数据的工作,而不要让应用程序来过滤那些无用的数据。

 
描述 运算符 例子   
等于 =    
大于 >    
大于等于 >=    
小于 <    
小于等于 <=    
不等于 <>,!=    
不小于 !<    
不大于 !>    
还提供了4种特殊的运算符 between,in,like,is    
   

6-1  使用Between查找条件
下面的语句查询出了所有加盟商的发货金额,并按金额的升序进行显示;
并且指定只统计2008年的已生效的发货单;
select a.get_mchid,c.shutname,sum(b.s_price*b.set_nums) as '金额'
from d_sell a join d_sellsub b on a.sellid=b.sellid
join j_merchant c on a.get_mchid=c.merchantid
where a.setsure_date between '2008-01-01 00:00:00.001' and '2008-12-31 23:59:58.998'
and a.set_sure=1             ---发货单必需已生效
group by a.get_mchid,c.shutname
order by sum(b.s_price*b.set_nums)
返回:
get_mchid  shutname  金额
----------------------------------------------
JL022    庄河 376.20
FQ014   福清 11249.00
YJ885    延吉 18126.00
XS571    萧山 52314.60
JX012    鸡西 59014.00
      ……

6-2 使用in查找条件
下面的语句查找出所有地区代码为0开头的加盟商:
select merchantid,areaid,shutname from j_merchant
where areaid in (select areaid from j_area where areaid like '0%')
返回:
merchantid  areaid   shutname
----------------------------------------------------------
AS018        006      鞍山
BYQ002      006      鲅鱼圈市
CD006        002      常德
CH111        001      澄海
CS005         002      长沙
CX024         007      慈溪
      ……

6-3 使用Like查找条件
 
描述 通配符 例子   
0个或多个字符 % 'Able' like 'A%'   
单个字符 _ 'Able' like 'Abl_'   
匹配指定范围或集合中的任何单个字符 [] 'a' like '[a-g]'
'a' like '[abcdefg]'   
匹配不属于指定范围或集合的任何单个字符 [^] 'a' like '[^w-z]'
'a' like '[^wxyz]' 

例句:
select * from j_merchant where merchantid like '[A-D]%'
返回merchantid 以 a b c d 4个字母开头的所有记录

查找包含通配符的记录:
A. select * from J_supplier where fullname like '%F[-]15%'
---使用[]注明
B. select * from J_supplier where fullname like '%F&-15%' escape'&'
--使用用escape关键字注明避开通配符,   escape 的意思就是:逃脱, 避开

提示:虽然like运算符非常有用,但它也会对性能造成影响,如果发现你的应用
程序需要频繁地使用like运算符,就应该启用全文索引.

6-4 使用多个where 条件
使用布尔逻辑运算符:and ,or ,not 将多个where 条件组合为一个复杂的where 条件
它们的优先顺序为:and     最高
            or       其次
            not     最低
例句:
select areaid,merchantid from j_merchant
where merchantid like 'A%' or
areaid between '001' and '005' and
merchantid like '%C%'
返回:
areaid   merchantid
--------------------------------
006 AS018  
002 CD006  
001 CH111  
002 CS005  
001 CZ011  
001 MC012  
003 YC717  

对下面的语句做小小的改动就会改变结果
select areaid,merchantid from j_merchant
where ( merchantid like 'A%' or
areaid between '001' and '005') and
merchantid like '%C%'
加了一对括号就改变了运算符的优先级

6-5 对结果集排序
如果没有指定order by 子句,SQL将按照它获取数据的先后顺序来返回记录,
假如所查询的表具有一个聚集索引,SQL很有可能会按照聚集索引中的键值顺序来返回记录行。
有的时候没有使用order by 子句查询结果看起来也像排序过,但这些只不过是巧合合已。
如果确实需要对数据进行排序,那么应当利用order by 子句来实现它,这才是一种好的开发习惯。
例句:
select userid as '编号',username '姓名' from j_user
order by 姓名
返回:
编号      姓名
--------------------------------
2003 cocopark
1033 仓库二
1007 陈来灿
1019 陈美英
1015 陈伟娜
      ……
注意:
虽然在order by 子句中使用别名,但却不能在where 子句中使用别名。
这是因为在逻辑上where 子句是在查询刚开始的时候执行的,此时还没有完成建立结果列
及其别名的工作,因而不能使用别名;而order by 子句却是最后一步执行的逻辑操作,
此时结果列及其别名都已经创建了,所以它能够使用别名。

使用这个语句可以报告已安装的排序规则,以及服务器的当前排序规则设置
select * from :: fn_helpcollations()

使用下面的语句可以查询出当前服务器的排序规则
select serverproperty('collation') as ServerCollation
返回:
ServerColation
----------------------------------
Chinese_PRC_CI_AS

例句:
select * from j_user
order by userid
Collate Danish_Norwegian_CI_AI       --- 指定排序规则
虽然不是第一个查询都需要排序,但对于那些需要排序的查询来说,将order by 子句
与许多的各种各样的排序规则配合使用,为结果集的排序方式提供了巨大的可能性。

6-6 使用空值
空值代表未知的值,任何包含空值的表达式的计算结果也得为空:
select 1+null
返回
无列名
-----------
 NULL

is null 用来检测空值:
if NULL= NULL       ----如果NULL等于NULL
select '='              ----则返回=
else                     ----否则
select '!='             ----返回!=

返回
--------------
   !=
该语句返回的值不正确!

if NULL is NULL     
select 'is'
else
select 'is not'

返回
----------
  is

is not 配合使用可以用来检查非空值
select userid,depotid from j_user
 where depotid is not NULL            ----查找到所属店铺不为空的用户
返回
userid    depotid
-----------------------
1001 110
1017 110
1433 104
2001 104
2002 101
     ……

is Null()函数具有两个参数,第一个参数是单个列或者表达式,第二个参数则是一个替代值。
如果第一个参数的值是一个有效值(非空值),is Null()函数就返回第一个参数,如果第一个参数
的值是空值,is Null()就会返回第二个参数的值来替代空值。
例句:
select userid,isnull(depotid,'空') from j_user
返回
userid    depotid
-----------------------
1001 110
1002 空
1003 空
1017 110
1039 空
1040 空
1433 104
2001 104
     ……

Nullif()    在许多情况下,都需要创建空值来替换那些被用来表示空值的值。如果一个数据库中在应当
使用空值的地方使用了n/a  空字符串或者 -,那么就可以使用nullif()函数将这些不一致的值都替换为空值。
使数据库变得更加完整。

nullif() 函数具有两个参数。如果这两个参数相等,它就会返回一个空值;否则,它会返回前一个参数的值。
为了演示的需要,先使用一个update将部份客户的名称改为空字符串:

update j_merchant
set shutname='    '
where merchantid like 'C%'       ---将客户代码为C开头的客户名称全部改为空格

select merchantid,
case shutname
when '' then 'blank'             ----使用case将为空字符串的名称全改为blank
else shutname                   -----如果不为空字符串就显示原值
end as shutname,
nullif(shutname,'') as shutnamenullif from j_merchant      ----使用nullif()将空字符串改为空值

返回
merchantid          shutname        shutnamenullif
----------------------------------------------------------------------
AS018               鞍山                  鞍山
BYQ002            鲅鱼圈市            鲅鱼圈市
CD001              blank               NULL
CD006              blank               NULL
CH111              blank               NULL
CQ118              blank               NULL
CS005              blank               NULL
CX024              blank               NULL
CY112              blank                NULL
CZ011              blank               NULL
DL117              大连                 大连
DQ459            大庆                  大庆
FQ014             福清                 福清
                   ……

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值