MySQL之综合实践【从基础到进阶】 - ic翼

前言

本篇文章将前几天所学过的MySQL知识进行了一次综合实践。包括表的建立、插入、查询、视图、函数的运用、触发器等。

创建&使用数据库

  • 建立数据库、建立表。写文章的时候没有截图。所以我尽可能的把代码思路弄清楚点。不好之处还望多多留言指正哈。PS:打表格的时候是真的费时间啊。

1.创建数据库YGGL

create database YGGL;

2.使用数据库YGGL

use YGGL;

创建表

3.在数据库YGGL中创建三个数据表Employees(员工信息表)、Departments(部门信息表)、和Salary(员工薪水情况表)

创建员工信息表

这里需要注意的是:因为Employees、Salary需要创建外键。最好是先创建没有外键的表。

  • Departments表结构
字段名数据类型主键外键非空唯一自增默认说明
DepartmentIDchar(3)部门编号
DepartmentNamevarchar(20)部门名称
create table Departments
(
    DepartmentID char(3) primary key not null unique comment '部门编号',
    DepartmentName varchar(20) not null comment '部门名称'
);

desc Departments;
  • Employees表结构
字段名数据类型主键外键非空唯一自增默认说明
EmployeeIDchar(6)员工编号
Namevarchar(10)姓名
Birthdaydate出生日期
Sexchar(2)‘1’性别
Workyeartinyint(1)工作时间
Addressvarchar(20)地址
PhoneNumberchar(12)电话号码
DepartmentIDchar(3)员工部门号
create table Employees
(
    EmployeeID char(6) primary key not null unique comment '员工编号',
    Name varchar(10) not null comment '姓名',
    Birthday date not null comment '出生日期',
    Sex char(2) not null default 1 comment '性别',
    Workyear tinyint(1) comment '工作时间',
    Address varchar(20) comment '地址',
    PhoneNumber char(12) comment '电话号码',
    DepartmentID char(3) comment '员工部门号',
    constraint test2 foreign key(DepartmentID) references Departments(DepartmentID)
);

desc Employees;
  • Salary表结构
字段名数据类型主键外键非空唯一自增默认说明
EmployeeIDchar(6)员工编号
InComefloat(8)0收入
OutComefloat(8)0支出
create table Salary
(
    EmployeeID char(6) primary key not null unique  comment '员工编号',    
    InCome float(8)  not null default 0 comment '收入',
    OutCome float(8) not null default 0 comment '支出',
    constraint test1 foreign key(EmployeeID) references Employees(EmployeeID)
);

desc Salary;

插入数据

4.向Employees(员工信息表)、Departments(部门信息表)、和Salary(员工薪水情况表)三张表中分别插入以下数据。

  • 向部门信息表中插入数据
EmployeeIDNameBrithdaySexWorkyearAddressPhoneNumberDepartmentID
000001王林1996-01-2318中山路32-1-508833556682
010008伍容华1976-03-2813北京东路100-2833213211
020010王向荣1982-12-0912四牌楼10-0-108837923611
020018李丽1960-07-3006中山东路102-2834133011
102201刘明1972-10-1813虎踞路100-2836066085
102208朱俊1965-09-2812牌楼巷5-3-106847088175
108991钟敏1979-08-1004中山路10-3-105833467623
111006张石兵1974-10-0111解放路34-1-203845634185
210678林涛1977-04-2212中山北路24-35834673363
302556李玉珉1968-09-2013热河路209-3587659914
308759叶凡1978-11-1812北京西路3-7-52833089014
504209陈林琳1969-09-0305汉中路120-4-12844681584
INSERT INTO `yggl`.`employees` (`EmployeeID`, `Name`, `Birthday`, `Sex`, `Workyear`, `Address`, `PhoneNumber`, `DepartmentID`) VALUES ('000001', '王林', '1996-01-23', '1', '8', '中山路32-1-508', '83355668', '2');
INSERT INTO `yggl`.`employees` (`EmployeeID`, `Name`, `Birthday`, `Sex`, `Workyear`, `Address`, `PhoneNumber`, `DepartmentID`) VALUES ('010008', '伍容华', '1976-03-28', '1', '3', '北京东路100-2', '83321321', '1');
INSERT INTO `yggl`.`employees` (`EmployeeID`, `Name`, `Birthday`, `Sex`, `Workyear`, `Address`, `PhoneNumber`, `DepartmentID`) VALUES ('020010', '王向荣', '1982-12-09', '1', '2', '四牌楼10-0-108', '83792361', '1');
INSERT INTO `yggl`.`employees` (`EmployeeID`, `Name`, `Birthday`, `Sex`, `Workyear`, `Address`, `PhoneNumber`, `DepartmentID`) VALUES ('020018', '李丽', '1960-07-30', '0', '6', '中山东路102-2', '83413301', '1');
INSERT INTO `yggl`.`employees` (`EmployeeID`, `Name`, `Birthday`, `Sex`, `Workyear`, `Address`, `PhoneNumber`, `DepartmentID`) VALUES ('102201', '刘明', '1972-10-18', '1', '3', '虎踞路100-2', '83606608', '5');
INSERT INTO `yggl`.`employees` (`EmployeeID`, `Name`, `Birthday`, `Sex`, `Workyear`, `Address`, `PhoneNumber`, `DepartmentID`) VALUES ('102208', '朱俊', '1965-09-28', '1', '2', '牌楼巷5-3-106', '84708817', '5');
INSERT INTO `yggl`.`employees` (`EmployeeID`, `Name`, `Birthday`, `Sex`, `Workyear`, `Address`, `PhoneNumber`, `DepartmentID`) VALUES ('108991', '钟敏', '1979-08-10', '0', '4', '中山路10-3-105', '83346762', '3');
INSERT INTO `yggl`.`employees` (`EmployeeID`, `Name`, `Birthday`, `Sex`, `Workyear`, `Address`, `PhoneNumber`, `DepartmentID`) VALUES ('111006', '张石兵', '1974-10-01', '1', '1', '解放路34-1-203', '84563418', '5');
INSERT INTO `yggl`.`employees` (`EmployeeID`, `Name`, `Birthday`, `Sex`, `Workyear`, `Address`, `PhoneNumber`, `DepartmentID`) VALUES ('210678', '林涛', '1977-04-22', '1', '2', '中山北路24-35', '83467336', '3');
INSERT INTO `yggl`.`employees` (`EmployeeID`, `Name`, `Birthday`, `Sex`, `Workyear`, `Address`, `PhoneNumber`, `DepartmentID`) VALUES ('302556', '李玉珉', '1968-09-20', '1', '3', '热河路209-3', '58765991', '4');
INSERT INTO `yggl`.`employees` (`EmployeeID`, `Name`, `Birthday`, `Sex`, `Workyear`, `Address`, `PhoneNumber`, `DepartmentID`) VALUES ('308759', '叶凡', '1978-11-18', '1', '2', '北京西路3-7-52', '83308901', '4');
INSERT INTO `yggl`.`employees` (`EmployeeID`, `Name`, `Birthday`, `Sex`, `Workyear`, `Address`, `PhoneNumber`, `DepartmentID`) VALUES ('504209', '陈林琳', '1969-09-03', '0', '5', '汉中路120-4-12', '84468158', '4');
  • 向员工信息表中插入数据
