本文中使用的 数据库为 MS SQL自带的Northwind数据库
语句参考了几本书
写出来是为了防止自己忘记
同时也是为了方便查找语句
use Northwind
go
select CustomerID,EMployeeID
from Orders
where CustomerID='RATTC'
go
如右图
-------------select * from Orders---------------------------------------------------------------------
如果是
use Northwind
go
select *
from Orders
go
则是返回所以的数据
---distinct -----------------------order by CustomerID-------------------------------------------------------------
use Northwind
go
select CustomerID
from Orders
order by CustomerID
go
select distinct CustomerID
from Orders
go
如右图
则返回如图两个列表
左边为第一个的里面有 重复了很多个
右边为distinct 过的 重复的消失了(个数也比 上面的少了很多)
order by CustomerID是排序 DESC是逆序 ASC是顺序(即默认)
-----------------------------------------------------------------------------------------------------
use Northwind
go
select top 5 CustomerID
from Orders
go
select top 5 percent CustomerID
from Orders
go
如右图
第一个为前5行(左边)
第二个为前5%(右边)
-------------------------------------------------------------------------------------------------
use Northwind
go
select CustomerID 'C的id','E的id'=EmployeeID,OrderDate as '时间'
from Orders
go
如右图
修改查询结果中列的标题(别名)
-----------------------------------------------------------------------------
use Northwind
go
select CustomerID ,'AAA'
from Orders
go
在CustomerID 列的旁边会有一个列 内容全为 AAA
-------------------------------------------------------------------------------------------------
use Northwind
go
select EmployeeID,CustomerID
from Orders
where EmployeeID>'1'
order by EmployeeID
go
如右图
只显示 EmployeeID>'1'的 项目
--------------------------------------------------------------------------------
use Northwind
go
select min(EmployeeID) as 最小,max(EmployeeID) as 最大,avg(EmployeeID) as 平均
from Orders
go
最大 | 最小 | 平均 |
1 | 9 | 4 |
-------------------------------------------------------------------------------
use Northwind
go
select CustomerID
from Orders
where CustomerID='RICSU' or CustomerID='TOMSP'
go
select CustomerID
from Orders
where CustomerID in ('RICSU','TOMSP')
go
这两个是等效的 效果如右图
如果是写成where CustomerID not in ('RICSU','TOMSP')
或者 where CustomerID <> 'RICSU' and CustomerID <> 'TOMSP')
就是现实不包含途中这几个项目的 列表了
-----------------------------------------------------------------------------------------
(1)% ,匹配包含0个活多个字符的字符串
(2)_ 下划线,匹配任何单个的字符。
(3)[] 排列通配符,匹配任何在访问或计划之内的单个字符,例如[m-p]匹配的是m/n/o/p单个字符
(4)[^]不在范围之内的字符,匹配任何不在访问或计划之内的单个字符,例如,[^MNOP]或者[^M-P]就是匹配除了M/N/O/P之外的任何字符
use Northwind
go
select distinct CustomerID as '开头为R'
from Orders
where CustomerID like 'R%'
go
select distinct CustomerID as '第二个为R'
from Orders
where CustomerID like '_R%'
go
select distinct CustomerID as '倒数第二个为R'
from Orders
where CustomerID like '%R_'
go
select distinct CustomerID as '第一个不是R'
from Orders
where CustomerID like '[^R]%'
go
select distinct CustomerID as '同上:第一个不是R'
from Orders
where CustomerID not like 'R%'
go
--------------------------------------------------------------------------------------------------------------------
为了得到效果 在Categories 表中 添加几列空列
use Northwind
go
select *
from Categories
where [Description] is null
go
如右图
[Description]好像是系统的一个保留字 所以用[]起来就可以使用了
-------------------------------------------------------------------------------------------
use Northwind
go
select distinct CustomerID, EmployeeID
from Orders
where EmployeeID between 2 and 4
order by EmployeeID
go
查询 EmployeeID在 2 到 4之间的项
如右图
如果是where EmployeeID not between 2 and 4
那么就是相反的结果
-----------------------------------------------------------------------------------
COMPUTE子句
用来计算总计或进行分组小计,总计值或小计值将作为福建的新行出现在查询结果中。
该子句用在WHERE子句之后
use Northwind
go
select distinct CustomerID, EmployeeID
from Orders
where CustomerID ='WANDK'
compute avg(EmployeeID)
go
这个AVG返回的是所有的CustomerID ='WANDK' 的平均值
------------------------------------------------------------------------
use Northwind
go
select CustomerID, EmployeeID
from Orders
where CustomerID like 'v%'
order by CustomerID
compute AVG(EmployeeID) by CustomerID
go
这个AVG返回的是每一种CustomerID 以V开头的的平均值
得先order by 一下再 compute by
使用COMPUTE BY 子句对BY 后面给出的列进行分组显示,并计算该列的分组小计。使用COMPUTE BY 子句时必须按照ORDER BY 和COMPYTE BY 中的 BY 指定的列进行排序。
-----------------------------------------------------------------------------------
use Northwind
go
select CustomerID, count(CustomerID)as'数量'
from Orders
where CustomerID like 'A%'
GROUP BY CustomerID
go
将查询结果按照GOOUP BY 后指定的列进行分组,该句子写在WHERE子句的后面。当在SELECT子句中包含聚合函数时,最适合使用GROUP BY 子句。SELECT子句中的选项列表中出现的列,包含在聚合函数中或者包含在GROUP BY子句中,否则,SQL SERVER将返回错误。
如果是
select EmployeeID, count(CustomerID)as'数量'
就会报错“列 'Orders.EmployeeID' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。”
所以得写成
use Northwind
go
select CustomerID, count(CustomerID)as'数量',EmployeeID
from Orders
where CustomerID like 'A%'
GROUP BY CustomerID,EmployeeID
go
-----------------------------------------------------------------------------------------------
网上看到的一个不错的例子 感觉蛮实用 的也拉进来了
用 SUM 这个指令来算出所有的 Sales (营业额)吧!如果我们的需求变成是要算出每一间店 (store_name) 的营业额 (sales),那怎么办呢?在这个情况下,我们要做到两件事:第一,我们对于 store_name 及 Sales 这两个栏位都要选出。第二,我们需要确认所有的 sales 都要依照各个 store_name 来分开算。这个语法为:
SELECT "栏位1", SUM("栏位2")
FROM "表格名"
GROUP BY "栏位1"
在我们的示范上,
Store_Information 表格
store_name | Sales | Date |
Los Angeles | $1500 | Jan-05-1999 |
San Diego | $250 | Jan-07-1999 |
Los Angeles | $300 | Jan-08-1999 |
Boston | $700 | Jan-08-1999 |
我们就打入,
SELECT store_name, SUM(Sales)
FROM Store_Information
GROUP BY store_name
结果:
store_name | SUM(Sales) |
Los Angeles | $1800 |
San Diego | $250 |
Boston | $700 |
当我们选不只一个栏位,且其中至少一个栏位有包含函数的运用时,我们就需要用到 GROUP BY 这个指令。在这个情况下,我们需要确定我们有 GROUP BY 所有其他的栏位。换句话说,除了有包括函数的栏位外,我 们都需要将其放在 GROUP BY 的子句中。
-------------------------------------------------------------------