mysql数据库基础进阶

一、场景表

部门表--》dept    职务表--》job  员工表--》emp  工资等级表--》salarygrade

USE demotest;
DROP TABLE IF EXISTS emp; 
DROP TABLE IF EXISTS dept; 
DROP TABLE IF EXISTS job; 
DROP TABLE IF EXISTS salarygrade; 

-- 部门表 


CREATE TABLE dept ( 
        did INT PRIMARY KEY PRIMARY KEY, -- 部门id 
        dname VARCHAR(50), -- 部门名称 
        loc VARCHAR(50) -- 部门所在地 
);

-- 职务表

,职务名称,职务描述 
CREATE TABLE job ( 
        id INT PRIMARY KEY, 
        jname VARCHAR(20), 
        description VARCHAR(50) 
);

-- 员工表 


CREATE TABLE emp ( 
        id INT PRIMARY KEY, -- 员工id 
        ename VARCHAR(50), -- 员工姓名 
        job_id INT, -- 职务id 
        mgr INT , -- 上级领导 
        joindate DATE, -- 入职日期 
        salary DECIMAL(7,2), -- 工资 
        bonus DECIMAL(7,2), -- 奖金 
        dept_id INT, -- 所在部门编号 
        CONSTRAINT emp_jobid_ref_job_id_fk FOREIGN KEY (job_id) REFERENCES job (id), 
        CONSTRAINT emp_deptid_ref_dept_id_fk FOREIGN KEY (dept_id) REFERENCES dept (did) 
);

-- 工资等级表 


CREATE TABLE salarygrade ( 
grade INT PRIMARY KEY, -- 级别 
losalary INT, -- 最低工资 
hisalary INT -- 最高工资 
);

-- 添加4个部门 


INSERT INTO dept(did,dname,loc)

         VALUES (10,'教研部','北京'), (20,'学工部','上海'), (30,'销售部','广州'), (40,'财务部','深圳');

-- 添加4个职务 


INSERT INTO job (id, jname, description)

         VALUES (1, '董事长', '管理整个公司,接单'), (2, '经理', '管理部门员工'), (3, '销售员', '向客人推销产品'), (4, '文员', '使用办公软件');

-- 添加员工 


INSERT INTO emp(id,ename,job_id,mgr,joindate,salary,bonus,dept_id)

        VALUES (1001,'孙悟空',4,1004,'2000-12-17','8000.00',NULL,20),

                        (1002,'卢俊义',3,1006,'2001-02-20','16000.00','3000.00',30),

                         (1003,'林冲',3,1006,'2001-02-22','12500.00','5000.00',30),

                         (1004,'唐僧',2,1009,'2001-04-02','29750.00',NULL,20),

                          (1005,'李逵',4,1006,'2001-09-28','12500.00','14000.00',30),

   
                        (1006,'宋江',2,1009,'2001-05-01','28500.00',NULL,30),

                        (1007,'刘备',2,1009,'2001-09-01','24500.00',NULL,10),

                        (1008,'猪八戒',4,1004,'2007-04-19','30000.00',NULL,20),

                         (1009,'罗贯中',1,NULL,'2001-11-17','50000.00',NULL,10),

                        (1010,'吴用',3,1006,'2001-09-08','15000.00','0.00',30),

                         (1011,'沙僧',4,1004,'2007-05-23','11000.00',NULL,20),

                        (1012,'李逵',4,1006,'2001-12-03','9500.00',NULL,30),

                         (1013,'小白龙',4,1004,'2001-12-03','30000.00',NULL,20),

                         (1014,'关羽',4,1007,'2002-01-23','13000.00',NULL,10);

-- 添加5个工资等级 


INSERT INTO salarygrade(grade,losalary,hisalary)

 VALUES

(1,7000,12000),

(2,12010,14000),

(3,14010,20000),

(4,20010,30000),

(5,30010,99990);

二、多表关联查询

-- 需求
-- 1. 查询所有员工信息。查询员工编号,员工姓名,工资,职务名称,职务描述
/* 分析:1. 员工编号,员工姓名,工资 信息在emp 员工表中 
                2. 职务名称,职务描述 信息在 job 职务表中 
                3. job 职务表 和 emp 员工表 是 一对多的关系 emp.job_id = job.id 
*/

-- 隐式内连接


