利用SQL语言进行查询
目录:1.单表检索语句Select
2.单表检索语句的练习
运算符问题,结果唯一性问题,结果排序问题,模糊查询问题
3.多表联合查询语句Select
4.多表联合查询之连接条件
5.多表联合查询训练
1.简单检索语句 Select
(1)Select 的简单语法形式
Select 列名 [ [ ,列名 ] ... ]
From 表名
[ Where 检索条件 ]; [...] 的意思是 Where 语句是可选的
(2)对 Select 的理解:从一个表中根据检索条件进行检索,按照 Select 的格式进行输出
2.简单查询举例
(1)检索学生表中所有学生的信息
Select * From Student; 若投影所有列,则可以用 * 来简写
另一种格式:
Select S#, Sname, Ssex, Sage, Sclass, D#
From Student;
(2)检索学生表中所有学生的姓名和年龄
Select Sname, Sage
From Student;
(3)检索学生表中所有年龄小于等于19岁的学生的年龄和姓名
Select Sage, Sname
From Student
Where Sage ≤ 19;
(4)检索教师表中所有工资少于 1500 元或者工资大于 2000 元并且是 03 系的教师姓名
对于复杂的检索条件,关键是运算符(and or not)的优先次序,在关系代数选择运算中有提及
Select Tname
From Teacher
Where ( Salary < 1500 or Salary > 2000 ) and D# = 03;
(5)求或者学过 001 号课程,或者学过 002 号课程的学生的学号
Select S#
From SC
Where C# = '001' or C# = '002';
(6)求既学过 001 号课程,又学过 002 号课程的学生的学号
Select S1.S#
From SC S1, SC S2
Where S1.S# = S2.S# and S1.C# = '001' and S2.C# = '002';
( 错误写法:Where C# = '001' and C# = '002';该语句的结果为空值 )
(7)结果唯一性问题
1)在 Table 中要求无重复元组是通过定义 Primary key 或 Unique 来保证的
2)在检索结果中要求无重复元组,是通过 DISTINCT 保留字的使用来实现的
在选课表中,检索成绩大于80分的学号
Select DISTINCT S#
From SC
Where Score > 80;
(8)结果排序问题
1)Select 语句中结果排序是通过增加 order by 子句实现的
order by 列名 [ asc ] [ desc ]
2)若 order by 语句后面跟随 [ asc ]或省略不写,表示为升序;若为 [ desc ],表示降序
按学号由小到大的顺序显示出所有学生的学号和姓名
Select S#, Sname
From Student
order by S# asc;
(9)检索 002 号课大于80分的所有同学学号并按照成绩由高到低顺序显示
Select S#
From SC
Where C# = '002' and Score > 80
Order By Score DESC;
(10)模糊查询问题
1)含有 like 运算符的表达式
列名 [ not ] like “字符串”
2)找出匹配给定字符串的字符串,匹配规则如下
“ % ”:匹配零个或多个字符
“ _ ”:匹配任意单个字符
“ \ ”:转义字符,用于去掉一些特殊字符的特定含义,使其被作为普通字符看待,如用“\%”去匹配字符 %
3)检索所有姓张的同学的学号和姓名
Select S#, Sname
From Student
Where Sname Like '张%';
4)检索名字为张某某的所有同学姓名
Select Sname
From Student
Where Sname Like '张__ __";(注意两个下划线代表一个汉字)
5)检索名字不姓张的所有同学姓名
Select Sname
From Student
Where Sname Not Like '张%';
3.利用SQL语言进行多表联合查询
(1)Select 的多表联合检索语句
Select 列名 [ [, 列名] ... ]
From 表名1,表名2,...
Where 检索条件;
(2)检索条件要包含连接条件,通估计不同的连接条件可以实现等值连接,不等值连接,各种 θ连接(关系代数中有相关知识)
4.多表联合查询之连接条件
(1)按“ 001 ”号课成绩由高到低顺序显示所有学生的姓名
Select Sname
From SC, Student
Where Student.S# = Sc.S# and SC.C# = '001'
Order By Score DESC;
(2)按‘ 数据库 ’可成绩由高到低顺序显示所有同学姓名
Select Sname
From Student, Course, SC
Where Student.S# = SC.S# and SC.C# = Course.C# and Course.Cname = '数据库'
Order By Score DESC;
(3)同一个表的连接操作(表更名和表别名)
1)连接运算涉及到重名的问题,如两个表中的属性重名,连接的两个表重名,同一个表的连接等,因此需要使用别名以便区分
2)select 中采用别名的方式
Select 列名 as 列别名 [ [,列名 as 列别名] ... ]
From 表名1 as 表别名1, 表名2 as 表别名2, ...
Where 检索条件;
3)上述定义中的 as 可以省略;当定义了别名后,在检索条件中可以使用别名来限制属性
4)求有薪水差额的任意两位教师
Select T1.Tname as Teacher1, T2.Tname as Teacher2
From Teacher as T1, Teacher as T2
Where T1.Salary > T2.Salary;
5)求年龄有差异的任意两位同学的姓名
Select S1.Sname as Student1, S2.Sname as Student2
From Student S1, Student S2
Where S1.Sage > S2.Sage;
6)求‘001’号课程有成绩差的任意两位同学
5.多表联合查询训练
(1)求既学过 “001” 号课又学过 “002”号课的所有学生的学号
Select S1.S#,
From SC S1, SC S2
Where S1.S# = S2.S# and S1.C# = '001' and S2.C# = '002';
(2)求 “001” 号课成绩比 “002” 号课成绩高的所有学生的学号
Select S1.S#
From SC S1, SC S2
Where S1.S# = S2.S# and S1.C# = '001' and S2.C# = '002' and S1.Score > S2.Score
(3)列出没学过李明老师讲授课程的所有同学的姓名(后续解答)