day33-javaWeb

MySQL

通过SQL语句操作数据库管理系统来管理数据

关系型数据库:

建立在关系模型基础上,由多张能相互连接的二维表组成

SQL通用语法:

1.SQL语句可以单行或多行书写,以分号结尾;
2.MYSQL数据库的SQL语句不区分大小写,关键字建议使用大写;
3.注释:
单行注释:-- 注释(–和注释之间必须有空格)或者#注释(MYSQL特有)
多行注释:/注释/

SQL语句:

DDL:用于操作数据库,表等的语句
DML:对表中的数据进行增删改的语句
DQL:对表中的数据进行查询的语句
DCL:对数据库进行权限控制的语句

DDL

show databases;

create database db1;

create database if not exists db1;

drop database db1;

drop database if exists db1;

use db1;-- 使用数据库

select database();-- 查看当前使用的数据库

在这里插入图片描述

数据类型:数值、日期、字符串

在这里插入图片描述

操作表
SHOW TABLES;-- 查询当前数据库下所有表的名称

DESC 表名称;-- 查询表结构
创建表

在这里插入图片描述

create table student(
    id int,
    name varchar(10),
    sex char(1),
    birthday date,
    score double(5,2),
    email varchar(64),
    tel varchar(15),
    status tinyint
);
删除表
drop table student;

drop table if exists student;
修改表
1.修改表名
ALTER TABLE tb_user RENAME TO users;
2.添加一列
ALTER TABLE users ADD score double(5,2);
3.修改数据类型
ALTER TABLE users MODIFY username varchar(10);
4.修改列名和数据类型
ALTER TABLE users CHANGE USERNAME name CHAR(10);
5.删除列
ALTER TABLE USERS DROP SCORE;

在这里插入图片描述

DML

添加数据:

1.给指定列添加数据
2.给全部列添加数据
3.批量添加数据
-- 查询所有数据
SELECT
	*
FROM
	users;

SELECT
	*
FROM
	student;

-- 给指定列添加数据,字符串使用单引号或者双引号都可
INSERT INTO users (NAME)
VALUES
	('张三');

-- 给所有列添加数据
INSERT INTO student (
	id,
	NAME,
	sex,
	birthday,
	score,
	email,
	tel,
	STATUS
)
VALUES
	(
		1,
		'李四',
		'男',
		'1999-08-08',
		98,
		'123455355@qq.com',
		123456789,
		1
	);

-- 给所有列添加数据时列名里的成员可省略
INSERT INTO student
VALUES
	(
		1,
		'李四',
		'男',
		'1999-08-08',
		98,
		'123455355@qq.com',
		123456789,
		1
	),(-- 批量添加只需一次多写几个括号,用,隔开
		1,
		'李四',
		'男',
		'1999-08-08',
		98,
		'123455355@qq.com',
		123456789,
		1
	);

修改数据

-- 如:将张三的性别改为男
UPDATE users
SET sex = '男'
WHERE
	NAME = '张三';

-- 将张三的id改为5,密码改成333
UPDATE users
SET id = 5,
 PASSWORD = 333
WHERE
	NAME = '张三';

SELECT
	*
FROM
	users;

注意:如果没有加where条件,将修改表中所有值!

-- 删除shifan的数据
DELETE FROM users WHERE name = 'shifan';
-- 如不加where条件将删除表中所有记录

DQL

查询语法

img

基础查询
1.查询多个字段
-- 查询所有记录,不要使用!
 SELECT * FROM users;
 -- 查询用户名,性别
 SELECT username,sex FROM users;
2.去除重复记录 distinct
SELECT DISTINCT username FROM users;
3.取别名 AS,as也可以省略,有空格隔开就行
SELECT username as 用户名,sex as 性别 FROM users;

img

条件查询
SELECT username,sex FROM users WHERE 条件列表;

img

 -- 查询年龄大于20岁的学员信息
 SELECT * FROM stu WHERE age > 20;

-- 查询年龄等于18,20,22的学员信息
 SELECT * FROM stu WHERE age = 18 OR age = 20 OR age = 22;

SELECT * FROM stu WHERE age in (18,20,22);

-- 查询英语成绩为null的学员信息
 -- 错误写法:SELECT * FROM stu WHERE english = NULL;
 -- NULL的比较不能使用=,!=,只能使用IS,IS NOT
 SELECT * FROM stu WHERE english IS null;
