(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。
- 1楼lfmilaoshi3天前 23:48
- 分出层次来的博客,看起来就轻松了n米老师