《SQL 2005 select 详尽用法》

分类: 365bet亚洲投注网址 时间: 2025-10-22 17:30:37 作者: admin 阅读: 8471
《SQL 2005 select 详尽用法》

最近一直很忙, 好久没有更新博客了,现在就贴上自己在学习SQL 2005 过程中的学习笔记吧,自认为总结的还是不错的,与君共勉,如有错误之处,还请高手们不吝赐教!!

数据库查询是数据库中一个最重要也是最基本的功能,它是从数据库中检索符合条件的数据记录的选择过程。SQL Server 2005的数据库查询使用T-SQL语言,其基本的查询语句是SELECT语句。

本章主要介绍SQL Server 2005数据库查询的方法及使用。

涉及的知识点:

数据库查询

数据汇总

排序

分组

子查询

集合操作

存储查询结果

函数查询

练习以上知识点实际上是练习使用select语句和其他语句的组合。

1.数据库查询

1.1 选择列

选择列指的是通过限定返回结果的列组成结果表。

选择指定列

选择指定列指的是选择一个表中的部分列,各列名之间用逗号隔开。

首先做三张表以作下面的演示:(代码大家可以直接复制)

Student表:

Course表:

选课表:SC

--1.查询全体学生的学号与姓名。

SELECT Sno,Sname

FROM Student;

--2. 查询全体学生的姓名、学号、所在系。

SELECT Sname,Sno,Sdept

FROM Student;

查询全部列:可以使用"*"简单代替

--3 查询全体学生的详细记录。

SELECT Sno,Sname,Ssex,Sage,Sdept

FROM Student;

SELECT *

FROM Student;

定义列别名:在选择列的同时给该列赋予新的名字,使用as关键字

--4.查询所有学生的姓名、性别,并将相应的列名换为name、sex。

Select Sname as name,Ssex as sex

from student

替换结果中数据(结果经过计算)

--5. 查全体学生的姓名及其出生年份。

SELECT Sname,2012-Sage

FROM Student

--使用CASE函数给每个学生的分数设定等级。

SELECT Sno,Cno,Grade,等级=

CASE

WHEN Grade>=90 THEN '优秀'

WHEN Grade>=80 THEN '良好'

WHEN Grade>=70 THEN '中等'

when Grade>=60 then '及格'

ELSE '不及格'

END

FROM SC

1.2 选择行

选择行指的是通过限定返回结果的行组成结果表。选择行可以和选择列一起使用。

1. 消除结果中重复行

在对表进行查询时,有时查询结果有许多重复行。SELECT语句使用DISTINCT关键字消除结果中的重复行。其语法格式如下:

DISTINCT column_name [,column_name…]

说明:DISTINCT关键字对后面的所有列消除重复行。一个SELECT语句中DISTINCT只能出现一次,而且必须放在所有列名之前。

--7 . 查询选修了课程的学生学号。

SELECT Sno FROM SC;

或(默认 ALL)

SELECT ALL Sno FROM SC;

/*

--//等价SELECT all Sno FROM SC

SELECT Sno FROM SC

--DISTINCT

SELECT DISTINCT Sno FROM SC

*/

限制结果返回行数

如果SELECT语句返回结果有很多行,可以使用TOP关键字限定返回行数。在SQL Server 2000中,关键字TOP后只能常数数值。

在SQL Server 2005中进行了改进,TOP后还可以使用数值表达式。其语法格式如下:

TOP n [PERCENT]

说明:其中n表示返回结果的前n行,n PERCENT表示返回结果的前n%行。

top 后跟数字

--8.查询课程表中前门课的信息。

select top 3 Cno from SC

top后跟表达式

--9.查询学生表中前人的信息。

declare @i_temp int

set @i_temp=3

select top (@i_temp) *

from Student

限制结果返回行的条件

在限定返回结果的行操作时,最重要的就是通过条件限制,SELECT语句中WHERE子句是最常用、最重要的条件子句。

在WHERE子句指出查询的条件,系统找出符合条件的结果。其语法格式如下:

WHERE < operator 1> [AND < operator 2>…][AND | OR < operator >…]

WHERE子句常用的查询条件

(1) 表达式比较