模糊查询
-- 模糊查询 LIKE
 /*
 通配符
 (1)_:代表单个任意字符
 (2)%:代表任意个数字符
 */
 SELECT * FROM stu WHERE `name` LIKE '柳_';

img
img

排序查询
-- 按年龄升序排列,ASC表示升序,默认升序,可以省略
 SELECT * FROM stu ORDER BY age ASC; 

img

 -- 按数学成绩降序排列,数学成绩相同则按英语成绩升序排列
 SELECT * FROM stu ORDER BY math DESC ,english;

img

分组查询
聚合函数

将一列数据作为整体进行计算

img

-- 分组查询
 -- 统计一个班一共有多少个学生
 SELECT count(id) FROM stu;
 -- count统计的列中不能有null,故count的取值一般为主键(非空且唯一)或者\*
 -- 查询数学成绩的最高分
 SELECT MAX(math) FROM stu;
 -- 查询数学成绩的最低分
 SELECT MIN(math) FROM stu;
 -- 查询数学成绩的总分
 SELECT SUM(math) FROM stu;
 -- 查询数学成绩的平均分
 SELECT AVG(math) FROM stu;
 -- 查询英语成绩最低分

SELECT MIN(english) FROM stu;

img

-- null值不参与聚合函数计算
/*分组查询语法SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定]  GROUP BY 分组字段名 [HAVING 分组后条件过滤]; */
 SELECT * FROM stu;
 -- 查询男同学和女同学各自的数学平均分
 SELECT sex,AVG(math) FROM stu GROUP BY sex;
 -- 分组之后,查询字段应为分组字段和聚合函数,查询其他字段没有意义
 -- 例:select name,sex,AVG(math) FROM stu GROUP BY sex;这里面的name字段没有意义
 -- 查询男同学和女同学各自的数学平均分,及各自人数
 SELECT sex 性别,AVG(math) as 平均分,COUNT(*) as 人数 FROM stu GROUP BY sex;
 -- 查询男同学和女同学各自的数学平均分,及各自人数,要求分数低于70不参与分组
 SELECT sex 性别,AVG(math) as 平均分,COUNT(*) as 人数 FROM stu WHERE math >=70 GROUP BY sex;
 -- 查询男同学和女同学各自的数学平均分,及各自人数,要求分数低于70不参与分组,且分组之后人数大于2
 -- WHERE 不能对聚合函数进行判断,having可以,因为执行顺序:where>聚合函数>having
分页查询(LIMIT)
/* 分页查询语法 SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询条目数; 起始索引从0开始,类似数组下标 */
 -- 从0开始查询,查询3条数据
 SELECT * FROM stu LIMIT 0,3;
 -- 每页显示3条数据,查询第一页数据
 SELECT * FROM stu LIMIT 0,3;
 -- 每页显示3条数据,查询第二页数据
 SELECT * FROM stu LIMIT 3,3;
 -- 每页显示3条数据,查询第三页数据
 SELECT * FROM stu LIMIT 6,3;
 -- LIMIT是MySQL专属,oracle使用的是rownumber,SQL server使用的是top
联合查询
# 联合查询union,union all
# 需求:查询性别为男的员工**和**入职日期在2010年以前的员工
select * from emp where gender =1;
select * from emp where entrydate<'2010-01-01';
# 联合查询:union all不会去重,直接拼接两个结果
select * from emp where gender = 1
union all
select *
from emp where entrydate <'2010-01-01';
# 联合查询:union,去重再拼接两个结果
select * from emp where gender = 1
union
select *
from emp where entrydate <'2010-01-01';
# 注意: 两个查询的列字段数量要一致,类型也要一致
自连接
# 自连接
# 需求:查询员工及其领导名字
select a.name '员工',b.name '领导'
from emp a join emp b on a.manager_id = b.id;
# 需求:查询员工及其领导名字,没有领导也要查出来
select a.name '员工',b.name '领导'
from emp a left join emp b on a.manager_id = b.id;```
#### 子查询

##### 标量子查询

> 简单不写

##### 列子查询

```mysql
# 列子查询,in,not in,all,any,some与any等同,使用some的地方都可以使用any
# 需求1:查询比2010年前入职员工工号都大的员工信信息
# 分解:1.查询2010年前入职的员工工号
select work_no
from emp
where entrydate < '2010-01-01';
# 2.查询比2010年前入职员工工号都大的员工信信息
select *
from emp
where work_no > all (select work_no from emp where entrydate < '2010-01-01');

