mysql数据库实验查询_MySQL数据库表数据的查询操作实验

实验3.MySQL数据库表数据的查询操作实验(1)

一、实验目的

掌握SELECT 语句的基本语法格式。

掌握SELECT 语句的执行方法。

掌握SELECT 语句的 GROUP BY 和 ORDER BY 子句的作用。

二、验证性实验

6af4d7572deed178b629d701d01b8862.png

create database bumeninfo;

use bumeninfo;

create table bumen(

d_id int(4)not null unique primary key,

d_name varchar(20)not null unique,

functions varchar(20),

address varchar(20)

);

desc bumen;

create table yuangong(

id int(4) not null unique primary key,

name varchar(20) not null,

sex varchar(4) not null,

birthday int(4),

d_id int(4) not null,

salary float,

address varchar(50),

constraint yuangong_fk foreign key(d_id)

references bumen(d_id)

);

desc yuangong;

0f1259afea08bd3dc62e3b13953e7af4.png

bumen表的练习数据:

1001,‘人事部’,‘人事管理’,‘北京’

1002,‘科研部’,‘研发产品’,‘北京’

1003,‘生产部’,‘产品生产’,‘天津’

1004,‘销售部’,‘产品销售’,‘上海’

yuangong表的练习数据:

8001,‘韩鹏’,‘男’,25,1002,4000,‘北京市海淀区’

8002,‘张峰’,‘男’,26,1001,2500,‘北京市昌平区’

8003,‘欧阳’,‘男’,20,1003,1500,‘湖南省永州市’

8004,‘王武’,‘男’,30,1001,3500,‘北京市顺义区’

8005,‘欧阳宝贝’,‘女’,21,1002,3000,‘北京市昌平区’

8006,‘呼延’,‘男’,28,1003,1800,‘天津市南开区’

然后在bumen表和yuangong表查询记录。

insert into bumen values(1001,'人事部','人事管理','北京');

insert into bumen values(1002,'科研部','研发产品','北京');

insert into bumen values(1003,'生产部','产品生产','天津');

insert into bumen values(1004,'销售部','产品销售','上海');

insert into yuangong values(8001,'韩鹏','男',25,1002,4000,'北京市海淀区');

insert into yuangong values(8002,'张峰','男',26,1001,2500,'北京市昌平区');

insert into yuangong values(8003,'欧阳','男',20,1003,1500,'湖南省永州市');

insert into yuangong values(8004,'王武','男',30,1001,3500,'北京市顺义区');

insert into yuangong values(8005,'欧阳宝贝','女',21,1002,3000,'北京市昌平区');

insert into yuangong values(8006,'呼延','man',28,1003,1800,'天津市南开区');

fdb522982ca4bb7e0dda5d0fc5317c2a.png

(1)查询yuangong表的所有记录。SQL代码:

select * from yuangong;

或者列出yuangong表的所有字段名称。SQL代码:

select id,name,sex,birthday,d_id,salary,address from yuangong;

9e249b1a768dd2112bbc7d6e7d08bd59.png

(2)查询yuangong表的第四条到第五条记录。

select id,name,sex,birthday,d_id,salary,address from yuangong limit 3,2;

9ec872336573c5ffafba044dbf2c71cf.png

(3)从bumen表查询部门号(d_id)、部门名称(d_name)和部门职能(functions)。SQL代码:

select d_id,d_name,functions from bumen;

33038cbac46103124e993963a69cd940.png

(4)从yuangong表中查询人事部和科研部的员工的信息。先从bumen表查询出人事部和科研部的部门号。然后到yuangong表中去查询员工的信息。SQL代码:

select * from yuangong

where d_id=any(

select d_id from bumen

where d_name in('人事部','科研部'));

918dfec09b398ebccfcab00b2161c5b6.png

或者使用下面的代码。代码如下:

select * from yuangong

where d_id in(

select d_id from bumen

where d_name='人事部' or d_name='科研部');

e3b528bd7e9079335a9ea10ceeaee05a.png

(5)从yuangong表中查询年龄在25到30之间的员工的信息。可以通过两种方式来查询。

第一种方式的SQL代码:

select * from yuangong where birthday between 25 and 30;

ddc5e06fea9455875b16177e3eb5bba1.png

第二种方式的SQL代码:

select * from yuangong where birthday>=25 and birthday<=30;

eb61e79043ac0bd55f73f9f74696b4b7.png

(6)查询每个部门有多少员工。先按部门号进行分组,然后用COUNT()函数来计算每组的人数。SQL代码:

select d_id,count(id) from yuangong group by d_id;

78741d70ac8a02bf67b87d0e0e293d1f.png

或者给COUNT(id)取名为sum。其SQL代码为:

select d_id,count(id) as sum from yuangong group by d_id;

7327e2471b339653c8844733dbd8e3ce.png

(7)查询每个部门的最高工资。先按部门号进行分组,然后用MAX()函数来计算最大值。SQL代码:

select d_id,max(salary) from yuangong group by d_id;

