MySQL基础梳理

使用命令行连接MySQL

net start mysql
net stop mysql

语句分类

DDL:数据定义语句【create 表,库……】
DML:数据操作语句【增删改】
DMQ:数据查询语句【select】
DCL:数据控制语句【管理数据库:如用户权限】

数据库的基本操作

#创建数据库
create database db01
#删除数据库
drop database db01
#创建utf8字符集的数据库
create database db02 character set utf8
#创建utf8字符集,带校对规则的数据库
#校对规则utf8_bin区分大小写,默认utf8_general_ci不区分大小写
create database db03 character set utf8 collate utf8_bin
#查看数据库
show database
#查看数据库定义信息
show create database db01
#备份数据库
#mysqldump -u 用户名 -p -B 数据库1 数据库n > 路径文件名.sql
mysqldump -u root -p-B db02 > d:\\
#恢复数据库
source d:\\bak.sql
#备份恢复数据库的表
#mysqldump -u 用户名 -p 数据库 表1 表n > 路径文件名.sql

表的基本操作

创建表

#创建表
create table table_name
(	field1 datatype
	filed2 datatype
	filed3 datatype
)character set 字符集 collate 校对规则 engine 存储引擎

数据类型(列类型)

常用数据类型

  • 数值类型:
    bit(M):位类型,M指定位数,默认值1,范围1-64
    tinyint:1个字节
    smallint:2个字节
    mediumint:3个字节
    int:4个字节
    bigint:8个字节
    float:占用空间4个字节
    double:比float精度更大,占8个字节
    decimal(M,D):M指定长度,D表示小数点的位数
  • 文本、二进制类型:
    char(size):固定长度字符串,最大255
    varchar(size):可变长度字符串,0~65535
    blob:二进制数据
    text:0~2^16
    longtext:0~2^32
  • 时间日期
    date:(YYYY-MM-DD)
    datetime:(YYYY-MM-DD HH:MM:SS)
    timestamp:时间戳,自动记录insert、update操作时间

数值型(整数)的基本使用

以tinyint为例:

#说明: 表的字符集,校验规则, 存储引擎,使用默认,默认是有符号
#1. 如果没有指定 unsinged , 则 TINYINT 就是有符号
#2. 如果指定 unsinged , 则 TINYINT
create table t3(
	id tinyint);
create table t4(
	id tinyint unsigned)

定义一个无符号的整数

create table t10 (id tinyint);//默认有符号
create table t11 (id tinyint unsigned);//无符号的

数值型(bit)的基本使用

#说明
#1. bit(m) m 在 1-64
#2. 添加数据 范围 按照你给的位数来确定,比如 m = 8,表示一个字节0~255
create table t05(num bit(8));
insert into t05 values(255);

数值型(小数)的基本使用

create table t06(
	num1 float,
	num2 double,
	num3 decimal(30,20));
#添加数据
insert into t06 values(88.12345678912345,88.12345678912345,88.12345678912345);
select * from t06;
#decimal 可以存放很大的数
create table t07 (
num decimal(65));
insert into t07 values(8999999933338388388383838838383009338388383838383838383);

字符串的基本使用

--固定长度字符串 最大 255 字符
-- VARCHAR(size) 0~65535 字节
-- 可变长度字符串 最大 65532 字节 【utf8 编码最大 21844 字符 1-3 个字节用于记录大小】
-- 如果表的编码是 utf8 varchar(size) size = (65535-3) / 3 = 21844
-- 如果表的编码是 gbk varchar(size) size = (65535-3) / 2 = 32766
create table t09(
	`name`char(255));
create table t10(
	`name` varchar(32766))charset gbk;

字符串的使用细节

#char(4) 和 varchar(4) 这个 4 表示的是字符,而不是字节, 不区分字符是汉字还是字母
create table t11(
	`name` char(4));
insert into t11 values('韩顺平好');
select * from t11;

create table t12(
	`name` varchar (4));
insert into t12 values('韩顺平好');
insert into t12 values('ab北京');
select * from t12;

#如果 varchar 不够用,可以考试使用 mediumtext 或者 longtext, #如果想简单点,可以使用直接使用 text
create table t13(
	content1 text,content2 mediumtext,content3 longtext);
insert into t13 values('han','han','hanhhhhh')
select * from t13

日期类型的基本使用

#创建一张表,date,datetime,timestamp
create table t14(
	birthday date,--生日
	job_time datetime,--年月日 时分秒
	login_time timestamp
		not null default current_timestamp
		on update current_timestamp);--登陆时间,如果希望login_time列自动更新
select * from t14;
insert into t14(birthday,job_time)
	values('2022-11-11','2022-11-11 11:11:11');
--更新t14的某条记录时,logic_time列会自动的以当前时间进行更新

创建表练习

create table emp(
	id int,
	`name` varchar(32),
	sex char(1),
	birthday date,
	entry_date datetime,
	job varchar(32),
	salary double,
	resume text)charset utf8 collate utf8_bin engine innodb;
