mysql的基本的数据库的查询

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

五 实验心得

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