当前位置:文档之家› (8)select语句的用法

(8)select语句的用法


思考以下问题中那一条语句是正确的:



1.利用sc表,分别显示出每位同学所选 修的每门课程的分数 (1)select sno,score from sc group by sno (2)select sno,score from sc order by sno



2.分别显示出每位同学所选修的课程的 平均分 (1) Select sno,avg(score) from sc Group by sno

例19 通过查询求管理系学生的总数。 SELECT COUNT(SNO) FROM S WHERE DEPT=‘管理’
例20 通过查询求学校中共有多少个系。 SELECT COUNT(DISTINCT DEPT) AS DeptNum FROM S 注意:加入关键字DISTINCT后表示消去重 复行,可计算字段“DEPT“不同值的数目。 COUNT函数对空值不计算,但对零进行计 算。

上面SQL语句等价于以下语句: SELECT TNO,TN,PROF FROM T WHERE SAL>=1000 AND SAL<=1500

例8 查询工资不在1000至1500之间的教师 的教师号、姓名及职称。
SELECT TNO,TN,PROF FROM T
WHERE SAL NOT BETWEEN 1000 AND 1500 或者可以写成 SELECT TNO,TN,PROF FROM T






例23 按学号sno对平均成绩进行分组,并 且只包含那些平均成绩大于87的分组 Select sno, AVG(score) as Avgscore from sc Group by sno Having AVG(score) >87


(同时使用where、group by和having子句) 例24 查询选课在三门以上并且各门课程均 及格的学生的学号及其总成绩,查询结果 按降序排列 select sno ,sum(score) as totalscore from sc Where score >=60 Group by sno Having count(*)>=3 Order by sum(score) desc




例16 查询选修C2,C3,C4或C5课程的学生 学号,课程号和成绩,查询结果要求按照学号 升序排列,若学号相同,再按成绩降序排列。
select SNO , SCORE from SC where CNO IN ( ‘C2’ , ’C3’ , ’C4’ , ’C5’ ) order by SNO, SCORE DESC

例如现在有两张表,结构如下: 学生信息表(S)
SNO SN AGE
选课表(SC)
SNO SCORE CNO
空值查询

如果某个字段中没有填入值(即为空值null), 空值不同于零和空格,它不占用任何存储空间。
例14 查询没有考试成绩的学生的学号和相应 的课程号 Select SNO,CNO from SC where SCORE is null
select select_list [into new_table_name] from table_list [where search_conditions] [group by group_by_list] [having search_ conditions] [order by order_list[DESC|ASC]]

例10 查询没有选修C1,也没有选修C2的 学生的学号、课程号和成绩 Select SNO,CNO,SCORE from SC where CNO not in( ‘C1’ , ’C2’ ) 上面的语句还可以写成:



Select SNO,CNO,SCORE from SC where CNO!= ‘C1’ and CNO!= ‘C2’
基本select语句


1 投影查询
基本的select语句组成:
要返回的列和这些列源于的表

查询时不使用where子句的无条件查询,就称为投影 查询。
如果希望查询表中所有的信息,可以使用*来表示 如果需要指定特定的列,应该用逗号分隔列表中需要显 示的列


例如现在有两张表,结构如下: 学生信息表(S)
分组查询

聚合函数和Group by子句 Group by子句可以用来查询结果按属性列或 者属性列组合在行方面上进行分组。
常用的聚合函数有: MIN,MAX,SUM,AVG,COUNT, COUNT(*)


例17 通过查询求学号为200801学生的总 分和平均分。
SELECT SUM(SCORE) AS TotalScore, AVG(SCORE) AS AveScore FROM SC WHERE SNO = ‘200801'

利用投影查询还可以控制列名的顺序,并 且可以通过指定别名来改变所查询的结果 的列标题的名称。
例3 查询所有的学生的姓名、学号和年龄 Select SN NAME,SNO,AGE from S 在结果窗口显示的结果为:

SNO
SN
AGE
NAME
SNO
AGE
条件查询

当需要在表中找出满足某些特定要求的行时, 就需要使用where子句。 Where子句中,条件通常用3部分来描述

注意:函数SUM和AVG只能对数值型字段 进行计算。

例18 通过查询求选修C1号课程的最高分、 最低分及之间相差的分数
SELECT MAX(SCORE) AS MaxScore, MIN(SCORE) AS MinScore, MAX(SCORE)- MIN(SCORE) AS Diff FROM SC WHERE CNO = 'C1'


S中数据如下:
现在根据dept字段进行分组
SNO SN AGE DEPT
选课表(SC)
SNO SCORE CNO

例1 查询全体学生的学号、姓名和年龄。 SELECT SNO, SN, AGE FROM S
或者可以用*表示全部列名:
SELECT * FROM S
例2 查询选修了课程的学生号 SELECT distinct SNO from SC


例21 利用特殊函数COUNT(*)求计算机系学生的
总数。 SELECT COUNT(*) FROM S WHERE DEPT=‘计算机’
Group by 和where子句,having子句



可以在包含group by子句的查询中使用 where子句。 如果要在分组后继续按一定的条件进行筛选, 则需要使用having子句。 Where 和 having子句的区别: ⒈where子句作用于基本表或视图 ⒉having子句则作用于组,且having子句中 可以包含聚合函数。
模糊查询

当不知道完全精确的值的时候,还可以使用 LIKE 或者NOT LIKE进行部分匹配查询(模 糊查询)
例11 查询所有姓张的教师的教师号和姓名 Select TNO,TN from T where TN LIKE ‘张%’




例12 查询姓名中第二个汉字是“力”的教 师号和姓名。 select TNO,TN from T where TN LIKE ‘_力%’
WHERE SAL < 1000 or SAL>1500
Select中可以利用IN操作来查询属性值属于 指定集合的元组,利用 NOT IN可以查寻指 定集合以外的元组。 例9 查询选修C1或C2学生的学号、课程号和 成绩。 Select SNO,CNO,SCORE from SC where CNO IN( ‘C1’ , ’C2’ ) 该语句也可以使用运算符OR来实现: Select SNO,CNO,SCORE from SC where CNO= ‘C1’ or CNO= ‘C2’


查询的排序

当需要对查询的结果排序时,就应该 在 select语句中使用order by 子句, 其中DESC为降序,ASC为升序。
例15 查询选修C1的学生的学号和成绩,并 按成绩降序排列。 select SNO , SCORE from SC where CNO = ‘C1’ order by SCORE DESC

其中通配符“_”表示任意单个字符。


例13 使用NOT运算符,找到所有名字以M 开头,但姓氏不以A开头的员工。 Worker:
firstname lastname emailaddress
ID
Select ID , firstname , lastname , emailaddress from workers where (firstname like ‘M%’ ) and (lastname not like ‘A%’ )


(2) Select * from sc Group by sno


3. 在S表中,分别显示出每个院系的学生的平 均年龄及相关信息 (1) Select avg(age) , dept from s Group by dept (2) Select sno , avg(age) , dept from s G绩高于85分的学生的学号、课程号和 成绩。 SELECT SNO,CNO,SCORE FROM SC WHERE SCORE>85



如果需要编写多条件的查询语句,则需要 使用逻辑运算符and、or或者not将其连接 成复合的逻辑表达式。 其优先级由高到低为:not and or
相关主题