--添加一条
insert into emp values(100,'小妖怪'', '', '2000-11-11','2010-11-10 11:11:11', '巡山的', 3000, '大王叫我来巡山');

修改表

-- 员工表 emp 的上增加一个 image 列,varchar 类型(要求在 resume 后面)。
alter table emp
	add image varchar(32) not null default''
	after resume
-- 修改 job 列,使其长度为 60。
alter table emp
	modify job varchar(60)not null default''
-- 删除 sex 列。
alter table emp
	drop sex
-- 表名改为 employee。
rename table emp to employee
-- 修改表的字符集为 utf8
alter table employee character set utf8
-- 列名 name 修改为 user_name
alter table employee
	change `name` `user_name` varchar(64)not full default ''
desc employee-- 显示表结构,可以查看表的所有列

数据库语句

  • 添加数据:insert
  • 更新数据:update
  • 删除数据:delete
  • 查找数据:select

insert 语句

--创建一张商品表 goods (id int , goods_name varchar(10), price double ); 
-- 添加 2 条记录
create table`goods`(
	id int
	goods_name varchar(10)
	price double not null default 100);
--添加数据
insert into `goods`(id,goods_name,price)
	values(10,'华为手机', 2000);
insert into `goods`(id,goods_name,price)
	values(20,'苹果手机', 3000);
select * from `goods`;

insert语句细节说明

#说明 insert 语句的细节
-- 1.插入的数据应与字段的数据类型相同。
-- 比如 把 'abc' 添加到 int 类型会错误
-- 2. 数据的长度应在列的规定范围内,例如:不能将一个长度为 80 的字符串加入到长度为 40 的列中。
-- 3. 在 values 中列出的数据位置必须与被加入的列的排列位置相对应
-- 4. 字符和日期型数据应包含在单引号中。
-- 5. 列可以插入空值[前提是该字段允许为空],insert into table value(null)
-- 6. insert into tab_name (列名..) values (),(),() 形式添加多条记录
insert into `goods`(id,goods_name,price)
	values(50, '三星手机', 2300),(60, '海尔手机', 1800);
-- 7. 如果是给表中的所有字段添加数据,可以不写前面的字段名称
-- 8. 默认值的使用,当不给某个字段值时,如果有默认值就会添加默认值,否则报错
-- 如果某个列 没有指定 not null ,那么当添加数据时,没有给定值,则会默认给 null -- 如果我们希望指定某个列的默认值,可以在创建表时指定

update 语句

-- 要求: 在上面创建的 employee 表中修改表中的纪录
-- 1. 将所有员工薪水修改为 5000 元。[如果没有带 where 条件,会修改所有的记录,因此要小心]
update employee set salary = 5000
-- 2. 将姓名为 小妖怪 的员工薪水修改为 3000 元。
update employee 
	set salary = 3000
	where user_name = '小妖怪';
-- 3. 将 老妖怪 的薪水在原有基础上增加 1000 元
INSERT INTO employee
	VALUES(200, '老妖怪', '1990-11-11', '2000-11-11 10:10:10', '捶背的', 5000, '给大王捶背', 'd:\\a.jpg')
UPDATE employee
	SET salary = salary + 1000
	WHERE user_name = '老妖怪';
-- 可以修改多个列的值
update employee
	set salary  = salary + 1000,job = '出主意的'
	where user_name = '老妖怪'

update语句细节说明

1.update 语法可以使用新值更新原有表行中的各列
2.set子句指示要修改哪些列和要给予哪些值
3.where子句指定应更新哪些行,如果没有where子句,则更新所有的行
4.如需修改多个字段,可以通过 set 字段1=值1,字段2=值2……

delete 语句

-- 删除表中名称为’老妖怪’的记录。
delete from employee
	where user_name ='老妖怪'; 
-- 删除表中所有记录
delete from employee;
-- Delete 语句不能删除某一列的值(可使用 update 设为 null 或者 '')
update employee set job = ''
	where user_name = '老妖怪';
-- 要删除这个表
drop table employee;

delete 语句细节说明

1.如果不使用where子句,将删除表中所有数据。
2.delete语句不能删除某一列的值(可使用 update 设为 null 或者 ‘’)
3.使用delete语句仅删除记录,不删除表本身。如果要删除表,使用drop table 表名语句

select 语句

1.select 指定查询哪些列的数据
2.column指定列名
3.*号代表查询所有列
4.from指定查询哪张表
5.distinct可选,显示结果时,是否去掉重复数据

-- select 语句【重点 难点】
create table student(
id int not null default 1, NAME varchar(20) not null default '', chinese float not null default 0.0, english float not null default 0.0, math float not null default 0.0
);
insert into student(id,NAME,chinese,english,math) values(1,'韩顺平',89,78,90);
insert into  student(id,NAME,chinese,english,math) values(2,'张飞',67,98,56);
insert into  student(id,NAME,chinese,english,math) values(3,'宋江',87,78,77);
insert into  student(id,NAME,chinese,english,math) values(4,'关羽',88,98,90);
insert into  student(id,NAME,chinese,english,math) values(5,'赵云',82,84,67);
insert into  student(id,NAME,chinese,english,math) values(6,'欧阳锋',55,85,45);
insert into  student(id,NAME,chinese,english,math) values(7,'黄蓉',75,65,30);
insert into  student(id,NAME,chinese,english,math) values(8,'韩信',45,65,99);

select * from student;
-- 查询表中所有学生的信息。
select * from student; 
-- 查询表中所有学生的姓名和对应的英语成绩。
select `name`,english from student;
-- 过滤表中重复数据 distinct 
select distinct english from student;
-- 要查询的记录,每个字段都相同,才会去重
select distinct `name`, english from student;

-- select 语句的使用
-- 统计每个学生的总分
select `name`, (chinese+english+math) from student; 
-- 在所有学生总分加 10 分的情况
select `name`, (chinese + english + math + 10) from student; 
-- 使用别名表示学生分数。
select `name` as '名字', (chinese + english + math + 10) as total_score
	from student

在where子句中经常使用的运算符

  • 比较运算符:
    < <= >= = !=
    between…and…:显示在某一区间的值
    in(set):显示在in列表中的值
    like’’ not like’':模糊查询
    is null:判断是否为空

  • 逻辑运算符
    and or not

--使用where子句,进行过滤查询
-- 查询姓名为赵云的学生成绩
select * from student
	where NAME = '赵云'-- 查询英语成绩大于 90 分的同学
select * from student
	where english > 90;
-- 查询总分大于 200的所有同学
select * from student
	where (chinese+math+english)>200;
-- 查询 math 大于 60 并且(and) id 大于 4 的学生成绩
select * from student
	where math>60 and id>4
-- 查询英语成绩大于语文成绩的同学
select * from student
	where english>chinese
-- 查询总分大于 200 分 并且 数学成绩小于语文成绩,的姓赵的学生. -- 赵% 表示 名字以赵开头的就可以
select * from student
	where (chinese+math+english)>200 and math<chinese and NAME like '赵%'
-- 查询英语分数在 80-90 之间的同学。
select * from student
	where english between 80 and 90;--between and是闭区间
-- 查询数学分数为 89,90,91 的同学。
select * from student
	where math=89 or math=90 or math=91;
select * from student
	where math in(89,90,91);

使用order by子句排序查询结果

1.order by指定排序的列,排序的列既可以是表中的列名,也可以是select 语句后指定的列名
2.asc 升序(默认),desc降序
3.order by子句应位于select语句的结尾

--演示 order by 使用
-- 对数学成绩排序后输出【升序】。
select * from student
	order by math;
-- 对总分按从高到低的顺序输出 [降序] -- 使用别名排序
select NAME,(chinese + english + math)
	as total_score from student
	order by total_score desc;
-- 对姓韩的学生成绩[总分]排序输出(升序) where + order by
SELECT NAME, (chinese + english + math) 
	AS total_score FROM student
	WHERE `name` LIKE '韩%' 
	ORDER BY total_score;

合计/统计函数

count函数

count返回行的总数

-- 演示 mysql 的统计函数的使用
-- 统计一个班级共有多少学生?
select count(*) from student;
-- 统计数学成绩大于 90 的学生有多少个?
select count(*) from student
	where math > 90
-- 统计总分大于 250 的人数有多少
select count(*) from student
	where (math+english+chinese) > 250
-- count(*) 和 count(列) 的区别
-- 解释 :count(*) 返回满足条件的记录的行数
-- count(列): 统计满足条件的某列有多少个,但是会排除 为 null 的情况
create table t15(
	NAME varchar(20));
insert into t15 values('tom');
insert into t15 values('jack');
insert into t15 values('mary');
insert into t15 values(NULL);
select * from t15;
select count(*)from t15;--4
select count(NAME)from t5;--3

sum函数

sum函数返回满足where条件的行的总和,一般使用在数值列

-- 统计一个班级数学总成绩?
select sum(math)from student;
-- 统计一个班级语文、英语、数学各科的总成绩
select sum(math) as math_total_score,sum(english),sum(chinese)from student;
-- 统计一个班级语文、英语、数学的成绩总和
select sum(math+english+chinese)from student
-- 统计一个班级语文成绩平均分
select sum(chinese)/count(*)from student;

avg 函数

avg函数返回满足where条件一列的平均值

-- 求一个班级数学平均分?
select avg(math) from student;
-- 求一个班级总分平均分
select avg(math + english + chinese) from student;

max/min 函数

max/min函数返回满足where条件的一列的最大/最小值

-- 求班级最高分和最低分(数值范围在统计中特别有用)
select max(math + english + chinese),min(math + english + chinese) from student;
-- 求出班级数学最高分和最低分
select max(math) as math_high_score,min(math) as math_low_socre from student; 

创建测试表

--部门表
create table dept(
	deptno mediumint unsigned not null default 0,
	dname varchar(20) not null default'',
	loc varchar(13)not null default'');
insert into dept values(10, 'ACCOUNTING', 'NEW YORK'),(20, 'RESEARCH', 'DALLAS'), (30, 'SALES', 'CHICAGO'),(40, 'OPERATIONS', 'BOSTON');
select * from dept;
--员工表
create table emp(
	empnno mediumint unsigned not null default 0,--编号
	ename varchar(20)not null default'',--名字
	job varchar(9)not null default'',--工资
	mgr mediumint unsigned,--上级编号
	hiredate date not null,--入职时间
	sal decimal(7,2) not null,--薪水
	comm decimal(7,2),--奖金
	deptno mediumint unsigned not null default 0--部门编号
	);
--添加测试数据
insert into emp values
	(7369, 'SMITH', 'CLERK', 7902, '1990-12-17', 800.00,NULL , 20), 
	(7499, 'ALLEN', 'SALESMAN', 7698, '1991-2-20', 1600.00, 300.00, 30), 
	(7521, 'WARD', 'SALESMAN', 7698, '1991-2-22', 1250.00, 500.00, 30), 
	(7566, 'JONES', 'MANAGER', 7839, '1991-4-2', 2975.00,NULL,20), 
	(7654, 'MARTIN', 'SALESMAN', 7698, '1991-9-28',1250.00,1400.00,30),
	(7698, 'BLAKE','MANAGER', 7839,'1991-5-1', 2850.00,NULL,30), 
	(7782, 'CLARK','MANAGER', 7839, '1991-6-9',2450.00,NULL,10), 
	(7788, 'SCOTT','ANALYST',7566, '1997-4-19',3000.00,NULL,20), 
	(7839, 'KING','PRESIDENT',NULL,'1991-11-17',5000.00,NULL,10), 
	(7844, 'TURNER', 'SALESMAN',7698, '1991-9-8', 1500.00, NULL,30), 
	(7900, 'JAMES','CLERK',7698, '1991-12-3',950.00,NULL,30), 
	(7902, 'FORD', 'ANALYST',7566,'1991-12-3',3000.00, NULL,20),(7934,'MILLER','CLERK',7782,'1992-1-23', 1300.00, NULL,10);
select * from emp
--工资级别
create table salgrade(
	grade mediumint unsigned not null default 0,--工资级别
	losal decimal(17,2) not null,--该级别的最低工资
	hisal decimal(17,2) not null);--该级别的最高工资

insert into salgrade values(1,700,1200);
insert into salgrade values(2,1201,1400);
insert into salgrade values(3,1401,2000);
insert into salgrade values(4,2001,3000);
insert into salgrade values(5,3001,9999);
select * from salgrade;
select * from dept;
select * from emp;

使用group by 子句对列进行分组–使用having 子句对分组后的结果进行过滤

1.group by 用于对查询的结果分组统计
2.having 子句用于限制分组显示结果

--按照部分来分组查询
select avg(sal),max(sal),deptno
	from emp group by deptno;
--使用数学方法,对小数点进行处理
select format(avg(sal),2),max(sal),deptno
	from emp group by deptno;
-- 显示每个部门的每种岗位的平均工资和最低工资
-- 1. 显示每个部门的平均工资和最低工资
-- 2. 显示每个部门的每种岗位的平均工资和最低工资
select avg(sal),min(sal),deptno,job
	from emp group by deptno,job;
-- ?显示平均工资低于 2000 的部门号和它的平均工资 // 别名
-- 老师分析 [写 sql 语句的思路是化繁为简,各个击破]
-- 1. 显示各个部门的平均工资和部门号
-- 2. 在 1 的结果基础上,进行过滤,保留 AVG(sal) < 2000
-- 3. 使用别名进行过滤
select avg(sal),deptno
	from emp group by deptno
		having avg(sal)<2000;
--使用别名
select avg(sal) as avg_sal,deptno 
	from emp group by deptno
		having avg_sal<2000;

字符串相关函数

在这里插入图片描述

-- 演示字符串相关函数的使用 , 使用 emp 表来演示
-- charset(str) 返回字串字符集
select charset(ename) from emp;
-- CONCAT (string2 [,... ]) 连接字串, 将多个列拼接成一列
select concat(ename, ' 工作是 ', job) from emp
-- instr (string ,substring ) 返回 substring 在 string 中出
-- dual 亚元表, 系统表 可以作为测试表使用
select instr('hanshunping', 'ping') from dual
-- ucase (string2 ) 转换成大写
select ucase(ename) from emp;
 -- lcase (string2 ) 转换成小写
select lcase(ename) from emp; 
-- LEFT (string2 ,length )从 string2 中的左边起取 length 个字符
-- RIGHT (string2 ,length ) 从 string2 中的右边起取 length 个字符
select left(ename, 2) from emp; 
-- LENGTH (string )string 长度[按照字节]
select length(ename) from emp; 
-- replace (str ,search_str ,replace_str )
-- 在 str 中用 replace_str 替换 search_str
-- 如果是 manager 就替换成 经理
select ename, replace(job,'MANAGER', '经理') from emp
-- strcmp (string1 ,string2 ) 逐字符比较两字串大小
select strcmp('hsp', 'hsp') from dual; 
-- substring (str , position [,length ])
-- 从 str 的 position 开始【从 1 开始计算】,取 length 个字符
-- 从 ename 列的第一个位置开始取出 2 个字符
select substring(ename, 1, 2) from emp; 
-- ltrim (string2 ) rtrim (string2 ) trim(string)去除前端空格或后端空格
select ltrim('   韩顺平教育') from dual;
select rtrim('韩顺平教育   ') from dual;
select trim('   韩顺平教育   ') from dual;

数学相关函数

在这里插入图片描述

--abs(sum) 绝对值
select abs(-10) from dual;
--bin(decimal_number)十进制转二进制
select bin(10)from dual;
--ceiling(number2)向上取整,得到比num2大的最小整数
select ceiling(-1.1)from dual;
--conv(number2,from_base,to_base)进制转换
--下面的含义是 8 是十进制的 8, 转成 2 进制输出
select conv(8,10,2) from dual;
--下面的含义是 8 是16进制的 8, 转成 10 进制输出
select conv(8,16,10) from dual;
--floor(number2) 向下取整,得到比num2小的最大整数
select floor(-1.1) from dual;
--format(number,decimal_places)保留小数位数,四舍五入
select format (78.125458,2) from dual;
--hex(DecimalNumber ) 转十六进制
--least(T (number , number2 [,..]) 求最小值
select least(0.1,-10,4) from dual;
--mod(numerator ,denominator) 求余
select mod(10,3)from dual;
--rand([seed]) 返回随机数,范围0<=v<=1.0
-- 1. 如果使用 rand() 每次返回不同的随机数 ,在 0 ≤ v ≤ 1.0
-- 2. 如果使用 rand(seed) 返回随机数, 范围 0 ≤ v ≤ 1.0, 如果 seed 不变,
-- 该随机数也不变了

时间日期函数

在这里插入图片描述

-- current_date ( ) 当前日期
select current_date() from dual; 
-- CURRENT_TIME ( )当前时间
select current_time() from dual; 
-- CURRENT_timestamp ( ) 当前时间戳
select current_timestamp() from dual; 
-- 创建测试表 信息表
select TABLE mes(
	id int ,
	content varchar(30),
	send_time datetime);
-- 添加一条记录
insert into mesvalues(1,'北京新闻',current_timestamp());
insert into mesvalues(2,'上海新闻',current_timestamp());
insert into mesvalues(3,'广州新闻',current_timestamp());

select *from mes;
select now() from dual;
-- 上应用实例
-- 显示所有新闻信息,发布日期只显示 日期,不用显示时间.
select id,content,date(send_time)
	from mes;
-- 请查询在 10 分钟内发布的新闻, 思路一定要梳理一下
select * from mes
	where date_add(send_time,interval 10 minute)>=now()
select * from mes
	where send_time>=data_sub(now(),interval 10 minute)
-- 请在 mysql 的 sql 语句中求出 2011-11-11 和 1990-1-1 相差多少
select datediff('2011-11-11','1990-01-01')from dual
-- 请用 mysql 的 sql 语句求出你活了多少天? [练习] 1986-11-11 出生
select datediff(now(),'1986-11-11') from dual
-- 如果你能活 80 岁,求出你还能活多少天.[练习] 1986-11-11 出
select datadiff (date_add('1986-11-11',interval 80 year),now())from dual

select timediff('10:11:11', '06:10:10') from dual;
--year|month|day|date(datetime)
select year(now()) from dual;
select month(now()) from dual;
select day(now()) from dual;
select year('2013-11-10'))from dual;
-- unix_timestamp() : 返回的是 1970-1-1 到现在的秒数
select unix_timestamp() from dual;
--from_unixtime():可以把一个unix_timestamp秒数(时间戳),转成指定格式的日期
-- %Y-%m-%d 格式是规定好的,表示年月日
-- 意义:在开发中,可以存放一个整数,然后表示时间,通过 FROM_UNIXTIME 转换
select from_unixtime(1618483484, '%Y-%m-%d')from dual;

加密和系统函数

--user() 查询用户
--可以查看登录到mysql的有哪些用户,以及登录的ip
select user() from dual;--用户@ip地址
--database()查询当前使用数据库名称
select database();
--md5(str)为字符串算出一个md5 32的字符串,常用(用户密码)加密
--root 密码是 hsp -> 加密 md5 -> 在数据库中存放的是加密后的密码
select md5('hsp') from dual;
select length(md5('hsp'))from dual;
-- 演示用户表,存放密码时,是 md5
create table hsp_user(
	id int,
	`name` varchar(32)not null default'',
	pwd char(32)not null default'');
insert into hsp_user
	values(100,'韩顺平', MD5('hsp');
select*from hsp_user;
select * from hsp_user
	where `name`=`韩顺平` and pwd = MD5('hsp')

-- password(str) -- 加密函数, MySQL 数据库的用户密码就是 password 函数
select password('hsp') from dual;
--数据库的 *81220D972A52D4C51BB1

流程控制函数

# if(expr1,expr2,expr3) 如果 expr1 为 True ,则返回 expr2 否则返回 expr3
select if(true,'北京', '上海') from dual;
# ifnull(expr1,expr2) 如果 expr1 不为空 null,则返回 expr1,否则返回 expr2
select ifnull(null,'韩顺平教育') from nual;
# select case when expr1 then expr2 when expr3 then expr4 else expr5 end; [类似多重分支.]
# 如果 expr1 为 TRUE,则返回 expr2,如果 expr2 为 true, 返回 expr4, 否则返回 expr5
select case
	when true then 'jack'
	when false then 'tom'
	else 'mary'end
-- 1. 查询 emp 表, 如果 comm 是 null , 则显示 0.0
-- 老师说明,判断是否为 null 要使用 is null, 判断不为空 使用 is not
select ename,if(comm is null,0.0,comm)
	from emp
select ename,ifnull(comm,0.0)
	from emp
-- 2. 如果 emp 表的 job 是 CLERK 则显示 职员, 如果是 MANAGER 则显示经理
-- 如果是 SALESMAN 则显示 销售人员,其它正常显示
select ename,(select case
	when job = 'clerk' then '职员'
	when job = 'manager'then '经理'
	when job = 'salesman' then '销售人员'
	else job end)as 'job'
	from emp;

mysql 表查询-加强

介绍

--对于之前建的三张表(emp,dept,salgrade)
--使用where子句
-- ?如何查找 1992.1.1 后入职的员工
-- 老师说明: 在 mysql 中,日期类型可以直接比较, 需要注意格式
select * from emp
	where hiredate>'1992-01-01'
-- ■ 如何使用 like 操作符(模糊)
-- %: 表示 0 到多个任意字符 _: 表示单个任意字符
-- ?如何显示首字符为 S 的员工姓名和工资
select ename,sal from emp
	where ename like 'S%'
-- ?如何显示第三个字符为大写 O 的所有员工的姓名和工资
select ename,sal from emp
	where ename like '__O%';
-- ■ 如何显示没有上级的雇员的情况
select * from emp
	where mgr is null;
-- ■ 查询表结构
desc emp

-- 使用 order by 子句
-- ?如何按照工资的从低到高的顺序[升序],显示雇员的信息
select * from emp
	order by sal
-- ?按照部门号升序asc而雇员的工资降序desc排列 , 显示雇员信息
select * from emp
	order by deptno asc,sal desc

分页查询

-- 按雇员的 id 号升序取出, 每页显示 3 条记录,请分别显示 第 1 页,第 2 
--第1页
select * from emp
	order by empno
	limit 0,3
--第2页
select * from emp
	order by empno
	limit 3,3
--第3页
select * from emp
	order by empno
	limit 6,3
-- 推导一个公式
select * from emp
	order by empno
	limit 每页显示记录数 * (第几页-1) , 每页显示记录数

分组函数

-- (1) 显示每种岗位的雇员总数、平均工资。
select count(*)avg(sal),job
	from emp
	group by job;
-- (2) 显示雇员总数,以及获得补助的雇员数。
-- 思路: 获得补助的雇员数 就是 comm 列为非 null, 就是 count(列),如果该列的值为 null, 是不会统计 , SQL 非常灵活,需要我们动脑筋.
select count(*),count(comm)
	from emp
-- 老师的扩展要求:统计没有获得补助的雇员数
select count(*),count(if(comm is null,1,null))
	from emp
select count(*),count(*)-count(comm)
	from emp
-- (3) 显示管理者的总人数。小技巧:尝试写->修改->尝试[正确的]
select count(distinct mgr)
	from emp;
-- (4) 显示雇员工资的最大差额。
select max(sal)-min(sal)
	from emp
-- 应用案例:请统计各个部门 group by 的平均工资 avg,
--并且是大于 1000 的 having,
--并且按照平均工资从高到低排序, order by
--取出前两行记录 limit 0, 2
select deptno,avg(sal) as avg_sal
		from emp
		group by deptno
		having avg_sal>1000
		order by avg_sal desc
		limit 0,2
--如果select语句顺序group by,having,order by,limit

MySQL多表查询

练习

-- ?显示雇员名,雇员工资及所在部门的名字
--分析:1. 雇员名,雇员工资 来自 emp 表
--2. 部门的名字 来自 dept 表
--3. 需求对 emp 和 dept 查询 ename,sal,dname,deptno
--4. 当我们需要指定显示某个表的列是,需要 表.列
select ename,sal,dname,emp,deptno
	from emp,dept
	where emp.deptno = dept.deptno
-- 老韩小技巧:多表查询的条件不能少于 表的个数-1, 否则会出现笛卡尔集
-- ?如何显示部门号为 10 的部门名、员工名和工资
select ename,sal,dname,emp,deptno
	from emp,dept
	where emp.deptno = dept.deptno and emp.deptno = 10
-- ?显示各个员工的姓名,工资,及其工资的级别
-- 思路 姓名,工资 来自 emp 13
-- 工资级别 salgrade 5
-- 写 sql , 先写一个简单,然后加入过滤条件... 
select ename, sal, grade
	from emp , salgrade
	where sal between losal and hisal;

自连接

自连接是指在同一张表的连接查询【将同一张表看作两张表】

-- 思考题: 显示公司员工名字和他的上级的名字
-- 老韩分析: 员工名字在 emp, 上级的名字在emp
-- 员工和上级是通过 emp 表的 mgr 列关联
-- 这里老师小结:
-- 自连接的特点 1. 把同一张表当做两张表使用
-- 2. 需要给表取别名 表名 表别名
-- 3. 列名不明确,可以指定列的别名 列名 as 列
select worker.ename as '职员名',boss.ename as'上级名'
	from emp worker,emp boss
	where worker.mgr=boss.empno;

mysql表子查询

子查询是指嵌入在其它 sql 语句中的 select 语句,也叫嵌套查询

子查询

-- 请思考:如何显示与 SMITH 同一部门的所有员工?
--1. 先查询到 SMITH 的部门号得到
--2. 把上面的 select 语句当做一个子查询来使用
select deptno
	from emp
	where ename = 'SMITH'
select * from emp
	where deptno = (
		select deptno
		from emp
		where ename = 'SMITH')
-- 课堂练习:如何查询和部门 10 的工作相同的雇员的
-- 名字、岗位、工资、部门号, 但是不含 10 号部门自己的雇员.
select * from emp
	where job = (
		select job
		from emp
		where deptno = 10)
	and deptno <>10

子查询当做临时表使用

在多行子查询中使用all操作符

-- 请思考:显示工资比部门 30 的所有员工的工资高的员工的姓名、工资和部门号
select ename,sal,deptno
	from emp
	where sal>all(
		select sal
			from emp
				where deotno=30)
select ename,sal,deptno
	from emp
	where sal>(
		select max(sal)
			from emp
			where deptno = 30)
-- 请思考:如何显示工资比部门 30 的其中一个员工的工资高的员工的姓名、工资和部门号
select ename,sal,deptno
	from emp
	where sal>any(
		select sal
			from emp
				where deotno=30)
select ename,sal,deptno
	from emp
	where sal>(
		select min(sal)
			from emp
			where deptno = 30)
-- 查询 ecshop 中各个类别中,价格最高的商品
-- 查询 商品表
-- 先得到 各个类别中,价格最高的商品 max + group by cat_id, 当做临时表
-- 把子查询当做一张临时表可以解决很多很多复杂的查询
select cat_id,max(shop_price)
	from ecs_goods
	group by cat_id
select goods_id,ecs_goods.cat_id,goods_name,shop_price
	from (select cat_id,max(shop_price)
			from ecs_goods
			group by cat_id)
	temp,ecs_goods
	where temp.cat_id=ecs_goods.cat_id
	and temp.max_price = ecs_goods.shop_price

多列子查询

-- 请思考如何查询与 allen 的部门和岗位完全相同的所有雇员(并且不含 allen 本人)
-- (字段 1, 字段 2 ...) = (select 字段 1,字段 2 from 。。。。)
-- 分析: 1. 得到 allen 的部门和岗位
select deptno,job
	from emp
	where ename = 'allen'
-- 分析: 2 把上面的查询当做子查询来使用,并且使用多列子查询的语法进行匹配
select * from emp
	where (deptno,job)=(
		select deptno,job
		from emp
		where ename = 'allen')
	and ename != 'allen'
-- 请查询 和宋江数学,英语,语文
-- 成绩 完全相同的学生
select * from student
	where (math,english,chinese)=(
		select math,english,chinese
			from student
			where`name`='宋江')

在from子句中使用子查询

-- 请思考:查找每个部门工资高于本部门平均工资的人的资料
-- 这里要用到数据查询的小技巧,把一个子查询当作一个临时表使用
-- 1. 先得到每个部门的 部门号和 对应的平均工资

-- 2. 把上面的结果当做子查询, 和 emp 进行多表查询
select ename,sal,temp.avg_sal,emp.deptno
	from emp,(
		select deptno,avg(sal)as avg_sal
		from emp 
		group by deptno
	)temp
	where emp.deptno = temp.deptno and emp.sal>temp.avga_sal
-- 查找每个部门工资最高的人的详细资料
select ename, sal, temp.max_sal, emp.deptno
	from emp(
		select deptno,max(sal) as max_sal
		from emp
		group by deptno)temp
	where emp.deptno = temp.deptno and emp.sal = temp.max_sal
- 查询每个部门的信息(包括:部门名,编号,地址)和人员数量,我们一起完成。
-- 1. 部门名,编号,地址 来自 dept 表
-- 2. 各个部门的人员数量 -》 构建一个临时表
select dname,dept.deptno,loc,tem.per_num as '人数'
	from dept,(
		select count(*)as per_num,deptno
		from emp
		group by deptno)tmp
	where tmp.deptno=dept.deptno
-- 还有一种写法 表.* 表示将该表所有列都显示出来, 可以简化 sql 语句
-- 在多表查询中,当多个表的列不重复时,才可以直接写列名
select tmp.*,dname,loc
	from dept,(
		select count(*)as per_num,deptno)
		from emp
		group by deptno)tmp
	where tmp.deptno=dept.deptno

表复制

-- 为了对某个 sql 语句进行效率测试,我们需要海量数据时,可以使用此法为表创建海量数据
create table my_tab01
	(id int,
	`name` varchar(32),
	sal double,
	job varchar(32),
	deptno int);
	desc my_tab01
	select* from my_tab01
-- 演示如何自我复制
-- 1. 先把 emp 表的记录复制到 my_tab01
insert into my_tab01
	(id,`name`,sal,job,deptno)
	select empno,ename,sal,job,deptno from emp;
-- 2. 自我复制
insert into my_tab01
	select * from my_tab01;
select count(*)from my_tab01;
-- 如何删除掉一张表重复记录
-- 1. 先创建一张表 my_tab02, -- 2. 让 my_tab02
-- 2. 让 my_tab02 有重复的记录
create table my_tab02 like emp; -- 这个语句 把 emp 表的结构(列),复制到 my_tab02
insert into my_tab02
	select * from emp;
-- 3. 考虑去重 my_tab02 的记录
--(1) 先创建一张临时表 my_tmp , 该表的结构和 my_tab02 一样
create table my_tmp like my_tab02
--(2) 把 my_tmp 的记录 通过 distinct 关键字 处理后 把记录复制到 my_tmp
insert into my_tmp
	select distinct*from my_tab02;
--(3) 清除掉 my_tab02 记录
delete from my_tab02
--(4) 把 my_tmp 表的记录复制到 my_tab02
insert into my_tab02
	select* from my_tmp;
--(5) drop 掉 临时表 my_tmp
drop table my_tmp;
select * from my_tab02

合并查询

1.union all
取得两个结果集的并集,使用该操作符时,不会取消重复行。
2.union
与union all相似,但是会自动去掉结果集中重复行

-- 合并查询
select enanme,sal,job from emp where sal>2500
select ename,sal,job from emp where job = 'MANAGER'
-- union all 就是将两个查询结果合并,不会去重
select ename,sal,job from emp where sal>2500
union all
select ename,sal,job from emp where job = 'MANAGER'
-- union 就是将两个查询结果合并,会去重
select ename,sal,job from emp where sal>2500
union
select ename,sal,job from emp where job = 'MANAGER'

mysql表外连接

在这里插入图片描述

--外连接
-- 比如:列出部门名称和这些部门的员工名称和工作,
-- 同时要求 显示出那些没有员工的部门。
-- 使用我们学习过的多表查询的 SQL, 看看效果如何
select dname,ename,job
	from emp,dept
	where emp.deptno = dept.deptno
	order by dname
--创建stu
/*
id name
1 Jack
2 Tom
3 Kity
4 nono
*/
create table stu(
	id int
	`name` varchar(32));
insert into stu values(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono');
select*from stu;
-- 创建 exam
/*
id grade
1 56
2 76
11 
*/
create table exam(
	id int,
	grade int);
insert into exam values(1,56),(2,76),(11,8);
select * from exam;
-- 使用左连接
-- (显示所有人的成绩,如果没有成绩,也要显示该人的姓名和 id
select `name`,stu.id,grade
	from stu,exam
	where stu.id = exam.id
-- 改成左外连接
select `name`,stu.id,grade
	from stu left join exam
	on stu.id = exam.id	
-- 使用右外连接(显示所有成绩,如果没有名字匹配,显示空)
-- 即:右边的表(exam) 和左表没有匹配的记录,也会把右表的记录显示出来
select `name`,stu.id,grade
	from stu right join exam
	on stu,id = exam.id;
-- 列出部门名称和这些部门的员工信息(名字和工作),
-- 同时列出那些没有员工的部门名。
-- 使用左外连接实现
select dname,ename,job
	from dept left join emp
	on dept.deptno = emp.deptno
-- 使用右外连接实现
select dname,ename,job
	from emp right join dept
	on dept.deptno = emp.deptno

mysql约束

约束用于确保数据库的数据满足特定的商业规则,在mysql中,约束包括:not null,unique,primary key,foreign key,check

  • 主键
-- 主键使用
-- id name email
create table t17
	(id int primary key, -- 表示 id 列是主键
	`name`varchar(32),
	email varchar(32));
-- 主键列的值是不可以重复
insert into t17
	values(1,'jack','jack@sohu.com');
insert into t17
	values(2,'tom','tom@sohu.com');
-- 主键使用的细节讨论
-- primary key 不能重复而且不能为 null
insert into t17
	values(null,'hsp', 'hsp@sohu.com');
-- 一张表最多只能有一个主键, 但可以是复合主键(比如 id+name)
create table t18
	(id int,
	`name` varchar(32),
	email varchar(32),
	primary key(id,`name`))--复合主键
-- 主键的指定方式 有两种
-- 1. 直接在字段名后指定:字段名 primakry key
-- 2. 在表定义最后写 primary key(列名);
-- 使用 desc 表名,可以看到 primary key 的情况
desc t18
  • not null 非空
    如果在列上定义了not null,那么当插入数据时,必须为列提供数据
    字段名 字段类型 not null
  • unique 唯一
    –当定义了唯一的约束之后,该列值是不能重复的
    –字段名 字段类型 unique
    –如果没有指定not null,则unique字段可以有多个null,一张表可以有多个unique字段
    – 如果一个列(字段), 是 unique not null 使用效果类似 primary key
-- unique的使用
create table t21
	(id int unique,
	`name`varchar(32),
	email varchar(32));
insert into t21
	values(1, 'jack', 'jack@sohu.com');
insert into t21
	values(1,'tom', 'tom@sohu.com');
  • foreign key 外键
    –细节说明
    –用于定义主表和从表直接的关系,
    –外键的约束要定义在从表上,主表则必须具有主键约束或是unique约束,
    –当定义外键约束后,要求外键列数据必须在主表的主键列存在或者是为null(前提是外键字段允许为null)
    –表的类型是innodb,这样的表才支持外键
    –一旦建立主外键的关系,数据不能随意删除了
    在这里插入图片描述
-- 创建 主表 my_class
create table my_class(
	id int primary key,--班级编号
	`name`varchar(32)not null default'');
-- 创建 从表 my_stu
create table my_stu(
	id int primary key,--学生编号
	`name`varchar(32)not null default'',
	class_id int,--学生所在班级的编号
	--下面指定外键关系
	foreign key(class_id)references my_class(id))
--测试数据
insert into my_class
	values(100,'java'),(200,'web');
insert into my_class
	values(300,'php');
select * from my_class;
insert into my_stu
	values(1,'tom',100);
insert into my_stu
	values(2,'jack',200);	
insert into my_stu
	values(3,'hsp',300);
insert into my_stu
	values(4,'hsp',400);-- 这里会失败...因为 400
insert into my_stu
	values(5,'king',null); -- 可以, 外键 没有写 not null
  • check
    在这里插入图片描述
create table t23(
	id int primary key,
	`name` varchar(32),
	sex varchar(6)check (sex in('man','woman')),
	sal double check(sal>1000 and sal <2000))

在这里插入图片描述

-- 商品 goods
create table goods(
	goods_id int primary key,
	good_name varchar(64)not null default'',
	unitprice decimal(10,2)not null default 0,
		check(unitprice>=1.0 and unitprice<=9999.99),
	category int not null default 0,
	provider varchar(64) not null default'');
-- 客户 customer(客户号 customer_id,姓名 name,住址 address,电邮 email 性别 sex,-- 身份证 card_Id
create table customer(
	customer_id char(8) primary key, -- 程序员自己决定
	`name`varchar(64)not null default'', 
	address varchar(64)not null default'', 
	email varchar(64)unique not null, 
	sex enum('男','女') not null, -- 这里老师使用的枚举类型, 是生效
	card_Id char(18));
-- 购买 purchase(购买订单号 order_id,客户号 customer_id,商品号 goods_id, -- 购买数量 nums);
create table purchase(
order_id int unsigned primary key, customer_id char(8) not null default'', -- 外键约束在后
goods_id int not null default 0 , -- 外键约束在后
nums int not null default 0, foreign key (customer_id) references customer(customer_id), foreign key (goods_id) references

自增长

在这里插入图片描述

-- 演示自增长的使用
-- 创建表
create table t24
	(id int primary key auto_increment, 
	email varchar(32)not null default'', 
	`name` varchar(32)not null default'');
desc t24
-- 测试自增长的使用
insert into t24
	values(null, 'tom@qq.com', 'tom')
insert into t24
	(email, `name`) values('hsp@sohu.com', 'hsp');
-- 修改默认的自增长开始值
alter table t25 auto_increment = 100
create table t25
	(id int primary key auto_increment, 
	email varchar(32)not null default'', 
	`name` varchar(32)not null default'');
insert into t25
values(NULL, 'mary@qq.com', 'mary');
insert into t25
values(666, 'hsp@qq.com', 'hsp');
select * from t25;

mysql 索引

---- 创建测试数据库 tmp
create database tmp;
create table dept(
	deptno mediumint unsigned not null default 0,
	dname varchar(20) not null default'',
	loc varchar(13)not null default'');
#创建表 EMP 雇员
create table emp
(empno mediumint unsigned not null default 0, /*编号*/
ename varchar(20)not null default"", /*名字*/
job varchar(9)not null default"",/*工作*/
mgr mediumint unsigned not null default 0,/*上级编号*/
hiredate date not null,/*入职时间*/
sal decimal(7,2)not null,/*薪水*/
comm decimal(7,2)not null,/*红利*/
deptno mediumint unsigned not null default 0 /*部门编号*/
) ;
#工资级别表
create table salgrade
(
grade mediumint unsigned not null default 0, losal decimal(17,2)not null, hisal decimal(17,2)not null
);
#测试数据
insert into salgrade values (1,700,1200);
insert into salgrade values (2,1201,1400);
insert into salgrade values (3,1401,2000);
insert into salgrade values (4,2001,3000);
insert into salgrade values (5,3001,9999);

DELIMITER $$

#创建一个函数,名字 rand_string,可以随机返回我指定的个数字符串
create function rand_string(n int)
returns varchar (255) #该函数会返回一个字符串
begin
#定义了一个变量 chars_str, 类型 varchar(100)
#默认给 chars_str 初始值 'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ'
declare chars_str varchar(100)default 'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ'
declare return_str varchar(255)default'';
declare i int default 0;
while i<n do
	set return_str=concat(return_str,substring(chars_str,floor(1+rand()*52),1));
	set i = i+1;
	end while;
return return_str;
end $$

#这里我们又自定了一个函数,返回一个随机的部门号
create function rand_num()
returns int(5)
begin
declare i int default 0;
set i =floor(10+rand()*500);
return i;
end $$

#创建一个存储过程, 可以添加雇员
create procedure insert_emp(in start int(10),in max_num int(10))
begin
declare i int default 0;
#set autocommit =0 把 autocommit 设置成 0
#autocommit = 0 含义: 不要自动提交
set autocommit = 0; #默认不提交 sql
repeat
set i=i+1
#通过前面写的函数随机产生字符串和部门编号,然后加入到 emp 表
insert into emp values((start+1),rand_string(6),'salesman',0001,curdate(),2000,400,rand_num());
until i =max_num
end repeat;
,400,rand_num());
UNTIL i = max_num
END REPEAT;
#commit 整体提交所有 sql 语句,提高效率
commit;
end $$

#添加 8000000 数据
call insert_emp(100001,8000000)$$
#命令结束符,再重新设置为;
delimiter;
select count(*)from emp;
-- 在没有创建索引时,我们的查询一条记录
select * from emp
	where empno = 1234567
-- 使用索引来优化一下, 体验索引的牛
-- 在没有创建索引前 , emp.ibd 文件大小 是 524m
-- 创建索引后 emp.ibd 文件大小 是 655m [索引本身也会占用空间.]
-- 创建 ename 列索引,emp.ibd 文件大小 是 827m
-- empno_index 索引名称
-- ON emp (empno) : 表示在 emp 表的 empno 列创建索引
create index empno_index on emp (empno)
-- 创建索引后, 查询的速度如何
select * from emp
	where empno = 1234567
	-- 0.003s 原来是 4.5s
-- 创建索引后,只对创建了索引的列有效
select * from emp
	where ename ='pjdlwy'
	-- 没有在 ename 创建索引时,时间4.7s
--创建索引
create index ename_index on emp (ename)
  • 索引的原理
    在这里插入图片描述
  • 索引的类型
    在这里插入图片描述
  • 索引使用
    在这里插入图片描述
create table t25(
	id int,
	`name`varchar(32));
-- 查询表是否有索引
show indexes from t25; -- 添加索引
-- 添加唯一索引
create unique index id_index on t25 (id); 
-- 添加普通索引方式 1
create index id_index on t25 (id); 
-- 如何选择
-- 1. 如果某列的值,是不会重复的,则优先考虑使用 unique 索引, 否则使用普通索引
-- 添加普通索引方式 2
alter table t25 add index id_index (id)
-- 添加主键索引
create table t26 (
id int , `name` varchar(32));
alter table t26 add primary key (id)
show index from t25
-- 删除索引
drop index id_index on t25
-- 删除主键索引
alter table t26 drop primary key
-- 修改索引 , 先删除,在添加新的索引
-- 查询索引
-- 1. 方式
show index from t25
-- 2. 方式
show indexes from t25
-- 3. 方式
show keys from t25
-- 4 方式
desc t25
  • 什么情况更适合使用索引
    在这里插入图片描述

mysql 事务

在这里插入图片描述

  • 事务和锁在这里插入图片描述
-- 事务的一个重要的概念和具体操作
-- 看一个图[看示意图]
-- 演示
-- 1. 创建一张测试表
create table t27
( id int, `name` varchar(32)); 
-- 2. 开始事务
start transaction
-- 3. 设置保存点
savepoint a
-- 执行 dml 操作
insert into t27 values(100, 'tom');
select * from t27;
savepoint b
-- 执行 dml 操作
insert into t27 values(200,'jack');
-- 回退到 b
rollback to b
-- 继续回退 a
rollback to a
-- 如果这样, 表示直接回退到事务开始的状态. rollback
commit
  • 回退事务
    在这里插入图片描述
  • 提交事务
    在这里插入图片描述
  • 事务细节讨论
    在这里插入图片描述
-- 1. 如果不开始事务,默认情况下,dml 操作是自动提交的,不能回滚
insert into t27 values(300, 'milan'); -- 自动提交 commit
select* from t27
-- 2. 如果开始一个事务,你没有创建保存点. 你可以执行 rollback,
-- 默认就是回退到你事务开始的状态
start transaction
insert into t27 values(400, 'king');
insert into t27 values(500, 'scott');
rollback -- 表示直接回退到事务开始的的状态
commit; -- 3. 你也可以在这个事务中(还没有提交时), 创建多个保存点.比如: savepoint aaa; -- 执行 dml , savepoint bbb
-- 4. 你可以在事务没有提交前,选择回退到哪个保存点
-- 5. InnoDB 存储引擎支持事务 , MyISAM 不支持
-- 6. 开始一个事务 start transaction, set autocommit=off

事务隔离级别

在这里插入图片描述

  • 查看事务隔离级别
    在这里插入图片描述
  • 事务隔离级别
    在这里插入图片描述
  • 事务隔离级别-案例
    在这里插入图片描述
  • 设置事务隔离级别
    在这里插入图片描述
-- 1. 开了两个 mysql 的控制台
-- 2. 查看当前 mysql 的隔离级别
SELECT @@tx_isolation; -- mysql> SELECT @@tx_isolation; -- +-----------------+
-- | @@tx_isolation | -- +-----------------+
-- | REPEATABLE-READ | -- +-----------------+
-- 3.把其中一个控制台的隔离级别设置 Read uncommitted
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
-- 4. 创建表
CREATE TABLE `account`(
id INT, `name` VARCHAR(32), money INT);
-- 查看当前会话隔离级别
SELECT @@tx_isolation
-- 查看系统当前隔离级别
SELECT @@global.tx_isolation
-- 设置当前会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
-- 设置系统当前隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL [你设置的级别]

mysql事务ACID

在这里插入图片描述

mysql 表类型和存储引擎

  • 基本介绍
    在这里插入图片描述
  • 主要存储引擎/表类型特点
    在这里插入图片描述
  • 细节说明
    在这里插入图片描述
  • 使用案例
-- 表类型和存储引擎
-- 查看所有的存储引擎
show engines
-- innodb 存储引擎,是前面使用过. -- 1. 支持事务 2. 支持外键 3. 支持行级锁
-- myisam 存储引擎
create table t28 (
id int,
`name` varchar(32)) engine myisam
-- 1. 添加速度快 2. 不支持外键和事务 3. 支持表级锁
start transaction
savepoint t
insert into t28 values(1,'jack');
select * from t28;
rollback to t1
-- memory 存储引擎
-- 1. 数据存储在内存中[关闭了 Mysql 服务,数据丢失, 但是表结构还在]
-- 2. 执行速度很快(没有 IO 读写) 3. 默认支持索引(hash 表)
create table t29(
	id int,`name`varchar(32))
	engine memory
desc t29
insert into t29
	values(1,'tom'),(2,'jack'),(3,'hsp');
select * from t29
-- 指令修改存储引擎
alter table t29 engine = innod
  • 如何选择表的存储引擎
    在这里插入图片描述
  • 修改存储引擎
    alter table表名engine = 存储引擎

视图

  • 基本概念
    在这里插入图片描述
    在这里插入图片描述
  • 视图的基本使用
    在这里插入图片描述
-- 视图的使用
-- 创建一个视图emp_view01,只能查询emp 表的(empno、ename, job 和deptno ) 信息
-- 创建视图
create view emp_view01 as
	select empno, ename, job, deptno from emp;
-- 查看视图
desc emp_view01
select * from emp_view01;
select empno, job from emp_view01;
-- 查看创建视图的指令
show create view emp_view01
-- 删除视图
drop view emp_view01;
-- 视图的细节
-- 1. 创建视图后,到数据库去看,对应视图只有一个视图结构文件(形式: 视图名.frm)
-- 2. 视图的数据变化会影响到基表,基表的数据变化也会影响到视图[insert update delete ]
-- 修改视图会影响到基表
update emp_view01
	set job = 'MANAGER'
	where empno = 7369
select * from emp; -- 查询基表
select * from emp_view01
-- 修改基本表, 会影响到视图
update emp
	set job = 'SALESMAN'
where empno = 7369
-- 3. 视图中可以再使用视图, 比如从emp_view01 视图中,选出empno,和ename 做出新视图
desc emp_view01
create view emp_view02 as
	select empno, ename 
	from emp_view01
select * from emp_view02
  • 细节
    在这里插入图片描述
  • 实践
    在这里插入图片描述

mysql管理

在这里插入图片描述
在这里插入图片描述
权限
在这里插入图片描述
给用户授权
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值