SQL Server数据库培训(SQL篇)----Select语句构成元素

1.             Select语句构成元素

1.1          Select *

避免使用select *

当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 ‘*’ 是一个方便的方法.不幸的是,这是一个非常低效的方法. 实际上,SQL在解析的过程中, 会将’*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间.

1.2          Select语句中元素的执行顺序

为了描述逻辑查询处理和各种SELECT查询子句,我们使用以下事例为大家介绍。

例:查询出加拿大市场的所有绑定1个以上手机的用户,并且按用户ID排序。

select ACCTID,count(*) numPhones

from IFD_PHONE_LIST

where NATION_CODE=‘CA‘

group by ACCTID

having count(*) >1

order by ACCTID

执行顺序如下:

1.       FROM

2.       WHERE

3.       GTOUP  BY

4.       HAVING

5.       SELECT

6.       ORDER BY

这条查询语句会完成以下功能

1.       从IFD_PHONE_LIST表中查询数据行

2.       对表中数据进行过滤,只保留市场为CA的记录

3.       按照用户ID对数据进行分组

4.       对分组后的数据进行过滤,只保留绑定多个手机的用户

5.       返回每个分组用户ID和手机数目

6.       按照用户ID对输出结果进行排序

所以如果sql改为

select ACCTID,count(*) numPhones

from IFD_PHONE_LIST

where NATION_CODE=‘CA‘ and numPhones >1

group by ACCTID

having count(*) >1

order by ACCTID

那么该sql会报错,因为这时字段还没有起别名,该操作是在where语句执行后才会执行。

1.3          DISTINCT

SELECT指令可以查出我们想要的所有数据,但是在这些数据中可能有很多重复的值。

当需要查询某个表格中有哪些不同的值,而每个值出现的次数并不重要,那么这时就可以使用DISTINCT

使用方法

SELECT  DISTINCT  “字段名”  FROM “表格名”

1.4          GROUP
BY

Group by 阶段可以将前面逻辑查询处理阶段返回的行按“组”进行组合。

例:查询某个用户的近6月账单

select  CYCLE_START as CycleStart,

CYCLE_END as CycleEnd,

sum(TOLL_CHARGE) as TollCharge,

sum(Credit) as Credit,

sum(Debit) as Debit,

min(Due_Date) as DueDate

from CYCLE_CALL_FEE_HISTORY

where acctid = 39129 and cycle_start>=‘2010-1-1‘ and cycle_end<=‘2010-6-1‘

group by CYCLE_START, CYCLE_END

因为聚合函数只为每个组返回一个值,所以一个元素如果不在group by 里表中出现,就只能作为聚合函数(COUNT,SUM,AVG,MIN,MAX)的输入。但是所有的聚合函数都会忽略NULL值,只有一个例外 COUNT(*)。例如某列的值为 30,10,NULL,10.COUNT(*)会返回4,而COUNT(列名) 将返回3.

1.5          ORDER BY

在一个表中的数据不一定是排序存放的。所以到需要排序时

ORDER BY 语句用于根据指定的列对结果集进行排序。

ORDER BY 语句默认按照升序对记录进行排序。

如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。

1.6          IS NULL

当要查询一个字段为null的记录时,要使用 is null 而不是 != nul

1.7          NOT

NOT运算符用于对搜索条件的布尔值求反。这里讨论NOT运算符的使用、应用场合及其与<>运算符的区别。

与其他运算符不同,表示否定的NOT运算符不能单独应用,而经常与其他运算符联合使用。例如,NOT IN运算符实际上就是IN运算符与NOT运算符的联合使用

例: 使用NOT运算符实现查询

SELECT TNAME, DNAME,AGE, TSEX  FROM TEACHER   WHERE NOT DNAME=‘计算机‘  ORDER BY DNAME

NOT运算符对紧跟其后的条件取反,NOT DNAME=‘计算机’实际上就等价于DNAME<>‘计算机’或者DNAME!=‘计算机’。

需要强调一点,NULL值进行取反,结果仍是NULL.

例 NULL值的取反

如下面的代码:

SELECT * FROM TEACHER WHERE NOT SAL >1500 OREDR BY SAL

上述实例代码实际上是查询所有工资不高于1500的教师信息,从结果中发现,工资为NULL的教师记录并没有包括在结果表中。因为当SAL为NULL时,“SAL >1500”的执行结果也为NULL,而NOT NULL的运算结果仍然为NULL,也就不满足查询条件。

1.8          Between And

使用BETWEEN...AND 操作符可以选中排列于两值之间的数据。这些数据可以是数字,文字或是日期。在SQL中 使用相当于 >= 和 <=

1.9          Top

例:查询出前10掉记录

select top 10 account_id,plan_id,status

from account_extension

order by account_id

这里要注意执行顺序,查询出的数据会先进行排序再查出前10行记录

在SQL Server 2005之前的传统SQL语句中,top语句是不支持局部变量的。此时可以使用Set RowCount,但是在SQL Server 2005/2008中,TOP通常执行得更快,所以应该用TOP关键字来取代Set RowCount。

Declare @percentage floatset

@percentage=1

select Top (@percentage) percent PName from [Demo_Top] order by PName

例:利用top 和 percent分页

查出前1%的数据

select Top 1 percent OrderID from Orders order by OrderID

查出前2%的数据

select Top 2 percent * from Orders  where OrderID not in

( select Top 1 percent OrderID from Orders order by OrderID) order by OrderID

1.10      Table Partition

数据库结构和索引的是否合理在很大程度上影响了数据库的性能,但是随着数据库信息负载的增大,对数据库的性能也发生了很大的影响。可能我们的数据库在一开始有着很高的性能,但是随着数据存储量的急速增长—例如通话记录数据—数据的性能也受到了极大的影响,一个很明显的结果就是查询的反应会非常慢。在这个时候,除了你可以优化索引及查询外,你还可以建立分区表(Table Partition),在某些场合下提高数据库的性能,在SQL Server 2008中提供了向导形式来创建分区表。

例:在fact_sales表中针对date_id 以月为单位做分区后执行以下语句。

SELECT date_id, SUM(quantity*unit_price) AS total_price

FROM fact_sales

WHERE date_id BETWEEN 20080801 AND 20080831

这时对date_id进行查询时,会从指定分区表内提取数据从而可以提高查询效率

1.11      OVER

确定在应用关联的开窗函数之前,行集的分区和排序

PARTITION BY 参数

将结果集分为多个分区。开窗函数分别应用于每个分区,并为每个分区重新启动计算。

例:

select orderid,custid,val,

sum(val) over() as totalvalue,

sum(val) over(partition by custid) as custtotalval

from ordervalues

查询结果:


orderid


custid


val


totalvalue


custtotalval


10001


1


800.50


1232323.23


4343.00


10002


1


340.23


1232323.23


4343.00


10003


1


123.31


1232323.23


4343.00


10004


2


343.34


1232323.23


1343.00


10005


2


123.32


1232323.23


1343.00

在Over中 使用 PARTITION BY,并且按照特定字段排序

例2:

select orderid,custid,val,

row_number() over(partition by custid

order by val) as rownum

from ordervalues

order by custid,val

查询结果:


orderid


custid


val


rownum


10001


1


100.50


1


10002


1


340.23


2


10003


1


444.23


3


10004


2


123.32


1


10005


2


234.23


2


10006


2


435.34


3

时间: 2024-10-18 11:38:17

SQL Server数据库培训(SQL篇)----Select语句构成元素的相关文章

SQL Server数据库培训(SQL篇)----集合运算及常用函数

1.             集合运算及常用函数 1.1          字符转换函数 1.1.1             ASCII () 返回字符表达式最左端字符的ASCII 码值.在ASCII()函数中,纯数字的字符串可不用''括起来,但含其它字符的字符串必须用''括起来使用,否则会出错. SELECT ASCII('iTalkbb') ---------- 105 1.1.2             CHAR () 将ASCII 码转换为字符.如果没有输入0 ~ 255 之间的ASCI

SQL Server(三):Select语句

