SQL Server

环境安装

关系代数

  • R S

    R
    A B C
    a b c
    b a d
    c d a
    S
    A B C
    a d b
    b a c
    d c b
  • 1
    关系 R 和 S的并集记为 R∪S
    • 并集运算结果(去除RS集合中公共的一条之外,再保留R中所有)

      R∪S
      A B C
      a b c
      b a c
      c d a
      a d b
      d c b
  • R-S
    A B C

| a | b | c |
| c | d | a |

  • (只保留RS的公共部分)

    1
    RS的交集
    • 交集结果输出

      R∩S
      A B C
      b a c
  • 笛卡尔积(R中的每个元组与S元组的 * )

专门的关系运算

1
在关系 R 中选出满足给定条件的元组称为选择 			---> 水平分割
1
在关系 R 中选出若干属性列组成新的关系称为投影 	   ---> 垂直分割
R
A B C
1 4 7
2 5 8
3 6 9
  • σc=8(R)

    1
    `σc=8(R)`由RC属性值为'8'的元组组成
    σc=8(R)
    A B C
    2 5 8
  • πA,B(R)

    1
    `πA,B(R)`
    πA,B(R)
    A B
    1 4
    2 5
    3 6
S
sno sname sex age speciality
141001 刘星宇 20 电子工程
141002 王晓凤 20 电子工程
142001 杨艳 21 计算机应用
142004 周沛杰 21 计算机应用
C
cno cname teacher
101 信号与系统 李航远
204 数据库原理与应用 钱春雨
901 英语 唐莉
SC
sno cno grade sno cno grade
141001 101 94 142004 204 90
141002 101 76 141001 901 95
141001 204 92 141002 901 84
141002 204 74 142001 901 82
142001 204 87 142004 901 92
  • 查询电子工程专业的学生的学号和姓名

    1
    2
    3
    4
    5

    select sno,sname from S where speciality='电子工程';

    π sno,sname(σ speciality='电子工程'(S));

  • 查询年龄小于22 岁的女生学号,姓名和年龄

    1
    2
    3
    4
    5

    select sno,sname,age from S where age<22 and sex='女';

    π sno,sname,age(σ age<22 ^ sex='女'(S));

  • 查询选修了101 号课程的学生的学号,姓名

    1
    2
    3
    4
    5

    select sno,sname from S inner join SC on S.sno=SC.sno where cno='101';

    π sno,sname(σ cno='101'(SC)⋈(S));

  • 查询选修了101 号课程或204 号课程的学生的学号

    1
    2
    3
    4
    select sno from SC where cno='101' or cno = '204';

    π sno(σ cno = '101' v cno = '204'(SC));

  • 查询选修101 号课程的学生的学号,姓名

    1
    2
    3
    4
    5

    select sno,sname from S inner join SC on S.sno = SC.sno where cno = '101';

    π sno,sname(σ cno = '101'(S)⋈(SC));

  • 查询选修了课程名为数据库原理应用的学生的学号和姓名

    1
    2
    3
    4
    5

    select sno,sname from S inner join SC on S.sno = SC.sno where cname = '数据库原理应用';

    π sno,sname(σ cname = '数据库原理应用'(S)⋈(SC));

  • 查询周沛杰为选修课程的课程号

    1
    2
    3
    4
    5

    select cno from S inner join SC on S.sno = SC.sno where sname = '周沛杰';

    π cno(σ sname = '周沛杰'(S)⋈(SC));

  • 查询杨艳英语成绩

    1
    2
    3
    4
    5

    select grade from S inner join SC on S.sno = SC.sno where sname = '杨艳' and cname = '英语';

    π grade(σ sname = '杨艳' ^ cname = '英语'(S)⋈(SC));

