黑马程序员--SQL Server基础<二>SQL语句2

黑马程序员--SQL Server基础<二>SQL语句2

今天我们会接着说SQL语句。

数据检索:

Select * from 表名,如:

select * from Person 检测出Person里所有数据

Select 列名 from 表名,如:

select Name from Person检测出Person表里Name列里的数据

Select * from 表名 where 条件,如:

select * from Person where Age > 20 检测出Person表里Age大于20的数据

Select 列名 as 别名 from 表名如:

select Name as 姓名 from Person 即显示的时候Name列会显示为姓名列

数据排序Order by、数据分组group by:

一般情况有升序和降序两种情况,即asc为升序,desc为降序,也可以按照一个字段排列后,再按照另外一个字段排列,也可以设定条件排序

Select * from 表名 order by 列名 asc,如:

select * from Person order by Age asc 即表示按Age升序

Select * from 表名 order by 列名 desc,如:

select * from Person order by Age desc 即表示按Age降序

Select * from 表名 order by 列名 asc,列名desc,如:

select * from Person order by Age asc,Income desc 即表示给Age升序,如果年龄相同,则按Income降序

Select * from 表名 where 条件 order by 列名 asc,如:

select * from Person2 where Age > 18 order by Age asc 即表示给Age大于20的数据按Age升序

对数据进行分组的时候,使用group by,如:

select Age, Count(*) from Person group by Age

表示对Person表里的Age列进行分组,并记数;

没有出现在group by子句中的列不能放到select语句后的列名中,聚合函数除外,如:

select Age,SUM(Income),Count(*) from Person group by Age 这样是可以的,表示对Person表中的Age列进行分组,并记数,同时,计算相同Age的Income的和,而下面的写法,是不行的:

select Age,Income,Count(*) from Person group by Age

因为数据即使Age相同,Income也是不同的,你不可能检索的到,如果改成:

select Age,Income,Count(*) from Person2 group by Age 就可以了,表示检索出所有Age和Income均相同的数据

聚合函数之所以在里面可以使用,是因为,我们可以计算出相同Age数据的Income的和、最大值、最小值等数据,而直接检索Income,因为Income可能是不同的,所以没法检索。

通配符过滤 like:

通配符是模糊搜索的一个很好用的方法,分为单字符匹配”_”,匹配单个出现的字符;多字符匹配”%”,匹配任意次数出现的字符。

如:select * from Person where Name like '_y' 即表示查找任意字符开头,剩余部分是”y”的数据

又如:select * from Person where Name like '%y%' 即表示查找Name中包含”n”的数据

空字符Null,空值的处理以及top、row_number():

在数据库中有个表示空字符的Null是很有意思的,因为它表示”不知道”,神秘的很,谁也不知道是啥,比如:

select * from Person where Name = null,检索不到任何数据,因为不知道你检索的是什么,如果你想进行空值判断,在SQL Server中要使用is、is not,如:

select * from Person where Name is null,能检索出Name是空值的数据

对于空值的处理,可以使用isnull(表达式,value),表示如果”表达式”不是空就返回 ”表达式“本身,否则返回value,如:

select ISNULL(Name,'佚名')as 姓名 from Person2表示如果Name列里空值的数据用佚名替代,否则还用数据本身,并且检索出来后,列名显示为姓名。

top可以检索出前几项的数据,如

select top 3 Age from Person order by Age desc 检索出Age里的前3项并降序排列

row_number()是一个很好用的用来分页的函数,如:

select ROW_NUMBER() over(order by Age asc) as '行号',Age,Name from Person 意思查询Person表里Age、Name列,并以Age升序排列

select * from

(

select ROW_NUMBER() over(order by Age asc) as '行号',Age,Name from Person

) as p

where p.Age = 20

可以查出Person表里,Age为20的数据

distinct的作用:

有时候某一列的数据可能会有重复,如果我们想去掉这些重复,该怎么实现呢?我们就可以使用distinct,如:

select distinct Age from Person 去掉Age中重复的项

select distinct Age,Name from Person1 去掉Age和Name都重复的项

union也有合并重复数据的效果。

Union、union all的用法:

Union(联合)有个基本原则,即为每个结果集必须有相同的列数;而且每个结果集的列必须类型相容。如:

select Name,Age from Person

union

select Name,Age from Person2

 

select Name,Age from Person

union

select 'Lily',21,这里Name是nvarchar类型,Age是int类型,所以这样union也是符合原则的,也就是可行的。

如果我们并不希望数据合并,那么我们联合的时候,应该使用Union all,即

select Name,Age from Person

union all

select Name,Age from Person2

表连接Join:

当两个表有着外键联系的时候,可以用join查询;

具体为:Select 表别名.字段

From 表名1 as 表别名1

Join表名2 as 表别名2 on 表别名1.字段 = 表别名2.字段,如:

select p.Age,p1.Name,p1.Id

from Person as p join Person1 as p1 on p.Id = p1.Age

表示Person表和Person1表是有关联的,Person里的Id,对应了Person1里的Id,可以查出Person表里的Age列,Person1表里的Name、Id列

Case函数:

Case也是SQL语句中的一个重要部分,具体用法如下:

Case 表达式的值

When 值1 then 表达式1

When 值2 then 表达式2

Else 表达式3

End

)如:

select Name,

(

case Age

when 19 then '孩子'

when 20 then '二十大关'

else '大孩子了'

end

)

from Person 表示当Age的数据是19返回“孩子“等

注意,这里面的then后面的数据类型跟else后面的要相同,当然也可以匹配范围值,如:

select Name,

(

case

when Age<19 then '小孩子'

when Age>=20  and Age <= 30 then '大孩子'

else '老孩子'

end

)

from Person

注意,这里case后面是没有列名的

子查询:

其实我们可以将一个查询语句作为一个结果集供其他的SQL语句使用,就像使用普通的表一样,被当做结果集的查询语句被称为子查询。所有可以使用表的地方几乎都可以使用子查询替代。但是,只有返回且仅返回一行、一列数据的子查询才能当成单值子查询。如果子查询是多行单列子查询其结果就是一个集合。

索引:

另外,索引在数据库中,也是很重要的。当我们给需要经常查询的字段建立索引的时候,可以显著提高查询字段的时间。当然,加了索引后,会增大存储空间,修改数据库的时候,也会因为需要更新索引而使修改速度降低。

创建索引的方法为,在表设计器中点击右键,选择”索引/键”——>添加——>在列中选择索引包含的列,就可以了。

如果你想使查询速度提高,还是需要建立索引的。

这就是目前我所接触到的SQL语句,如以后还有,会继续更新。

posted @ 2013-04-21 20:32  帅大屋  阅读(150)  评论(0编辑  收藏  举报