MySQL

配置mysql

https://www.acwing.com/file_system/file/content/whole/index/content/6237942/

mysql服务的关闭与启动(默认开机自动启动,如果想手动操作,可以参考如下命令)

  • 关闭:net stop mysql80
  • 启动:net start mysql80

mysql的常用操作

  • 连接用户名为root,密码为520jpc…的数据库服务:mysql -uroot -p520jpc…
  • show databases;:列出所有数据库
  • create database kob;:创建数据库
  • drop database kob;:删除数据库
  • use kob;:使用数据库kob
  • show tables;:列出当前数据库的所有表
  • create table user(id int, username varchar(100)):创建名称为user的表,表中包含id和username两个属性。
  • drop table user;:删除表
  • insert into user values(1, ‘yxc’);:在表中插入数据
  • select * from user;:查询表中所有数据
  • delete from user where id = 2;:删除某行数据

DDL

创建

1
2
3
4
5
create database [name]; 	#创建数据库
create table user(
id int,
username varchar(100)
); #创建名称为user的表,表中包含id和username两个属性。

查询

1
2
3
show databases;				#列出所有数据库
show tables; #列出当前数据库的所有表
desc [tablename]; #查询表的结构信息

修改

1
2
3
4
5
alter table [name] rename to [newname];						#修改表名
alter table [name] add [列名] [数据类型]; #添加一列
alter table [name] modify [列名] [新数据类型]; #修改数据类型
alter table [name] change [列名] [新列名] [新数据类型]; #修改列名和数据类型
alter table [name] drop [列名]; #删除列

删除

1
2
3
drop database kob;			#删除数据库
drop table [name]; #删除表
drop table if exists [name] #如果存在就删除表

DML

添加

1
2
3
4
5
6
7
8

insert into [表名](列名1,列名2,...) value (val1, val2,...); #给制定列添加数据
insert into [表名] value (val1, val2,...); #给全部列添加数据

#批量添加数据
insert into [表名](列名1,列名2,...) value (val1, val2,...),(val1, val2,...);
insert into [表名] value (val1, val2,...),(val1, val2,...);

修改

1
2
update [表名] set [列名1]=[value1], [列名2]=[value2]... [where 条件]; #修改表数据

删除

1
delete from [表名] [where 条件]; #删除

DQL

基础查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
select * from [表名]; 				#查询所有列
select age from stu; #查询一列
select distinct address from stu; #查询地址并去重
select math as 数学成绩 from stu; #查询并且起一个别名

-- 条件查询
select 字段列表 from 表名 where 条件列表
select * from stu where age >= 20;# 查询年龄大于等于20岁的
select * from stu where name like '_鹏%'; #模糊查询,查询第二个字是鹏的信息


-- 排序查询
# ASC:升序(默认)
# DESC:降序
select 字段列表 from 表名 order by 排序字段名1 [排序方式1], 排序字段名2 [排序方式2];

select * from stu order by math desc, english asc; #数学降序排,若一样按英语升序排

-- 聚合函数
# count(列名) 统计数量
# max(列名) 最大值
# min() 最小值
# sum() 求和
# avg() 平均值
select 聚合函数(列名) from 表;
select max(math) from stu; #查询数学最高分

分组查询

1
2
3
4
5
6
7
8
9
10
-- where 和 having 区别
# 执行时机不一样,where是分组之前限定,不满足where 条件,则不参与分组,而having是分组之后堆结果进行过滤。
# 可判断的条件不一样: where不能对聚合函数进行判断,having可以。
# 执行顺序: where >聚合函数> having

select 字段列表 from 表名 [where 分组前条件列表] group by 分组字段名 [having 分组后条件过滤];

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

分页查询

1
2
#起始索引 = (当前页码-1)*每页显示的条数
select 字段列表 from 表名 limit 起始索引, 查询条目数

数据库提高

约束

约束名称 描述 关键字
非空约束 保证列中所有数据不能有null值 NOT NULL
唯一约束 保证列中所有数据各不相同 UNIQUE
主键约束 主键是一行数据的唯一标识,要求非空且唯一 PRIMARY KEY
检查约束 保证列中的值满足某—条件 CHECK
默认约束 保存数据时,未指定值则采用默认值 DEFAULT
外键约束 外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性 OREIGN KEY

外键约束

外键约束

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 添加外键
create table emp(
id int primary key auto_increment,
name varchar(100),
age int,
dep_id int, -- 部门,外键
-- 添加外键dep_id , 关联dept表的主键
constraint fk_emp_dept foreign key(dep_id) references dept(id)
)


# 删除外键
alter table emp drop foreign key fk_emp_dept;
# 建完表后添加外键
alter table emp add constraint fk_emp_dept foreign key(dep_id) references dept(id);

多表查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-- 多表查询
select * from emp, dept; # 产生笛卡尔积变成AXB

-- 连接查询
# 内连接A交B(交集)
select * from emp, dept where emp.dep_id = dept.did; #隐式内连接
select * from emp inner join dept on emp.dep_id = dept.did; #显示内连接
# 外连接
# 左外连接查询A集合所有部分和AB交集
select * from emp left join dept on emp.dep_id = dept.did;
# 右外连接查询B集合所有部分和AB交集
select * from emp right join dept on emp.dep_id = dept.did;


-- 子查询()内是子查询
# 单行单列
select * from emp where salary > (select salary from emp where name = 'xxx')
# 多行单列(查市场部和财务部员工信息)
select * from emp where dep_id in (select did from dept where dname = '财务部' or dname = '市场部');
# 多行多列(查询入职是2011-11-11之后的员工信息)
select * from (select * from emp where join_data > '2011-11-11') t1, dept where t1.dep_id = dept.did;