SQL 查询语言(2、查询举例)

(1)学生基本情况数据表Student,结构如下:

字段名(列名)

字段类型

约束控制

字段含义说明

S_No

char(6)

primary key

学号

Class_No

char(6)

Foreign key

班级号

S_Name

char(10)

not null

学生姓名

S_Sex

char(2)

‘男’或‘女’

性别

S_Birthday

datetime

 

出生日期

(2)班级数据表Class,结构如下:

字段名(列名)

字段类型

约束控制

字段含义说明

Class_No

char(6)

primary key

班级号

Class_Name

char(20)

not null

班级名称

Major

char(20)

 

所属专业

Department

char(20)

 

系别

(3)课程数据表Course,结构如下:

字段名(列名)

字段类型

约束控制

字段含义说明

Course_No

char(5)

primary key

课程号

Course_Name

char(20)

not null

课程名称

Course_Credit

numeric(6,2)

 

学分

(4)选修课程情况数据表Choice,结构如下:

字段名(列名)

字段类型

约束控制

字段含义说明

S_No

char(6)

Foreign key

学号+课程号为主键

Course_No

char(5)

Foreign key

课程号

Score

numeric(6,1)

 

成绩

(5)教师数据表Teacher,结构如下:

字段名(列名)

字段类型

约束控制

字段含义说明

T_No

char(6)

primary key

教师号

T_Name

varchar(10)

not null

教师姓名

T_Sex

char(2)

‘男’或‘女’

性别

T_Birthday

datetime

 

出生日期

T_Title

char(10)

 

职称

T_Salary

int

Check>0

工资

T_Dept

Char(10)

Not null

系别


(6)教师任课情况表Teaching ,结构如下:

字段名(列名)

字段类型

约束控制

字段含义说明

Course_No

char(5)

Foreign key

课程号+教师号为主键

T_No

char(6)

Foreign key

教师号

以上的6个表用于下面举例时用


本篇概要图


1、普通查询

       含义:一个表的查询。

       举例:求选课在3门以上(含3门)且各门课程均及格的学生的学号及其总成绩,查询结果按总成绩降序排序。

Select S_No sum(Score) as S_S from Choice group by S_No having(count(*)>=3) 

2、连接查询

      含义:查询“同时”涉及两个以上的表时,称为连接查询。表和表之间为并列关系

      1>、From……Where型

             含义:From字句指明进行连接的表名,Where字句指明连接的列名及其连接条件

                  举例:查询每门课程的课程名称、任课老师姓名及其职务、选课人数。

                              Select Course.Course_Name,Teacher.T_Name,Teacher.T_Title,count(Course.S_No)as People from Course,Teacher,Choice,Teaching Where Teaching.T_No =Teacher.T_No and Teaching.Course_No = Course.Course_No and Course.Course_No =Choice.Course_No  Group by Choice.S_No

      2>、关键字Join型

              1>>、具体类型

                        Innerjoin(内连接):显示符合条件的记录,此为默认值。没有主辅之分

                        Right[outer] join(右外连接):显示符合条件的记录以及右表中不符合条件的记录,此时,左表记录行一般用null来显示。有主辅之分

                        Left [outer] join(左外连接):显示符合条件的记录以及左表中不符合条件的记录,此时,右表记录行一般用null来显示。有主辅之分

                         Full [outer] join(全外连接):显示符合条件的记录以及左右表中不符合条件的记录,此时,缺省左右记录行一般用null来显示。没有主辅之分

               2>>、举例:检索所有学生姓名、出生日期、和选课名称

                                  SelectStudent.S_Name,Student.S_Birthday,Course.Course_NameFrom (select S_No,S_Name,S_BirthdayFrom Student) as R3 INNER JOIN (selectR2.S_No,R1.Course_No From (selectCourse_No,Course_Name From Course) as R1 InnerJoin (select S_No,Course_No From Choice) as R2 on R1.Course_No=R2.CNo) as R4 ONR3.S_No=R4.S_No