在WHERE子句的<比较条件>中使用比较运算符:

=,>,<,>=,<=,!= 或 <>,!>,!<,

-- 10.查询所有年龄在岁以下的学生姓名及其年龄。

select Sname ,Sage

from Student

where Sage<20

SELECT Sname,Sage

FROM Student

WHERE NOT Sage >= 20

--11.查询考试成绩有不及格的学生学号。

select Sno

from SC

where Grade<60

(2) 限制范围

--12.查询年龄在~23岁之间的学生的姓名、系别和年龄。

-- between a and b 相当于[a,b]

select Sname , Sdept , Sage

from Student

where Sage between 18 and 23

--13.查询年龄不在~23岁之间的学生姓名、系别和年龄。

select Sname , Sdept , Sage

from Student

where Sage not between 18 and 23

(3) 确定集合

使用谓词 IN <值表>, NOT IN <值表>

<值表>:用逗号分隔的一组取值

--14.查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。

select Sname,Ssex

from Student

where Sdept in ('IS','MA')

--同上等价

SELECT Sname,Ssex

FROM Student

WHERE Sdept= 'IS' OR Sdept= 'MA'

--15.查询既不是信息系、数学系,也不是计算机科学系的学生的姓名和性别。

SELECT Sname,Ssex

FROM Student

WHERE Sdept NOT IN ( 'IS','MA','CS' )

(4) 字符串匹配

谓词LIKE可以用来进行字符串匹配

[NOT] LIKE ‘<匹配串>’ [ESCAPE ‘<换码字符>’]

<匹配串>:指定匹配模板

匹配模板:固定字符串或含通配符的字符串

当匹配模板为固定字符串时,

可以用 = 运算符取代 LIKE 谓词

用 != 或 < >运算符取代 NOT LIKE 谓词

通配符:

%: (百分号) 代表任意长度(长度可以为)的字符串

例:a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab 等都满足该匹配串

_ :(下横线) 代表任意单个字符

例:a_b表示以a开头,以b结尾的长度为的任意字符串。如acb,afb等都满足该匹配串

-- 16.查询学号为的学生的详细情况。

SELECT *

FROM Student

WHERE Sno ='95001'

等价于:

SELECT *

FROM Student

WHERE Sno = '95001'

--17.查询所有姓刘学生的姓名、学号和性别。

select *

from Student

where Sname like '刘%'

--18.查询所有不姓刘学生的姓名、学号和性别。

select *

from Student

where Sname not like '刘%'

ESCAPE 短语:

当用户要查询的字符串本身就含有 % 或 _ 时,要使用ESCAPE ‘<换码字符>’短语对通配符进行转义。

使用换码字符将通配符转义为普通字符。

--19.查询姓名中第二个字是‘%’的学生。

select sname

from student

where Sname like '_/%' ESCAPE '/'

--同以上等价

select sname

from student

where sname like '_6%' ESCAPE '6'

==>:DSCAPE后的内容是转义符号,并且该转移符号只能是单个字符,如下面的写法是错误的:

select sname

from student

where sname like '_6AB%' ESCAPE '6AB'

--错误信息:

--消息506,级别16,状态2,第1 行

--在LIKE 谓词中指定的转义符"6AB" 无效。

(5)涉及空值的查询

使用谓词 IS NULL 或 IS NOT NULL

“IS NULL”不能用 “= NULL”代替

--20.某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。

select Sno , Cno, Grade

from SC

where Grade is null

--21. 查所有有成绩的学生学号和课程号。

SELECT Sno,Cno

FROM SC

WHERE Grade IS NOT NULL

(6) 多重条件查询

用逻辑运算符AND和OR来联结多个查询条件

AND的优先级高于OR

可以用括号改变优先级

可用来实现多种其他谓词的等价形式

[NOT] IN

[NOT] BETWEEN … AND …

-- 22.查询计算机系年龄在岁以下的学生姓名。

select Sname

from Student

where Sdept='IS' and Sage<20

--改写.

--14.查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。

SELECT Sname,Ssex

FROM Student

WHERE Sdept IN ( 'IS','MA','CS' )

可改写为:

SELECT Sname,Ssex

FROM Student

