SQL SERVER之数据查询
本篇主要讲解查询语句,所有的示例都会按照下面这张表进行。
stuID |
stuName |
age |
sex |
11090241031 |
王小虎 |
21 |
男 |
11090241032 |
王小六 |
22 |
男 |
11090241033 |
张三 |
23 |
男 |
1.使用where子句查询表中满足条件的记录
比较查询
算术比较查询
算术比较中常用的就是所谓的>、<、<>、=、!<(不小于)、!=(不等于)等,比较的语法如下
select* from T_student where age!>30
select* from T_student where stuName<> ‘王小七‘
注意:在where子句中,如果比较的是数值型数据,则可以省略单引号,如果是字符串或者日期的话,需要用单引号引起来
Between and
用来查询指定条件范围的记录
select* from T_student where agebetween 3 and 45
注意:between and的查询的记录包括两个边界值
IN运算符查询与列表匹配的记录
使用IN运算符可以查询与列表匹配的记录
select* from T_student where agein(32,15)
注意:在SQL语句中也可以使用not in运算符来排除一些记录。
逻辑查询
在SQL中逻辑运算符主要包括AND、OR和NOT三种。
AND:用来同时满足多个条件的记录
OR:用来满足多个条件中的其中任意一个条件
NOT:用来满足反条件的记录
select* from T_student where agein(30,15)and stuName =‘王小虎‘
(如果有一个条件为False的话,就不会显示结果)
select* from T_student where agein(32,15)or stuName =‘王小虎‘
(只要满足任何一个条件就可以显示记录)
select* from T_student where agenot in(32,15)
(查询的是反条件记录,也就是不满足年龄在32和15的记录)
复杂逻辑
复杂逻辑其实就是AND、OR、NOT的运算符使用的组合,正如我们所知运算符也有先后顺序
NOT>AND>OR
select* from T_student where agenot in(32,15)OR stuName =‘王小六‘
(根据先后顺序可知,查询的是年龄不是32和15或者名字是王小六的记录)
空值查询
在使用SQL语句时,有时可能遇到该字段中没有值,那么就称为空值(null),查询语句也非常简单.
select* from T_student where stuNameIS NOT NULL
(查询表汇总名字不是空值的记录)
Like模糊查询
使用LIKE操作符实现模糊查询
在使用SQL时,可能有时会遇到一种情况,不能完全确定自己要查找的信息,但是这些信息又有一些明显的特征,那么就可以采取下面的模糊查询
匹配任意单个字符
通配符“_”表示匹配单个字符,在查询中可以用到
select* from T_student where stuName like ‘王_虎‘
(表示查询王*虎的记录)
匹配0个或者多个字符
通配符“%”表示匹配0个或者多个字符,即一个%可以表示一个字符或者多个字符
select* from T_student where stuName like ‘王%‘
(表示名字中首字符石王的记录)
通配符[]
字符列中的任何单一字符
select* from T_student where stuName like ‘[王菲]%‘
(表示姓名以王或者菲开头的记录)
通配符[^]
表示不在字符列中的任何单一字符
select * from T_student where stuName like ‘[^菲]%‘
(表示姓名不是已菲开头的记录)
转义字符
在使用SQL执行模糊查询时,如果数据表某个字段本身就包含通配符时,又该怎么办
(1):在需要转义的“%”或者是“_”前加一个转义符,该转义符可以是一个任意字符
(2):在ESCAPE关键字后指定该转义符的名称
select * from T_student where sutID like ‘%$_%‘ ESCAPE ‘$‘
(该查询语句表示,ID中包含_的记录,其中转义符$已经把_转义)
---------------------------------------------------------------------------------------
2.数据表的分组操作
表中的数据的排序和分组
我们在使用SQL语句查询操作时,可能查询出的语句是没有规律的,那么为了更好的观察自己查到的结果可以对其进行排序。
GROUP BY
通过ORDER BY子句可以对查询结果指定的列进行升序或降序,这取决于后面的关键字
select * from T_student order by age desc
(将查出后的结果按降序排序)
注意:ORDER BY子句只是对最终结果进行排序,不能用在select子查询中的select语句中,而且ORDER BY子句的位置必须放在所有子句的最后,也就是说,如果查询语句中有多个子句的话,那么ORDER BY子句必须放在这些子句之后
常用的聚合函数
所谓的聚合函数就是统计函数,主要是对得到的数据进行排序求值等操作
函数 |
功能 |
COUNT(列表达式) |
计算给定列或者表示式中非空行数 |
COUNT(*) |
计算数据表中的总行数,包括空值 |
MAX(列表达式) |
计算给定列中或者表达式中的最大值 |
MIN(列表达式) |
计算给定列或者表达式中的最小值 |
SUM(列表达式) |
计算给定列或者表达式中所有的总和 |
AVG(列表达式) |
计算给定列或者表达式中的所有值得平均值 |
使用GROUP BY子句对表中数据进行分组
GROUP by子句可以根据数据列的多个数据查询出来的结果进行分组
select age, count(stuname)from t_student whereage <50 group by age order by age
(以年龄进行分组,并且统计每个年龄段的学生的数目)
使用having限制分组后的查询结果
如果要对分组后的结果限制查询条件,就可以使用having语句,该语句放在GROUP BY语句的后面
select age, count(stuname)from t_student whereage <50 group by age having age >15 order by age
(跟上面的相同,只不过又多了年龄的限制,必须大于15)
限制结果集行数
有些时候,我们并不希望看到查出的结果的全部,只显示几行就可,尤其当在分页操作中的时候,只关心前几条记录就OK了,这时候就需要对结果集进行限制
语法:select top n {precent}列名1,列名2 from表名
Top:关键字,表示限制结果集行数的关键字
N:表示限制结果集行数
Precent:表示返回查询的结果集中的前N%的行数
selecttop 1 agefromt_student where age <50
(表示只返回一行)