《SQL 2005 select 详尽用法》

本文介绍SQL Server 2005中的数据库查询方法,包括如何使用SELECT语句选择列和行、消除重复行、限制结果返回行数等,同时涵盖数据汇总、排序、分组等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

涉及的知识点:

数据库查询

数据汇总

排序

分组

子查询

集合操作

存储查询结果

函数查询

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

1.数据库查询

   

1.1 选择列

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

选择指定列

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

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

Student表:

Course表:

选课表:SC

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

SELECT SnoSname

FROM Student


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

SELECT SnameSnoSdept

FROM Student

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

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

SELECT  SnoSnameSsexSageSdept 

FROM Student

SELECT  *

FROM Student

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

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

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表示返回结果的前nn 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 SnameSage 

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 SnameSsex

FROM Student

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

 

 

(4) 字符串匹配

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

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

<匹配串>指定匹配模板

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

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

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

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

      

通配符:

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

  a%b表示以a开头b结尾的任意长度的字符串acbaddgbab 等都满足该匹配串

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

  a_b表示以a开头b结尾的长度为的任意字符串acbafb等都满足该匹配串

-- 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,第

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

(5)涉及空值的查询

使用谓词 IS NULL  IS NOT NULL

 “IS NULL不能用 “= NULL代替

 

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

select Sno , Cno, Grade 

from SC

where Grade is  null

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

SELECT SnoCno

FROM  SC

WHERE  Grade IS NOT NULL

(6) 多重条件查询

用逻辑运算符ANDOR来联结多个查询条件

AND的优先级高于OR

可以用括号改变优先级

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

[NOT] IN

[NOT] BETWEEN …  AND  …

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

select Sname

from Student

where Sdept='IS' and Sage<20

--改写.

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

SELECT SnameSsex

FROM Student

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

可改写为

SELECT SnameSsex

FROM   Student

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

改写.

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

FROM Student

WHERE Sage BETWEEN 20 AND 23

可改写为

SELECT SnameSdeptSage

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. 传统连接方式

传统连接方式是指使用FROMWHERE连接多表其语法格式如下

SELECT column_name [,column_name,…          

FROM table_name [,table_name,…]

WHERE condition 

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

select 


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值