简单的select语句
Select语句的统计功能
Select语句中的多表连接
子查询
Select语句可以从数据库中按照用户的要求检索数据,并将查询结果以表格的形式输出。
Select具有的功能:数据查询、统计、分组、排序
三个表
Student(sno、sname、Ssex、Sage、Sdept)
Course(cno、cname、cpno(先修课)、Ccredit)
Sc(sno、cno、grade)
基本的select语句
1、查询所有的列:select * from student
2、查询表中指定的列:select sno,sname from student
消除值相同的行:distinct
查询选修了课程的学生的学号 select distinct sno from s
使用top [percent]返回前几行数据:
Select top 7 * from student
3、改变查询结果的列标题
对使用别名的操作有三种方式
(1)“列明 别名”
(2)“列名 as ‘别名’”
(3)“‘别名’=列名”
4、单引号的用处
使用单引号加入字符
Select aname,‘学号为:’,sno from s
Where子句
1、使用where来限定查询条件(给出限制查询的范围)
Where子句中的条件表达式
类别 |
运算符 |
说明 |
比较 |
=、>、<、<=、>=、<>、!= |
比较两个表达式 |
逻辑 |
And、or、not |
组合两个表达式的运算结果 或取反 |
范围 |
Between、not between |
搜索值是否在范围内 |
列表运算符 |
In、not in |
查询值是否属于列表值之一 |
字符运算符 |
Like、not like |
字符串是否匹配 |
未知值 |
Is null、is not null |
查询值是否为null |
例1、从学生表s中查询学号为“101”学生的学号和姓名
Select sno,sname from s where sno=‘101’
例2、从课程表c中查询课程名为“数据结构”而且学分为6分的课程信息
Select * from c where cname=‘数据结构’and credit=6
例3、从成绩表sc中查询成绩在70到80之间的信息(between、not)
2、int子句给出列值范围
如果需要确定表达式的取值是否是属于某一列表值之一,可以用关键字in或not in来限定查询条件
例4、从课程表course中查询课程编号为01、02、03的课程信息(in、not)
select * from course
where cno in ('01','02','03')
3、使用like 实现模糊查询(字符串是否匹配)
通配符 |
含义 |
% |
任意多个字符 |
_(下划线) |
单个字符 |
格式: [not] like ‘<匹配串>’[Escape’<换码字符>’]
例5:查询学号为’101’学生的详细情况
Select * from s where sno like '101'
如果like匹配串中不含通配符,可以用 = 代替
等价于 Select * from s where sno ='101'
例6、从学生表s中查询姓 李 的同学的的学号和姓名(like、not like)
select sname、sno from s where sname like '李%'
例7、查询姓‘欧阳’,且全名为3个汉字的学生的学号和姓名
Select sname from s where sname like’欧阳_ _’
如果用户要查询的字符串本身就含有通配符%、_,这时候就需要使用Escape。
例8、查询以‘DB_’开头,且倒数第三个字符为i的课程的详细信息
Select * from course
Where cname like ‘DB\_%i_ _’Escape’\’
匹配串是‘DB\_%i_ _’ \换码字符,先转义成普通的‘_’字符,
后边的_ _,仍作为通配符,Escape’\’,表示\为转码字符
涉及空值的查询
[例] 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。(is null、is not null)
select sno、cno from sc
where grade is null
多重条件查询
逻辑运算符:AND和 OR来联结多个查询条件
[例] 查询计算机系年龄在20岁以下的学生姓名。
SELECT Sname FROM Student
WHERE Sdept= 'CS' AND Sage<20;
[例] 查询信息系(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 ';
4、使用order by 子句
对查询结果进行排序,要在排序的列名后使用关键字Asc(缺省)或者Desc(降序)
当排序列含空值时
ASC:排序列为空值的元组最后显示
DESC:排序列为空值的元组最先显示
[例]、把成绩表sc的信息按成绩由高到低排序
select sno、cno、grade from sc
order by grade desc
Order by 子句可以指定多个列
[例]、从课程c表中查询任课教师、课程号、课程名,要求查询结果首先按照教师名降序排序,教师名一样的,则按课程号升序排序
select teacher,cno,cname from c
order by teacher desc,cno
Select语句的统计功能
5、使用聚合函数
聚合函数是对一组值执行计算并返回单一的值
常用的一些聚合函数:count(返回组中项目的数量,返回值为int类型)、
avg、sum、max、min、var(统计方差)
计数:COUNT([DISTINCT|ALL] *)
COUNT([DISTINCT|ALL] <列名>)
[例]、统计学生表s中学生人数
select count(sno)as 总人数 from s
例、查询sc表中grade的最大值、最小值、总和和平均值
使用group by子句(分组统计语句)
group by 显示分组的汇总数据
[例] 求各个课程号及相应的选课人数。
SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno;
查询过程:按Cno的值分组,所有具有相同Cno值的元组为一组,然后再对每一组使用COUNT计算,求得每组的学生人数。
[例]查询选修了3门以上课程的学生学号。
select sno from SC
group by Sno
having COUNT(*) >3
Having用法与where用法类似
不同:
having只用于group by
having短语作用于组,从中选择满足条件的组。
having可以使用聚合函数,而where不能
where是用于在初始表中筛选结果
当同时含有where子句、group by子句、having子句及聚合函数时,执行顺序:执行where子句查找符合条件的数据,使用group by子句对数据进行分组,使用having子句进一步筛选不符合条件的组
连接查询
连接查询:同时涉及多个表的查询
[例] 查询每个学生及其选修课程的情况
SELECT Student.*,SC.* FROM Student,SC
WHERE Student.Sno = SC.Sno
等价于:
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student,SC
WHERE Student.Sno = SC.Sno;
自身连接:一个表与其自己进行连接
需要给表起别名以示区别
由于所有属性名都是同名属性,因此必须使用别名前缀
[例]查询每一门课的间接先修课(即先修课的先修课)
SELECT a.Cno,b.Cpno
FROM Course a,Course b
WHERE a.Cpno = b.Cno;
复合条件连接:WHERE子句中含多个连接条件
[例]查询选修2号课程且成绩在90分以上的所有学生
SELECT Student.Sno, Sname
FROM Student, SC
WHERE Student.Sno = SC.Sno AND SC.Cno= ‘2’ AND SC.Grade > 90;
/* 连接谓词*/ /* 其他限定条件 */
[例]查询每个学生的学号、姓名、选修的课程名及成绩
SELECT Student.Sno,Sname,Cname,Grade
FROM Student,SC,Course /*多表连接*/
WHERE Student.Sno = SC.Sno
and SC.Cno = Course.Cno;
子查询
一个select……from……where语句称为一个查询块,将一个查询块嵌套在另一个查询块的where子句或者having短语中的查村成为嵌套查询或子查询
查询过程:首先执行内部查询,传递给外层语句,并作为外层语句的查询条件来使用
通常子查询的结果是一个集合
【例子】查询与“刘晨”在同一个系学习的学生。此查询要求可以分步来完成
① 确定“刘晨”所在系名
SELECT Sdept FROM Student
WHERE Sname= '刘晨 ';
结果为: CS
② 查找所有在CS系学习的学生。
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept= 'CS ';
将第一步查询嵌入到第二步查询的条件中
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname= ‘ 刘晨 ’);
查询选修了课程名为“信息系统”的学生学号和姓名
SELECT Sno,Sname ③ 最后在Student关系中
FROM Student 取出Sno和Sname
WHERE Sno IN
(SELECT Sno ② 然后在SC关系中找出选
FROM SC 修了3号课程的学生学号
WHERE Cno IN
(SELECT Cno
① 首先在Course关系中找出
FROM Course
“信息系统”的课程号,为3号
WHERE Cname= ‘信息系统’
)
)
student(sno、sname、ssex、sage、sdept)
course(cno、cname、cpro、ccredit)
sc(sno、cno、grade)
用连接查询实现
SELECT Sno,Sname
FROM Student,SC,Course
WHERE Student.Sno = SC.Sno AND
SC.Cno = Course.Cno AND
Course.Cname=‘信息系统’;