• 团队项目----数据库SQL语句学习总结与实践


      在本次团队项目编程过程中,我主要负责数据库的设计与建立;在知识不够,能力不足,无数据库设计经验的情况下,对SQL语句进行了较为深入的学习,今天将成果整理之后,写了这篇博客,欢迎大家指出我的不足。

      首先,介绍一下Windows下使用DOS命令进入MySQL数据库

        1.桌面左下角windows图标--搜索框内输入cmd,结果如图所示,点击cmd.exe,或者使用快捷键Windows键(在键盘上有个Windows标志的按键)+R输入cmd后回车。

        2.启动mysql数据库:在出来的DOS命令窗口中输入 net start mysql,或者使用快捷键Windows键(在键盘上有个Windows标志的按键)+ R直接输入net start mysql后回车。(另附:关闭的命令为net stop mysql)。

        3.在DOS命令窗口输入 mysql -hlocalhost -uroot -p回车 进入mysql数据库,其中-h表示服务器名,localhost表示本地;-u为数据库用户名,root是mysql默认用户名;-p为密码,如果设置了密码,可直接在-p后链接输入,如:-p123456,用户没有设置密码,显示Enter password时,直接回车即可。注意,如果你的mysql没有安装在C盘下,你需要先使用DOS命令进入mysql的安装目录下的bin目录中。以我的电脑为例,方法如下:输入D:进入D盘,在输入cd D:ToolsMySQL5.5.25in进入到mysql的bin目录下才可以输入 mysql -hlocalhost -uroot -p。

        4.输入show databases;显示你有的数据库(mysql数据库中的命令必须以分号结尾“;”)。

        5.输入use "数据库名";在显示的数据库列表中选择你要使用的数据库。

        6.进入数据库后,输入show tables;显示该数据库中的所有表。

        7.使用SQL语句进行对表的操作。

        8.如果要退出mysql数据库,输入exit;回车。

    SQl语句的实践

    如下,总共有四张表,现在对这些表进行操作,加深SQL语句的理解:

    表1:班级表,存储学校的所有班级

    表名:class

    属性名

    含义

    类型

    允许NULL

    类别

    域及约束

    classNo

    班级号

    char(6)

    N

    PK

    主键约束

    className

    班级名

    varchar(30)

    N

     

     

    institute

    所属学院

    varchar(30)

    N

     

     

    grade

    年级

    smallint

    N

     

     

    classNum

    班级人数

    int

    Y

    派生

    该属性是冗余属性,值是由表student自动计算出来的。

     

    表2:课程表,存储学校的所有课程

    表名:course

    属性名

    含义

    类型

    允许NULL

    类别

    域及约束

    courseNo

    课程号

    char(3)

    N

    PK

    主键约束

    courseName

    课程名

    varchar(30)

    N

     

    唯一约束:课程名不能重复。

    creditHour

    学分

    numeric(1,0)

    N

     

     

    courseHour

    课时数

    tinyint

    N

     

     

    priorCourse

    先修课程

    char(3)

    Y

    FK

    外键约束,参照本表的主键courseNo

     

    表3:学生表,存储学校的所有学生

    表名:student

    属性名

    含义

    类型

    允许NULL

    类别

    域及约束

    studentNo

    学号

    char(7)

    N

    PK

    只能是全数字组成的7位字符,主键约束。

    studentName

    姓名

    varchar(20)

    N

     

     

    sex

    性别

    char(2)

    Y

     

    取值范围:男、女或者NULL

    birthday

    出生日期

    datetime

    Y

     

     

    native

    籍贯

    varchar(20)

    Y

     

     

    nation

    民族

    varchar(30)

    Y

     

    缺省为汉族

    classNo

    所属班级

    char(6)

    Y

    FK

    外键约束,参照class.classNo

     

     

    表4:成绩表,表示有哪些学生,参加了哪些课程的考试,成绩如何。

    表名:score

    属性名

    含义

    类型

    允许NULL

    类别

    域及约束

    studentNo

    学号

    char(7)

    N

    PK,FK

    外键约束,参照student. studentNo

    courseNo

    课程号

    char(3)

    N

    PK,FK

    外键约束,参照course. courseNo

    score

    成绩

    numeric(5,1)

    N

     

    默认为0,必须是0-100之间的数

    注意,表score的主键是studentNo和courseNo两个属性的联合主键,表示学生与课程之间是多对多的关系,即一个学生可以选修多门课程,一门课程可以由多个学生选择。

    连接查询:
    基于score,student,course三张表进行,首先要注意可能有些学号没有在score表中(即有些同学没有参考过任何一门课程的考试),还可能有些课程号没有在socre表中(即有些课程没有任何一个同学选修)。
      自然连接:根据score,student,course三张表显示学生的考试成绩情况,显示学号,姓名,课程号,课程名,成绩,查询结果按学号升序排列。只查询在score表中出现过的学号和课程号(参加了考试的学生和课程)的成绩:
    select a.studentNo,b.studentName,a.courseNo,c.courseName,a.score
    from Score a,Student b,Course c
    where a.studentNo=b.studentNo and a.courseNo=c.courseNo
    order by a.studentNo
      外连接:根据score,student,course显示学生的考试成绩情况,显示学号,姓名,课程号,课程名,成绩,查询结果按学号升序排列。除了查询参加了考试的学生外,还要查询出未参加过考试的学生,未被学生选择的课程不显示:
    select b.studentNo,b.studentName,c.courseNo,c.courseName,a.score
    from Score a join Course c on a.courseNo=c.courseNo
    right join Student b on a.studentNo=b.studentNo
    order by b.studentNo
    或者写成
    select b.studentNo,b.studentName,c.courseNo,c.courseName,a.score
    from Student b left join Score a on a.studentNo=b.studentNo
    left join Course c on a.courseNo=c.courseNo
    order by b.studentNo
      外连接:根据score,student,course显示学生的考试成绩情况,显示学号,姓名,课程号,课程名,成绩,查询结果按学号升序排列。除了查询出被学生选择过的课程外,还要查询出未被学生选过的课程,未参加过考试的学生不显示:
    select b.studentNo,b.studentName,c.courseNo,c.courseName,a.score
    from Score a join Student b on a.studentNo=b.studentNo
    right join Course c on a.courseNo=c.courseNo
    order by b.studentNo
    或者写成
    select b.studentNo,b.studentName,c.courseNo,c.courseName,a.score
    from Student b join Score a on a.studentNo=b.studentNo
    right join Course c on a.courseNo=c.courseNo
    order by b.studentNo
      全连接:根据score,student,course显示学生的考试成绩情况,显示学号,姓名,课程号,课程名,成绩,查询结果按学号升序排列。除了查询参加了考试的学生外,还要查询出未参加过考试的学生;除了查询出被学生选择过的课程外,还要查询出未被学生选过的课程。
    select b.studentNo,b.studentName,c.courseNo,c.courseName,a.score
    from Score a right join Student b on a.studentNo=b.studentNo
    full outer join Course c on a.courseNo=c.courseNo
    order by b.studentNo
    或者写成
    select b.studentNo,b.studentName,c.courseNo,c.courseName,a.score
    from Student b left join Score a on a.studentNo=b.studentNo
    full outer join Course c on a.courseNo=c.courseNo
    order by b.studentNo
      自连接:根据course表,查询出所有课程的信息:课程号,课程名称,学分,课时数,先修课程名称:
    select a.courseNo,a.courseName,a.creditHour,a.courseHour,b.courseName as 先修课程
    from Course as a left join Course as b
    on b.courseNo=a.priorCourse

    聚合查询:
      查询学号为0800005同学所选修改课程的总学分
    select SUM(creditHour) 总学分
    from Score a , Course b
    where studentNo='0800005' and a.courseNo=b.courseNo
      查询每个同学的选课门数、平均分,最高分
    select StudentNo,COUNT(*) 门数,AVG(Score) 平均分,MAX(score) 最高分
    from Score
    group by studentNo
    嵌套子查询
       在score表中查询分数大于平均分的学生
    select * from score where score>=(select avg(score) from score)
      查询每个班级的平均分和最高分,显示的属性为:班级号,班级名称,平均分,最高分,最后的结果按平均分倒序显示。
    select c.classNo,d.className,c.平均分,c.最高分
    from (select a.classNo,avg(score) 平均分,max(score) 最高分 from Student a,Score b
    where a.studentNo=b.studentNo group by a.classNo) c , Class d
    where c.classNo=d.classNo
    order by 平均分 desc
      视图设计
      创建一个包含学号,姓名和年龄的视图StudentAgeView
    create view StudentAgeView as
    select StudentNo,studentName,YEAR(getdate())-YEAR(birthday) age from Student
    go
    select * from StudentAgeView

    在三表或者多表外连接或者全连接的情况下,连接的顺序能不能交换?为什么?
    比如:
    select b.studentNo,b.studentName,c.courseNo,c.courseName,a.score
    from Score a
    right join Student b on a.studentNo=b.studentNo
    full outer join Course c on a.courseNo=c.courseNo
    order by b.studentNo
    能不能改成:
    select b.studentNo,b.studentName,c.courseNo,c.courseName,a.score
    from Score a
    full outer join Course c on a.courseNo=c.courseNo
    right join Student b on a.studentNo=b.studentNo
    order by b.studentNo

    不能,但是可以改成
    select b.studentNo,b.studentName,c.courseNo,c.courseName,a.score
    from Score a
    right join Course c on a.courseNo=c.courseNo
    full outer join Student b on a.studentNo=b.studentNo
    order by b.studentNo

     

  • 相关阅读:
    【css】rem及其替换方案
    【css】如何实现环形进度条
    【js】我们需要无限滚动列表吗?
    【js】再谈移动端的模态框实现
    【js】callback时代的变更
    【js】为什么要使用react+redux
    【js】JavaScript parser实现浅析
    【css】回想下经典的布局
    【JS】温故知新: 从parseInt开始
    【渲染原理】浏览器渲染原理的个人整理
  • 原文地址:https://www.cnblogs.com/qiangzai/p/8035569.html
Copyright © 2020-2023  润新知