3、子查询

      含义:在Where子句中包含一个形如Select-From-Where的查询块,此查询块称为子查询或嵌套查询。

      1>、相关子查询

              含义:子表中查询的条件用到了父表中的字段名。所以,执行顺序:根据在字表中出现的父表的字段名,选取父表中的第一行记录的相应字段值,然后,进行配对,符合条件的组成新的虚拟表,此时,子查询完成。

                 举例:查询不讲授课程号为C5的教师姓名

SelectT_Name From Teacher Where (‘C5’<>all(Select Course_No From Teaching WhereT_No=Teacher.T_No))

      2>、普通子查询

              含义:子表中查询的条件没有用到父表中的字段名

              1>>、单行单列记录

                        含义:子查询的返回值只有一个,并且涉及到的字段只有也是一个。此时可以使用比较运算符(=,>,<,>=,<=,!=,<>)。注意:!=和<>都代表不等于,没有区别,这是因为向下兼容性的而处在的。

                         举例:查询与“刘伟”老师职称相同的教师号、姓名

                                    SelectT_No,T_Name From Teacher Where T_Title = (Select T_Title From Teacher WhereT_Name = ‘刘伟’)

               2>>、多行单列记录

                        含义:子查询的返回值是多个值,返回了一个集合。此时不能直接使用比较大小的比较运算符(=,>,<,>=,<=,<>),可以在比较大小的比较运算符和子查询之间插入any或all,也可以不使用比较大小的比较运算符,而使用in(in相当于等于“=any”)。

                         举例:查询其它系中比计算机系所有教师工资都高的教师的姓名和工资

Select T_Name,T_Salary From Teacher Where T_Salary > all(Select T_Salary From Teacher Where T_Dept='计算机') and T_Dept<>'计算机'

                          说明:in()的含义是匹配子查询结果中的任一个值即可(符合一个就行,重点为在里面);all()的含义是必须要符合子查询的所有值才可以(全部相同才行,重点为全部);any()的含义是要符合查询结果的任何一个值即可(重点为任意一个)。in()可以代替“=any()”。注意:all和any操作符不能单独使用,必须要和比较大小的比较运算符(=,>,<,>=,<=,<>)结合使用。

                 3>>、多行多列记录

                           含义:子查询的返回多个字段的多个值,且父查询的时候依据这些值进行查询

                 4>>、单行单列记录

                           含义:子查询的返回多个字段的一条记录,且父查询的时候依据这些值进行查询。此时可以运用比较大小的比较运算符(=,>,<,>=,<=,<>)。

                  5>>、网友的过于3>>和4>>的说法和举例:多列子查询:当是单行多列的子查询时,主查询语句的条件语句中引用子查询结果时可用单行比较符号(=, >, <, >=, <=, <>)来进行比较;当是多行多列子查询时,主查询语句的条件语句中引用子查询结果时必须用多行比较符号(IN,ALL,ANY)来进行比较。

例:SELECT deptno,ename,job,sal FROM EMP WHERE (deptno,sal) IN (SELECT deptno,MAX(sal) FROM EMP GROUP BY deptno);     

           3>、相关子查询和普通查询的区别

                   普通子查询的子表只执行一次;相关子查询的子表的执行次数,要看父表的记录行数了,也就是说,选择父表的一行记录执行一边子表。

4、合并查询

      含义:使用union操作符将来自不同查询的数据组合起来,形成一个具有综合信息的查询结果。union会自动将重复的数据行剔除。注意:参加合并查询的各子查询的使用的表结构应该相同(数据列的数据及相应的数据类型应该相同)

        举例:从选课信息表中查询出学号为“S1”的同学的学号和总分,且再一次从选课信息表中查询出学号为“S2”的同学的学号和总分,然后将两个查询结果合并成一个结果集。

Select S_No,sum(Score) From Choice Where S_No='S1' Group by S_No Union Select S_No,sum(Score) From Choice Where S_No='S2' Group by S_No。

 

注意:确定是否为子查询的关键是子查询的形式,不是位置。也就是说子查询的位置是不固定的,可以是在where后,也可以是在from后等等,但是子查询的形式一定是Select-From-Where的结构。

 

 

补充:

1、查询内容完全重复的内容

select * from Table_Name where Field_Name in (select Field_Name from Table_Name group by Field_name having count(*)>1)

 

2、运用条件查询时用到的运算符和通配符

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值