数据库的创建与管理

  • 基本流程

    在已安装环境中查找SQL Server 使用Windows 身份验证登录,点击连接
    在已安装环境中查找SQLServer 使用Windows身份验证登录,点击连接
    在数据库选项右击,出现弹窗,点击新建数据库 根据对应要求创建相关数据库
    在数据库选项右击,出现弹窗,点击新建数据库 根据对应要求创建相关数据库
    1. 新建jxgl 数据库

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      CREATE DATABASE jxgl1 
      ON PRIMARY (
      /*
      NAME is filespec: filespec 指定的文件的逻辑文件名
      逻辑文件名--数据库文件在数据库中显示的名字
      */
      name=coderitl_daz,
      /* 主数据文件存储路径 name.mdf */
      filename='G:\SQLServer\Data\coderitl.mdf',
      /* SIZE: 指定 filespec 定义的文件的初始大小 */
      size=10mb,
      /* MAXSIZE:指定 filespec 定义文件的最大大小 */
      maxsize = 50mb, filegrowth = 5mb )

      log ON (
      name=coderit_log,
      filename='G:\SQLServer\Data\coderitl.ldf',
      SIZE=5mb,
      maxsize=25mb,
      filegrowth=5mb
      ) ;
    2. jxgl 数据库增加数据文件data1,改变数据文件的大小和增长方式

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      /* 更新数据库名称 */
      alter database jxgl modify name=data1;

      /* 更新数据库 物理逻辑名称,初始大小,最大大小,增长大小 */
      alter database newjxgl modify file
      (
      name=coderitl,
      size=20mb,
      maxsize=80mb,
      filegrowth=10mb
      );

      /* 检验修改信息 */
      exec sp_helpdb newjxgl;

      /* 修改并添加主数据文件 */
      alter database jxgl
      add file (
      name='coderitladd',
      filename='G:\SQLServer\Data\data1.ndf',
      size=10mb,
      maxsize=50mb,
      filegrowth=5mb
      )

    3. jxgl 数据库增加日志文件datalog1,改变日志文件的大小和增长方式

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      /* 添加日志数据文件 */
      alter database jxgl
      add log file (
      name='coderitl_add_log',
      filename='G:\SQLServer\Data\datalog1.ldf',
      size=10mb,
      maxsize=50mb,
      filegrowth=5mb
      )

    4. jxgl 数据库增加文件组abc

      1
      alter database jxgl add filegroup abc;
    5. 删除数据库jxgl

      1
      drop database jxgl;

