Bootstrap

Mysql安装及常用命令

1、下载安装

下载连接:https://downloads.mysql.com/archives/community/
解压后配置环境变量

1.1、初始化Mysql

mysqld --initialize-insecure

1.2、注册Mysql服务

mysqld -install

1.3、启动Mysql服务

net start mysqld

1.4、修改root密码

mysqladmin -u root password 1234//1234为设置的密码

1.5、登录Mysql

mysql -uroot -p1234

2、数据库及表操作

# 操作数据库
-- 显示所有数据库
show databases;
-- 创建数据库
create database db1;
-- 删除数据库
drop database db1;
-- 使用数据库
use db2;
-- 查询当前正在使用的数据库
select database();

# 表操作
-- 查询当前数据库下所有表
show tables;
-- 创建表
create table if not exists tb1(
	id int,
	username varchar(30),
	password varchar(30)
);
-- 查询表结构
desc tb2;
-- 删除表
drop table tb1;
-- 修改表
	-- 修改表名
	alter table tb1 rename to tb2;
	-- 添加一列
	alter table tb2 add nicename varchar(30);
	-- 修改数据类型
	alter table tb2 modify username char(10);
	-- 修改列名和数据类型
	alter table tb2 change username  uname varchar(30) not null;
	-- 删除列
	alter table tb2 drop nicename;

3、数据操作

# 数据操作
-- 给全部列添加数据
insert into tb2(id,uname,password) value(1,"user1","123456");
-- 批量添加数据
insert into tb2(id,uname,password) values(2,"user2","123456"),
(3,"user3","123456"),(4,"user4","123456");
-- 修改数据
update tb2 set uname = 'user11' where uname = 'user1';
-- 删除数据
delete from tb2 where id = 1;

4、数据查询

4.1、添加数据

-- 删除stu表
drop table if exists stu;

-- 创建stu表
CREATE TABLE stu (
 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 stu(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,'1998-09-01'),
(8,'德玛西亚',18,'男','南京',56,65,'1994-09-02');

4.2、基础查询

-- 查询多个字段
select * from stu;
-- 去除重复记录
select distinct sex from stu;
-- 起别名
select id,name as 姓名,age as 年龄,sex 性别,address 地址 from stu;
-- 查询姓名、数学成绩、英语成绩。并通过as给math和english起别名(as关键字可以省略)
select name,math 数学,english 英语 from stu;

4.3、条件查询

-- 查询年龄大于20岁的学员信息
select * from stu where age > 20;
-- 查询年龄大于等于20岁的学员信息
select * from stu where age >= 20;
-- 查询年龄大于等于20岁 并且 年龄 小于等于 30岁 的学员信息 两种方式
select * from stu where age >= 20 and age <= 30;
select * from stu where age between 20 and 30;
-- 查询入学日期在'1998-09-01' 到 '1999-09-01'  之间的学员信息
select * from stu where hire_date between '1998-09-01' and '1999-09-01';
-- 查询年龄等于18岁的学员信息
select * from stu where age = 18;
-- 查询年龄不等于18岁的学员信
select * from stu where age != 18;
-- 查询年龄等于18岁 或者 年龄等于20岁 或者 年龄等于22岁的学员信息
select * from stu where age in (18,20,22);
-- 查询英语成绩为 null的学员信息
select * from stu where english is null;

4.4、模糊查询和排序

-- 查询姓'马'的学员信息
select * from stu where name like '马%';
-- 查询第二个字是'花'的学员信息
select * from stu where name like '_花%';
-- 查询名字中包含 '德' 的学员信息
select * from stu where name like '%德%';
-- 查询学生信息,按照年龄升序排列
select * from stu order by age asc;
-- 查询学生信息,按照数学成绩降序排列
select * from stu order by math desc;
-- 查询学生信息,按照数学成绩降序排列,如果数学成绩一样,再按照英语成绩升序排列
select * from stu order by math desc,english asc;

4.5、聚合查询

-- 统计班级一共有多少个学生
select count(*) from stu;
-- 查询数学成绩的最高分
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;

4.6、分组查询

-- 查询男同学和女同学各自的数学平均分
select sex,avg(math) from stu group by sex;
-- 查询男同学和女同学各自的数学平均分,以及各自人数
select sex,avg(math),count(*) from stu group by sex;
-- 查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组
select sex,avg(math),count(*) from stu where math >= 70 group by sex;
-- 查询男同学和女同学各自的数学平均分,以及各自人数
-- 要求:分数低于70分的不参与分组,分组之后人数大于2个的
select sex,avg(math),count(*) num from stu where math >= 70 group by sex having num > 2;

4.7、分页查询

-- 从0开始查询,查询3条数据
select * from stu limit 0,3;
-- 每页显示3条数据,查询第1页数据
select * from stu limit 0,3;
-- 每页显示3条数据,查询第2页数据
select * from stu limit 3,3;
-- 每页显示3条数据,查询第3页数据
select * from stu limit 6,3;

5、多表查询案例

5.1、数据准备

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, -- 部门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,
  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);

5.2、查询练习

-- 查询所有员工信息。查询员工编号,员工姓名,工资,职务名称,职务描述
select
	emp.id 员工编号,
	emp.ename 员工姓名,
	emp.salary 工资,
	job.jname 职务名称,
	job.description 职务描述
from emp
join job
on emp.job_id = job.id;

-- 查询员工编号,员工姓名,工资,职务名称,职务描述,部门名称,部门位置
select
	emp.id 员工编号,
	emp.ename 员工姓名,
	emp.salary 工资,
	job.jname 职务名称,
	job.description 职务描述,
	dept.dname 部门名称,
	dept.loc 部门位置
from emp
join job
on emp.job_id = job.id
join dept
on emp.dept_id = dept.did;


-- 查询员工姓名,工资,工资等级
select
	emp.ename 员工姓名,
	emp.salary 工资,
	salarygrade.grade 工资等级
from emp
join salarygrade
on emp.salary >= salarygrade.losalary
and emp.salary <= salarygrade.hisalary;

-- 查询员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级
select
	emp.id 员工编号,
	emp.ename 员工姓名,
	emp.salary 工资,
	job.jname 职务名称,
	job.description 职务描述,
	dept.dname 部门名称,
	dept.loc 部门位置,
	salarygrade.grade 工资等级
from emp
join job
on emp.job_id = job.id
join dept
on emp.dept_id = dept.did
join salarygrade
on emp.salary >= salarygrade.losalary
and emp.salary <= salarygrade.hisalary;

-- 查询出部门编号、部门名称、部门位置、部门人数
select
dept.did 部门编号,
dept.dname 部门名称,
dept.loc 部门位置,
t2.num 部门人数
from dept
left join (select dept_id,count(*) num from emp group by dept_id) t2
on dept.did = t2.dept_id;
;