-- SELECT 
--             e.id ,
--             e.ename ,
--             e.salary,
--             j.jname,
--             j.description 
-- FROM 
--         emp e,job j
-- WHERE 
--         e.job_id = j.id;
-- -- 当表名写了简称之后,就不能在这样写了-->emp.job_id = job.id


-- 显式内连接


-- SELECT 
--             e.id ,
--             e.ename ,
--             e.salary,
--             j.jname,
--             j.description 
-- FROM 
--         emp e
-- INNER JOIN job j ON e.job_id = j.id;

-- 2. 查询员工编号,员工姓名,工资,职务名称,职务描述,部门名称,部门位置
/* 分析:1. 员工编号,员工姓名,工资 信息在emp 员工表中 2. 职务名称,职务描述 信息在 job 职务表中 3. job 职务表 和 emp 员工表 是 一对多的关系 emp.job_id = job.id 4. 部门名称,部门位置 来自于 部门表 dept 5. dept 和 emp 一对多关系 dept.id = emp.dept_id */
-- 方式一 :隐式内连接
-- SELECT
--     emp.id,
--     emp.ename,
--     emp.salary,
--   job.jname,
--   job.description,
--     dept.dname,
--     dept.loc
-- FROM
--     emp,job,dept
-- WHERE
--     emp.job_id = job.id 
-- AND 
--     emp.dept_id = dept.did;
-- 方式二 :显式内连接
-- SELECT
--     emp.id,
--     emp.ename,
--     emp.salary,
--   job.jname,
--   job.description,
--     dept.dname,
--     dept.loc
-- FROM
--     emp
-- INNER JOIN job ON emp.job_id = job.id
-- INNER JOIN dept ON emp.dept_id = dept.did;

-- 3. 查询员工姓名,工资,工资等级
-- SELECT 
--     emp.ename,
--     emp.salary,
--     t2.grade
-- FROM
--     emp ,salarygrade t2 
-- WHERE   
--     emp.salary >= t2.losalary 
-- AND 
--         emp.salary <= t2.hisalary ;

USE demotest;
-- -- 4. 查询员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级
-- -- 分析:
-- --     job表-->emp表 一对多 外键关联; dept表-->emp表 一对多 外键关联 
-- --     1.姓名、工资--> emp表
-- --     2.职务名称、职务描述 --> job表
-- --     3.部门名称、部门位置 -->dept表
-- --     4.工资等级 --> salarygrade表

-- SELECT
--     emp.ename,
--     emp.salary,
--     job.jname,
--     job.description,
--     dept.dname,
--     dept.loc,
--     salarygrade.grade
-- FROM
--     emp,job,dept,salarygrade
-- WHERE
--     emp.job_id = job.id 
-- AND
--     emp.dept_id = dept.did
-- AND
--     emp.salary >= salarygrade.losalary
-- AND
--     emp.salary <= salarygrade.hisalary;
-- \显式内连接
-- SELECT
--     emp.ename,
--     emp.salary,
--     job.jname,
--     job.description,
--     dept.dname,
--     dept.loc,
--     t2.grade
-- FROM
--     emp
--     INNER JOIN job ON emp.job_id = job.id
--     INNER JOIN dept ON emp.dept_id = dept.did
--     INNER JOIN salarygrade t2 ON emp.salary BETWEEN t2.losalary AND t2.hisalary;

-- 5. 查询出部门编号、部门名称、部门位置、部门人数
-- 分析:
-- 部门编号、部门名称、部门位置  属于 dept 表
-- 部门人数  属于  emp 表    
-- dept 和 emp 是一对多关系


/* 分析:1. 部门编号、部门名称、部门位置 来自于部门 dept 表 
2. 部门人数: 在emp表中 按照dept_id 进行分组,然后count(*)统计数量 
3. 使用子查询,让部门表和分组后的表进行内连接 */

-- 首先根据部门id分组查询各部门人数
-- SELECT dept_id , COUNT(*) count_nums FROM emp GROUP BY dept_id;
-- 将此作为临时表,进行一对多查询
-- SELECT 
--     dept.did,
--     dept.dname,
--     dept.loc,
--     t2.count_nums
-- FROM
--     dept,(SELECT dept_id , COUNT(*) count_nums FROM emp GROUP BY dept_id) t2
-- WHERE 
--     dept.did = t2.dept_id;

三、mysql事物