7078e64c1beb91d7b74b4efa841f78bb.png

(8)用左连接的方式查询bumen表和yuangong表。

使用 LEFT JOIN ON 来实现左连接。SQL代码:

select bumen.d_id,d_name,functions,bumen.address,id,name,birthday,sex,salary,yuangong.address

from bumen left join yuangong on yuangong.d_id=bumen.d_id;

549800b440946404f4c4effa774a9b12.png

(9)计算每个部门的总工资。先按部门号进行分组,然后用SUM()函数来求和。SQL代码:

select d_id,sum(salary) from yuangong group by d_id;

d7bc761c20126c0d6ad6dd112e16df09.png

(10)查询yuangong表,按照工资从高到低的顺序排列。SQL代码:

select * from yuangong order by salary desc;

d8245d618f8b093029885accd9dfb42e.png

(11)从bumen表和yuangong表中查询出部门号,然后使用UNION合并查询结果。SQL代码:

select d_id from yuangong union select d_id from bumen;

08325325ead11738c079bc9e2cb6a6f8.png

(12)查询家是北京市员工的姓名、年龄、家庭住址。这里使用 LIKE 关键字。SQL代码:

select name,birthday,address from yuangong where address like '北京%';

5f56c39663a85a4336895d06228fc7aa.png

二、设计性试验

2693109d6b8d8d16c90faeb7f893a332.png

表创建成功后,查看两个表的结构。

Student练习数据如下:

901,‘张军’,‘男’,1985,‘计算机系’,‘北京市海淀区’

902,‘张超’,‘男’,1986,‘中文系’,‘北京市昌平区’

903,‘张美’,‘女’,1990,‘中文系’,‘湖南省永州市’

904,‘李五一’,‘男’,1990,‘英语系’,‘辽宁省阜新市’

905,‘王芳’,‘女’,1991,‘英语系’,‘福建省厦门市’

906,‘王桂’,‘男’,1988,‘计算机系’,‘湖南省衡阳市’

score表练习数据如下:

901,‘计算机’,98

901,‘英语’,80

902,‘计算机’,65

902,‘中文’,88

903,‘中文’,95

904,‘计算机’,70

904,‘英语’,92

905,‘英语’,94

906,‘计算机’,90

906,‘英语’,85

create database schoolinfo;

use schoolinfo;

create table student(

num int(10) primary key not null unique,

name varchar(20) not null,

sex varchar(4) not null,

birthday year,

bumen varchar(20) not null,

address varchar(50)

);

desc student;

create table score(

id int(10) primary key not null unique,

c_name varchar(20),

stu_id int(10) not null,

grade int(10),

constraint score_fk foreign key(stu_id)

references student(num)

);

desc score;

e020587f34191fb7659c2bda3fd32416.png

insert into student(num,name,sex,birthday,bumen,address)

values

(901,'张军','男','1985','计算机系','北京市海淀区'),

(902,'张超','男','1986','中文系','北京市昌平区'),

(903,'张美','女','1990','中文系','湖南省永州市'),

(904,'李五一','男','1990','英语系','辽宁省阜新市'),

(905,'王芳','女','1991','英语系','福建省厦门市'),

(906,'王桂','男','1988','计算机系','湖南省衡阳市');

select * from student;

4e4c218fb172aef8ba528dd945b12152.png

insert into score(id,stu_id,c_name,grade)

values

(1,901,'计算机',98),

(2,901,'英语',80),

(3,902,'计算机',65),

(4,902,'中文',88),

(5,903,'中文',95),

(6,904,'计算机',70),

(7,904,'英语',92),

(8,905,'英语',94),

(9,906,'计算机',90),

(10,906,'英语',85);

select * from score;

c6d5ee01ea255ea7592c971fafe6dda9.png

然后按照下列要求进行表操作:

(1)查询student表的所有记录。

方法一:用”*“。

select * from student;

方法二:列出所有的列名。

select num,name,sex,birthday,bumen,address from student;

60a7b772788dcb774fba3d407b8c5db5.png

(2)查询student表的第二条到第四条记录。

select num,name,sex,birthday,bumen,address from student limit 1,3;

52d3338fbf605f545c25ed80659486c9.png

(3)从student表查询所有学生的学号、姓名和院系的信息。

select num,name,bumen from student;

61e168fd7c3a6ec543aaaba267c3db6d.png

(4)查询计算机系和英语系的学生的信息。

方法一:使用IN关键字

select * from student

where bumen in('计算机系','英语系');

方法二:使用OR关键字

select * from student

where bumen='计算机系' or bumen='英语系';

fef90f39577eb0ca5cced1b2a196816a.png

(5)从student表中查询年龄为28到32岁的学生的信息。

方法一:使用BETWEEN AND 关键字来查询

select * from student where year(now())-birthday between 28 and 32;

df9b5b21fe3432b84d86627be5c04d64.png

方式二:使用 AND 关键字和比较运算符。