# 需求2:查询比2010年前入职员工任意一人工号大的员工信息
# 分解:1.查询2010年前入职的员工工号
select work_no
from emp
where entrydate < '2010-01-01';
# 2.查询比2010年前入职员工任意一人工号大的员工信息,any可替换为some,
select *
from emp
where work_no > any (select work_no from emp where entrydate < '2010-01-01');
行子查询
# 行子查询
# 需求:查询性别与工作均与张无忌相同的员工信息
# 分解:1.查询张无忌的性别与工作
select gender,job from emp where name = '张无忌';
# 2.查询性别与工作均与张无忌相同的员工信息
select * from emp where (gender,job) = (select gender,job from emp where name = '张无忌');

练习题

第一题

-- 创建员工表
create table employee(
	id int,					-- 编号
	name varchar(20),		-- 姓名
	sex varchar(10),		-- 性别
	birthday date,			-- 生日
	salary float,			-- 薪水
	resume varchar(20)		-- 介绍
);

-- 添加数据
INSERT INTO employee VALUES(1,"zhangsan","male","1980-11-25",2000,"good body");
INSERT INTO employee VALUES(2,"lisi","male","1980-04-25",1000,"good body");
INSERT INTO employee VALUES(3,"xiaohong","female","1978-11-25",4000,"good girl");

-- 需求练习
-- 将所有员工薪水修改为5000元。
UPDATE employee SET salary=5000;
-- 将姓名为’zhangsan’的员工薪水修改为3000元。
UPDATE employee SET salary=3000 WHERE NAME='zhangsan';
-- 将姓名为’lisi’的员工薪水修改为4000元,sex改为female。
UPDATE employee SET salary=4000, sex='female' WHERE NAME='lisi';
-- 将xiaohong的薪水在原有基础上增加1000元。
UPDATE employee SET salary=salary+1000 WHERE NAME='xiaohong';

第二题

-- 部门表
create table dept(
	deptno int primary key,  -- 部门编号  主键:唯一,非空
	dname varchar(14), 		 -- 部门名称
	loc varchar(13)			 -- 部门地址
);

insert into dept values	(10,'accounting','new york');
insert into dept values (20,'research','dallas');
insert into dept values	(30,'sales','chicago');
insert into dept values	(40,'operations','boston');

-- 员工表
create table emp(
	empno int  primary key, 	-- 员工编号
	ename varchar(10), 			-- 员工姓名
	job varchar(9), 			-- 员工工作
	mgr int, 					-- 员工直属领导编号
	hiredate date, 				-- 入职时间
	sal double, 				-- 工资
	comm double, 				-- 奖金
	deptno int  				-- 所在部门
);

insert into emp values(7369,'smith','职员',7566,"1980-12-17",800,null,20);
insert into emp values(7499,'allen','销售员',7698,'1981-02-20',1600,300,30);
insert into emp values(7521,'ward','销售员',7698,'1981-02-22',1250,500,30);
insert into emp values(7566,'jones','经理',7839,'1981-04-02',2975,null,20);
insert into emp values(7654,'martin','销售员',7698,'1981-09-28',1250,1400,30);
insert into emp values(7698,'blake','经理',7839,'1981-05-01',2850,null,30);
insert into emp values(7782,'clark','经理',7839,'1981-06-09',2450,null,10);
insert into emp values(7788,'scott','职员',7566,'1987-07-03',3000,2000,20);
insert into emp values(7839,'king','董事长',null,'1981-11-17',5000,null,10);
insert into emp values(7844,'turners','销售员',7698,'1981-09-08',1500,50,30);
insert into emp values(7876,'adams','职员',7566,'1987-07-13',1100,null,20);
insert into emp values(7900,'james','职员',7698,'1981-12-03',1250,null,30);
insert into emp values(7902,'ford','销售员',7566,'1981-12-03',3000,null,20);
insert into emp values(7934,'miller','职员',7782,'1981-01-23',1300,null,10);


-- 工资等级表
create table salgrade( 
	grade int,-- 等级
	losal double, -- 最低工资
	hisal double ); -- 最高工资
	
insert into salgrade values (1,500,1000);
insert into salgrade values (2,1001,1500);
insert into salgrade values (3,1501,2000);
insert into salgrade values (4,2001,3000);
insert into salgrade values (5,3001,9999);

