替换查询结果中的数据。
casewhen 条件1 then 表达式1
when 条件2 then 表达式2
else 表达式n
end例】查询score表sno,sname,degree列,对degree列按以下规则进行转换;若degree为90~100,替换为“优秀”,若degree为80 ~ 89,替换为“良好”,若degree在70 ~ 79之间,替换为“中等”,若degree为60 ~ 69之间,替换为“及格”,若degree为0~ 59之间,替换为“不及格”,列标题更改为“evaluation”。
select sno, cno, evaluation=
case when degree>=90 and degree<=100 then '优秀'
when degree>=80 and degree<=89 then '良好'
when degree>=70 and degree<=79 then '中等'
when degree>=60 and degree<=69 then '及格'
else '不及格'
endfrom score
查询经过计算的值
例] 查全体学生的姓名及其年龄。
select sname,'age:',2010-datepart(yy,sbirthday)
from student
消除结果集中的重复行(all与distinct)
例] 查询选修了课程的学生学号。
1) select sno
from score
或(默认 all)
select all sno
from score
(2) select distinct sno
from score
限制结果集的返回行数(top n [percent])
例] select top 4 * from score
select top 40 percent * from score
where子句常用的查询条件。
例] 查询所有在’1975-01-01’后出生的学生学号。
及其姓名。select sno,sname
from student
where sbirthday>’1975-01-01’ 或
select sno,sname
from student
where not sbirthday <=1975-01-01'
例] 查询成绩在60~80(包括60分和80分)之间的所有记录。
select * from score
where degree between 60 and 80
例] 查询成绩不在60~80之间的所有记录。
select * from score
where degree not between 60 and 80
例] 查询成绩为或88的记录。
select *
from score
where degree in(85,86,88)
例] 查询成绩既不是,也不是88的记录。
select *
from score
where degree not in(85,86,88)
例] 查询学号为101的学生的详细情况。
select *
from student
where sno like ‘101'
等价于: select *
from student
where sno = 101'
字符串匹配(通配符)
% 百分号) 代表任意长度(长度可以为0)的字符串。
例:a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab 等都满足该匹配串。
_ 下划线) 代表任意单个字符。
例:a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满足该匹配串。
例] 查询所有姓王学生的姓名、学号和性别。
select sname,sno,ssex
from student
where sname like '王%'
例] 查询姓“李”且全名为二个汉字的学生的姓名。
select sname
from student
where sname like '李_'
例] 查询名字中第2个字为"阳"字的学生的姓名和学号。
select sname,sno
from student
where sname like '_阳%'
例] 查询所有不姓李的学生姓名。
select sname
from student
where sname not like ‘李%'
escape 短语。
当用户要查询的字符串本身就含有 % 或 _ 时,要使用escape '《换码字符》' 短语对通配符进行转义。
例] 查询课程名为db_design课程的课程号和任课教师。
select cno,tno
from course
where cname like 'db\_design'
escape '\
例] 查询以"db_"开头,且倒数第3个字符为 i的课程的详细情况。
select *
from course
where cname like 'db\_%i_ _escape '
注:若匹配串中本身含有’ \则用’?’做换码符。
涉及空值的查询。
例] 某些学生选修课程后没有参加考试。查询缺少成绩的学生的学号和相应的课程号。
select sno,cno
from score
where degree is null
例] 查所有有成绩的学生学号和课程号。
select sno,cno
from score
where degree is not null
使用h**ing短语筛选最终输出结果。
只有满足h**ing短语指定条件的组才输出。
h**ing短语与where子句的区别:作用对象不同。
where子句作用于基表或视图,从中选择满足条件的元组。
h**ing短语作用于组,从中选择满足条件的组。
例] 查询选修了2门或2门以上课程的学生学号。
select sno
from score
group by sno
h**ing count(*)2
例] 查询有2门或2门以上课程都至少为85分的学生的学号及其课程数。
select sno, count(*)
from score
where degree>=85
group by sno
h**ing count(*)2
连接查询 表的连接方法。
方法1:表之间满足一定条件的行进行连接,此时from子句中指明进行连接的表名,where子句指明连接的列名及其连接条件。
方法2:利用关键字join进行连接。
当将join 关键词放于from子句中时,应有关键词on与之相对应,以表明连接的条件。
cross join:将一个表的每条记录和另一表的每条记录拼接成新的记录行。
交叉连接:又称为非限制连接,不带连接谓词的连接,它将两个表不加任何约束地组合在一起,也就是将第一个表的每条记录分别与第二个表的每条记录组成新记录。
例:方法1:
select student.* score.*
from student, score
方法2:select student.* score.*
from student cross join score
inner join :显示符合条件的记录。
等值与非等值连接查询(内连接:inner join):
例35] 查询每个学生及其选修课程的情况。
方法1:select student.*,score.* from student, score
where =
方法2:select student.*,score.* from student inner join score
on = 注:本例中select子句和where子句中的列名前都加上了表名前缀,是因为两个表中的列名sno相同,必须用表名前缀来确切说明所指列属于哪个表,以避免二义性。如果列名在参加连接的各表中是唯一的,就不必加前缀。
= 为连接条件,sno为连接字段。连接条件的一般格式为:
《表名1>.]列名1> 《比较运算符》 [表名2>.]列名2>
其中,比较运算符主要有。
当比较运算符为“=“时,称为等值连接,其他情况为非等值连接。
left (outer) join:显示符合条件的数据行以及左边表中不符合条件的数据行,此时右边数据行会以null来显示,称为左外连接。
right (outer) join:显示符合条件的数据行以及右边表中不符合条件的数据行,此时左边数据行会以null来显示,称为右外连接。
full (outer) join:显示符合条件的数据行以及左边表和右边表中不符合条件的数据行,此时缺乏数据的数据行会以null来显示。
实验五高级查询
一 实验目的。1.掌握子查询。2.掌握连接查询,通过实验操作熟悉各种查询的作用。二 实验学时 2学时。三 实验步骤。1 查询pubs数据库的authors表中的作者的姓 au lname 名 au fname 和 号码 phone 2 使用top关键字,从northwind数据库的customers...
实验7高级查询
一 实验目的与要求。1 熟练掌握使用t sql语句进行连接查询的方法。2 熟练掌握使用t sql语句进行嵌套查询的方法。二 实验内容与步骤。1 查询机械工程学院总分 mark 大于510分的学生学号 姓名 系部和选修课程的课程号及成绩。利用同等连接实现 2 实现上题 1 中的查询内容。利用内连接实现...
实验四高级查询
一 实验目的。1.掌握sql的连接查询。2.熟悉sql的高级查询。二 实验环境。一台pc机,安装widows xp操作系统,oracle 10g或11g数据库软件。三 实验内容 1.列出至少有一个雇员的所有部门。2 列出薪金比 smith 多的所有雇员。3列出所有雇员的姓名及其上级的姓名。4列出入职...