利用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)列出没学过李明老师讲授课程的所有同学的姓名(后续解答)

相关