-- 需求练习
-- 1、查找部门30中员工的详细信息。
SELECT * FROM emp WHERE deptno = 30;
-- 2、找出从事职员工作的员工的编号、姓名、部门号。
SELECT empno,ename,deptno FROM emp WHERE job='职员';
-- 3、检索出奖金多于基本工资的员工信息。
SELECT * FROM emp WHERE sal<comm;
-- 4、检索出奖金多于基本工资60%的员工信息。
SELECT * FROM emp WHERE sal*0.6<comm;
-- 5、找出姓名中包含A的员工信息。
SELECT * FROM emp WHERE ename LIKE '%A%';
-- 6、找出姓名以A、B、S开始的员工信息。
SELECT * FROM emp WHERE ename LIKE 'a%' OR ename like 'b%' OR ename LIKE 's%';
-- 7、找到名字长度为7个字符的员工信息。
SELECT * from emp WHERE ename LIKE '_______';


-- 8、名字中不包含R字符的员工信息。
SELECT * FROM emp WHERE ename NOT LIKE '%r%';


-- 9、返回员工的详细信息并按姓名升序排序。
SELECT * FROM emp ORDER BY ename;
-- 10、返回员工的信息并按姓名降序,工资升序排列。
SELECT * FROM emp ORDER BY ename DESC,sal;


-- 11、计算员工的日薪(按30天)。
SELECT ename,sal/30 FROM emp ;


-- 12、找出获得奖金的员工的工作。
SELECT DISTINCT job from emp WHERE comm is not null;	
-- 13、找出奖金少于100或者没有获得奖金的员工的信息。
SELECT * FROM emp where comm < 100 OR comm is null;
-- 14、找出10部门的经理、20部门的职员 的员工信息。
SELECT * FROM emp where (deptno=10 AND job = '经理')OR(deptno = 20 and job='职员');
-- 15、找出10部门的经理、20部门的职员 或者 既不是经理也不是职员但是工资高于2000元的员工信息。
SELECT * FROM emp where (deptno=10 AND job = '经理')OR(deptno = 20 and job='职员')
or (job!='经理' AND job!= '职员' AND sal>2000);
-- 16、查询每个职位的员工个数,没有奖金的不在统计范围之内
SELECT job,COUNT(*) FROM emp WHERE comm is not null GROUP BY job;	

DCL

# DCL,后端开发使用较少,dba(数据库管理员)使用更多
# DCL-用户管理

# 创建用户'user1',只能在当前主机localhost访问,密码123456
create user 'user1'@'localhost' identified by '123456';

# 创建用户'user2',可以在任意主机访问数据库,密码123456,主机名可使用%通配,表示任意
create user 'user2'@'%' identified by '123456';

# 修改用户user2的密码为1234
alter user 'user2'@'%' identified with mysql_native_password by '1234';

# 删除user1@localhost用户
drop user 'user1'@'localhost';

# DCL-权限管理
# 查询权限
show grants for 'user2'@'%';

# 授予权限,多个权限使用逗号分隔,数据库名和表名可使用*通配,表示所有
grant all on test.* to 'user2'@'%';

# 撤销授权
revoke all on test.* from 'user2'@'%';

函数

数据准备

-- auto-generated definition
create table emp
(
    id           int unsigned auto_increment comment 'ID'
        primary key,
    username     varchar(20)                  not null comment '用户名',
    password     varchar(32) default '123456' null comment '密码',
    name         varchar(10)                  not null comment '姓名',
    gender       tinyint unsigned             not null comment '性别, 说明: 1 男, 2 女',
    image        varchar(300)                 null comment '图像',
    job          tinyint unsigned             null comment '职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师',
    entrydate    date                         null comment '入职时间',
    dept_id      int unsigned                 null comment '部门ID',
    create_time  datetime                     not null comment '创建时间',
    update_time  datetime                     not null comment '修改时间',
    work_no      varchar(10)                  null,
    work_address varchar(10)                  null,
    constraint username
        unique (username)
)
    comment '员工表';

