zoukankan      html  css  js  c++  java
  • mysql的基本的数据库的查询

    学习一个数据库我们要学习哪些东西:

    sql数据库的话,

    curd.

    对于查询,要注意表的关联的查询。

    索引,触发器,对于控制连接量,脚本,

    数据库的可视化工具,权限管理。

     http://www.360doc.com/content/09/0722/10/116129_4382792.shtml

    **********************************************************************
    *********************************************************************

    把大学时老师让我们练习一个实验搞出来的了:

    目的与要求

       (1)掌握数据库对象的操作过程,包括创建、修改、删除。

       (2)熟悉表的各种操作,包括插入、修改、删除、查询。

       (3)熟练掌握常用 SQL 语句的基本语法。

    实验设备与环境

    使用 SQL Server 数据库管理系统提供的 SSMS 和查询编辑器。

    实验内容、实验记录及实验结果与分析

    (1)实验内容

      学生选课系统

    

        要求如下:

      建立一个数据库和相关的表、索引、视图等数据库对象,练习对表、索引和视图的各种操作。

      要求认真进行实验,记录各实验用例及执行结果。

      深入了解各个操作的功能。

    (2)实验的具体要求

        ①数据定义

      基本表的创建、修改及删除

      索引的创建

      视图的创建

        ②数据操作

      插入数据

      修改数据

      删除数据

    ③ 数据查询

      单表查询

      分组统计

      连接查询

      嵌套查询

      集合查询

    ④ 视图操作

      创建视图

      视图查询

    (3)实验记录、结果

     一、数据定义

    创建学生选课数据库 ST,包括三个基本表,其中 Student 表保存学生基本信息,Course 表保存课程信息,SC 表保存学生选课信息,其结构如下表所示。

                   表 2-1 Student 表结构

    列名称

    用途

    类型

    长度

    约束

    备注

    Sno

    学号

    字符

    8

    主键

    Sname

    姓名

    字符

    8

    Ssex

    性别

    字符

    2

    Sage

    年龄

    整型

    Sdept

    所在系

    字符

    20

    Sclass

    班级

    字符

    4

                       表 2-2 Course 表结构

    列名称

    用途

    类型

    长度

    约束

    备注

    Cno

    课程号

    字符

    4

    主键

    Cname

    课程名

    字符

    40

    Cpno

    先修课程号

    字符

    4

    Ccredit

    学分

    整型

                         表 2-3 SC 表结构、

    列名称

    用途

    类型

    长度

    约束

    备注

    Sno

    学号

    字符

    8

    外键

    Cno

    课程号

    字符

    4

    Sage

    年龄

    整型

    1.创建、修改及删除基本表

       (1)Student 表:

      CREATE TABLE Student

         ( Sno    CHAR(8)  PRIMARY KEY,

           Sname  CHAR(8) ,       

           Ssex   CHAR(2) NOT NULL,

           Sage   INT,

           Sdept  CHAR(20)      

         );

    (2)Course 表:

        CREATE TABLE  Course

        ( Cno      CHAR(4)  PRIMARY KEY,

          Cname    CHAR(40) NOT NULL,

          Cpno     CHAR(4) ,

          Ccredit  SMALLINT,

        );

        (3)SC 表:

             CREATE TABLE  SC

            ( Sno  CHAR(8) FOREIGN KEY (Sno) REFERENCES Student(Sno),

              Cno  CHAR(4),

              Grade  SMALLINT,

            );

    (4)检查表是否创建成功

    SELECT * FROM Student;

    SELECT * FROM Course;

    SELECT * FROM SC;

    (5)修改表结构及约束

      增加班级列

      ALTER TABLE Student ADD Sclass char(4);

          修改年龄列

      ALTER TABLE Student ALTER COLUMN Sage smallint;

      增加约束

      ALTER TABLE Course ADD UNIQUE(Cname);

    2. 创建、删除索引

    (1)为 Course 表按课程名称创建索引

         CREATE INDEX iCname On Course(Cname);

     

    (2)为 Student 表按学生姓名创建唯一索引

         CREATE UNIQUE INDEX iSname ON Student(Sname);

    (3)为 SC 表按学号和课程号创建聚集索引

         CREATE CLUSTERED INDEX iSnoCno ON SC(Sno,Cno DESC);

    (4)为 Course 表按课程号创建唯一索引

        ▼  CREATE UNIQUE INDEX iCno ON Course(Cno);

     

    3.创建视图

       建立信息系学生的视图:

            CREATE VIEW IS_Student

            AS

            SELECT Sno,Sname,Sage  FROM  Student;

            WHERE Sdept= 'IS';

     

    二、数据操作

    1.插入数据

    (1)插入到Student表中:

    INSERT INTO Student VALUES('20100001','李勇','男',20,'CS','1001')

    INSERT INTO Student VALUES('20100002','刘晨','女',19,'CS','1001')

    INSERT  INTO  Student(Sno,Sname,Ssex,Sage,Sdept,Sclass)

    VALUES('20100021','王敏','女',18,'MA','1002')

    INSERT  INTO  Student(Sno,Sname,Ssex,Sage,Sdept,Sclass)

    VALUES('20100031','张立','男',19,'IS','1003')

    INSERT  INTO  Student(Sno,Sname,Ssex,Sclass)

    VALUES('20100003','刘洋','女','1001')  

    ▼ INSERT  INTO Student(Sno,Sname,Ssex,Sage,Sdept,Sclass)

       VALUES('20100010','赵斌','男','19','IS','1005')

    ▼ INSERT INTO Student

       VALUES('20100022','张明明','男’,'19','CS','1002')

     

     (2)插入到Course表中:

    INSERT INTO Course(Cno,Cname,Cpno,Ccredit)

    VALUES('1','数据库系统原理','5',4)

    INSERT INTO Course(Cno,Cname,Cpno,Ccredit)

    VALUES('2','高等数学',null,2)

    INSERT INTO Course(Cno,Cname,Cpno,Ccredit)

    VALUES('3','管理信息系统','1',4)

    ▼ INSERT INTO Course(Cno,Cname,Cpno,Ccredit)

       VALUES('4','操作系统系统原理','6',3)

    ▼ INSERT INTO Course(Cno,Cname,Cpno,Ccredit)

       VALUES('5','数据结构','7',4)

    ▼ INSERT INTO Course(Cno,Cname,Cpno,Ccredit)

       VALUES('6','数据处理',null,2)

    ▼ INSERT INTO Course(Cno,Cname,Cpno,Ccredit)

       VALUES('7','C语言',null,4)

     

      (3)插入到SC表中:

    INSERT INTO SC VALUES('20100001','1',92)

    ▼ INSERT INTO SC VALUES('20100001','2',85)

    ▼ INSERT INTO SC VALUES('20100001','3',88)

    ▼ INSERT INTO SC VALUES('20100002','1',90)

    INSERT INTO SC VALUES('20100002','2',80)

    ▼ INSERT INTO SC(Sno,Cno) VALUES('20100003','1')

    INSERT INTO SC(Sno,Cno,Grade) VALUES('20100010','3',null)

     

        (4)多行插入到表中

      创建存一个表,保存学生的学号、姓名和年龄:

    CREATE TABLE cs_Student

      ( 学号 char(8),

        姓名 char(8),

        年龄 smallint

      );

      插入数据行:

      INSERT INTO cs_Student

      SELECT Sno,Sname,Sage

      FROM student Where Sdept='CS';

       (5)检查插入到表中的数据

    SELECT * FROM Student

    SELECT * FROM Course

    SELECT * FROM SC

    2.修改数据

      (1)将学生 20100001 的年龄改为 22 岁。

          UPDATE student SET Sage = 22 WHERE Sno='20100001';

     

     (2)将所有学生的年龄增加一岁:

          UPDATE Student SET Sage = Sage +1

     

     (3)填写赵斌同学的管理信息系统课程的成绩:

          UPDATE SC SET Grade = 85

          WHERE Sno='20100010' AND Cno='3'

     

     (4)将计算机科学系全体学生的成绩加5分:

          UPDATE sc SET Grade=Grade + 5

          WHERE 'CS'=(select  Sdept

                       from  student

                       where student.Sno=sc.Sno);

     

     (5)▼ 将刘晨同学的 2 号课程成绩修改为 80:

          UPDATE SC SET Grade=80

          WHERE Cno='2' AND Sno=(SELECT Sno   FROM Student

                            WHERE SC.Sno=Student.Sno AND Sname='刘晨');

     

          ▼ 将“20100021”同学的学号修改为“20100025”:

     UPDATE Student SET Sno='20100025'

     WHERE Sno='20100021';

     

    3. 删除数据

     (1)删除学号为 201000022 的学生记录:

          DELETE FROM Student WHERE Sno='20100022'

     (2)删除学号 20100001 学生的 1 号课程选课记录

          将选课信息复制到一个临时表 tmpSC 中:

          SELECT * INTO tmpSC FROM SC

          在 tmpSC 中执行删除操作:

          DELETE FROM tmpSC WHERE Sno='20100001' and Cno='1'

     (3)▼ 删除临时表中 20100002 学生的全部选课记录

          SELECT * INTO tmpSC FROM SC

          DELETE FROM tmpSC WHERE Sno='20100002'

     (4)删除计算机科学系所有学生的选课记录

          DELETE FROM tmpSC WHERE 'CS'=(select Sdept

                                        from student where

                                        student.Sno=tmpSC.Sno );

    (5)删除全部选课记录:

         DELETE FROM tmpSC

    三、数据查询操作

       1.单表查询

         (1)按指定目标列查询

              查询学生的详细记录:

              SELECT  * FROM  Student;

              查询学生的学号、姓名和年龄

              SELECT  Sno,Sname,Sage  FROM Student;

     

         (2)目标列包含表达式的查询

          查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名。

          SELECT Sname,'Year of Birth: ',2004-Sage,LOWER(Sdept)

          FROM Student;

     

         (3)查询结果集中修改列名称

          查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名:

          SELECT Sname, 'Year  of  Birth:' as BIRTH,  2000-Sage BIRTHDAY,

          DEPARTMENT = LOWER(Sdept)

          FROM Student;

     

    (4)取消重复行

         查询选修了课程的学生学号:比较ALL和DISTINCT的区别

    SELECT  Sno  FROM SC;

    SELECT  DISTINCT  Sno  FROM SC;

                         

    (5)简单条件查询

         查询计算机科学系全体学生的名单

         SELECT Sname FROM Student  WHERE Sdept='CS';

    (6)按范围查询

         查询年龄在20~23岁之间的学生的姓名、系别和年龄

         SELECT Sname,Sdept,Sage

         FROM Student

         WHERE Sage BETWEEN 20 AND 23

    (7)查询属性值属于指定集合的行

     查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别:

         SELECT Sname,Ssex

         FROM Student

         WHERE Sdept IN ('IS','MA','CS');

    (8)模糊查询

       查询所有姓刘学生的姓名、学号和性别

       SELECT Sname,Sno,Ssex

       FROM Student

       WHERE  Sname LIKE '刘%'

    (9)查询空值

         查询缺少成绩的学生的学号和相应的课程号

         SELECT Sno,Cno

         FROM sc

         WHERE Grade is null;

    (10)多重条件查询

         查询计算机科学系年龄在 20 岁以下的学生姓名:

         SELECT Sname

         FROM student

         WHERE Sdept='CS' and Sage<20;

    (11)结果集排序

    查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学 生按年龄降序排列。

        SELECT * FROM  Student  ORDER BY Sdept,Sage DESC;

     

    (12)▼ 查询学生基本信息,结果集属性名使用汉字:

    SELECT Sno 学号,Sname 姓名,Ssex 性别,Sage 年龄, Sdept 系所,Sclass 班级 FROM Student;

     

          ▼ 查询信息系且年龄大于23岁同学的学号和姓名:

         SELECT Sno,Sname

         FROM student

         WHERE Sdept='IS' and Sage>23;

          ▼ 查询年龄是17、18、20、23岁同学的学号、姓名、年龄和所在系:

         SELECT Sno,Sname,Sage,Sdept

         FROM student

         WHERE Sage=17 OR Sage=18 OR Sage=20 OR Sage=23;

     

          ▼ 查询年龄不在21~24岁之间的学生的姓名、系别和年龄:

    SELECT Sname,Sdept,Sage

    FROM student

    WHERE Sage NOT BETWEEN 21 AND 24;

     

    2.分组统计

      (1)聚集函数的使用

    查询学生总人数:

    SELECT COUNT(*) FROM  Student;

    查询选修了课程的学生人数:

    SELECT COUNT(DISTINCT Sno) FROM SC

    查询最高分:

    SELECT MAX(Grade) FROM SC

      (2)聚集函数作用于部分行

    统计2号课程的总分、均分和最高分:

    SELECT SUM(grade) 总分,AVG(grade) 均分,MAX(grade) 最高分

    FROM sc WHERE Cno='2'

      (3)分组统计

    统计各门课程的选课人数、均分和最高分:

    select cno 课程号,count(*) 人数,AVG(grade) 均分,MAX(grade) 最高分

    from sc group by Cno

    统计均分大于90的课程

    select cno 课程号,count(*) 人数,AVG(grade) 均分,MAX(grade) 最高分

    from sc group by Cno

    having AVG(grade) > 90

     (4)▼ 统计每个同学的学号、选课数、平均成绩和最高成绩

    SELECT Student.Sno 学号,COUNT(distinct Course.Cno) 选课数,AVG(Sc.Grade) 平均成绩,MAX(Sc.Grade) 最高成绩

    FROM  SC

    JOIN Student ON (SC.Sno = Student.Sno)

    JOIN Course ON (SC.Cno = Course.Cno)

    GROUP BY Student.Sno;

          ▼ 统计每个班的每门课的选课人数、平均成绩和最高成绩

    SELECT Student.Sclass 班级,Course.Cname 课程名,COUNT(*) 选课人数,AVG(Sc.Grade) 平均成绩,MAX(Sc.Grade) 最高成绩

    FROM  SC

    JOIN Student ON (SC.Sno = Student.Sno)

    JOIN Course ON (SC.Cno = Course.Cno)

    GROUP BY Student.Sclass,Course.Cname

    3. 连接查询

      (1)在 WHERE 中指定连接条件

    查询每个参加选课的学生信息及其选修课程的情况:

    SELECT  Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade

    FROM  Student,SC

    WHERE  Student.Sno = SC.Sno

     

    查询每一门课的间接先修课:

    SELECT *  FROM course first,course second

    WHERE first.Cpno=second.Cno;

    SELECT first.Cno,second.Cpno FROM course first,course second  

    WHERE first.Cpno=second.Cno;

     

     

       (2)在 FROM 中指定连接条件

    查询每个参加选课的学生信息及其选修课程的情况:

    SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade

    FROM  Student JOIN SC ON (Student.Sno=SC.Sno)

     

       (3)使用外连接查询

    查询每个学生信息及其选修课程的情况:

    SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade

    FROM  Student LEFT OUTER JOIN SC ON (Student.Sno=SC.Sno)

     

       (4)复合条件连接查询

    查询选修2号课程且成绩在90分以上的所有学生:

    SELECT Student.Sno, Sname

    FROM   Student join SC ON (Student.Sno = SC.Sno)

    WHERE  SC.Cno= '2' AND SC.Grade > 90;

       (5)多表查询

    查询每个学生的学号、姓名、选修的课程名及成绩:

    SELECT Student.Sno,Sname,Cname,Grade

    FROM  Student,SC,Course  

    WHERE Student.Sno = SC.Sno AND SC.Cno = Course.Cno;

     

      (6)▼ 查询选修了 2 号课程的同学的学号和姓名

    SELECT Sno,Sname

    FROM Student

    WHERE EXISTS(SELECT *

                 FROM SC

                 WHERE Sno=Student.Sno AND Cno='2');

           ▼ 查询各门课程的课程号、课程名称以及选课学生的学号

    SELECT Course.Cno,Cname,Student.Sno

    FROM SC,Course,Student

    WHERE Student.Sno=SC.Sno AND Course.Cno=SC.Cno;

     

           ▼ 查询选修了数据库系统原理课程的同学的学号和姓名和成绩

    SELECT Student.Sno,Sname,Grade

    FROM Student,Course,SC

    WHERE Student.Sno=SC.Sno AND

          Course.Cno=SC.Cno and Cname='数据库系统原理';

    4. 嵌套查询

      (1)由 In 引出的子查询

    查询与“刘晨”在同一个系学习的学生:

    SELECT Sno,Sname,Sdept FROM Student

    WHERE Sdept IN ( SELECT Sdept FROM Student WHERE Sname= '刘晨');

     

      (2)由比较运算符引出的子查询

    找出每个学生超过他选修课程平均成绩的课程号。

    SELECT Sno, Cno  FROM  SC  x

    WHERE Grade >= ( SELECT AVG(Grade)

                     FROM  SC y

                     WHERE y.Sno=x.Sno);

      (3)带修饰符的比较运算符引出的子查询

    查询其他系中比计算机科学系所有学生年龄都小的学生姓名及年龄:

    SELECT Sname,Sage  FROM Student

    WHERE Sage < ALL ( SELECT Sage FROM Student

                       WHERE Sdept= 'CS')

          AND  Sdept <> 'CS' ;

      (4)由 EXISTS 引出的子查询:

    查询所有选修了1号课程的学生姓名

    SELECT Sname  FROM Student

    WHERE EXISTS (SELECT *

                  FROM SC

                  WHERE Sno=Student.Sno AND Cno= '1');

    5. 集合查询

      (1)集合并

    查询计算机科学系的学生及年龄不大于19岁的学生:

    SELECT *  FROM Student WHERE Sdept= 'CS'

    UNION

    SELECT *  FROM Student  WHERE Sage<=19

     

      (2)集合交

    查询计算机科学系且年龄不大于 19 岁的学生:

    SELECT * FROM Student  WHERE Sdept='CS'  

    INTERSECT

    SELECT * FROM Student  WHERE Sage<=19

     

      (3)集合差

    查询计算机科学系且年龄大于19岁的学生

    SELECT * FROM Student WHERE Sdept='CS'

    EXCEPT

    SELECT * FROM Student WHERE Sage <=19;

     

    四、视图操作

    建立视图并基于视图进行查询:

    1. 创建视图

       (1)建立学生基本信息视图

    CREATE  VIEW Student_VIEW(学号,姓名,性别,年龄,系,班级)

    AS

    SELECT Sno,Sname,Ssex,Sage,Sdept,Sclass

    FROM  Student;

     

       (2)建立学生均分视图

    CREATE VIEW S_G(Sno,Gavg)  

    AS

    SELECT Sno,avg(Grade)  

    FROM SC GROUP BY Sno;

     

       (3)建立选课信息视图

    CREATE VIEW XK_VIEW

    AS

    SELECT Student.*,Course.*,Grade

    FROM  Student,SC,Course  

    WHERE Student.Sno = SC.Sno  AND SC.Cno = Course.Cno;

     

    2. 视图查询

       (1)查询学生基本信息:

    SELECT * FROM  Student_VIEW

     

       (2)找出每个学生超过他选修课程平均成绩的课程号:

    SELECT SC.Sno,Cno,grade

    FROM SC, S_G

    WHERE SC.Sno = S_G.Sno and Grade >= S_G.Gavg

       (3)查询每个学生的学号、姓名、选修的课程名及成绩

    SELECT Sno,Sname,Cname,Grade

    FROM XK_VIEW

     

       (4)▼ 比较使用视图查询和直接从基表查询的优点

    简单性。视图简化了用户对数据的理解和操作。那些被经常使用的查询可以被定义为视图,从而用户不必为以后的操作每次都指定全部的条件。
        安全性。通过视图用户只能查询和修改他们所能见到的数据。数据库中的其他数据则既看不见也取不到。数据库授权命令使每个用户对数据库的检索限制到特定数据库对象,但不能授权到数据库特定行和特定的列上。通过视图,用户可以被限制在数据不同子集。
        逻辑数据独立性。视图使应用程序和数据库表在一定程度上独立。如果没有视图则应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。

    四 实验遇到的问题和解决方法

    1. 实验二的项目较多,花费了很长时间才全部完成。其中涉及到的有数据库语句操作,如表的创建、修改、删除,以及数据的插入、修改、删除和查询。实验课期间没有完成,之后又尝试编写出错和不会等问题。查询资料、请教同学之后顺利完成。

    2. 实验虽多,却也是课本最基本知识的练习,不足为虑。实验中的多数问题是编写语言时候不细心所致,比如大小写转换,中英文标点的使用等。

    五 实验心得

    本次试验最大的收获就是,耐心和细心的锻炼。试验项目很多,必须专心致志和良好耐心之下,坚持完成。很高兴做到了这点,磨练了以后对待工作的态度和初步的数据库管理能力。在实验的基础之上,课本中的知识点也得到了很好的练习和巩固。

  • 相关阅读:
    LeetCode之移除元素
    有被开心到hh(日常)
    交换排序
    插入排序
    顺序查找&折半查找
    C++之引用
    MySQL学习笔记
    C/C++程序编译过程
    计算机面试知识整合(更新中...)
    MFC之编辑框
  • 原文地址:https://www.cnblogs.com/coding4/p/5598203.html
Copyright © 2011-2022 走看看