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

五 实验心得

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

 

posted @ 2016-06-19 16:00  飘然离去  阅读(1033)  评论(0编辑  收藏  举报