WHERE Sdept= ' IS ' OR Sdept= ' MA' OR Sdept= ' CS '

改写.

--12查询年龄在~23岁(包括岁和岁)之间的学生的姓名、系别和年龄。ÿ SELECT Sname,Sdept,Sage

FROM Student

WHERE Sage BETWEEN 20 AND 23;

可改写为:

SELECT Sname,Sdept,Sage

FROM Student

WHERE Sage>=20 AND Sage<=23

2.数据汇总(使用集函数)

5类主要集函数

(1)计数

COUNT([DISTINCT|ALL] *)

COUNT([DISTINCT|ALL] <列名>)

(2)计算总和

SUM([DISTINCT|ALL] <列名>)

(3)计算平均值

AVG([DISTINCT|ALL] <列名>)

(4)求最大值

MAX([DISTINCT|ALL] <列名>)

(5)求最小值

MIN([DISTINCT|ALL] <列名>)

DISTINCT短语:在计算时要取消指定列中的重复值

ALL短语:不取消重复值

ALL为缺省值

--25.查询学生总人数。

SELECT COUNT(*)

FROM Student

--26.查询选修了课程的学生人数。

SELECT COUNT(DISTINCT Sno)

FROM SC;

注:用DISTINCT以避免重复计算学生人数

--27.计算号课程的学生平均成绩。

SELECT AVG(Grade)

FROM SC

WHERE Cno= ' 2 '

--28.查询选修号课程的学生最高分数。

SELECT MAX(Grade)

FROM SC

WHER Cno= ' 2 '

3.排序

使用ORDER BY子句可以按一个或多个属性列排序升序:ASC;降序:DESC;缺省值为升序当排序列含空值时

ASC:排序列为空值的元组最前显示

DESC:排序列为空值的元组最后显示

--23查询选修了号课程的学生的学号及其成绩,查询结果按分数升序排列。

select Sno , Grade

from SC

where Cno='3'

ORDER BY Grade asc

--24查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。

SELECT *

FROM Student

ORDER BY Sdept,Sage DESC

4.对查询结果分组

GROUP BY子句用于分组

分组:按指定的一列或多列值分组,值相等的为一组

--29.查询CS表中选课学生的学号。

select sno

from SC

--group by sno

--方法同下亦可

select DISTINCT sno

from SC

分组的目的:细化集函数的作用对象,未对查询结果分组时,集函数将作用于整个查询结果,

对查询结果分组后,集函数将分别作用于每个组,即每个组都有一个函数值。

--30.求各个课程号及相应的选课人数

select Cno, count(Sno) as 选课人数

from SC

group by Cno

注意:使用GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性和集函数

使用HAVING短语筛选最终输出结果

只有满足HAVING短语指定条件的组才输出

HAVING短语与WHERE子句的区别:作用对象不同

WHERE子句作用于表或视图,从中选择满足条件的元组。

HAVING短语作用于组,从中选择满足条件的组。

--31.查询选修了门以上课程的学生学号。

select Sno

from SC

group by Sno

having count(Sno)>2

--32.☆☆☆查询有门以上课程是分以上的学生的学号及(分以上的)课程数

SELECT Sno ,count(grade) as '80分课程数'

FROM SC

WHERE Grade>=80

group by Sno

having COUNT(*)>=3

--注:对于数字在前的别名,需要别名上加上' ',不然数字不能够识别,导致错误

【连接】

【连接】指的是通过限定返回结果,将多个表的数据组成结果表,即用一个SELECT语句可以完成从多个表中查询数据。连接对结果没有特别的限制,具有很大的灵活性。

T-SQL提供了两种连接方式:传统连接方式和SQL连接方式。

1. 传统连接方式

传统连接方式是指使用FROM…WHERE连接多表。其语法格式如下:

SELECT column_name [,column_name,…

FROM table_name [,table_name,…]

WHERE condition

--33.查询每个学生选修课程的信息,输出学生姓名和课程名。

select

相关文章

「歪」字组词
异质光照环境下克隆整合对南美蟛蜞菊和蟛蜞菊种间关系的影响
世界杯首战俄罗斯5
古人偏爱什么动物毛制的笔?王羲之用哪种毛笔?他考证古笔而尽量挽留毛笔文化