实验一 创建以下数据库和表,并查看是否成功创建
目的与要求
(1) 了解 mysql 数据库的存储引擎分类 ;
(2) 了解表的结构特点 ;
(3) 了解 mysql 的基本数据类型 ;
(4) 了解空值概念 ;
(5) 学会使用 sql 语句创建数据库和表。
实验内容
1.实验题目
创建用于企业管理的员工数据库,数据库名为 yggl ,包含员工信息,部门信
息及员工薪水信息。数据库 yggl 包含 3 个表:
1) Employees: 员工信息表 ;
2) Departments: 部门信息表 ;
3) Salary: 员工薪水情况表。
创建语句如下:
( 1 )创建数据库
create database yggl;
use yggl;
( 2 )创建表 departments
create table Departments
(
DepartmentID char(3) NOT null,
DepartmentName char(20) not null,
Note text(16) ,
primary key (DepartmentID)
)engine=innodb;
( 3 )创建表 employees
create table employees
(employeeid char(6) not null,
name char(10) not null,
education char(4),
birthday date not null,
sex char(2) not null,
workyear tinyint(1) ,
address varchar(20) ,
phonenumber char(12),
departmentid char(3) not null,
primary key (employeeid)
)engine=innodb;
( 4 )创建表 salary create table salary
(
employeeid char(6),
income float(8),
outcome float(8),
primary key (employeeid)
)engine=innodb;
该实验进行前,首先要明确,用户必须是系统管理员,或是被授权使用 create database 语句的用户。
其次,确定数据库包含哪些表,以及各表的结构,常用的 mysql 数据类型。
实验二 表数据的插入、修改和删除
目的与要求
(1) 学会使用 sql 语句对数据表进行插入、删除和修改数据;
(2) 了解更新操作时要注意数据完整性 ;
(3) 了解 sql 语句对数据操作的灵活控制功能。
实验内容
1.实验题目
使用 sql 语句,向在上一个实验中建立的数据库 YGGL 的 3 个表插入多行数据,然后修改和删除一些记录。使用 SQL 进行有限制的修改和删除。要掌握 SQL 中用于对表数据进行插入、修改和删除命令分别 INSERT , UPDATE , DELETE 。要特别注意在执行插入、删除和修改数据更新操作时,必须保证数据的完整性。命令行下的 SQL 语句在对表数据进行插入、修改删除时,比在图形界面下操作更灵活,功能更强大。
实验步骤
( 1 )使用 SQL 语句插入数据,向表 employees 插入数据。启动 mysql 客户端,在命令行中
入:
insert into employees values('000001',' 王 林 ',' 大 专 ','1986-01-23','1',8,' 中 山 路 32-1-508','83355668','2');
insert into employees values('010008',' 伍容华 ',' 本 科 ','1988-03-28','1',3,' 北 京 东 路 100-2','83321321','1');
以上两行数据,并没有明确要求列出列名,所以各列值及类型要和表中的列一一对应。
insert into employees (employeeid,name,education,birthday,sex,workyear,address,phonenumber,departmentid) values ('020018',' 王向容 ',' 硕士 ','1982-12-09','1',2,' 四牌楼 10-0-108','83792361','1');
以上命令在插入数据的过程中明确了列名和值的对应关系。
也可以同时插入多行数据, 如上所示, 多行值中间以逗号分割 :
insert into employees (employeeid,name,education,birthday,sex,workyear,address,phonenumber,departmentid) values('102201','刘明 ',' 本科 ','1978-07-30','1',3,' 虎距路 100-2','83606608','5'), ('020010','李丽 ',' 大专 ','1972-10-18','1',3,' 中山东路 102-2','83413301','1');
温馨提示: 在查看运行结果的时候如果出现乱码(不管是命令行还是图形界面下)试用show variables like 'char%';和 show variables like 'collation_%'; 来查看一下 mysql 的数据使用编码!
至于怎么解决编码不一致导致的乱码问题,可以作为一个问题由同学们通过查询相关文献、网络资源自行解决以提高自我学习能力。更深入的了解可以查询字符编码相关知识。
( 2 )删除一行
delete from employees where Employeeid='000001';
( 3 )修改一行
insert into employees values('000002',' 容 华 ',' 本 科 ','1988-03-28','0',3,' 北 京 东 路100-2','83321321','1');
update employees set address=' 北 京 西 路 100-2',phonenumber='83321320',departmentid='2' where employeeid='000002';
( 4 )替换已经存在的行
insert into Departments values ('1',' 广告部 ',' 负责推广产品 ');
replace into Departments values ('1',' 广告 2 部 ',' 负责推广产品 ');
总结: 向表中“替换插入”一条数据,如果原表中没有 id=1 这条数据就作为新数据插入 ( 相当于 insert into 作用);如果原表中有 id=1 这条数据就做替换(相当于 update 作用)。对于没 有指定的字段以默认值插入。
( 5 )删除表中所有的行
truncate table salary 谨慎操作此命令。
实验三 数据库查询
目的与要求
(1) 掌握 SELECT 语句的基本语法;
(2) 掌握子查询的表示 ;
(3) 掌握连接查询的表示;
(4) GROUP BY 子句的作用和使用方法;
(5) ORDER BY 子句的作用和使用方法;
(6) LIMIT 子句的作用和使用方法。
实验内容
1 , SELECT 语句的基本使用
( 1 )查询每个雇员的数据,
use yggl; 选择数据库
select * from employees;
( 2 )查询每个雇员的姓名,地址和电话
Select name,address,phonenumber from employees;
( 3 )查询 employeeid 为 000001 的雇员的地址和电话
select address ,phonenumber from employees where employeeid='000001';
练习:查询月收入高于 2000 的员工号码。
( 4 )查询 employess 表中女雇员的地址和电话,使用 AS 字句将结果中各列的标题分别指
定为地址,电话。
select address as 地址 ,phonenumber as 电话 from employees where sex='0';
( 5 )查询 employees 表中员工的姓名和性别,要求 sex 值为 1 时显示为男,为 0 时显示为
女( 实际上是把 SEX 列的值由 0 和 1 改变为男和女,同时 sex 列名也被显示为性别 )。
select name as 姓名 ,case
when sex='1' then ' 男 '
when sex='0' then ' 女 '
end
as 性别 from employees;
( 6 )获取员工总数
select count(*) from employees;
练习 :
1) 计算 salary 表中员工月收入的平均数
2) 获得 Employees 表中最大的员工号码
3) 计算 salary 表中所有员工的总支出
4) 查询账务部雇员的最高和最低实际收入
( 7 )找出所有姓王的雇员的部门号和姓名
select name, departmentid from employees where name like ' 王 %';
思考与练习 :
a. 找出所有地址中含有 ' 中山 ' 的雇员的号码及部门号,
select phonenumber,departmentid from employees where address like '中山%';
注意:
%与_都可以替换字符,%与_的不同之处在于%可以替换若干个字符,而_只能替换一个字符。看下面这一题就明白了。
b. 查找员工号码中倒数第 2 个数字为 0 的姓名、地址和学历。
用%写:
select name,address,education from employees where employeeid like '%0_';
因为employeeid是6位的,所以前四位可以用一个%进行代替,而倒数第二位是0,最后一位用_代替一位数字。
错误写法:select name,address,education from employees where employeeid like '%0%';
这样写前后两个%会导致指代不明,不明白0到底是哪一位的。结果中只要employeeid中中间有0的都会被查询出来。
用_写:
select name,address,education from employees where employeeid like '____0_';
前面4个_,后面1个_,因为吗,每一个_只能替代一位。
( 8 )找出所有收入在 2000~3000 元之间的员工号码,
Select employeeID from salary Where income between 2000 and 3000;
思考与练习: 找出所有部门号是 1 或 2 的工作的雇员的号码,
2 子查询的使用,
( 1 )查找在财务部工作的雇员的情况
Select * From employees Where departmentId=( Select DepartmentId From departments Where departmentname='财务部 ');
思考与练习: 用子查询的方法查找所有收入在 2500 元以下的雇员的情况
注意:
如果子查询的表中的departmentid只有一个,不会出现查找多个的情况。
如果子查询的表中的departmentid有多个,会出现Subquery returns more than 1 row。
例如:查询employees表中income少于2500的雇员的信息:
select * from employees where employeeid=(select employeeid from salary where income<'2500');
在salary表中,income少于2500的雇员有多个,所以会出现Subquery returns more than 1 row。
解决:添加any。select * from employees where employeeid= any(select employeeid from salary where income<'2500');
( 2 )查找研发部年龄不低于市场部所有雇员年龄的雇员的姓名
select name From employees Where departmentId in
( Select departmentid from departments where
departmentname=' 研发部 ')
and
Birthday<=all( Select birthday from employees where departmentID in
( Select departmentid from departments where
departmentname=' 市场部 '));
思考与练习: 用子查询的方法,查找研发部比市场部所有雇员收入都高的雇员的姓名
( 3 ) 查找比广告部所有的雇员收入都高的雇员的姓名
select name from employees where employeeid in (
select employeeid from salary where income>all(
select income from salary where employeeid in (
select employeeid from employees where departmentID=(
select departmentID from departments where departmentname='
广告部 ')
)
)
);
3 连接查询的使用
( 1 )查询每个雇员的情况及薪水的情况
select employees.*,salary.* from
employees ,salary where
employees.employeeid=salary.employeeid;
思考与练习 查询每个雇员的情况及工作部门的情况
( 2 )使用内连接的方法查询名字为“王林”的员工所在部门
select departmentname from departments join employees on
departments.departmentID=employees.departmentID where employees.name=' 王林 '; 思考与练习:
1) 使用内连接方法查找不在广告部工作的所有员工信息。
2) 使用外连接方法查找所有员工的用收入。
( 3 ) 查找广告部收入在 2000 元以上的雇员姓名及薪水详情
select name,income,outcome from employees,salary,departments
where employees.employeeID=salary.employeeID
and
employees.departmentID=departments.departmentID
and
departmentname=' 广告部 '
and
income>2000;
思考与练习 : 查询研发部在 1966 年以前出生的雇员姓名及薪水详情
4 , GROUP BY , ORDER BY 和 LIMIT 子句的使用
( 1 )查找 employees 中男性和女性的人数
select sex,count(sex)
from employees
group by sex;
思考与练习:
1) 按部门列出在该部门工作的员工的人数。
2) 按员工的学历分组,列出本科,大专和硕士的人数。
( 2 )查找员工数超过 2 人的部门名称和员工数量
select departmentname ,count(*) as 人数
from employees,departments
where employees.departmentID=departments.departmentID
group by employees.departmentid
having count(*)>2;
思考与练习:
按员工的工作年份分组,统计各个工作年份的人数,如工作一年的多少人 ? 工作二年的
多少人?
( 3 )将 Employees 表中的员工号码由大到小排列
select employeeid
from employees
order by employeeid desc;
思考与练习:
a. 将员工信息按出生日期从小到大排列。
b. 在 order by 子句中使用子查询,查询员工姓名,性别和工龄信息,要求按实际收入
从大到小排列。
( 4 )返回 employees 表中的前 5 位的员工信息
select *
from employees limit 5;
思考与练习: 返回 employees 表中从第 3 位员工开始的 5 个员工的信息 ?