‘壹’ 请教一段sql语句的含义
select
a.splanno,a.addid,a.itemno,
b.itemname,b.descript,
c.msname,
a.planqty,a.plansum,a.rcvqty,a.rcvsum,
a.planqty - a.rcvqty celqty,
a.plansum - a.rcvsum celsum
from
(
select
a.splanno,a.addid,a.itemno,
sum(isnull(a.planqty,0)) planqty,sum(isnull(a.plansum,0)) plansum,sum(isnull(a.rcvqty,0)) rcvqty,
sum(isnull(a.untaxrcvsum,0)) rcvsum
from
(select
a.splanno,case when a.addid = 1 then 1 when a.addid > 1 then 2 end addid,
a.itemno,a.planqty,a.plansum,a.spurno,a.lineid,b.rcvqty,
b.untaxrcvsum from
(select a.splanno,a.addid,a.itemno,a.planqty,a.plansum,b.spurno,b.lineid from
(select splanno,addid,itemno,planqty,plansum plansum from purplandet
where splanno in (select distinct splanno from purplanmst where cyc_code='0004')) a
left outer join
purdec b
on a.splanno=b.refsysno and a.addid=b.refaddsysno and a.itemno=b.itemno
) a
left outer join
rcvdet b
on a.spurno=b.purno and a.lineid=b.refrow and a.itemno=b.itemno
) a
group by a.splanno,a.addid,a.itemno
) a,
itemdata b,msunit c
where a.itemno=b.itemno and b.msunit=c.msunit
order by a.splanno,a.addid,a.itemno
1.先对SQl语句进行整理提高可读性
2.针对几个简单的概念和简单函数先了解
(a).别名(表的别名 以及栏位的别名):
上述例子中 如itemdata b 即定义表itemdata 为名称b 这样在第一个select中b.itemname即是查询的为itemdata.itemname
a.planqty - a.rcvqty celqty就是对前面的计算结果 以celqty栏位名称作为显示
(b).isnull
如果第一个参数值为空,默认显示第二个栏位值
(c).sum
栏位加总
(d).left join
表关联,配合on条件
(e).group by
分组栏位
(f).case when
SQL中的if else
3.SQL解析(因为不知道你的表具体含义只能通过SQL单纯的看)
(a). 一层一层来看的话,最外层查询的含义是
查询第一层子查询中的splanno,addid,itemno,
planqty,plansum,arcvqty,rcvsum,planqty - rcvqty,
plansum - rcvsum
以及itemdata 中的itemname,descript,和msunit表中的msname,
a表是通过itemno和itemdata 表关联,itemdata 表再通过msunit和msunit表关联
最后按照a表中splanno,addid,itemno进行升序排序
(b).from里层主要是查询最外层所定义的a表
(b1).直接看最里层的SQL查询
select a.splanno,a.addid,a.itemno,a.planqty,a.plansum,b.spurno,b.lineid from
(select splanno,addid,itemno,planqty,plansum plansum from purplandet
where splanno in (select distinct splanno from purplanmst where cyc_code='0004')) a
left outer join
purdec b
on a.splanno=b.refsysno and a.addid=b.refaddsysno and a.itemno=b.itemno) a
查询purplandet 中splanno 对应的cyc_code为0004的相关资料并关联purdec 查询对应栏位
(b2).以上查询出后会在关联rcvdet 查出需要栏位
(b3).通过对a.splanno,a.addid,a.itemno的分组,统计对应栏位的加总信息
不知道这样说明是否OK? 另外 建议尽量避免子查询 会影响效能
~~排版有点乱 凑合着看吧
‘贰’ sql语句写法
朋友,一楼的回答,您的理解是错误的。
in语句,本身就是or,而不是and。in ('0102','0202'),就是表示部门号等于其中任何一个都符合条件的情况,所以一楼写的这个写法是正确的,你查不到肯定是别的原因。
如果你觉得不对,你可以试试select s.部门名,s.领用人,s.仪器名称,s.型号,s.单价,s.存放地 from s where s.部门号 in ('0102','0202'),这个肯定是可以查询出来这两个的。
除了使用in的写法,还可以使用另外的写法。
select s.部门名,s.领用人,s.仪器名称,s.型号,s.单价,s.存放地 from s, users u where s.部门号= u.unit and u.user_id = '01'
这个写法肯定也是可以的。
‘叁’ SQL函数的函数介绍
Aggregate函数的操作面向一系列的值,并返回一个单一的值。
注释:如果在 SELECT 语句的项目列表中的众多其它表达式中使用 SELECT 语句,则这个 SELECT 必须使用 GROUP BY 语句! 函数 描述 AVG(column) 返回某列的平均值 COUNT(column) 返回某列的行数(不包括 NULL 值) COUNT(*) 返回被选行数 FIRST(column) 返回在指定的域中第一个记录的值 LAST(column) 返回在指定的域中最后一个记录的值 MAX(column) 返回某列的最高值 MIN(column) 返回某列的最低值 STDEV(column) 返回某列的标准偏差 STDEVP(column) 返回某列总体的标准偏差 SUM(column) 返回某列的总和 VAR(column) 返回某列非NULL值的方差 VARP(column) 返回某列所有非NULL值的总体方差 【示例】 Name Age Adams, John 38 Bush, George 33 Carter, Thomas 28 AVG 函数返回数值列的平均值。NULL 值不包括在计算中。
SELECT AVG(column_name) FROM table_name
我们拥有 Orders 表(示例1):
我们希望计算 OrderPrice 字段的平均值。
我们使用如下 SQL 语句:
SELECT AVG(OrderPrice) AS OrderAverage FROM Orders结果集类似这样: OrderAverage 950 示例2
我们希望找到 OrderPrice 值高于 OrderPrice 平均值的客户。
我们使用如下 SQL 语句:
SELECT Customer FROM OrdersWHERE OrderPrice>(SELECT AVG(OrderPrice) FROM Orders)结果集类似这样: Customer Bush Carter Adams COUNT() 函数COUNT() 函数返回匹配指定条件的行数。 FORMAT 函数用于对字段的显示进行格式化。
SELECT FORMAT(column_name,format) FROM table_name 参数 描述 column_name 必需。要格式化的字段。 format 必需。规定格式。 我们拥有下面这个 Procts 表: Prod_Id ProctName Unit UnitPrice 1 gold 1000 g 32.35 2 silver 1000 g 11.56 3 copper 1000 g 6.85 我们希望显示每天日期所对应的名称和价格(日期的显示格式是 YYYY-MM-DD)。
我们使用如下 SQL 语句:
SELECT ProctName, UnitPrice, FORMAT(Now(),'YYYY-MM-DD') as PerDateFROM Procts结果集类似这样: ProctName UnitPrice PerDate gold 32.35 12/29/2008 silver 11.56 12/29/2008 copper 6.85 12/29/2008 LAST() 函数返回指定的字段中最后一个记录的值。
提示:可使用 ORDER BY 语句对记录进行排序。
SELECT LAST(column_name) FROM table_name
实例1 Orders 表:
我们希望查找 OrderPrice 列的最后一个值。
我们使用如下 SQL 语句:
SELECT LAST(OrderPrice) AS LastOrderPrice FROM Orders结果集类似这样: LastOrderPrice 100 LCASE 函数把字段的值转换为小写。
SELECT LCASE(column_name) FROM table_name
我们拥有下面这个 Persons 表: Id LastName FirstName Address City 1 Adams John Oxford Street London 2 Bush George Fifth Avenue New York 3 Carter Thomas Changan Street Beijing 我们希望选取 LastName 和 FirstName 列的内容,然后把 LastName 列转换为小写。
我们使用如下 SQL 语句:
SELECT LCASE(LastName) as LastName,FirstName FROM Persons结果集类似这样: LastName FirstName adams John bush George carter Thomas LEN 函数返回文本字段中值的长度。
SELECT LEN(column_name) FROM table_name
同上有 Persons 表:
我们希望取得 City 列中值的长度。
我们使用如下 SQL 语句:
SELECT LEN(City) as LengthOfCity FROM Persons结果集类似这样: LengthOfCity 6 8 7 MAX 函数返回一列中的最大值。NULL 值不包括在计算中。
SELECT MAX(column_name) FROM table_name注释:MIN 和 MAX 也可用于文本列,以获得按字母顺序排列的最高或最低值。
实例1Orders 表:
我们希望查找 OrderPrice 列的最大值。
我们使用如下 SQL 语句:
SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders结果集类似这样: LargestOrderPrice 2000 MID 函数用于从文本字段中提取字符。
SELECT MID(column_name,start[,length]) FROM table_name 参数 描述 column_name 必需。要提取字符的字段。 start 必需。规定开始位置(起始值是 1)。 length 可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。 同上有 Persons 表:
我们希望从 City 列中提取前 3 个字符。
我们使用如下 SQL 语句:
SELECT MID(City,1,3) as SmallCity FROM Persons结果集类似这样: SmallCity Lon New Bei MIN 函数返回一列中的最小值。NULL 值不包括在计算中。
SELECT MIN(column_name) FROM table_name注释:MIN 和 MAX 也可用于文本列,以获得按字母顺序排列的最高或最低值。
实例1 Orders 表:
我们希望查找 OrderPrice 列的最小值。
我们使用如下 SQL 语句:
SELECT MIN(OrderPrice) AS SmallestOrderPrice FROM Orders结果集类似这样: SmallestOrderPrice 100 NOW 函数返回当前的日期和时间间
SELECT NOW() FROM table_name
貌似没有这函数。
我们拥有下面这个 Procts 表: Prod_Id ProctName Unit UnitPrice 1 gold 1000 g 32.35 2 silver 1000 g 11.56 3 copper 1000 g 6.85 我们希望显示当天的日期所对应的名称和价格。
我们使用如下 SQL 语句:
SELECT ProctName, UnitPrice, Now() as PerDate FROM Procts结果集类似这样: ProctName UnitPrice PerDate gold 32.35 12/29/2008 11:36:05 AM silver 11.56 12/29/2008 11:36:05 AM copper 6.85 12/29/2008 11:36:05 AM ROUND 函数用于把数值字段舍入为指定的小数位数。
SELECT ROUND(column_name,decimals) FROM table_name 参数 描述 column_name 必需。要舍入的字段。 decimals 必需。规定要返回的小数位数。 Procts 表:
我们希望把名称和价格舍入为最接近的整数。
我们使用如下 SQL 语句:
SELECT ProctName, ROUND(UnitPrice,0) as UnitPrice FROM Procts结果集类似这样: ProctName UnitPrice gold 32 silver 12 copper 7 SUM 函数返回数值列的总数(总额)。
SELECT SUM(column_name) FROM table_name
实例1 Orders 表:
我们希望查找 OrderPrice 字段的总数。
我们使用如下 SQL 语句:
SELECT SUM(OrderPrice) AS OrderTotal FROM Orders结果集类似这样: OrderTotal 5700 GROUP BY 语句合计函数 (比如SUM) 常常需要添加 GROUP BY 语句。 UCASE 函数把字段的值转换为大写。
SELECT UCASE(column_name) FROM table_name
Persons 表:
我们希望选取 LastName 和 FirstName 列的内容,然后把 LastName 列转换为大写。
我们使用如下 SQL 语句:
SELECT UCASE(LastName) : LastName FirstName ADAMS John BUSH George CARTER Thomas
‘肆’ sql中如何使用语句
use Tempdb
go
--> -->
if not object_id('xssj') is null
drop table xssj
Go
Create table xssj([unitcode] int,[operator] nvarchar(2),[money] int,[type] nvarchar(5))
Insert xssj
select 1,N'小文',2400,N'团购' union all
select 2,N'小李',3400,N'经销' union all
select 3,N'小文',1200,N'经销' union all
select 5,N'小李',3500,N'团购' union all
select 9,N'小王',4900,N'名烟名酒店' union all
select 12,N'小刘',1200,N'团购' union all
select 14,N'小文',5000,N'批发' union all
select 19,N'小文',9000,N'团购'
Go
Select [operator],
[团购]=sum(case when [type]=N'团购' then [money] else 0 end),
[经销]=sum(case when [type]=N'经销' then [money] else 0 end),
[批发]=sum(case when [type]=N'批发' then [money] else 0 end),
[合计]=sum([money])
from xssj group by [operator]
operator 团购 经销 批发 合计
-------- ----------- ----------- ----------- -----------
小文 11400 1200 5000 17600
小王 0 0 0 4900
小李 3500 3400 0 6900
小刘 1200 0 0 1200
(4 个资料列受到影响)
动态这样就行了
declare @s nvarchar(4000)
set @s='select [operator]'
select @s=@s+','+quotename([type])+N'=sum(case when [type] = N'''+[type]+''' then [money] else 0 end)'
from xssj group by [type]
exec(@s+N',sum([money]) as 合计 from xssj group by [operator]')
‘伍’ 请教SQL语句
select unitid,count(unitid) from article_act where unitid<>'' and month(updatetime)=month(getdate()) and year(updatetime)=year(getdate()) group by unitid order by count(unitid) desc
这样写不可能错的啊,如果错的,你把你错误结果贴上来看看
‘陆’ sql server 2008查询a,b两张表的数据,用unit连接起来后排序 。排序的字段在a表中查询字段类型为int,b表
int最多存32位, smallint最多能存16位,
就是容量不一样。
排序不影响!
‘柒’ sql语句 union用法
因为union查询后会合并相同的记录,select *是所有字段记录相同才合并,其中的date字段值可以相同,而select date的时候,只要date相同就会合并,date值是唯一的。所以查询结果是不同的。
‘捌’ sql语句,大神求解释,看不懂
这就是普通的select语句啊,只是加了嵌套和连接,看起来比较庞大而已,你想看清楚可以分层次去查询,一块一块的看就好理解了。
‘玖’ SQL语句把同一个表中的a字段中的数据复制到另一个字段b中
SQL语句把同一个表中的a字段中的数据复制到另一个字段b中可以使用update语句,例如:
update cust set s8_16=unit , unit='';
上述语句将unit字段内容更新到s8_16字段内,然后将unit字段内容置为了空。
(9)unit的sql用法扩展阅读
SQL UPDATE 语句用法介绍:
UPDATE 语句用于更新表中已存在的记录。
SQL UPDATE 语法
UPDATEtable_name
SETcolumn1=value1,column2=value2,...
WHEREsome_column=some_value;
注意 SQL UPDATE 语句中的 WHERE 子句!WHERE 子句规定哪条记录或者哪些记录需要更新。如果省略了 WHERE 子句,所有的记录都将被更新 。
‘拾’ SQL的语法 详细 介绍
SELECT 子句
指定由查询返回的列。
语法
SELECT [ ALL | DISTINCT ]
[ TOP n [ PERCENT ] [ WITH TIES ] ]
< select_list >
< select_list > ::=
{ *
| { table_name | view_name | table_alias }.*
| { column_name | expression | IDENTITYCOL | ROWGUIDCOL }
[ [ AS ] column_alias ]
| column_alias = expression
} [ ,...n ]
参数
ALL
指定在结果集中可以显示重复行。ALL 是默认设置。
DISTINCT
指定在结果集中只能显示唯一行。为了 DISTINCT 关键字的用途,空值被认为相等。
TOP n [PERCENT]
指定只从查询结果集中输出前 n 行。n 是介于 0 和 4294967295 之间的整数。如果还指定了 PERCENT,则只从结果集中输出前百分之 n 行。当指定时带 PERCENT 时,n 必须是介于 0 和 100 之间的整数。
如果查询包含 ORDER BY 子句,将输出由 ORDER BY 子句排序的前 n 行(或前百分之 n 行)。如果查询没有 ORDER BY 子句,行的顺序将任意。
WITH TIES
指定从基本结果集中返回附加的行,这些行包含与出现在 TOP n (PERCENT) 行最后的 ORDER BY 列中的值相同的值。如果指定了 ORDER BY 子句,则只能指定 TOP ...WITH TIES。
< select_list >
为结果集选择的列。选择列表是以逗号分隔的一系列表达式。
*
指定在 FROM 子句内返回所有表和视图内的所有列。列按 FROM 子句所指定的由表或视图返回,并按它们在表或视图中的顺序返回。
table_name | view_name | table_alias.*
将 * 的作用域限制为指定的表或视图。
column_name
是要返回的列名。限定 column_name 以避免二义性引用,当 FROM 子句中的两个表内有包含重复名的列时会出现这种情况。例如,Northwind 数据库中的 Customers 和 Orders 表内都有名为 ColumnID 的列。如果在查询中联接这两个表,可以在选择列表中将客户 ID 指定为 Customers.CustomerID。
expression
是列名、常量、函数以及由运算符连接的列名、常量和函数的任意组合,或者是子查询。
IDENTITYCOL
返回标识列。有关更多信息,请参见 IDENTITY(属性)、ALTER TABLE 和 CREATE TABLE。
如果 FROM 子句中的多个表内有包含 IDENTITY 属性的列,则必须用特定的表名(如 T1.IDENTITYCOL)限定 IDENTITYCOL。
ROWGUIDCOL
返回行全局唯一标识列。
如果在 FROM 子句中有多个表具有 ROWGUIDCOL 属性,则必须用特定的表名(如 T1.ROWGUIDCOL)限定 ROWGUIDCOL。
column_alias
是查询结果集内替换列名的可选名。例如,可以为名为 quantity 的列指定别名,如"Quantity"或"Quantity to Date"或"Qty"。
别名还可用于为表达式结果指定名称,例如:
USE Northwind
SELECT AVG(UnitPrice) AS 'Average Price'
FROM [Order Details]
column_alias 可用于 ORDER BY 子句。然而,不能用于 WHERE、GROUP BY 或 HAVING 子句。如果查询表达式是 DECLARE CURSOR 语句的一部分,则 column_alias 不能用在 FOR UPDATE 子句中。
INTO 子句
创建新表并将结果行从查询插入新表中。
用户若要执行带 INTO 子句的 SELECT 语句,必须在目的数据库内具有 CREATE TABLE 权限。SELECT...INTO 不能与 COMPUTE 子句一起使用。有关更多信息,请参见事务和显式事务。
通过在 WHERE 子句中包含 FALSE 条件,可以使用 SELECT...INTO 创建没有数据的相同表定义(不同表名)。
语法
[ INTO new_table ]
参数
new_table
根据选择列表中的列和 WHERE 子句选择的行,指定要创建的新表名。new_table 的格式通过对选择列表中的表达式进行取值来确定。new_table 中的列按选择列表指定的顺序创建。new_table 中的每列有与选择列表中的相应表达式相同的名称、数据类型和值。
当选择列表中包含计算列时,新表中的相应列不是计算列。新列中的值是在执行 SELECT...INTO 时计算出的。
在此次发布的 SQL Server 版本中,select into/bulk 数据库选项对是否可以使用 SELECT INTO 创建永久表没有影响。对包括 SELECT INTO 在内的某些大容量操作的记录量,取决于对数据库有效的恢复模式。有关更多信息,请参见使用恢复模型。
在以前发布的版本中,如果设置了 select into/bulk ,则可用 SELECT INTO 创建永久表。