表结构的创建和管理

  1. 掌握使用图形界面表结构的创建和管理

    创建数据库 创建表
    T-student T-score
    T-course 查看所有已经创建表信息
  2. 修改course 添加主键

    点击设计 错误 解决方案
  3. 使用SSMS 图形界面在jxgl 数据库中修改score(成绩表)的score 字段,将其类型改为int

    修改字段数据类型
  4. 使用SSMS 图形界面在jxgl 数据库为student(学生信息表)添加字段email,类型char(15)

    student 添加表中添加新字段`email
  5. 使用SSMS 图形界面在jxgl 数据库中将student(学生信息表)的sfzh 字段删除

    student 表中删除字段sfzh
  6. 打开查询窗口,使用T-SQL 命令完成stsc 数据库的创建

    打开窗口 命令
    • 创建表命令使用

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      CREATE DATABASE stsc
      ON PRIMARY (
      /*
      NAME is filespec: filespec 指定的文件的逻辑文件名
      逻辑文件名--数据库文件在数据库中显示的名字
      */
      name=coderitl_datafile,
      /* 主数据文件存储路径 name.mdf */
      filename='G:\SQLServer\Data\database-20210928\stsc.mdf',
      /* SIZE: 指定 filespec 定义的文件的初始大小 */
      size=10mb,
      /* MAXSIZE:指定 filespec 定义文件的最大大小 */
      maxsize = 50mb, filegrowth = 5mb )

      log ON (
      name=coderit_log,
      filename='G:\SQLServer\Data\database-20210928\stsc.ldf',
      SIZE=5mb,
      maxsize=25mb,
      filegrowth=5mb
      ) ;
  7. 使用T-SQL 命令,为stsc 数据库创建教材P388 所示的studentcoursescoreteacher 数据表结构。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    use stsc;

    -- 创建表 student
    create table student(
    /* 学号 */
    sno char(6) not null primary key,
    /* 姓名 */
    sname char(8) not null,
    /* 性别 */
    stsex char(2) not null,
    /* 出生日期 */
    stbirthday date not null,
    /* 专业 */
    speciality char(12),
    /* 总学分 */
    tc int
    );

    -- 创建表 course
    create table course(
    -- 课程号
    cno char(3) not null primary key,
    -- 课程名
    cname char(16) not null,
    -- 学分
    credit int ,
    -- 教师号
    tno char(6)
    );


    -- 创建表 score
    create table score(
    -- 学号
    stno char(6) not null,
    -- 课程号
    cno char(3) ,
    -- 成绩
    grade int ,
    -- 添加联合主键
    primary key(stno,cno)
    );

    -- 创建表 teacher

    create table teacher(
    -- 教师号
    tno char(6) not null,
    -- 姓名
    tname char(8) not null,
    -- 性别
    tsex char(2) not null,
    -- 出生日期
    tbirthday date not null,
    -- 职称
    title char(12) ,
    -- 学院名
    school char(12),
    );

  8. 使用T-SQL 命令,为stsc 数据库的student 表添加Email 字段,类型为char(20)

    1
    2
    3
    4
    use stsc
    go
    ALTER TABLE student
    ADD Email char(20) NOT NULL;
  9. 使用T-SQL 命令,在stsc 数据库中修改course 表的credit 字段类型,改为float

    1
    2
    3
    4
    USE stsc
    GO
    ALTER TABLE course
    ALTER COLUMN credit float;
  10. 使用T-SQL 命令,在stsc 数据库中删除student 表的email 字段

    1
    2
    3
    4
    USE stsc
    GO
    ALTER TABLE student
    DROP COLUMN email;
  11. SSMS 图形界面向stsc 数据库中的studentcoursescore 表插入数据,(表中数据如P389

    1
    2
    3
    4
    5
    6
    7
    student:
    INSERT INTO student VALUES ('121001', '李贤友', '男', '1991-12-30', '通信', 52);
    INSERT INTO student VALUES ('121002', '周映雪', '女', '1993-01-12', '通信', 49);
    INSERT INTO student VALUES ('121005', '刘刚', '男', '1992-07-05', '通信', 50);
    INSERT INTO student VALUES ('122001', '郭德纲', '男', '1991-10-23', '计算机', 48);
    INSERT INTO student VALUES ('122002', '谢暄', '女', '1992-09-11', '计算机', 52);
    INSERT INTO student VALUES ('122004', '孙婷', '女', '1991-02-24', '计算机', 50);
    1
    2
    3
    4
    5
    6
    course:
    INSERT INTO course VALUES ('102', '数字电路', 3, '102101');
    INSERT INTO course VALUES ('203', '数据库系统', 3, '204101');
    INSERT INTO course VALUES ('205', '微机原理', 4, '204107');
    INSERT INTO course VALUES ('208', '计算机原理', 4, NULL);
    INSERT INTO course VALUES ('801', '高等数学', 4, '801102');
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    score:
    INSERT INTO score VALUES ('121001', '102', 92);
    INSERT INTO score VALUES ('121002', '102', 72);
    INSERT INTO score VALUES ('121005', '102', 87);
    INSERT INTO score VALUES ('122002', '203', 94);
    INSERT INTO score VALUES ('122004', '203', 81);
    INSERT INTO score VALUES ('121001', '205', 91);
    INSERT INTO score VALUES ('121002', '205', 65);
    INSERT INTO score VALUES ('121005', '205', 85);
    INSERT INTO score VALUES ('121001', '801', 94);
    INSERT INTO score VALUES ('121002', '801', 73);
    INSERT INTO score VALUES ('121005', '801', 82);
    INSERT INTO score VALUES ('122001', '801', NULL);
    INSERT INTO score VALUES ('122002', '801', 95);
    INSERT INTO score VALUES ('122004', '801', 86);

    student course score

  1. Insert 语句向stsc 数据库中的teacher 数据表插入数据(表中数据如P389

    1
    2
    3
    4
    5
    6
    Teacher:  	
    INSERT INTO teacher VALUES ('102101', '刘林卓', '男', '1962-03-21', '教授', '通信学院');
    INSERT INTO teacher VALUES ('102105', '周学莉', '女', '1977-10-05', '讲师', '通信学院');
    INSERT INTO teacher VALUES ('204101', '吴波', '男', '1978-04-26', '教授', '计算机学院');
    INSERT INTO teacher VALUES ('204107', '王冬琴', '女', '1968-11-18', '副教授', '计算机学院');
    INSERT INTO teacher VALUES ('801102', '李伟', '男', '1975-08-19', '副教授', '数学学院');
    • 结果

  1. SQL Server 创建数据库、表命令使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE DATABASE stsc
ON PRIMARY (
/*
NAME is filespec: filespec 指定的文件的逻辑文件名
逻辑文件名--数据库文件在数据库中显示的名字
*/
name=coderitl_datafile,
/* 主数据文件存储路径 name.mdf */
filename='G:\SQLServer\Data\database-20210928\stsc.mdf',
/* SIZE: 指定 filespec 定义的文件的初始大小 */
size=10mb,
/* MAXSIZE:指定 filespec 定义文件的最大大小 */
maxsize = 50mb, filegrowth = 5mb )

log ON (
name=coderit_log,
filename='G:\SQLServer\Data\database-20210928\stsc.ldf',
SIZE=5mb,
maxsize=25mb,
filegrowth=5mb
) ;
  1. 使用T-SQL 命令,为stsc 数据库创建教材P388 所示的studentcoursescoreteacher 数据表结构。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     use stsc;

    -- 创建表 student
    create table student(
    /* 学号 */
    sno char(6) not null primary key,
    /* 姓名 */
    sname char(8) not null,
    /* 性别 */
    stsex char(2) not null,
    /* 出生日期 */
    stbirthday date not null,
    /* 专业 */
    speciality char(12),
    /* 总学分 */
    tc int
    );

    -- 创建表 course
    create table course(
    -- 课程号
    cno char(3) not null primary key,
    -- 课程名
    cname char(16) not null,
    -- 学分
    credit int ,
    -- 教师号
    tno char(6)
    );


    -- 创建表 score
    create table score(
    -- 学号
    stno char(6) not null,
    -- 课程号
    cno char(3) ,
    -- 成绩
    grade int ,
    -- 添加联合主键
    primary key(stno,cno)
    );

    -- 创建表 teacher

    create table teacher(
    -- 教师号
    tno char(6) not null,
    -- 姓名
    tname char(8) not null,
    -- 性别
    tsex char(2) not null,
    -- 出生日期
    tbirthday date not null,
    -- 职称
    title char(12) ,
    -- 学院名
    school char(12),
    );
  2. 使用T-SQL 命令,为stsc 数据库的student 表添加Email 字段,类型为char(20)

    1
    2
    3
    4
    use stsc
    go
    ALTER TABLE student
    ADD Email char(20) NOT NULL;
  3. 使用T-SQL 命令,在stsc 数据库中修改course 表的credit 字段类型,改为float

    1
    2
    3
    4
    USE stsc
    GO
    ALTER TABLE course
    ALTER COLUMN credit float;
  4. 使用T-SQL 命令,在stsc 数据库中删除student 表的email 字段

    1
    2
    3
    4
    USE stsc
    GO
    ALTER TABLE student
    DROP COLUMN email;
  5. SSMS 图形界面向stsc 数据库中的studentcoursescore 表插入数据,(表中数据如P389

    1
    2
    3
    4
    5
    6
    7
    student:
    INSERT INTO student VALUES ('121001', '李贤友', '男', '1991-12-30', '通信', 52);
    INSERT INTO student VALUES ('121002', '周映雪', '女', '1993-01-12', '通信', 49);
    INSERT INTO student VALUES ('121005', '刘刚', '男', '1992-07-05', '通信', 50);
    INSERT INTO student VALUES ('122001', '郭德纲', '男', '1991-10-23', '计算机', 48);
    INSERT INTO student VALUES ('122002', '谢暄', '女', '1992-09-11', '计算机', 52);
    INSERT INTO student VALUES ('122004', '孙婷', '女', '1991-02-24', '计算机', 50);
    1
    2
    3
    4
    5
    6
    course:
    INSERT INTO course VALUES ('102', '数字电路', 3, '102101');
    INSERT INTO course VALUES ('203', '数据库系统', 3, '204101');
    INSERT INTO course VALUES ('205', '微机原理', 4, '204107');
    INSERT INTO course VALUES ('208', '计算机原理', 4, NULL);
    INSERT INTO course VALUES ('801', '高等数学', 4, '801102');
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    score:
    INSERT INTO score VALUES ('121001', '102', 92);
    INSERT INTO score VALUES ('121002', '102', 72);
    INSERT INTO score VALUES ('121005', '102', 87);
    INSERT INTO score VALUES ('122002', '203', 94);
    INSERT INTO score VALUES ('122004', '203', 81);
    INSERT INTO score VALUES ('121001', '205', 91);
    INSERT INTO score VALUES ('121002', '205', 65);
    INSERT INTO score VALUES ('121005', '205', 85);
    INSERT INTO score VALUES ('121001', '801', 94);
    INSERT INTO score VALUES ('121002', '801', 73);
    INSERT INTO score VALUES ('121005', '801', 82);
    INSERT INTO score VALUES ('122001', '801', NULL);
    INSERT INTO score VALUES ('122002', '801', 95);
    INSERT INTO score VALUES ('122004', '801', 86);
  6. Insert 语句向stsc 数据库中的teacher 数据表插入数据(表中数据如P389

    1
    2
    3
    4
    5
    6
    Teacher:
    INSERT INTO teacher VALUES ('102101', '刘林卓', '男', '1962-03-21', '教授', '通信学院');
    INSERT INTO teacher VALUES ('102105', '周学莉', '女', '1977-10-05', '讲师', '通信学院');
    INSERT INTO teacher VALUES ('204101', '吴波', '男', '1978-04-26', '教授', '计算机学院');
    INSERT INTO teacher VALUES ('204107', '王冬琴', '女', '1968-11-18', '副教授', '计算机学院');
    INSERT INTO teacher VALUES ('801102', '李伟', '男', '1975-08-19', '副教授', '数学学院');

新增练习

  1. 将李贤友同学的出生日期改为‘1995-4-5’
1
2
3
4
/* 1. 将李贤友同学的出生日期改为‘1995-4-5’。*/
UPDATE student
SET stbirthday = '1995-4-5'
WHERE sname = '李贤友';
  • 输出:
    在这里插入图片描述
  1. teacher 表添加一名老师的信息: 通信学院,张丽,女,教授,教师号:102103,出生日期:1977-8-7
1
2
INSERT INTO teacher ( school, tname, tsex, title, tno, tbirthday)
VALUES ( '通信学院', '张丽', '女', '教授', '102103', '1977-8-7');
  • 输出:
    在这里插入图片描述
  1. 删除张丽老师的信息。
1
2
3
4
-- 3.   删除张丽老师的信息。
DELETE
FROM teacher
WHERE tname = '张丽';
  • 输出:
    在这里插入图片描述
  1. 查询student 表中总分大于或等于50 分的学生情况。
1
2
3
4
 -- 4.   查询student表中总分大于或等于50分的学生情况。
SELECT *
FROM student
WHERE tc >= 50;
  • 输出:
    在这里插入图片描述
  1. 查询谢暄的“高等数学”成绩
1
2
3
4
5
6
7
-- 5. 查询谢暄的“高等数学”成绩。
SELECT sname, grade
FROM student stu
INNER JOIN score ON stu.sno = score.stno
INNER JOIN course ON score.cno = course.cno
WHERE stu.sname = '谢暄'
AND cname = '高等数学';
  • 输出:
    在这里插入图片描述
  1. 查找选修了“数字电路” 的学生的姓名及成绩,并按成绩降序排列
1
2
3
4
5
6
7
-- 6. 查找选修了“数字电路”的学生的姓名及成绩,并按成绩降序排列。
SELECT sname, grade
FROM student stu
INNER JOIN score ON stu.sno = score.stno
INNER JOIN course ON score.cno = course.cno
WHERE cname = '数字电路'
ORDER BY grade DESC;
  • 输出:
    在这里插入图片描述
  1. 查询学号121001 的学生的所有课程的平均成绩。
1
2
3
4
5
6
7
8
-- 7.查询学号为121001的学生的所有课程的平均成绩。
use stsc
go
SELECT count(*) AS "leanCourse",avg(grade) AS "allCourseAvgScore", stu.stno
FROM student stu
INNER JOIN score ON stu.stno = score.stno
WHERE stu.stno = '121001'
GROUP BY stu.stno;
  • 输出:
    在这里插入图片描述
  1. 查找“数据库系统” “微机原理” 的平均成绩

    1
    2
    3
    4
    5
    6
    -- 8.   查找“数据库系统”“微机原理”的平均成绩。
    SELECT cname, avg(grade) AS "Avg"
    FROM score
    INNER JOIN course ON score.cno = course.cno
    WHERE cname in ('数据库系统','微机原理')
    GROUP BY cname;
  • 输出:
    在这里插入图片描述
  1. 查询每个专业最高分课程名和分数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    9. 查询每个专业最高分的课程名和分数。
    -- 查询课程名
    SELECT max(grade) AS "grade", cname
    FROM course
    INNER JOIN score
    ON course.cno = score.cno
    INNER JOIN student stu
    ON stu.sno = score.stno
    WHERE speciality IN
    -- 查询专业
    (SELECT DISTINCT student.speciality
    FROM student)
    AND grade IN
    -- 查询最大成绩
    (SELECT max(grade) AS "grade"
    FROM student
    INNER JOIN score
    ON student.sno = score.stno
    GROUP BY speciality)
    GROUP BY cname;
  • 输出:
    在这里插入图片描述
  1. 查询通信专业最高分的学生的学号、姓名、课程号和分数。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    -- 10. 查询通信专业最高分的学生的学号、姓名、课程号和分数。

    select sno, sname, c.cno, grade,speciality
    from student
    inner join score sc on sno = stno
    inner join
    course c on c.cno = sc.cno
    where grade = (select max(grade)
    from student
    inner join score sc on sno = stno
    inner join
    course c on c.cno = sc.cno
    where speciality = '通信')
    and speciality = '通信';
    -------------------------------------------------------------------------------
    /* 临时解决方法: 创建一个视图 */
    create view getMaxGradeInfo as
    SELECT sno
    , sname
    , score.cno
    , grade
    , cname
    , speciality
    FROM student stu
    INNER JOIN score ON stu.sno = score.stno
    INNER JOIN course ON score.cno = course.cno
    WHERE speciality = '通信'
    GROUP BY sno, sname, score.cno, cname, grade, speciality;

    /* 临时解决方案 */
    select top 1 max(grade) as 'MaxGrade',sno, sname, cno, grade
    from getMaxGradeInfo
    group by sno, sname, cno, grade;
  • 输出:
    在这里插入图片描述
  1. 查询有两门以上(含两门)课程超过80 分的学生的姓名及其平均成绩
    1
    2
    3
    4
    5
    6
    7
    8
    9
    -- 11. 查询有两门以上(含两门)课程超过 80 分的学生的姓名及其平均成绩。
    SELECT count(*) as 'TCourse', avg(grade) as 'Avg', sname
    FROM student stu
    inner join score on
    score.stno = stu.sno
    inner join course on score.cno = course.cno
    where grade > 80
    group by sname
    having count(*) > 2;
  • 输出:
    在这里插入图片描述
  1. 查询选修了所有已安排任课教师的课程的学生的姓名

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    -- 12. 查询选修了所有已安排任课教师的课程的学生的姓名
    SELECT sname
    FROM student
    WHERE NOT EXISTS(SELECT *
    FROM course
    WHERE NOT EXISTS(
    SELECT *
    FROM score sc
    WHERE sc.stno = Student.sno
    AND sc.Cno = course.cno));

SQL Server 数据库操作

增删改查
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/* SQL Server 创建数据库 */
create database coderitl
/* 主数据文件 */
on primary(
/* filespace 逻辑文件名 */
name='coderitl_mdf_data_file',
/* filespace 定义文件指定操作系统文件名,存储路径,
指出定义物理文件名时使用的路径和文件名
*/
filename='E:\SQLServer\Data\database-20210930\coderitl.mdf',
/* 指定 filespace 定义的文件的初始大小*/
size=1mb,
/* 指定 filespace 定义的文件的最大大小*/
maxsize=2mb,
/* 指定 filespace 定义文件的增长量 */
filegrowth=1mb
)
/* 日志数据文件 */
log on(
name='coderitl_log',
filename='E:\SQLServer\Data\database-20210930\coderitl.ldf',
size=1mb,
maxsize=2mb,
filegrowth=1mb
);

1
2
3
4
	
/* 数据库重命名 */
alter database coderitl modify name=coder-itl;

1
2
3
4
5
6
7
8
9
	
/* 修改主数据文件 */
alter database coderitl modify file(
name='newCoderitl',
size=1mb,
maxsize=2mb,
filegrowth=2mb
);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
	
{% tip cogs %}

```sql
/* 创建数据表 */
create table testSudent(
stuId int not null primary key,
stuName char(9)
);

