数据检索
一、select 基本语法:
简单的数据检索:select * from 表名;
(1)、检索出所需要的列:select 列名1,列名2,列名3.。。。 from 表名;
(2)、给列去别名:1、select 列名1 as 别名,列名2 as 别名,列名 as 别名3.。。。 from 表名;
2、简写可以省去as:select 列名1 别名1,列名2 别名2.。。 from 表名 ;
(3)、按条件过滤:select * from 表名 where 过滤条件;
(4)、数据汇总: SQL 中提供了聚合函数来完成计算统计结果集条数、 某个字段的最大值、 某个字段的最小值、 某个字段的平均值以及某个字段的合计值等数据统计的功能,SQL 标准中规定了下面几种聚合函数:
函数名称 |
说明 |
max |
计算字段最大值 |
min |
计算字段最小值 |
avg |
计算字段平均值 |
sum |
计算字段合计值 |
count |
统计数据条数 |
这几个聚合函数都有一个参数,这个参数表示要统计的字段名,比如要统计工资总额,那
么就需要把 FSalary 做为 SUM 函数的参数。
SELECT MAX(FSalary) FROM T_Employee WHERE FAge>25
还可以多次使用聚合函数,比如下面的 SQL 用来统计公司的最低工资和最高工资:
SELECT MIN(FSalary),MAX(FSalary) FROM T_Employee
介绍的函数就是统计记录数量的 COUNT,这个函数有一点特别,因为它的即可以
像其他聚合函数一样使用字段名做参数, 也可以使用星号 “*” 做为参数。
SELECT COUNT(*),COUNT(FNumber) FROM T_Employee
COUNT(*)统计的是结果集的总条数,而COUNT(FName)统计的则是除了结果集中 FName 不为空值(也就是不等于 NULL)的记录的总条数。
(5)、排序:select的语句允许使用order by 来排序.order by位于select语句末尾,它允许指定按照一个列或者多个列进行排序,还可以指定排序是升序ASC(从小到大)还是降序desc(从大到校)。
ORDER BY 子句完全可以与 WHERE 子句一起使用,唯一需要注意的就是 ORDER BY 子句要放到 WHERE 子句之后,不能颠倒它们的顺序。
二、高级数据过滤::
(1)、通配符过滤:SQL 中的通配符过滤使用 LIKE 关键字,可以像使用 OR、AND 等操符一样使用它,它是一个二元操作符, 左表达式为待匹配的字段, 而右表达式为待匹配的通配符表达式。
1、单字符匹配:进行单字符匹配的通配符为半角下划线 “_” , 它匹配单个出现的字符。
SELECT* FROMT_Employee WHEREFName LIKE '_erry'
2、多字符匹配:进行多字符匹配的通配符为半角百分号“%” ,它匹配任意次数(零或多个)出现的任意字符。
SELECT * FROMT_Employee WHERE FName LIKE 'T%'
3、集合匹配:进行集合匹配的通配符是“[]”,中括号中包含一个字符集中任意一个字符相匹配的的字符。
Select * from T_Employee where FName like ‘[SJ]%’;
还可以使用否定符“^”来对集合取相反,它匹配不予字符集中任意一个字符集中任意一个字符相匹配的字符。
SELECT * FROMT_Employee WHERE FName LIKE '[^SJ]%'
执行完毕我们就能在输出结果中看到下面的执行结果:
FNumber FName F Age FSalary
DEV001 T om 25 8300.00
HR002 T ina 25 5200.36
SALES002 Kerry 28 6200.00
集合匹配只在 MSSQLServer 上提供支持,不过在其他数据库中我们可以通过变通手段
来实现相同的效果。
SELECT* FROMT_Employee
WHEREFName LIKE 'S%' ORFName LIKE 'J%'
而下面的 SQL 可以实现和本节第二个例子相同的效果:
SELECT* FROMT_Employee
WHERE NOT(FName LIKE 'S%') AND NOT(FName LIKE 'J%')
(2)、空值检测:使用IS NULL关键字,使用方法为“待检测字段名IS NULL”, 比如要查询所有姓名未知的员工信息,则运行下面的SQL语句:
SELECT * FROM T_Employee WHERE FNAME IS NULL;
(3)、反义运算符:”=”,’<’,”>”,等都是进行数据值判断的,有时候需要使用这些运算符的反义。MSSqlServer和DB2提供了“!”运算符进行对运算符的反义,也就是“!=”表示不等于、“!<”表示不小于、“!>”表示不大于。
不过这个运算符只在MSSQLSEVER和DB2这2中数据库上提供支持,如果其他数据库上则可以有变通的方式实现,最常用的有2中变通方式:一种是用同意运算符、一种用NOT。
a)否定运算符都可以用同意运算符来表示,例如:不大于可以用小于等于来代替、不小于可以用大于等于来代替。在sql中提供里一种通用的不等于运算符“<>”,这样在其它数据不等于、不大于、不小于可以分别表示为“<>”、“<=”、“>=”。
b)NOT运算符是用来表示将一个表达式的值去反,也就是将表达式结果为真的值变为假,将值为假的表达式结果变为真,使用非常简单“NOT(表达式)”。
(4)、多值检测:多值检测有or和in2中,使用方法如下:
例如:检查出23、24、27年龄的人员信息;
Select * form Employee where Age=23 or Age=24 or Age=27;
Select * form Employee where Age in(23.24,27);
(5)范围值检测:范围值检测可以使用大于、小于、大于等于、小于等于、不小于、不大于来实现,不过SQL提供里一种专门的语法“BETWEEN AND”, between and是一个闭区间它包括边界值如:Between 1 and 4就包括1和4;
数据库系统对Between And进行了查询优化,使用它进行取值范围检测将会比其它方式性能更好。
三、数据分组:
(1)、SQL语句中是用Group By进行分组。分组语句必须和聚合函数一起使用,Group by字句负责将数据分成逻辑组,而聚合函数则对每组进行计算。 Group By也可以单独使用例如:
Select * from Employee group by age;
需要注意的是GROUP BY子句的位置,GROUP BY子句必须放到SELECT语句的之后,如果
SELECT语句有WHERE子句,则GROUP BY子句必须放到WHERE语句的之后。
GROUP BY子句中可以指定多个列,只需要将多个列的列名用逗号隔开即可。
(2)数据分组与聚合函数:到目前为止聚合函数都是对普通结果集进行统计。
(3)HAVING语句:有时候需要对部分数据进行过滤,比如:只检索人数多于1个的年龄段,有的开发人员是使用如下:
Select FAge,COUNT(*) as CountofThisAge from Employee Group by FAge Where Count(*)>1;
上面的语法书错误的正确的应该是:
Select * FAge,Count(*) as CountofthisAge from Emplyee Group by FAge Having Count(*)>1;
Having语句能够使用的语法和where 几乎是一样的,不过使用where的是时候group by字句要位于where 字句之后,而使用Having字句的时候Group by要位于Having之前。
Having语句不能包含未分组的列名;
(4)限制结果集:在进行数据检索的时候有时候需要只检索结果集的部分行,比如:前3条数据,第3条数据到地6条数据;虽然主流数据库都提供这种功能,但是无论是语法还是使用方式都很大的差异。下面是MSSQLSERVER 2005的实例:
TOP关键字用来返回结果集中的钱N条数据,语法为:select top 条数 from 表名;
ROW_NUMBER()函数可以计算每一行数据在结果集中的行号:
Select ROW_NUMBER() OVER(ORDER BY FAge),FNumber,FName,FAge form 表名;
五、抑制数据库重复:DISTINCT关键字是用来进行重复数据的抑制的最简单的功能,而且所有的数据库都支持DISTINCT,DISTINCT使用非常简单只需要在select 后增加DISTINCT即可。
DISTINCT是对整个结果集进行 数据重复抑制的,不是简单的针对某个列。
六、计算字段:(1)、常量字段:比如:SELECT'CowNew集团',918000000,FName,F Age,FSubCompany FROM T_Employee’这里的'CowNew集团'和918000000并不是一个实际的存在的列,但是在查询出来的数据中它们看起来是一个实际存在的字段, 这样的字段被称为 “常量字段” (也称为 “常量值” ) 。
(2)、字段间计算:比如:SELECT FNumber , FName,FAge * FSalary FROM T_Employee;
工资指数的计算公式为年龄与工资的乘积,这就需要计算将F Age和FSalary的乘积做为一个工资指数列体现到检索结果中.
(3)、数据处理函数:主流数据库提供了计算字符串长度的函数,MSSQLSERVER中这个函数式为LEN。这个函数接受一个字符串类型的字段值做为参数,返回值为字符串的长度。
Select FName,LEN(FName) form Employee where FName is not null;
(4)、字符串的拼接:MSSQLSERVER中使用”+”进行字符串的拼接。
(8)、简单的结果联合:UNION运算符要放置在两个查询语句之间。联合结果集的基本原则: 一是每个结果集必须有相同的列数; 二是每个结果集的列必须类型相容。
(9) UNION ALL:默认情况下,UNION运算符合并了两个查询结果集,其中完全重复的数据行被合并为了一条。如果需要在联合结果集中返回所有的记录而不管它们是否唯一, 则需要在UNION运算符后使用ALL操作符,如:
SELECTFName,FAge FROMT_Employee
UNION ALL
SELECTFName,FAge FROMT_TempEmployee ;