练习三 单表查询
一、表结构修改
1.在练习二的所建立的数据库中增加Teacher表,结构如下:
字段名称 | 数据类型 | 长度 | 精度 | 小数位数 | 是否允许Null值 | 说明 |
Tno | Char | 3 | 0 | 0 | 否 | 教师号,主码 |
Tname | Varchar | 8 | 0 | 0 | 是 | 教师名 |
Tsex | Char | 2 | 0 | 0 | 是 | 性别,取值:男或女 |
Tbirthday | Date | 8 | 0 | 0 | 是 | 出生日期 |
Tdept | Char | 16 | 0 | 0 | 是 | 所在系 |
这里我发现我没给字段`Tno`加主码
这里加上:
而且显示表格的时候会明确标出主键Tno
2.在练习二的所建立的数据库中增加Teaching表,表结构如下:
Teaching表(授课表)的表结构
字段名称 | 数据类型 | 长度 | 精度 | 小数位数 | 是否允许Null值 | 说明 |
Cno | Char | 5 | 0 | 0 | 否 | 课程号,外码 |
Tno | Char | 3 | 0 | 0 | 否 | 教师号,外码 |
Cterm | Tinyint | 1 | 0 | 0 | 是 | 1-8之间 |
这里我发现我没给`Cno`和`Tno`加外码:
这里我给Cno和Tno添加外码:
当我第一次向teaching表中的Cno添加外码的时候,发现外码的名字cn重复的,我尽力去寻找,原来在这个数据库中的sc表中的Cno字段也向主表course中的Cno添加了外键,而且外键的名字也叫cn,所以这里说的外键名cn重复就只需要将cn改个名字即可
对于Tno的外键也是如此:
但是这道题目的意思貌似是得在创建表格的时候加入主键和外键,因此------把这两张新建的表格drop了QAQ
当我想要删除表teacher的时候会报错,原因就是teacher是teaching表中Tno字段的外键束缚的主表,因此我们要先删除从表teaching,(删除表之后,表里的外键自然就会被删除了),接下来我们删除teacher表才能成功
下面就是本题的本意:在创建表的时候就创建好主键和外键:
在创建表格的时候添加外键
3.向上述两表中输入如下数据记录
Cno | Tno | Cterm |
C01 | 101 | 2 |
C02 | 102 | 1 |
C03 | 201 | 3 |
C04 | 202 | 4 |
教师表Teacher 授课表Teaching
Tno | Tname | Tsex | Tbirthday | Tdept |
101 | 李新 | 男 | 1977-01-12 | CS |
102 | 钱军 | 女 | 1978-06-04 | CS |
201 | 王小华 | 女 | 1979-12-23 | IS |
202 | 张小青 | 男 | 1978-08-25 | IS |
往teacher表里添加数据:
往teaching表里添加数据:
自此完成了表格的创建:
二、完成下面查询(将代码写在下面空白处)
1.查询所有男生信息。
2.查询年龄大于20岁的女生学号和姓名。
注意使用year()函数获取Sbrithday字段的年
3.查询所有教师的Tname、Tdept。
4.查询“电子商务”专业的学生姓名、性别和出生日期。
5.查询成绩低于90分的学生学号及课号,并按成绩降序排列。
参数 ASC表示按照升序排序,DESC表示按照降序排序;默认情况下,按照ASC方式排序。通常情况下,ORDER BY子句位于整个SELECT语句的末尾。
6.查询Student表中所有的系名。
如何解决?----可以在Sdept字段前加distinct
7.查询“C01”课程的开课学期。
8.查询成绩在80分至90之间的学生学号及课号。
9.统计有学生选修的课程门数。
但是查询一个sc表:
数据有重复,可以使用distinct
10.查询成绩为77,88或99的记录
根据我们上表的查看sc表里没有这三条记录
11.计算“C01”课程的平均成绩。
12.输出有成绩的学生学号。
13.查询所有姓“刘”的学生信息。
%用于匹配任意长度的字符串。例如,字符串“a%”匹配以字符a开始任意长度的字符串;”%a”匹配以字符a结束任意长度的字符串;”%a%”匹配包含字符a1的任意长度的字符串
14.统计输出各系学生的人数。按系分组
15.查询选修了“C03”课程的学生的学号及其成绩,查询结果按分数的降序排列。
16.查询各个课程号及相应的选课人数,并为选课人数取别名为“人数”。
但是我发现字段人数没有显示出来
17.统计每门课程的选课人数和最高分,并为选课人数和最高分分别取别名为“人数”、“最高分”。
18.统计每个学生的选课门数和考试总成绩,并为选课门数和总成绩分别取别名为“门数”、“总成绩”,并按选课门数降序排列。
- 思考题
1.聚集函数能否直接使用在:SELECT子句、HAVING子句、WHERE子句、GROUP BY子句中?
可以
2.关键字ALL和DISTINCT有什么不同的含义?
ALL修饰的字段可以出现重复的值(并且默认为ALL)
DISTINCT修饰的字段不会出现重复的值(如果需要,需要加上DSITINCT)
3.SELECT语句中的通配符有几种?含义分别是什么?
%通配符:%用于匹配任意长度的字符串。例如,字符串“a%”匹配以字符a开始任意长度的字符串;”%a”匹配以字符a结束任意长度的字符串;”%a%”匹配包含字符a1的任意长度的字符串
_通配符:下划线通配符只匹配单个字符,如果要匹配多个字符,需要连续使用多个下划线通配符。例如,字符串“ab_”匹配以字符串“ab”开始长度为3的字符串,如abc、abp等等;字符串“a__d”匹配在字符“a”和“d”之间包含两个字符的字符串,如"abcd"、"atud"等等。
- 利用BETWEEN…AND运算符表示数据的范围能否与其他方法表示?怎样表示?
例如where age between 15 and 18就可以 where age>=15 and age<=18