本篇选自本人前段时间对MySQL的皮毛学习,在这里进行一个简单的汇总,希望能对读者有或多或少的帮助,若有什么不懂的知识盲区,可在评论区交流讨论。
insert into employee(id, workno, name, gender, age, idcard, entrydate) values (1,'1','Itcase','男',10,'012345678998765432','2022-9-19');
select * from employee;
insert into employee values(2,'2','张无忌','男',18,'012345678901234567','2022-9-19');
#insert into 表名 values (值1,值2...),(值1,值2...),(值1,值2...);
insert into employee values(3,'3','韦一笑','男',28,'012345678901234567','2022-9-19'),(4,'4','张三丰','男',38,'012345678901234567','2022-9-19');
update 表名 set 字段1=值1,字段2=值2,… [where 条件];
update employee set name = 'itheima' where id=1;
update employee set name='小昭',gender='女' where id=1;
update employee set entrydate='2008-01-01';
delete from 表名 [where 条件]
delete from employee where gender='女';
delete from employee;
drop table employee;
数据准备
create table emp(id int comment '编号',workno varchar(10) comment '工号',name varchar(10) comment '姓名',gender char(1) comment '性别',age tinyint unsigned comment '年龄',idcard char(18) comment '身份证号',workaddress varchar(50) comment '工作地点',entrydate date comment '入职时间'
) comment '员工表';
插入数据
insert into emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
values (1,'1','柳岩','女',20,'123654879654123658','北京','2000-01-01'),(2,'2','张无忌','男',18,'123654879654123611','北京','2005-09-01'),(3,'3','韦一笑','男',38,'123654879654123650','上海','2005-08-01'),(4,'4','赵敏','女',18,'123654879654123658','北京','2009-12-01'),(5,'5','小昭','女',16,'123654879654120008','上海','2007-07-01'),(6,'6','杨逍','男',28,'123654879654120058','北京','2006-01-01'),(7,'7','范瑶','男',40,'123654879650023658','北京','2005-05-01'),(8,'8','黛绮丝','女',38,'123654870054123658','天津','2015-05-01'),(9,'9','范凉凉','女',45,'123654879654123658','北京','2010-04-01'),(10,'10','陈友谅','男',53,'123054879654123658','上海','2011-01-01'),(11,'11','张士诚','男',55,'103654879654123658','江苏','2015-05-01'),(12,'12','常遇春','男',32,'120654879654123658','北京','2004-02-01'),(13,'13','张三丰','男',88,'123654879654123658','江苏','2020-11-01'),(14,'14','灭绝','女',65,'123650000654123658','西安','2019-05-01'),(15,'15','胡青牛','男',70,'123654879654120000','西安','2018-04-01'),(16,'16','周芷若','女',18,null,'北京','2012-06-01');
select 字段列表 from 表名列表
select * from 表名;
select 字段1 [as 别名1],字段2 [as 别名2]... from 表名;
select distinct 字段列表 from 表名;
select name,workno,age from emp;
select id,workno, name, gender, age, idcard, workaddress, entrydate from emp;
select * from emp;
select workaddress as '工作地址' from emp;
select workaddress '工作地址' from emp; #as可省略
select distinct workaddress '工作地址' from emp;
select 字段列表 from 表名 where 条件列表;
select * from emp where age=88;
select id,workno, name, gender, age, idcard, workaddress, entrydate from emp where age=88;
select * from emp where age<20;
select * from emp where age<=20;
select * from emp where idcard is null;
select * from emp where idcard is not null;
select * from emp where age!=88;
select * from emp where age<>88;
select * from emp where age>=15 && age <=20;
select * from emp where age>=15 and age <=20;
select * from emp where age between 15 and 20;
select * from emp where gender='女' and age<25;
select * from emp where age=18 || age =20 || age=40;
select * from emp where age=18 or age =20 or age=40;
select * from emp where age in(18,20,40);
select * from emp where name like '__';
select * from emp where idcard like '%0';
select * from emp where idcard like '_________________0';
select 聚合函数(字段列表) from 表名;
select count(*) from emp;
select avg(age) from emp;
select max(age) from emp;
select min(age) from emp;
select sum(age) from emp where workaddress='西安';
select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];
select gender,count(*) from emp group by gender;
select gender,avg(age) from emp group by gender;
select workaddress, count(*) from emp where age<45 group by workaddress having count(*)>=3;
select 字段列表 from 表名 order by 字段1 排序方式1,字段2 排序方式2;
select * from emp order by age asc;
select * from emp order by age; #默认会升序
select * from emp order by age desc; #降序
select * from emp order by entrydate desc;
select * from emp order by age asc,entrydate desc;
select 字段列表 from 表名 limit 起始索引,查询记录数;
select * from emp limit 0,10;
select * from emp limit 10; #可以省略起始索引0
select * from emp limit 10,10;
DQL 语句执行顺序: from->where->group by->select->order by->limit
select * from emp where age in(20,21,22,23) and gender='女';
select * from emp where gender='男'and age>20 and age<=40 and name like '___';
select gender, count(*) from emp where age<60 group by gender;
select name,age from emp where age<=35 order by age asc,entrydate desc ;
select * from emp where gender='男' and age<=40 and age>=20 order by age asc ,entrydate desc limit 3;
查询用户
user mysql;
select * from user;
直接选中左框中的mysql,找到user表,双击即可查看用户
创建用户
create user '用户名'@'主机名' identified by '密码';
修改用户密码
alter user '用户名'@'主机名' identified with mysql_native_password by '新密码';
删除用户
drop user '用户名'@'主机名';
create user 'itcase'@'localhost' identified by '123456';
create user ' heima' @'%' identified by '123456';
alter user ' heima'@'%' identified with mysql_native_password by '1234';
drop user 'itcase'@'localhost';
show grants for '用户名'@'主机名';
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
remove 权限列表 on 数据库名.表名 from '用户名'@'主机名';
约束名称 描述 关键字
非空约束 保证列中所有数据不能有null值 NOT NULL
唯一约束 保证列中所有数据各不相同 UNIQUE
主键约束 主键是一行数据的唯一标识,要求非空且唯一 PRIMARY KEY
检查约束 保证列中的值满足某一条件 CHECK
默认约束 保存数据时,未指定值则采用默认值 DEFAULT
外键约束 外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性 FOREIGN KEY
create table emp1 (id int primary key auto_increment , -- 员工id,主键且自增长ename varchar(50) not null unique , -- 员工姓名,非空并且唯一joindate date not null , -- 入职日期,非空salary double(7,2) not null , -- 工资,非空bonus double(7,2) default 0 -- 奖金,如果没有奖金默认为0
);
– 例:建完表后添加约束 alter table 表名 modify 字段名 数据类型 not null;
– 删除约束: alter table 表名 modify 字段名 数据类型;
show databases ;
use itcase;
show tables ;
select * from emp1;
drop table dept;
insert into emp1(id, ename, joindate, salary, bonus) values (1,'张三','1999-11-11',8800,5000);
(1) 创建表时添加外键约束
CREATE TABLE表名(列名 数据类型,...[CONSTRAINT] [外键名称] FOREIGN KEY(外键列名)REFERENCES 主表(主表列名)
);
(2) 建完表后添加外键约束
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名称)REFERENCES 主表名称(主表列名称);
例:alter table emp add constraint fk_emp_dept foreign key(dep_id) references dept(id);
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
例:alter table emp drop foreign key fk_emp_dept;
-- 部门表
create table dept (id int primary key auto_increment , -- 部门id,主键且自增长dep_name varchar(20) , -- 部门名addr varchar(20) -- 部门地址
);
-- 员工表
create table emp (id int primary key auto_increment , -- 员工id,主键且自增长name varchar(20) , -- 员工姓名age int,dep_id int, -- 所属部门id-- 添加外键 dep_id,关联dept表的id主键constraint fk_emp_dept foreign key(dep_id) references dept(id)
);
-- 添加俩个部门
insert into dept(dep_name, addr) values ('研发部','广州'),('销售部','深圳');-- 添加员工 dep_id 表示员工所在的部门
insert into emp(name,age,dep_id) values ('张三',20,1),('李四',20,1),('王五',20,1),('赵六',20,2),('孙七',20,2),('周八',20,2);
select * from emp;
select emp.id,emp.name,emp.age,dept.dep_name from emp,dept where emp.dep_id=dept.id;
select t1.id,t1.name,t1.age,t2.dep_name from emp t1,dept t2 where t1.dep_id=t2.id;
select * from emp inner join dept on emp.dep_id=dept.id;
select * from emp join dept on emp.dep_id=dept.id; #inner可省略
左外连接:相当于查询A表所有数据和交集部分数据
select * from emp left join dept on emp.dep_id=dept.id;
右外连接:相当于查询B表所有数据和交集部分数据
select * from emp right join dept on emp.dep_id=dept.id;
(1) 查询‘财务部’所有的员工信息 emp是员工表 dept是部门表
select id from dept where dname='财务部'; 获取财务部的部门id号
select * from emp where dep_id=(select id from dept where dname='财务部');
(2) 查询‘财务部’和‘市场部’所有的员工信息 emp是员工表 dept是部门表
select id from dept where dname='财务部' or dname='市场部'; 获取财务部和市场部的部门id号
select * from emp where dep_i in (select id from dept where dname='财务部' or dname='市场部');
(3) 查询入职日期是’2011-11-11’之后的员工信息和部门信息
select * from emp where join_data>'2011-11-11'; 获取入职日期是'2011-11-11’之后的员工信息
select * from (select * from emp where join_data>'2011-11-11') t1,dept where t1.dep_id=dept.id;
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)
);
select * from account;
-- 添加数据
insert into account(name,money) values('张三',1000),('李四',1000);update account set money=1000; #设置 张三李四 余额变为1000
(1)开启事务
begin ;
(2)查询李四的余额
select money from account where name='李四';
(3)李四金额 -500
update account set money=money-500 where name='李四';
(4)张三金额 +500
update account set money=money+500 where name='张三';
commit ;
rollback ;
事务四大特征:
原子性(Atomicity):事务是不可分割的最小操作单位,要么同时成功,要么同时失败
一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态
隔离性(lsolation) :多个事务之间,操作的可见性
持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
select @@autocommit;
#1为自动 0为手动 mysql数据库默认为自动set @@autocommit=0;
# 0 为手动方式 即需要手动调用 commit;并发事务问题:
事务隔离级别:
脏读 不可重复读 幻读
read uncommitted 有 有 有
read committed 0 1 1
repeatable read 0 0 1
serializable 0 0 0
select @@transaction_isolation;
set [session | global] transaction isolation level {read uncommitted | read committed | repeatable read | serializable }
set session transaction isolation level read uncommitted ;
set session transaction isolation level repeatable read ;
show create table account;
show engines ;
create table my_myisam(id int,name varchar(10)
)engine =MyISAM;
select concat('hello','MySQL');
select lower('Hello');
select upper('Hello');
select lpad('01',5,'hadia'); # 将字符串’hadia‘给字符串’01‘ 左边填充至5个字符
select rpad('01',5,'hadia');
select trim(' hello to me ');
select substring('hello mysql',1,5); #截取字符串的 第一个位置开始的5个字符
(1)案例:由于业务需求变更,企业员工的工号统一为5位数,目前不足5位数的全部在前面补0,如1号员工的工号应该为00001
update user set name=lpad(name,5,'0'); # 因为id为int型需要string型,所以这里用name代替
select ceil(1.1);
select floor(1.9);
select mod(3,4);
select rand();
select round(2.345,2);
(2)案例:通过数据库的函数,生成一个六位数的随机验证码
select lpad(round(rand()*1000000,0),6,'0');
select curdate();
select curtime();
select now();
select year(now());
select month(now());
select day(now());
select date_add(now(),interval 70 day ); #从现在日期往后推70天 interval是固定值,70是变值,day是可变的时间单位 month、year
select datediff('2022-10-1','2022-9-26');
(3)案例:查询所有员工的入职天数,并根据入职天数倒序排序
select name,datediff(curdate(),entrydate) as 'days' from emp order by days desc; # entrydate为员工表中的入职天数(这里没创建)
select if(true,'ok','error');
select if(false,1,0);
select ifnull('ok','default');
select ifnull(' ','default');
select ifnull(null,0);
(1)需求:查询emp表的员工姓名和工作地址(北京/上海—> 一线城市,其他----> 二线城市)
select name,(case workaddress when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end) as '工作地址' from emp; # workaddress为表中的工作地址,emp为表名
(1)案例:统计班级各个学员的成绩,展示的规则如下: >=85,展示优秀 >=60,展示及格 否则展示不及格
create table score(
id int comment 'ID', # comment后面加注释
name varchar(20) comment '姓名',
math int comment '数学',
english int comment '英语',
chinese int comment '语文'
) comment '学员成绩表';
insert into score(id,name, math,english,chinese) values (1,'Tom',67,88,95 ),(2,'Rose',23,66,90),(3,'Jack',56,98,76);select id,name,(case when math>=85 then '优秀' when math>=60 then '及格' else '不及格' end) as '数学',(case when english>=85 then '优秀' when english>=60 then '及格' else '不及格' end) as '英语',(case when chinese>=85 then '优秀' when chinese>=60 then '及格' else '不及格' end) as '语文'from score;