1.最基本的Select语句: Select [Top n [With Ties]] <*|Column_Name [As <Alias>][, ...n]> From <Table_name> Order by <Column_Name [DESC]>[, ...n] 1)*(星号)表示所有列,在选择特定列时可以在结果集中更改显示的列名 Select * from ProductsSelect ProductID,ProductName,CategoryI

SQL Server数据库(SQL Sever语言 CRUD)

使用SQL Sever语言进行数据库的操作 常用关键字identity 自增长primary key 主键unique 唯一键not null 非空references 外键(引用) 在使用查询操作数据库是,要设置好需要操作的数据库,避免出现错误 1.删除表drop table 表名2.修改表alter table 表名 add 列名 数据类型 ---追加alter table 表名 drop column 列名 CRUD操作 ☆★☆ create 添加数据read 读取数据update 修改数

Sql Server数据库 002—sql server 2008 r2 连接字符串

安装完了数据库,在程序中使用就需要连接字符串.如何写呢?以sql server 2008 r2后为例.1.安装好sql server 2008 r2后,类似oracle的plsql工具.sql server 2008 r2也有工具,那就是sql server management studio,如图 2.打开sql server management studio后,如图 服务器,用户名,密码都是在安装的时候自己输入的. 3.进入界面,可以创建自己的数据库名.也可以点击附件导入已有的数据库(md

SQL Server数据库(SQL Sever语言 存储过程及触发器)

存储过程:就像函数一样的会保存在数据库中-->可编程性-->存储过程 创建存储过程: 保存在数据库表,可编程性,存储过程create proc jiafa --需要的参数@a int,@b intas --存储过程内容 declare @c int; set @c [email protected] + @b; return @c;go 相当于一个函数public int 函数名 (变量1,变量2){ 函数语句 return int c} 存储之后可以直接调用,执行存储过程exec 存储名 有

SQL Server数据库(SQL Sever语言 事务)

事务:保障流程的完整执行保证程序某些程序在运行时同时成功同时失败,保证程序的安全性 begin tran --在流程开始的位置加 --此处写SQL语句 if @@error>0 --ERRORSQL自带的错误提示begin rollback tran --回滚事务,到begin tran 的位置,就当没发生过end else begin commit tran --提交事务,都没问题,一并提交end

4.2 SQL Server数据库物理结构

4.2 SQL Server数据库物理结构SQL Server将所有数据都存储在文件中.这些文件被分成子结构,SQL Server管理这 些子结构来维护其中所包含数据的完整性.结构和逻辑组织.虽然本书只是提供有关SQL Server 2008数据库管理的入门级指导,但是对于新的数据库管理员而言,了解像数据库的 物理体系结构这样的髙级主题还是很重要的.了解SQL Server如何存储和维护数据有助于 更好地理解数据变更如何影响性能,以及更有效地诊断数据库问题.4 .2 .1 物理存储数据类型在学习

4.2.4 SQL Server数据库文件

4.2.4 SQL Server数据库文件SQL Server将数据存储在数据文件中,将事务记录存储在事务□志文件中.如果通过 一个逻辑数据库名称将它们集合到一起,这些文件就是数据库.SQL Server数据库可以具 有多个数据文件和多个事务日志文件(虽然-个事务日志文件通常已经足够).当首次创建数据库时,它会有一个默认文件扩展名为.mdf的主数据文件.数据库也可 以有默认扩展名为m df的辅助数据文件.这些数据文件可以组合到一个称为文件组的逻辑 组中,第 5 章将对此进行介绍.该数据库至少有一

SQL Server数据库性能优化之SQL语句篇(转载)

SQL Server数据库性能优化之SQL语句篇 原文地址:http://www.blogjava.net/allen-zhe/archive/2010/07/23/326927.html 期项目需要,做了一段时间的SQL Server性能优化,遇到了一些问题,也积累了一些经验,现总结一下,与君共享.SQL Server性能优化涉及到许多方面,如良好的系统和数据库设计,优质的SQL编写,合适的数据表索引设计,甚至各种硬件因素:网络性能.服务器的性能.操作系统的性能,甚至网卡.交换机等.这篇文章主