INSERT INTO test.emp (id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time, work_no, work_address) VALUES (1, 'jinyong', '123456', '金庸', 1, '1.jpg', 4, '2000-01-01', 2, '2023-04-18 20:20:27', '2023-04-18 20:20:27', '00001', '武汉');
INSERT INTO test.emp (id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time, work_no, work_address) VALUES (2, 'zhangwuji', '123456', '张无忌', 1, '2.jpg', 2, '2015-01-01', 2, '2023-04-18 20:20:27', '2023-04-18 20:20:27', '00002', '江苏');
INSERT INTO test.emp (id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time, work_no, work_address) VALUES (3, 'yangxiao', '123456', '杨逍', 1, '3.jpg', 2, '2008-05-01', 2, '2023-04-18 20:20:27', '2023-04-18 20:20:27', '00003', '武汉');
INSERT INTO test.emp (id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time, work_no, work_address) VALUES (4, 'weiyixiao', '123456', '韦一笑', 1, '4.jpg', 2, '2007-01-01', 2, '2023-04-18 20:20:27', '2023-04-18 20:20:27', '00004', '江苏');
INSERT INTO test.emp (id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time, work_no, work_address) VALUES (5, 'changyuchun', '123456', '常遇春', 1, '5.jpg', 2, '2012-12-05', 2, '2023-04-18 20:20:27', '2023-04-18 20:20:27', '00005', '上海');
INSERT INTO test.emp (id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time, work_no, work_address) VALUES (6, 'xiaozhao', '123456', '小昭', 2, '6.jpg', 3, '2013-09-05', 1, '2023-04-18 20:20:27', '2023-04-18 20:20:27', '00006', '上海');
INSERT INTO test.emp (id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time, work_no, work_address) VALUES (7, 'jixiaofu', '123456', '纪晓芙', 2, '7.jpg', 1, '2005-08-01', 1, '2023-04-18 20:20:27', '2023-04-18 20:20:27', '00007', '武汉');
INSERT INTO test.emp (id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time, work_no, work_address) VALUES (8, 'zhouzhiruo', '123456', '周芷若', 2, '8.jpg', 1, '2014-11-09', 1, '2023-04-18 20:20:27', '2023-04-18 20:20:27', '00008', '南京');
INSERT INTO test.emp (id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time, work_no, work_address) VALUES (9, 'dingminjun', '123456', '丁敏君', 2, '9.jpg', 1, '2011-03-11', 1, '2023-04-18 20:20:27', '2023-04-18 20:20:27', '00009', '南京');
INSERT INTO test.emp (id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time, work_no, work_address) VALUES (10, 'zhaomin', '123456', '赵敏', 2, '10.jpg', 1, '2013-09-05', 1, '2023-04-18 20:20:27', '2023-04-18 20:20:27', '00010', '江苏');
INSERT INTO test.emp (id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time, work_no, work_address) VALUES (11, 'luzhangke', '123456', '鹿杖客', 1, '11.jpg', 5, '2007-02-01', 3, '2023-04-18 20:20:27', '2023-04-18 20:20:27', '00011', '南京');
INSERT INTO test.emp (id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time, work_no, work_address) VALUES (12, 'hebiweng', '123456', '鹤笔翁', 1, '12.jpg', 5, '2008-08-18', 3, '2023-04-18 20:20:27', '2023-04-18 20:20:27', '00012', '南京');
INSERT INTO test.emp (id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time, work_no, work_address) VALUES (13, 'fangdongbai', '123456', '方东白', 1, '13.jpg', 5, '2012-11-01', 3, '2023-04-18 20:20:27', '2023-04-18 20:20:27', '00013', '武汉');
INSERT INTO test.emp (id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time, work_no, work_address) VALUES (14, 'zhangsanfeng', '123456', '张三丰', 1, '14.jpg', 2, '2002-08-01', 2, '2023-04-18 20:20:27', '2023-04-18 20:20:27', '00014', '武汉');
INSERT INTO test.emp (id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time, work_no, work_address) VALUES (15, 'yulianzhou', '123456', '俞莲舟', 1, '15.jpg', 2, '2011-05-01', 2, '2023-04-18 20:20:27', '2023-04-18 20:20:27', '00015', '北京');
INSERT INTO test.emp (id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time, work_no, work_address) VALUES (16, 'songyuanqiao', '123456', '宋远桥', 1, '16.jpg', 2, '2007-01-01', 2, '2023-04-18 20:20:27', '2023-04-18 20:20:27', '00016', '南京');
INSERT INTO test.emp (id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time, work_no, work_address) VALUES (17, 'chenyouliang', '123456', '陈友谅', 1, '17.jpg', null, '2015-03-21', null, '2023-04-18 20:20:27', '2023-04-18 20:20:27', '00017', '武汉');

字符串函数