select * from student where year(now())-birthday >=28 and year(now())-birthday <=32;

ed2aaa035f1459381640da828bab1743.png

(6)student表中查询每个院系有多少人,为统计的人数列取别名sum_of_bumen。

select bumen,count(num) as sum_of_bumen from student group by bumen;

77f03b2469c42363de93901ccb745ab9.png

(7)从score表中查询每个科目的最高分。

select c_name,max(grade) from score group by c_name;

db58f7ca48f1eda5c3ebe29b380433c2.png

(8)查询李五一的考试科目(c_name)和考试成绩(grade)。

select c_name,grade from score

where stu_id in(

select num from student

where name='李五一');

3c9546548819e40b2db6c3e8cbd3b694.png

(9)用连接查询的方式查询所有学生的信息和考试信息。

select student.num,name,sex,birthday,bumen,address,score.c_name,score.grade

from student left join score on student.num=score.stu_id;

481d9e52427cb71c43fa15c3490b0ca2.png

(10)计算每个学生的总成绩(需显示学生姓名)。

select name,sum(grade) from student s left join score sc on s.num=sc.stu_id group by num;

7927be2f6a2dbce776d857ecbc08ed02.png

(12)计算每个考试科目的平均成绩。

select c_name,avg(grade) from score group by c_name;

41fc6a9670a1621e8287e57c37871004.png

(13)查询计算机成绩低于95的学生的信息。

select * from student

where num in(

select stu_id from score

where c_name='计算机' and grade<95);

3a0b3697e231c8325da9f92daa50ab0c.png

(14)查询同时参加计算机和英语考试的学生的信息。

select * from student

where num=any(

select stu_id from score

where stu_id in(

select stu_id from score

where c_name='计算机') and c_name='英语');

a13e626321bd04b26911b0195729f61c.png

(15)将计算机成绩按从高到低进行排序。

select c_name,grade from score where c_name='计算机' order by grade desc;

c17e714ab830dc203f2559cccf191a08.png

(16)从student表和score表中查询出学生的学号,然后合并查询结果。

select num from student union select stu_id from score;

3ba6f4b4883cd585b110e328f94dd4e3.png

(17)查询姓张或者姓王的同学的姓名、院系、考试科目和成绩。

select student.name,bumen,c_name,grade from student,score

where (name like '张%' or name like '王%')

and student.num=score.stu_id;

6eb1e5a2745c7fe3ba4a52d2025e9e66.png

(18)查询都是湖南的同学的姓名、年龄、院系、考试科目和成绩。

select name,birthday,bumen,c_name,grade from student,score

where (address like '湖南%')

and student.num=score.stu_id;

152f9952742018bf4ab7aa3f1863e3c6.png

三、 观察与思考

1、LIKE的通配符有哪些?分别代表什么含义?

%(百分号):代表任意长度(长度可以为0)的字符串。

_(下横线):代表任意单个字符。

2、知道学生的出生日期,如何求出其年龄?

float(datadiff(year,birthday,getdata())/365.25)

birthday=’xxxx-xx-xx’

getdata()=’xxxx-xx-xx’

3、IS能用“=”来代替吗?如何周全地考虑“空数据”的情况?

不能。该属性应该有一个值,但不知道具体值;该属性不应该有值;由于某种原因不便于填写。

4、关键字ALL和DISTINCT有什么不同的含义?关键字ALL是否可以省略不写?

all:返回所有的记录;distinct:去掉查询返回的记录中重复的记录。

all在select子句里省略,对结果无影响,在union子句里省略则表示剔除有重复的行,反之则保留所有记录行。

5、聚集函数能否直接使用在SELECT子句、HAVING子句、WHERE子句、GROUP BY子句中?

聚集函数只能用于select子句,group by中的having子句,where子句是一个条件语句,在where后面跟的是条件。

6、WHERE子句与HAVING子句有何不同?

作用对象不同:where子句作用于基本表或视图,从中选择满足条件的元祖,having子句作用于组,从中选择满足条件的组。

7、 count(*)、count(列名)、count(distinct 列名)三者的区别是什么?通过一个实例说明。

count(*):明确的返回数据表中的元组数据个数,不会忽略值为null的字段

count(列名):返回数据表中的某列数据个数,不统计值为null的字段

count(disinct 列名):返回数据表中某列不重复的数据个数,不统计值为null的字段

select count(distinct d_id) from yuangong;

select count(d_id) from yuangong;

select count(*) from yuangong;

cb798835185519ffa78c136c2bec12a7.png

8、 内连接与外连接有什么区别?

内连接:比较运算符根据每个表共有的列的值匹配两个表中的行(使用像 = 或 <> 之类的比较运算符)

外连接:当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值(使用left/right/full join或left/right/full outer join关键字)

9、“=”与IN在什么情况下作用相同?

当in的候选值只有一个时。

感谢无意间遇到有同样实验报告的小伙伴:

https://blog.csdn.net/qq_27991659/article/details/51473829#commentBox

  • 10
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值