部门号部门名称
1财务部
2人力资源部
3经理办公室
4研发部
5市场部
INSERT INTO `yggl`.`departments` (`DepartmentID`, `DepartmentName`) VALUES ('1', '财务部');
INSERT INTO `yggl`.`departments` (`DepartmentID`, `DepartmentName`) VALUES ('2', '人力资源部');
INSERT INTO `yggl`.`departments` (`DepartmentID`, `DepartmentName`) VALUES ('3', '经理办公室');
INSERT INTO `yggl`.`departments` (`DepartmentID`, `DepartmentName`) VALUES ('4', '研发部');
INSERT INTO `yggl`.`departments` (`DepartmentID`, `DepartmentName`) VALUES ('5', '市场部');
  • 向员工工资表中插入数据
编号收入支出
0000012100.8123.09
0100081582.6288.03
1022012569.88185.65
1110061987.0179.58
5042092066.15108.0
3025562980.7210.2
1089913259.98285.12
0200102860.0198.0
0200182347.68180.0
3087592531.98199.08
2106782240.0121.0
1022081980.0100.0
INSERT INTO `yggl`.`salary` (`EmployeeID`, `InCome`, `OutCome`) VALUES ('000001', '2100.8', '123.09');
INSERT INTO `yggl`.`salary` (`EmployeeID`, `InCome`, `OutCome`) VALUES ('010008', '1582.62', '88.03');
INSERT INTO `yggl`.`salary` (`EmployeeID`, `InCome`, `OutCome`) VALUES ('102201', '2569.88', '185.65');
INSERT INTO `yggl`.`salary` (`EmployeeID`, `InCome`, `OutCome`) VALUES ('111006', '1987.01', '79.58');
INSERT INTO `yggl`.`salary` (`EmployeeID`, `InCome`, `OutCome`) VALUES ('504209', '2066.15', '108.0');
INSERT INTO `yggl`.`salary` (`EmployeeID`, `InCome`, `OutCome`) VALUES ('302556', '2980.7', '210.2');
INSERT INTO `yggl`.`salary` (`EmployeeID`, `InCome`, `OutCome`) VALUES ('108991', '3259.98', '285.12');
INSERT INTO `yggl`.`salary` (`EmployeeID`, `InCome`, `OutCome`) VALUES ('020010', '2860.0', '198.0');
INSERT INTO `yggl`.`salary` (`EmployeeID`, `InCome`, `OutCome`) VALUES ('020018', '2347.68', '180.0');
INSERT INTO `yggl`.`salary` (`EmployeeID`, `InCome`, `OutCome`) VALUES ('308759', '2531.98', '199.08');
INSERT INTO `yggl`.`salary` (`EmployeeID`, `InCome`, `OutCome`) VALUES ('210678', '2240.0', '121.0');
INSERT INTO `yggl`.`salary` (`EmployeeID`, `InCome`, `OutCome`) VALUES ('102208', '1980.0', '100.0');

