启动mysql的方法是cmd中输入
mysql -u用户名 -p密码
操作数据库:
操作表格:
--查询所有数据
SELECT*FROM
student;
--给指定列添加数据
INSERT into student(id,name) values(1,"张三");
--给所有列添加数据
INSERT into student(id,name,gender,birthday,score,email,tel,status) VALUES (2,'李四','男','1991-11-11',99.99,'[email protected]','13888888888','1');
--可以不写student,表示全选数据,但是后期开发建议写数据
INSERT into student VALUES (2,'李四','男','1991-11-11',99.99,'[email protected]','13888888888','1');
INSERT into student(id,name,gender,birthday,score,email,tel,status) VALUES (2,'李四','男','1991-11-11',99.99,'[email protected]','13888888888','1');
INSERT into student(id,name,gender,birthday,score,email,tel,status) VALUES (2,'李四','男','1991-11-11',99.99,'[email protected]','13888888888','1');
INSERT into student(id,name,gender,birthday,score,email,tel,status) VALUES (2,'李5','男','1991-11-11',99.99,'[email protected]','13888888888','1');
--修改数据UPDATE表名SET
update student set gender='女' where name ='李四';
update student set birthday='1991-12-12',score=99.01,where name='李四';
--注意:如果没有where,将修改全部值
update student set gender='男';
--删除
delete from student where name='张三';
--delete from student 表示删除所有的数据
CREATE TABLE dql(
id int,
name VARCHAR(20),
age INT,
sex VARCHAR(5),
address varchar(100),
math double(5,2),
english double(5,2),
hire_date DATE
);
INSERT INTO dql(id,name,age,sex,address,math,english,hire_date)
VALUES
(1,'马芸',55,'男','杭州',66,78,'1995-09-01'),
(2,'马花藤',45,'女','深圳',98,87,'1998-09-01'),
(3,'马斯克',55,'男','香港',56,77,'1999-09-02'),
(4,'柳白',20,'女','湖南',76,65,'1997-09-05'),
(5,'柳青',20,'男','湖南',86,NULL,'1998-09-01'),
(6,'刘德华',57,'男','香港',99,99,'1998-09-01'),
(7,'张学右',22,'女','香港',99,99,'1995-09-01'),
(8,'德玛西亚',18,'男','南京',56,65,'1994-09-02');
--查询地址信息
SELECT address from dql;
--去除重复记录
SELECT DISTINCT address from dql;
--查询姓名,数学成绩,英语成绩,并且用as重命名
SELECT name,math as 数学成绩, english as 英语成绩 from dql;
--查询年龄大于等于20岁的成员
SELECT * from dql where age >=20;
--查询年龄大于等于20岁 并且 年龄 小于等于30岁的学员
SELECT * from dql where age >= 20&&age <= 30;
SELECT * from dql where age>=20 and <=30;
SELECT * from dql where age BETWEEN 20 and 30;
--查询入学日期在1998,9,1 到 1999,9,1
SELECT * from dql where hire_date BETWEEN '1998-09-01' and '1999-09-01';
--查询年龄等于18岁的学员
select * from dql where age=18;
--查询年龄不等于18岁的学员
select * from dql where age != 18;
SELECT * from dql where age<> 18;
--查询年龄等于18或20或22
select * from dql where age =18 or age =20 or age=22;
select * from dql where age in(18,20,22);
--查询英语成绩为null的信息 用 is和is not
SELECT * from dql where english is null;
--模糊查询like
/*
通配符:
1_:表示单个任意字符
2%:表示任意个数字符
*/
--查询姓“马”的学员
select * from dql where name like '马%';
--查询第二个字是“花”的学员
select * from dql where name like '_花%';
--查询名字中包含“德”的学员
select * from dql where name like '%德%';
--排名查询 asc 升序排列(默认) desc 降序排列
--查询学生信息,年龄升序排列
select * from dql order by age;
--查询学生信息,数学成绩降序排列
select * from dql order by math desc;
--查询学生信息,按照数学成绩降序排列,数学成绩一样的 英语成绩升序排列
SELECT * from dql order by math desc, english asc;
--查询表的数据问题(sum,avg等等) 聚合函数
--where>聚合函数>having
--统计班级一共多少学生
select * from dql;
select count(id) from dql;--count统计的列名不能为null
select count(*) from dql;
--查询数学成绩最高分
select max(math) from dql;
--查询数学成绩最低分
select min(math) from dql;
--查询数学成绩的总分
select sum(math) from dql;
--查询数学成绩的平均分
select avg(math) from dql;
--查询英语成绩的最低分(null不参与计算)
select min(english) from dql;
--分组 注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义
--查询男同学和女同学各自的数学平均分,以及各自人数
select sex, avg(math),count(*) from dql group by sex;
--查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70的不参与分组
select sex, avg(math),count(*) from dql where math >70 group by sex;
--查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70的人不参与分组,分组之后人数大于2
select sex, avg(math), count(*) from dql where math>70 group by sex having count(*)>2;
--实现分页功能
--从0开始查询,查询3条数据
select * from dql LIMIT 0,3;
--每页显示3条数据,查询第一页数据
select * from dql limit 0,3;
--每页显示3条数据,查询第二页数据
select * from dql limit 3,3;
--每页显示3条数据,查询第三页数据
select * from dql limit 6,3;
--起始索引=(当前页面-1)*每页显示的条数
--员工表
-- 改动创建表的语句时,需要重新创建表格
create table emp0(
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
);
insert into emp0(id,ename,joindate,salary,bonus) values(1,'张三','1999-11-11',8800,5000);
-- 演示主键约束:非空且唯一
insert into emp0(id,ename,joindate,salary,bonus) values (null,'张三','1999-11-11',8800,5000);
insert into emp0(id,ename,joindate,salary,bonus) values (1,'张三','1999-11-11',8800,5000);
insert into emp0(id,eNAME,joindate,salary,bonus) values(2,'李成功','1999-11-11',8800,5000);
-- 演示非空约束
insert into emp0(id,eNAME,joindate,salary,bonus) values(3,null,'1999-11-11',8800,5000);
-- 演示唯一约束
insert into emp0(id,eNAME,joindate,salary,bonus) values(3,'李成功','1999-11-11',8800,5000);
-- 演示默认约束
insert into emp0(id,eNAME,joindate,salary) values(3,'王五','1999-11-11',8800);
insert into emp0(id,eNAME,joindate,salary,bonus) values(4,'赵六','1999-11-11',8800,null);
-- 演示自动增长: auto_increment: 当列是数字类型并且 唯一约束
insert into emp0(eNAME,joindate,salary,bonus) values('赵六','1999-11-11',8800, null);
insert into emp0(id,eNAME,joindate,salary,bonus) values(null,'赵六2','1999-11-11',8800, null);
insert into emp0(id,eNAME,joindate,salary,bonus) values(null,'赵六3','1999-11-11',8800, null);
可以在表 对象栏目逆向到模型 查看外键约束
-- 部门表
create table dept(
id int PRIMARY key auto_increment,
dep_name varchar(20),
addr varchar(20)
);
-- 员工表
create table emp(
id int primary key auto_increment,
name varchar(20),
age int,
dep_id int,
-- 添加外键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);
-- 点击对象,逆向到模型可以查看键
-- 删除外键
alter table emp drop FOREIGN key fk_emp_dept;
-- 建完表后,添加外键
alter table emp add CONSTRAINT fk_emp_dept FOREIGN key(dep_id) REFERENCES dept(id);
/*
多对多
* 如: 订单和商品
*一个商品对应多个订单,一个订单包含多个商品
实现方式:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
*/
-- 订单表
create table tb_order(
id int primary key auto_increment,
payment double(10,2),
payment_type TINYINT,
status TINYINT
);
-- 商品表
create table tb_goods(
id int primary key auto_increment,
title varchar(100),
price double(10,2)
);
-- 订单商品中间表
create table tb_order_goods(
id int primary key auto_increment,
order_id int,
goods_id int,
count INT
);
-- 建完表后,添加外键
alter table tb_order_goods add CONSTRAINT fk_order_id FOREIGN key (order_id) REFERENCES tb_order(id);
alter table tb_order_goods add CONSTRAINT fk_goods_id FOREIGN key(goods_id) REFERENCES tb_goods(id);
-- 创建部门表
create table dept1(
did int primary key auto_increment,
dname VARCHAR(20)
);
-- 创建员工表
create table emp1(
id int primary key auto_increment,
name varchar(10),
gender char(1),
salary double,
join_date date,
dep_id int,
foreign key (dep_id) REFERENCES dept1(did) -- 外键,关联部门表
);
-- 添加部门数据
insert into dept1 (dNAME) values ('研发部'),('市场部'),('财务部'),('销售部');
-- 添加员工数据
insert into emp1(name,gender,salary,join_date,dep_id) VALUES
('孙悟空','男',7200,'2013-02-24',1),
('猪八戒','男',3600,'2010-12-02',2),
('唐僧','男',9000,'2008-08-08',2),
('白骨精','女',5000,'2015-10-07',3),
('蜘蛛精','女',4500,'2011-03-14',1),
('小白龙','男',2500,'2011-02-14',null);
-- 笛卡尔积:有A,B两个集合 取A,B所有的组合情况
-- 消除无效数据
-- 隐式内连接
select * from emp1,dept1 where emp1.dep_id=dept1.did;
-- 查询emp1的name,gender,dept表的dname
select emp1.name,emp1.gender,dept1.dname from emp1,dept1 where emp1.dep_id=dept1.did;
-- 显式内连接
select * from emp1 inner join dept1 on emp1.dep_id = dept1.did;
-- inner可以省略
select * from emp1 join dept1 on emp1.dep_id = dept1.did;
-- 左外连接
-- 查询emp1表所有数据和对应的部门信息
select * from emp1 left join dept1 on emp1.dep_id=dept1.did;
-- 右外连接
-- 查询dept所有数据和对应的员工信息
select * from emp1 right join dept1 on emp1.dep_id=dept1.did;
select * from dept1 left join emp1 on emp1.dep_id=dept.did;
-- 查询工资高于猪八戒的员工信息
-- 单行单列 作为条件值,使用=!><等进行条件判断
select * from emp1;
-- 1.查询猪八戒的工资
select salary from emp1 where name='猪八戒';
-- 2.查询工资高于猪八戒的员工信息
select * from emp1 where salary>3600;
select * from emp1 where salary>(select salary from emp1 where name='猪八戒');
-- 查询财务部和市场部所有的员工信息
-- 查询财务部所有的员工信息
-- 多行单列 作为条件值,使用in等关键字进行条件判断
select did from dept1 where dname='财务部' or dname='市场部';
select * from emp1 where dep_id in(select did from dept1 where dname='财务部' or dname='市场部');
-- 查询入职日期是2011-11-11之后的员工信息和部门信息
-- 多行多列:作为虚拟表
-- 查询入职日期是2011-11-11之后的员工信息
select * from emp1 where join_date >'2011-11-11';
select * from (select * from emp1 where join_date >'2011-11-11') t1,dept1 t2 where t1.dep_id=t2.did;
多表查询综合案例:
部门,员工,职位,薪资等级四张表之间的查询
-- 部门表
create table dept2(
id int primary key, -- 部门id
dname varchar(50), -- 部门名称
loc varchar(50) -- 部门所在地
);
-- 职务表,职务名称,职务描述
create table job2(
id int primary key,
jname varchar(20),
description varchar(50)
);
-- 员工表
create table emp2(
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 emp2_jobid_ref_job_id_fk FOREIGN key (job_id) REFERENCES job2 (id),
CONSTRAINT emp2_deptid_ref_dept_id_fk FOREIGN key(dept_id) REFERENCES dept2 (id)
);
-- 工资等级表
create table salarygrade2(
grade int primary key, -- 级别
losalary int,-- 最低工资
hisalary int-- 最高工资
);
-- 添加4个部门
insert into dept2(id,dname,loc) VALUES
(10,'教研部','北京'),
(20,'学工部','上海'),
(30,'销售部','广州'),
(40,'财务部','深圳');
-- 添加4个职务
insert into job2(id,jname,description) VALUES
(1,'董事长','管理整个公司,接单'),
(2,'经理','管理部门员工'),
(3,'销售员','向客人推销产品'),
(4,'文员','使用办公文件');
-- 添加员工
insert into emp2(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 salarygrade2(grade,losalary,hisalary) VALUES
(1,7000,12000),
(2,12010,14000),
(3,14010,20000),
(4,20010,30000),
(5,30010,99990);
-- 查询所有员工信息 员工编号,员工姓名,工资,职务名称,职务描述
/*
分析:
1.员工编号,员工姓名,工资 信息都在emp员工表中
2.职务名称,职务描述 信息在job表中
3.job职务表 和 emp员工表 是 一对多的关系 emp.job_id=job.id
*/
-- 隐式内连接
select emp2.id,emp2.ename,emp2.salary, job2.jname, job2.description from emp2,job2 where emp2.job_id=job2.id;
-- 显式内连接
select emp2.id,emp2.ename,emp2.salary, job2.jname, job2.description from emp2 inner join job2 on emp2.job_id=job2.id;
-- 查询员工编号,员工姓名,工资,职务名称,职务描述,部门名称,部门位置
/*
分析
1.员工编号,员工姓名,工资 信息在emp 员工表中
2.职务名称,职务描述 信息在job职务表中
3.job职务表 和emp员工表 是 一对多的关系emp.job_id=job.id
4.部门名称,部门位置 来自于 部门表 dept
5.dept和emp一对多关系 dept.id=emp.dept_id
*/
-- 隐式内连接
select emp2.id,emp2.ename,emp2.salary, job2.jname, job2.description, dept2.dname, dept2.loc from emp2,job2,dept2 where emp2.job_id=job2.id and dept2.id=emp2.dept_id;
-- 显式内连接
select emp2.id,emp2.ename,emp2.salary, job2.jname, job2.description, dept2.dname, dept2.loc from emp2
inner join job2 on emp2.job_id=job2.id
inner join dept2 on dept2.id=emp2.dept_id;
-- 查询员工姓名,工资,工资等级
/*
分析
1.员工姓名,工资 信息在emp员工表中
2.工资等级 信息在salarygrade 工资等级表中
3. emp.salary>=salarygrade.losalary and emp.salary<=salarygrade.hisalary
*/
select emp2.ename,emp2.salary,t2.* from emp2,salarygrade2 t2 where emp2.salary>=t2.losalary and emp2.salary<=t2.hisalary;
-- 查询员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级
/*
分析
1.员工编号,员工姓名,工资 信息在emp 员工表中
2.职务名称,职务描述 信息在job职务表中
3.job职务表 和emp员工表 是 一对多的关系emp.job_id=job.id
4.部门名称,部门位置 来自于 部门表 dept
5.dept和emp一对多关系 dept.id=emp.dept_id
6.工资等级 信息在salarygrade 工资等级表中
7. emp.salary>=salarygrade.losalary and emp.salary<=salarygrade.hisalary
*/
select emp2.id,emp2.ename,emp2.salary, job2.jname, job2.description, dept2.dname, dept2.loc,t2.grade from emp2
inner join job2 on emp2.job_id=job2.id
inner join dept2 on dept2.id=emp2.dept_id
inner join salarygrade2 t2 on emp2.salary between t2.losalary and t2.hisalary;
-- 查询出部门编号,部门名称,部门位置,部门人数
/*
分析
1.部门编号,部门名称,部门位置 来自于部门dept表
2.部门人数:在emp表中 按照dept_id进行分组,然后count(*)来统计数量
*/
select dept2.id, dept2.dname,dept2.loc,t1.count from dept2,(select dept_id,count(*) count from emp2 group by dept_id) t1 where dept2.id=t1.dept_id;
a事件和b事件要么同时成功,要么同时失败
比如a向b借500,a-500的同时b+500,有一个不能正常运行,该事务应该回滚
-- 创建账户表
create table account(
id int primary key auto_increment,
name varchar(10),
money double(10,2)
);
update account set money=1000;
select * from account;
-- 添加数据
insert into account(name,money) values('张三',1000),('李四',1000),('王五',1000);
-- 开启事务
begin;
-- 李四-500
update account set money=money-500 where name = '李四';
-- 张三+500
update account set money=money+500 where name = '张三';
-- 提交事务
commit;
-- 回滚事务
rollback;