-- 4.1 概述
-- 数据库的事务(Transaction)是一种机制、一个操作序列,包含了一组数据库操作命令。
-- 事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么同时成功,要么同时失败。
-- 事务是一个不可分割的工作逻辑单元。


-- 这些概念不好理解,接下来举例说明,如下图有一张表
-- 张三和李四账户中各有100块钱,现李四需要转换500块钱给张三

-- 开启事务
-- START TRANSACTION; 
-- 或者BEGIN;
-- 提交事务
-- commit;
-- 回滚事务
-- rollback;

-- 环境准备
-- DROP TABLE IF EXISTS account; 
-- -- 创建账户表 
-- CREATE TABLE account( 
-- id int PRIMARY KEY auto_increment, 
-- name varchar(10), money double(10,2) 
-- );
-- -- 添加数据 
-- INSERT INTO account(name,money) values('张三',1000),('李四',1000);

-- 不加事务演示问题
-- 转账操作 
-- 1. 查询李四账户金额是否大于500 
-- 2. 李四账户 -500 
-- UPDATE account set money = money - 500 where name = '李四'; 
-- -- 出现异常了... -- 此处不是注释,在整体执行时会出问题,后面的sql则不执行 -- 
-- -- 3. 张三账户 +500 
-- UPDATE account set money = money + 500 where name = '张三';

-- 添加事务sql如下:
-- 开启事务 
-- BEGIN; 
-- -- 转账操作 
-- -- 1. 查询李四账户金额是否大于500 
-- -- 2. 李四账户 -500 
-- UPDATE account set money = money - 500 where name = '李四'; 
-- -- 出现异常了... -- 此处不是注释,在整体执行时会出问题,后面的sql则不执行 
-- -- 3. 张三账户 +500 
-- UPDATE account set money = money + 500 where name = '张三';
-- -- 提交事务 
-- COMMIT; 
-- -- 回滚事务 
-- ROLLBACK;
-- 上面sql中的执行成功进选择执行提交事务,而出现问题则执行回滚事务的语句。
-- 以后我们肯定不可能这样操作,而是在
-- java中进行操作,在java中可以抓取异常,没出现异常提交事务,出现异常回滚事务。


-- 4.4 事务的四大特征


-- 原子性(Atomicity): 事务是不可分割的最小操作单位,要么同时成功,要么同时失败
-- 一致性(Consistency) :事务完成时,必须使所有的数据都保持一致状态
-- 隔离性(Isolation) :多个事务之间,操作的可见性
-- 持久性(Durability) :事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
-- 说明:
-- mysql中事务是自动提交的。
-- 也就是说我们不添加事务执行sql语句,语句执行完毕会自动的提交事务。
-- 可以通过下面语句查询默认提交方式:
-- SELECT @@autocommit;
-- 查询到的结果是1 则表示自动提交,结果是0表示手动提交。当然也可以通过下面语句修改提交方式
-- set @@autocommit = 0;
-- 

//查询每个员工每年的总工资
USE demotest;
SELECT t1.e_name AS 姓名,DATE_FORMAT(t2.d_year,'%Y') AS a_year,SUM(t2.salary) AS 总工资
FROM  employee t1 LEFT JOIN deptemp t2
ON t1.e_name = t2.d_name
GROUP BY t1.e_name,a_year;

目录

一、场景表

-- 部门表 

-- 职务表

-- 员工表 

-- 工资等级表 

-- 添加4个部门 

-- 添加4个职务 

-- 添加员工 

-- 添加5个工资等级 

二、多表关联查询

-- 隐式内连接

-- 显式内连接

三、mysql事物

-- 4.4 事务的四大特征


-- 将deptemp年份int类型换为时间类型date 年-月-日 datetime 年-月-日 时分秒
-- ALTER TABLE deptemp MODIFY d_year date;
-- 添加内容
-- -- -- INSERT INTO deptemp(d_year)
-- -- -- VALUES ('2000-01-01');
-- -- -- apply_id 为空:
-- -- -- update product_report_temp SET state = 0 WHERE apply_id is NULL;
-- -- -- apply_id 不为空:
-- -- -- update product_report_temp SET state = 1 WHERE apply_id <> "" or apply_id is not null;
-- UPDATE deptemp SET d_year = '2020-01-01' WHERE d_year IS NULL;

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值