表的基本操作

1.查询Employees表中所有信息

select * from employees;

2.查询Workyear字段,并去掉重复值

SELECT DISTINCT `Workyear` from employees;

3.查询1970-01-01之前和1979-12-31之后出生的员工信息

select * from Employees where birthday<='1970-01-01' or birthday>='1979-12-31';

4.查询在1、3、5部门工作的员工信息

select EmployeeID,Name,Birthday,Sex,Workyear,Address,PhoneNumber,Employees.DepartmentID,DepartmentName from Employees,Departments where  Departments.DepartmentID=Employees.DepartmentID and Departments.DepartmentID in (1,3,5);

5.查询姓名为两个字的员工的信息

select * from Employees where Name like '__';

6.查询在1号部门工作的性别为1的员工信息

###这里有两种方法
select * from Employees,Departments where Departments.DepartmentID=Employees.DepartmentID and Departments.DepartmentID = 1 and Employees.sex = 1;
select * from employees where DepartmentID='1' and sex='1';

7.查询在4号部门和5号部门工作的员工信息

###这里有两种方法
select * from Employees,Departments where Departments.DepartmentID=Employees.DepartmentID and Departments.DepartmentID in (4,5);
select * from employees where DepartmentID='4' or DepartmentID='5';

8.查询所有员工的支出情况,并按支出进行降序排序

select Name,OutCome from Employees,Salary where Employees.EmployeeID=Salary.EmployeeID order by OutCome desc;

9.统计每个部门的职工人数

select DepartmentName,count(Employees.DepartmentID) from Employees,Departments where Departments.DepartmentID=Employees.DepartmentID group by Employees.DepartmentID;

10.统计每个部门的职工人数,并找出职工人数大于等于3人的部门号

select DepartmentName,count(Employees.DepartmentID) from Employees,Departments where Departments.DepartmentID=Employees.DepartmentID and Employees.DepartmentID >=3 group by Employees.DepartmentID;

11.求支出最多的员工的编号

### 这里有两种方法
select EmployeeID,max(OutCome) as 支出 from Departments,Salary;
select employeeid,outcome 
from salary
where OutCome=(select max(OutCome) from salary);

12.求所有员工支出的平均值

select avg(OutCome) as 平均值 from Salary;

13.查询员工的姓名和所在部门名称

select Name,DepartmentName from Employees,Departments where Departments.DepartmentID=Employees.DepartmentID;

14.查询王向荣所在部门的部门名称

select Departments.DepartmentName from Employees,Departments where Name regexp '王向荣' and Departments.DepartmentID=Employees.DepartmentID;

15.查询财务部的员工姓名

select Employees.Name from Employees,Departments where DepartmentName regexp '财务部' and Departments.DepartmentID=Employees.DepartmentID;

16.查询比王林、刘明、李玉珉中某一个人收入高的员工信息

select DISTINCT Employees.* from Employees,Salary where Salary.InCome >= 2100.8 and Salary.InCome >= 2569.88 and Salary.InCome >= 2980.7 and Salary.EmployeeID=Employees.EmployeeID;

17.查询是否存在部门5,如果存在,则查询Employees表的所有记录

select * from employees
where exists
(select DepartmentID from departments where DepartmentID='5');

18.查询是否存在部门号为6的部门,如果不存在,则查询Employees表的所有记录

select * from employees 
where not exists
(select DepartmentID from departments where DepartmentID='6');

19.将Employees表中名称为“叶凡”的PhoneNumber修改为“83308902”

UPDATE `yggl`.`employees` SET `PhoneNumber`='83308902' WHERE `EmployeeID`='308759';

20.在Salary表中的InCome字段上添加普通索引

alter table Salary add index testSalary (InCome);

21.在Employees表中的Name字段上添加唯一索引

alter table Employees add unique index unEmployees (Name);

22.(1)查看Employees表中全部信息的存储过程(2)调用该存储过程

###
delimiter //
create procedure a()
begin 
    select * from employees;
end //
delimiter ;


call a();

23.(1)创建存储过程:查看Employees表中DepartmentID为5的员工人数,并将人数输出到某个变量中。(2)调用该存储过程

### 
delimiter //
create procedure b(out num int)
begin
    select count(*) into num from employees where DepartmentID='5';
end //
delimiter ;

call b(@sum);
select @sum;

24.在Employees表和Salary表上创建视图view_2,通过该视图可以查看员工姓名、支出及收入情况

###
create view view_2(name,income,outcome)
as select name,income,outcome
from employees,salary
where employees.EmployeeID=salary.EmployeeID;

25.查看视图view_2的所有记录

select * from view_2;

26.删除视图view_2

drop view view_2;

27.创建触发器:向Employees表中插入一条新纪录之后向Salary表中插入一条新的纪录(new.EmployeeID,0,0)

create trigger t1 after insert on employees
for each row insert into salary values (new.employeeID,'0','0');

28.删除27中所创建的触发器

drop trigger t1;
    原文作者:SQL
    原文地址: https://juejin.im/entry/5ae33ff1518825670d72d879
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