/*
sp_helptext: 是MS SQL Server的一个系统存储过程,可以通过它来查看存储过程或者视图、函数源码

示例:sp_helptext viewName

(viewName 即要查询的存储过程名或视图名,查询结果可以选择经文本格式显示结果效果更清晰)

sp_help :快速查看表结构信息,包括字段,主键,外键,索引信息

示例:sp_help viewTable

(viewTable 即表名,结果会列出表相关创建信息,列信息,主键,外键等相关信息)

sp_helpdb :返回一个特定数据库或者所有数据库的信息,不加参数显示所有数据库信息,不加参数显示指定数据库信息

*/

-- 创建视图
create view testSudents as select * from testSudent;

-- 查看数据库信息
exec sp_helpdb coderitl;

-- 查看表结构
exec sp_help testSudent;

-- 查看视图 创建语句
exec sp_helptext testSudents;

```

{% endtip %}

  • 差异备份differental backup
  • 完整备份full backup
1
2
3
4
5
6
7
8
9
10
语法:
use [数据库名]
go
alter table [表名]
alter column [字段名] [数据类型];
样例:
use coderitl
go
alter table testSudent
alter column stuName char(20);
1
2
3
4
5
6
7
8
9
10
11
12
13
语法:
use coderitl
go
alter table [表名]
alter column [字段名] [数据类型];
样例:
use coderitl
go
alter table testSudent
alter column stuName char(100);

/* 发现: 主键字段不允许修改数据类型? */

1
2
3
4
5
6
7
8
9
10
语法:
alter table testSudent
add constraint 主键名 primary key(字段名)

样例:
alter table testSudent
add constraint pk_stuId primary key(stuId);

/* 注意单词书写错误问题 */

1
2
3
4
语法:
exec sp_rename '表名.字段名','新名称';
样例:
exec sp_rename 'testSudent.stuName','username';
1
2
3
4
5
6

语法:
alter table [表名] add [字段名] 数据类型 约束类型市;
样例:
alter table testSudent add grade varchar(10) not null;

1
alter table 表名 add   constraint 主键名  
日期函数
1
2
3
getdate(): 返回当前数据库系统时间值,返回值类型为 datetime

getutcdate(): 返回当前国际标准是时间值,返回值类型为 datetime
CONVERT函数使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* 
convert() 函数使用:
convert(数据类型,转换目标);
*/

-- 数字转换为字符串实现拼接
select 'coder-itl'+convert(varchar,101);

/*
日期类型转换:
数据类型[(长度)],getdate: 获取系统时间,100: 转换格式
*/
select convert(varchar(10),getdate(),100);

Style ID SQL 对应格式
1 SELECT CONVERT(varchar(100), GETDATE(), 1); 01/03/17
2 SELECT CONVERT(varchar(100), GETDATE(), 2); 17.01.03
3 SELECT CONVERT(varchar(100), GETDATE(), 3); 03/01/17
4 SELECT CONVERT(varchar(100), GETDATE(), 4); 03.01.17
5 SELECT CONVERT(varchar(100), GETDATE(), 5); 03-01-17
6 SELECT CONVERT(varchar(100), GETDATE(), 6); 03 01 17
7 SELECT CONVERT(varchar(100), GETDATE(), 7); 01 03, 17
8 SELECT CONVERT(varchar(100), GETDATE(), 8); 09:09:10
9 SELECT CONVERT(varchar(100), GETDATE(), 9); 01 3 2017 9:09:10:037AM
10 SELECT CONVERT(varchar(100), GETDATE(), 10); 01-03-17
11 SELECT CONVERT(varchar(100), GETDATE(), 11); 17/01/03
12 SELECT CONVERT(varchar(100), GETDATE(), 12); 170103
13 SELECT CONVERT(varchar(100), GETDATE(), 13); 03 01 2017 09:09:10:037
14 SELECT CONVERT(varchar(100), GETDATE(), 14); 09:09:10:037
20 SELECT CONVERT(varchar(100), GETDATE(), 20); 2017-01-03 09:09:10
21 SELECT CONVERT(varchar(100), GETDATE(), 21); 2017-01-03 09:09:10.037
22 SELECT CONVERT(varchar(100), GETDATE(), 22); 01/03/17 9:09:10 AM
23 SELECT CONVERT(varchar(100), GETDATE(), 23); 2017-01-03
24 SELECT CONVERT(varchar(100), GETDATE(), 24); 09:09:10
25 SELECT CONVERT(varchar(100), GETDATE(), 25); 2017-01-03 09:09:10.037
100 SELECT CONVERT(varchar(100), GETDATE(), 100); 01 3 2017 9:09AM
101 SELECT CONVERT(varchar(100), GETDATE(), 101); 01/03/2017
102 SELECT CONVERT(varchar(100), GETDATE(), 102); 2017.01.03
103 SELECT CONVERT(varchar(100), GETDATE(), 103); 03/01/2017
104 SELECT CONVERT(varchar(100), GETDATE(), 104); 03.01.2017
105 SELECT CONVERT(varchar(100), GETDATE(), 105); `03-01-2017``
106 SELECT CONVERT(varchar(100), GETDATE(), 106); 03 01 2017
107 SELECT CONVERT(varchar(100), GETDATE(), 107); 01 03, 2017
108 SELECT CONVERT(varchar(100), GETDATE(), 108); 09:09:10
109 SELECT CONVERT(varchar(100), GETDATE(), 109); 01 3 2017 9:09:10:037AM
110 SELECT CONVERT(varchar(100), GETDATE(), 110); `01-03-2017``
111 SELECT CONVERT(varchar(100), GETDATE(), 111); 2017/01/03
112 SELECT CONVERT(varchar(100), GETDATE(), 112); 20170103
113 SELECT CONVERT(varchar(100), GETDATE(), 113); 03 01 2017 09:09:10:037
114 SELECT CONVERT(varchar(100), GETDATE(), 114); 09:09:10:037
120 SELECT CONVERT(varchar(100), GETDATE(), 120); 2017-01-03 09:09:10
121 SELECT CONVERT(varchar(100), GETDATE(), 121); 2017-01-03 09:09:10.037
126 SELECT CONVERT(varchar(100), GETDATE(), 126); 2017-01-03T09:09:10.037
130 SELECT CONVERT(varchar(100), GETDATE(), 130); 5 ???? ?????? 1438 9:09:10:037AM
131 SELECT CONVERT(varchar(100), GETDATE(), 131); 5/04/1438 9:09:10:037AM
  • 样例

  • 错误输出

    未使用cast转换数据类型

  • 转换数据类型

    使用cast转换数据类型