# 字符串函数演示
# concat:拼接字符串
select concat('hello','mysql');/*输出为:hellomysql*/
# lower:字母大写转小写
select lower('HELLO');/*输出为:hello*/
# upper:字母小写转大写
select upper('hello');/*输出为:HELLO*/
# lpad:左填充,使用第三个参数对第一个参数进行填充,使其达到第二个参数指定的长度
select lpad('01',5,'-');/*输出为:---01*/
# rpad:右填充
select rpad('01',5,'-');/*输出为:12---*/
# trim:去除字符串首尾的空格
select trim('  hello  mysql  ');/*输出为:hello  mysql*/
# substring:截取字符串,以下例子表示:从第一个字符开始截取,截取7个字符
select substring('hello mysql',1,7);/*输出为:hello m*/

# 练习:更新员工工号,长度设置为5位,不足5位前面补0
update emp set work_no = lpad(work_no,5,'0');

数值函数

# 数值函数演示
-- ceil:向上取整
select ceil(1.1);-- 输出为:2
# floor:向下取整
select floor(2.9);-- 输出为:2
# mod:取模
select mod(7,3);-- 7对3取模,输出为1
# rand:返回0-1之间随机数
select rand();
# round(x,y)对x四舍五入,保留y位小数
select round(3.135,2);-- 输出为3.14

# 练习:生成一个六位数随机验证码
select lpad(round(rand()*1000000,0),6,'0');

日期函数

# 日期函数演示
# curdate():返回当前日期
select curdate();
# curtime():返回当前时间
select curtime();
# now():返回当前日期时间
select now();
# year(date):获取指定date的年份
select year('2011-10-11');-- 2011
select year(now());
# month(date):获取指定date的月份
select month('2011-10-11');-- 10
# day(date):获取指定date的日期
select day('2011-10-11');-- 11
# date_add(date,interval expr type):返回一个日期/时间值加上一个时间间隔expr之后的时间值
select date_add(now(),interval 20 month );-- 从现在起往后推20个月的时间
# datediff(date1,date2):返回开始时间date1和结束时间date2之间的间隔天数
select datediff('2000-01-01','2000-01-05');-- 输出:-4,第一个时间减第二个时间

# 练习:查询所有员工的入职天数,并按入职天数倒序排序
select name,datediff(curdate(),entrydate) 入职天数
from emp
order by 入职天数 desc;

流程函数

# 流程函数
# if(value,t,f):如果value为true,返回t,否则返回f
select if(true,'ok','error');
select if(false,'ok','error');
# ifnull(value1,value2):如果value1不为空返回vlaue1,否则返回value2
select ifnull(null,'default');
select ifnull(1,'default');
# case [expr] when [val1] then [res1] ... else [default] end :如果expr的值等于val1,返回res1,否则返回默认值default
# 需求:查询员工姓名和工作地址(北京/上海-->一线城市,其他-->二线城市)
select name,case work_address when '北京' then '一线城市'
when '上海' then '一线城市'
else '二线城市' end city
from emp;
# case when [val1] then [res1] ... else [default] end:如果val1的值为true,返回res1,...否则返回默认值default
# 需求:2005年前入职的是元老,2010年之后入职的是新员工,此间入职的是老员工
select name,case when entrydate<'2005-01-01' then '元老'
    when entrydate>'2005-01-01' and entrydate<'2010-01-01' then '老员工'
else '新员工' end type
from emp;

事务

事务并发问题

  1. 脏读:

    A事务读取到B事务做了修改但尚未提交的数据

  2. 不可重复读:

    A事务第一次读取到的数据和第二次读取到的数据不一致,原因在于两次读取之间,B事务对该数据进行了修改且已提交

  3. 幻读:

    A事务查询发现id为2的数据不存在,于是进行插入操作,却发现id重复导致插入失败,原因在于B事务在A事务查询之后插入了id为2的数据且已提交(此时我们已经解决了不可重复读的问题,即A事务此时无法获取到B事务所做的修改),此时A事务再次查询id为2的数据依然会显示不存在

事务隔离等级

# 事务隔离级别:
# read uncommitted:无法解决脏读,不可重复读以及幻读问题
# read committed(oracle默认):可以解决脏读,无法解决不可重复读,幻读问题
# repeatable read(mysql默认):可以解决脏读,不可重复读问题,无法解决幻读问题
# serializable:可以解决脏读,不可重复读,幻读问题,数据安全性高,但同时性能也最低

# 查看事务隔离级别
select @@transaction_isolation;-- REPEATABLE-READ
# 设置事务隔离级别
set session transaction isolation level read uncommitted ;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值