MySQL
1. 数据库DB
“按照数据结构来组织、存储和管理数据的仓库 " 数据库管理系统 DBMS 系统里面的软件 一个应用程序 服务端程序
数据库意义?
将数据写入文件中: 类型比较单一 操作数据比较麻烦的
web项目:
页面(浏览器)--->服务器---->控制层(servlet/struts2/springMVC)--->service--->dao(数据持久层 mybatis/mp)--->DB
用户注册
持久化保存用户的数据
1.从存储位置上:
1.1 基于磁盘的数据库: 磁盘文件 IO 效率偏低 持久化保存 mysql oracle sqlserver
1.2 基于缓存(内存)的数据库: 存储内存 效率非常快 并不能保证持久化 读的时候 redis mogodb
2.从关系上:
2.1 关系型数据库: 表与表 字段与字段 数据与数据 都是有关系的 mysql oracle sqlserver
2.2 非关系型数据库 NOSQL: not only sql 数据: key:value redis
RDBMS: 关系型数据库管理系统软件 relation database management system
2. mysql
下载地址: https://dev.mysql.com/downloads/mysql/
https://dev.mysql.com/downloads/windows/installer/5.7.html msi
安装成功之后 会在window系统里面 自动安装一个mysql的服务
用户名: root
密码: root
安装的目录路径: C:\Program Files\MySQL\MySQL Server 5.7
数据的目录: C:\ProgramData\MySQL\MySQL Server 5.7
mysql的核心配置文件: my.ini
max_connections=151 最大的连接数
3. 操作
mysql tcp/ip 前提: 先去连接服务端程序 连接指定的计算机里面服务程序 (获得了一个数据库连接)
mysql:
很多数据库 database---> 很多表 table ---> 字段 字段类型 约束 数据
3.1 mysql指令
C:\Users\dn>mysql -h 127.0.0.1 -uroot -p
Enter password: ****
# mysql -h ip地址 -uroot -p
mysql> show databases; 查看所有的数据库
mysql> use mysql; 使用指定的数据库
mysql> select database(); 查看当前正在使用的数据库
mysql> show tables; 查看当前数据库里面所有的table
mysql> desc user; 查看指定表结构
mysql> show create database mydb; 查看创建数据库的详细的信息
3.2 SQL
结构化查询语言 structured query language
1. DDL 数据定义语言 create drop alter
2. DML 数据操作语言 insert delete update
3. DQL 数据查询语言 select
4. DCL 数据控制语言 grant commit rollback
mysql> select * from user; 查询指定表里面所有的数据 *: 通配符 通配表里面所有的字段
1. DDL(了解)
mysql> create database mydb;
# CREATE DATABASE 数据库名称; #名称不可更改
mysql> drop database mydb; 删除数据库(库里面的表也会全部删除)
#创建表 t_student tb_ studnet
create table 表名(
字段名称1 类型 [约束],
字段名称2 类型 [约束],
....
字段名称n 类型 [约束]
);
#一张表里面 必不可少3个字段 id create_time update_time
create table tb_student(
id int,
name varchar(20),
age tinyint(2) unsigned,
gender char(1),
birthday date,
score float(4,1),
hobby varchar(30),
create_time datetime,
update_time datetime
);
操作表结构
mysql> drop table tb_student; 删除表
mysql> alter table tb_student rename student; 修改表名
mysql> alter table student add image varchar(100); 新增新的字段
mysql> alter table student drop image; 删除字段
mysql> alter table student change name stuName varchar(20); 更改字段的名称
mysql> alter table student change stuName name varchar(200); 更改字段的名称/类型
mysql> alter table student modify gender varchar(2); 更改字段/类型
2. 数据类型
四类八种
1. 整型
tinyint(m) -128-127 unsigned 0-255 年龄 tinyint(1) boolean 0 1
int(m)
bigint(m) id 时间毫秒数
m:11 int(4) 限定单元格宽度
unsigned 无符号 正整数
zerofill 用0填充 int(4) 10001
2.小数类型
float(m,n) m: 规定小数的总位数 n: 限定小数点后面位数
double(m,n)
decimal(m,n) 定点数 money BigDecimal
3.字符串
char(n) 255 char(1)
varchar(n) 65535 限定存储的字符个数
char(4) ’a___‘ 查询的时候 自动去除隔空
varchar(4) ’a‘
4. 日期类型
date 年月日
datetime 年月日 时分秒
timestamp 时间戳(自动获取当前系统的时间)
year(4)
3. DML
数据操作语言
mysql> select * from student;
# insert
#1. 对所有的字段新增
insert into 表名 values (数据1,数据2...数据n),(数据1,数据2...数据n);
mysql> insert into student values (1002,'zhangsa',20,'m','2020-01-01',100,'game,code,music','2020-01-01 12:00:00','2020-01-01 12:00:00');
#2. 指定字段新增
insert into 表名 (字段1,字段2...字段n) values (数据1,数据2...数据n);
mysql> insert into student (id,name,age,create_time) values (1003,'tom',18,now());
#3. 添加多行记录
insert into 表名 (字段1,字段2...字段n) values (数据1,数据2...数据n),(数据1,数据2...数据n),....;
mysql> insert into student (id,name,age,create_time) values (1003,'tom',18,now()),(1004,'lisi',30,now());
#delete
delete from 表名; 清空表里面所有的数据
#有条件的删除 where and/or
mysql> delete from student where id='1001';
mysql> delete from student where id='1003' and create_time = '2020-12-23 16:38:13';
-- delete from emp where id = ?; -- DML
-- TRUNCATE TABLE stu ;-- 效率快 drop table create table DDL
--
select * from stu;
#update 带条件修改
update 表名 set 字段1=新值1, 字段2=新值2 where 条件 ;
mysql> update student set age=18,gender='m',update_time=now() where id = 1003;
4. 编码格式
mysql> insert into tb_userinfo (id,name,age) values (1002,'张三',20);
ERROR 1366 (HY000): Incorrect string value: '\xD5\xC5\xC8\xFD' for column 'name' at row 1
mysql> show create database mydb;
+----------+-----------------------------------------------------------------+
| Database | Create Database |
+----------+-----------------------------------------------------------------+
| mydb | CREATE DATABASE `mydb` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+-----------------------------------------------------------------+
mysql> show variables like '%character%'; #查看整个mysql服务相关的编码配置
+--------------------------+---------------------------------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------------------------------+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | gbk |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | C:\Program Files\MySQL\MySQL Server 5.7\share\charsets\ |
+--------------------------+---------------------------------------------------------+
# 不能存储中文的数据
#修改指定数据库的编码格式
mysql> alter database mydb character set utf8;
mysql> show create database mydb;
+----------+---------------------------------------------------------------+
| Database | Create Database |
+----------+---------------------------------------------------------------+
| mydb | CREATE DATABASE `mydb` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+---------------------------------------------------------------+
mysql> insert into tb_userinfo (id,name,age) values (1002,'张三',20);
ERROR 1366 (HY000): Incorrect string value: '\xD5\xC5\xC8\xFD' for column 'name' at row 1
# 这2张表示在刚刚latin的编码格式下创建的 即使修改了指定数据库编码格式 依然不能添加中文
修改全局的配置 在my.ini
66 default-character-set=utf8
100 character-set-server=utf8
重新启动mysal的服务 加载核心配置文件
客户端
navicat sqlyog
mysql-front
3.3 约束
限制字段的数据 (规则: 校验字段数据是否符合指定规则 insert update delete)
行级约束: 单个字段
表级约束: 多个字段(多张表的多个字段)
1. 非空约束 not null
字段的数据不能为null
-- create TABLE a(
-- id int not null,
-- name varchar(20) null,
-- age TINYINT UNSIGNED
-- );
-- ctrl+/ 注释sql
-- insert into a VALUES (1,'jim',20);
-- INSERT into a (name,age) values ('tom',20);
INSERT into a (id) values (2),(3);
select * from a;
INSERT into a (name,age) values ('tom',20)
> 1364 - Field 'id' doesn't have a default value
2. 唯一性约束 unique
唯一性的索引 index 在表里面 有些字段有索引的话 查询效率要快
-- create TABLE b(
-- id int not null UNIQUE,
-- name varchar(20) UNIQUE,
-- age TINYINT UNSIGNED
-- );
-- UNIQUE约束自动过滤null
-- insert into b (id) values(1),(2),(3);
insert into b (id) values(1);
select * from b;
> 1062 - Duplicate entry '1' for key 'id'
3. 默认约束 default
给字段设置默认值
-- create TABLE c(
-- id int not null UNIQUE,
-- name varchar(20) UNIQUE DEFAULT '无名氏' ,
-- age TINYINT UNSIGNED
-- );
insert into c (id,name) values(2,'jim');
select * from c;
3. 主键约束 primary key
行级约束(任意类型的字段都可以充当主键列 整型+字符串)
字段的数据就等同于 not null +unique 一张表里面有且只有一个主键列 (可以是多个字段充当一个主键列 联合主键)
代表行记录的唯一性 主键列 自带索引
mysql的三大范式:
1: 保证列的原子性 列不可再分
地址:
2. 主键保证行记录的唯一性。
3. 避免数据出现冗余的情况 (排除主键列和外键列的数据)
#主键列是整型 一般也不会手动给值 都是mysql自动维护 自增 auto_increment (并发: )
-- create TABLE d(
-- id int PRIMARY key,
-- name varchar(20) UNIQUE DEFAULT '无名氏' ,
-- age TINYINT UNSIGNED
-- );
-- alter table d change id id int auto_increment;
-- 默认从1开始 步长 1
-- alter table d auto_increment = 1000; 修改自增初始值
-- set GLOBAL auto_increment_increment = 5; 修改自增的步长值
insert into d (name) values('张三8');
select * from d;
insert into d (id,name) values(2,'tom')
> 1062 - Duplicate entry '2' for key 'PRIMARY'
-- create TABLE d(
-- id int PRIMARY key auto_incremnet,
-- name varchar(20) UNIQUE DEFAULT '无名氏' ,
-- age TINYINT UNSIGNED
-- );
#主键列为字符串类型
-- create TABLE e(
-- id varchar(100) PRIMARY key,
-- name varchar(20) not null UNIQUE ,
-- age TINYINT UNSIGNED not null
-- );
--
insert into e (id,name,age) values (uuid(),'kkk','20');
select * from e;
-- select uuid();
-- create TABLE e(
-- id varchar(100),
-- name varchar(20) not null UNIQUE ,
-- age TINYINT UNSIGNED not null,
-- PRIMARY key(id)
-- );
-- 多个字段同时充当主键列 联合主键
-- create TABLE e(
-- id int,
-- name varchar(20) ,
-- age TINYINT UNSIGNED not null,
-- PRIMARY key (id,name)
-- );
--
insert into e values (1,'a',20);
insert into e values (1,'b',20);
insert into e values (2,'a',20);
select * from e;
表 字段 类型
映射
类 属性 数据类型
4. 外键约束 foreign key
表级约束:涉及至少2张表 维护多张表的关系
一张表(子表/从表)里面可以有多个列充当外键列(通过约束来指定) 外键列的数据要严格参照主表里面的主键列的数据
1. 一对一
一个用户有一个角色
主表: 角色表
从表: 用户表 ---> 外键列(参照角色表主键列的数据)
-- 修改从表的表结构
-- alter TABLE tb_userinfo
-- add CONSTRAINT FOREIGN key fk_roleid (roleid) REFERENCES tb_role(id);
-- 新增/修改子表的数据
-- 先查询角色表里面所有的角色
-- select * from tb_role; 1
-- Cannot add or update a child row: a foreign key constraint fails (`mydb`.`tb_userinfo`, CONSTRAINT `tb_userinfo_ibfk_1` FOREIGN KEY (`roleid`) REFERENCES `tb_role` (`id`))
insert into tb_userinfo (`name`,roleid) values ('张三1',100);
update tb_userinfo set name = 'kkk' , roleid = 1000 where id= 2;
-- 删除子表的数据 对主表没有任何影响的
delete from tb_userinfo where id = 1;
-- 操作主表
-- 子表如果参照主表的数据 主表的记录不能删除的
-- 以上这些情况 外键约束的机制: restrict
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CkiA7erC-1609079465047)(pic/foreign .png)]
-- 外键约束的机制: set null (外键列必须可以为null)
-- 操作主表
-- 子表如果参照主表的数据 先将子表的数据置为null 然后再删除主表的数据
delete from tb_role where id = 1;
select * from tb_role;
SELECT * from tb_userinfo;
-- 外键约束的机制: cascade
-- 操作主表
-- 子表如果参照主表的数据 全部删除子表关联的记录
-- 删除主表的数据
delete from tb_role where id = 11;
select * from tb_role;
SELECT * from tb_userinfo;
在实际开发中 外键列正常存在 但是不会添加外键约束的。 在代码的层面上 维护表与表的关系
#【强制】不得使用外键与级联,一切外键概念必须在应用层解决。
#说明:(概念解释)学生表中的 student_id 是主键,那么成绩表中的 student_id 则为外键。如果更新学生表中的 student_id,同时触发成绩表中的 student_id 更新,即为级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度.
2. 一对多
一个订单多个详情:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N708nqgy-1609079465049)(pic/订单详情id .png)]
中间表维护订单与详情的关系: 弊端: 中间表越来越多
3. 多对多
用户---->角色 --->权限(功能)
100个用户
50 1 2 3 4 5
50 1 2 3
使用中间表实现关系:
删除角色:
删除权限:
3.4 DQL
select * from tb_userinfo;
select
表字段
from
table1,table2...
[
where 条件1 and/or (条件过滤)
group by 字段(分组查询)
having 条件1 and/or (分组之后的过滤)
order by asc/desc(排序)
limit ?/?,? 限定查询的结果(分页查询)
]
1. 条件查询 where
select/delete/update 都可以与where结合使用
=、!=、<>、<、<=、>、>=;
BETWEEN…AND;是否满足一个区间范围 >= <=
IN(set);条件的集合
IS NULL;
AND; 连接多个条件的查询
OR;or 满足其中一个条件就可以
NOT;
-- 1.where 查询
-- 查询学生性别为女,并且年龄50的记录
-- SELECT * from stu where (gender='female' and age = 15);
-- 查询学号为S_1001,S_1002,S_1003的记录
-- SELECT * from stu where sid = 's_1001' or sid = 'S_1002' or sid = 'S_1003';
-- SELECT * from stu where sid in ('s_1001','s_1002','s_1003');
-- delete from stu where sid in ('s_1001','s_1002');
-- 查询学号不是S_1001,S_1002,S_1003的记录
-- SELECT * from stu where sid != 's_1004' and sid != 'S_1005' and sid != 'S_1003';
-- SELECT * from stu where sid not in ('s_1004','s_1005','s_1003');
-- 查询年龄为null的记录
-- select * from stu where age is not null;
-- 查询年龄在20到40之间的学生记录
-- select * from stu where age>=20 and age<=40;
-- select * from stu where age BETWEEN 20 AND 40;
-- 查询性别非男的学生记录
-- select * from stu WHERE gender!='male' or gender is null;
2. 模糊查询 like
-- 2. like
-- 查询姓名由5个字母构成的学生记录 使用通配符_
-- select * from stu where sname like '_____';
-- 查询姓名以“z”开头的学生记录 使用通配符 %
-- select * from stu where sname like 'z%';
-- show VARIABLES like '%character%';
-- 查询姓名中第2个字母为“i”的学生记录
-- select * from stu where sname like '_i%';
-- 查询姓名中包含“a”字母的学生记录
select * from stu where sname like '%a%';
3.字段控制查询
去重 distinct
去除重复的字段/行记录的数据
-- 去重 DISTINCT 只能与select结合使用
-- select DISTINCT gender from stu;
select DISTINCT gender from stu;
select DISTINCT gender,sname from stu;
select DISTINCT * from stu;
null值运算
-- 一个字段本身的数据为null 如果进行相关的算术运算的话 结果还是为null
select sid,sname,age, ifnull(age,18)+1 from stu;
-- ifnull(字段名称,新的值) 如果指定的字段的数据为 null 使用新的值替换 否则还是自身的数据
SELECT empno,ename,sal,comm,(sal+ifnull(comm,0)) from emp;
别名查询 as 可以省略
SELECT e.empno,e.ename,sal,comm,(sal+ifnull(comm,0)) totalMoney from emp e;
-- 多张表关联查询 对表起名称
4. 排序 order by
默认按照升序 asc desc 降序
-- 查询员工信息 先按照薪资排序 薪资一致 再按照编号降序排列
-- 根据id 以及 时间 降序排列
select * from emp ORDER BY sal desc, empno desc;
5. 分组查询 group by
分组函数
聚合函数是用来做纵向运算的函数:
COUNT():统计指定列不为NULL的记录行数;
MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
-- 1. 聚合函数(分组函数) 有且只有一个结果
-- 统计emp表总记录数 count(字段)
-- select count(empno),count(comm),count(*),count(1) from emp;
-- 统计emp最高薪资 最低薪资 所有员工的薪资总和 平均薪资
-- select max(sal),min(sal),sum(sal),avg(sal),sum(sal)/count(*)from
-- 查询emp表中月薪大于2500的人数
-- select count(empno) from emp where sal>2500;
-- oracle 分组关联字段必须出现在select后面
-- 查询每个部门的部门编号和每个部门的工资和:
select deptno,sum(sal) from emp GROUP BY deptno;
-- 查询每个部门的部门编号以及每个部门的人数:
select deptno,count(*) from emp GROUP BY deptno;
-- 查询每个部门的部门编号以及每个部门员工工资大于1500的人数:
select deptno,count(*) from emp WHERE sal>1500 GROUP BY deptno;
6. having过滤
-- 查询工资总和大于9000的部门编号以及工资和:
-- > 1111 - Invalid use of group function where 不能与组函数结合使用
-- 一般都是体现在分组后面 对分组之后数据进行过滤
select deptno,sum(sal) from emp GROUP BY deptno HAVING sum(sal)>9000;
7. 关联查询
- 等值连接
-- 查询员工信息,要求显示员工号,姓名,月薪,部门名称
-- 56=14*4 笛卡尔积的数据
-- Column 'deptno' in where clause is ambiguous
-- 关联2张表查询 至少有1个条件
SELECT
e.*,dname
from
emp as e,dept as d where e.sal>1500 and e.deptno=d.deptno;
- 不等值连接 条件连接不是一个等号
-- 查询员工信息,要求显示:员工号,姓名,月薪,薪水的级别
SELECT
DISTINCT e.*,s.GRADE,d.dname
from
emp as e,salgrade s,dept d where e.deptno=d.deptno and e.sal BETWEEN s.LowSAL and s.HISAL
ORDER BY e.sal;
- 外连接
# 内外连接 inner join on/where
#左外连接 left join on
#右外连接 right join on
-- 外连接
-- 内外连接 inner join on/where 等同于普通的表关联查询
-- select d.deptno,d.dname,count(*)
-- FROM dept d INNER JOIN emp e
-- where d.deptno=e.deptno GROUP BY e.deptno;
-- 到底使用左/右 要看基表在左边还是右边?
-- 左外连接 left join on 以左表为基本 右表没有的数据使用null或者0填充
-- 右外连接 right join on 以右表为基本 左表没有的数据使用null或者0填充
-- select d.deptno,d.dname,count(e.empno)
-- FROM dept d left JOIN emp e
-- on d.deptno=e.deptno GROUP BY e.deptno;
- 自连接 (把自己当成多张表看待)
-- 查询员工姓名和员工的老板的名称
-- 员工的mgr的数据就是老板的empno
-- SELECT
-- e1.*,e2.empno,e2.ename
-- from
-- emp e1,emp e2 where e1.mgr=e2.empno ORDER BY e1.empno ;
-- SELECT
-- e1.*,e2.empno,e2.ename
-- from
-- emp e1 LEFT JOIN emp e2 on e1.mgr=e2.empno ORDER BY e1.empno ;
-- 展示部门名称 薪资级别
SELECT
e1.*,d.dname, s.GRADE,e2.empno,e2.ename,e2.sal,d1.dname,s1.GRADE
from
emp e1 LEFT JOIN emp e2 on e1.mgr=e2.empno -- 临时表
,dept d,salgrade s, dept d1,salgrade s1
where e1.deptno=d.deptno and e1.sal BETWEEN s.LowSAL and s.HISAL
and d1.deptno=e2.deptno and e2.sal BETWEEN s1.LowSAL and s1.HISAL
ORDER BY e1.empno ;
SELECT
e1.*,d.dname, s.GRADE,e2.empno,e2.ename,e2.sal,d1.dname,s1.GRADE
from
emp e1 LEFT JOIN emp e2 on e1.mgr=e2.empno
LEFT JOIN dept d on e1.deptno=d.deptno
LEFT JOIN salgrade s on e1.sal BETWEEN s.LowSAL and s.HISAL
, dept d1,salgrade s1
where d1.deptno=e2.deptno and e2.sal BETWEEN s1.LowSAL and s1.HISAL
ORDER BY e1.empno ;
SELECT
e1.*,d.dname, s.GRADE,e2.empno,e2.ename
from
emp e1 LEFT JOIN emp e2 on e1.mgr=e2.empno
LEFT JOIN dept d on e1.deptno=d.deptno
LEFT JOIN salgrade s on e1.sal BETWEEN s.LowSAL and s.HISAL
ORDER BY e1.empno ;
- 子查询 (查询的条件的数据是未知的)
-- 查询工资为20号部门平均工资的员工信息
select * from emp where sal=(select avg(sal) from emp where deptno=20);
- 集合运算
union all
vs
union
-- 分库分表: 所有的用户信息
-- select * from user0;
-- select * from user1;
-- select * from user2;
-- 通过1条sql语句 查出来所有的用户的信息
-- select DISTINCT * from
-- (select * from user0
-- union all
-- select * from user1
-- union all
-- select * from user2) temp;
-- select * from user0
-- union
-- select * from user1
-- union
-- select * from user2;
8. 分页查询 limit
-- 每一页展示固定量的商品信息 100个商品
-- 商品表维护所有的商品的信息
-- 用户只知道请求查看第几页的数据
-- 分页查询员工表的信息 每页展示5条数据 pageSize
-- 总页数: 14%5==0 int totalPage = 14/5 ; totalPage = totalPage+1;
-- 总记录数: select count(*) from emp; 14
-- -- 第一页的数据:
-- select * from emp ORDER BY empno limit 5;-- 从第一条记录 查询pageSize条
-- select * from emp ORDER BY empno limit 0,5;
-- -- 第2页的数据:
-- select * from emp ORDER BY empno limit 5,5;-- 1: 从第几条记录 index 2: 查询pageSize条
-- -- 第3页的数据:
-- select * from emp ORDER BY empno limit 10,5;
-- 取决用户要看第几页的数据: curpage 当前第几页
select * from emp ORDER BY empno limit (curpage-1)*pageSize,pageSize;
4. 常用函数
-- 常用函数
-- 字符串操作 String
-- concat(字段名称,str2,…) 连接字符串
-- lower(str) 转成小写
-- upper(str) 转成大写
-- trim(str) 去掉字符串str前缀和后缀的空格
-- length(str) 返回字符串str的长度
-- char_length(str) 返回字符串str的长度
-- SELECT ename,CONCAT(ename,'_','a','_'),upper(lower(ename)) from emp;
-- select LOWER('aHc');
-- select trim(' ffg g gg '),LENGTH('我们'),char_LENGTH('我们');
-- repeat(str,count) 返回str重复count次的结果
-- substring(str,pos,len) 从字符串str的pos位置起len个字符长度的子串
-- select REPEAT('abc_',2),SUBSTRING('hello',2),SUBSTRING('hello',2,3);
-- replace(str,from_str,to_str) 用字符串to_str替换字符串str中所有的字符串from_str
-- SELECT REPLACE('hello','l','abc');
-- lpad(str,ien,padstr) 返回字符串str,其左边由字符串padstr填补到len字符串长度
-- rpad(str,len,padstr) 返回字符串str,其左边由字符串padstr填补到len字符串长度
-- SELECT lpad('hello',9,'abc'),rpad('hello',9,'abc');
-- insert(str,pos,len,newstr) 字符串str从第pos位置开始的len个字符替换为新字符串newstr
-- SELECT insert('hello',2,3,'abc');
-- 数值型数据操作 Math
-- select abs(-10),round(rand()*10),ROUND(10.523),round(10.1256,3),TRUNCATE(10.1256,3);
-- SELECT ceil(1.5),ceil(-2.6),FLOOR(1.5),FLOOR(-2.6);
-- 日期相关函数 Date
-- 获得当前系统时间
-- select now(),SYSDATE(),CURRENT_TIMESTAMP(),CURRENT_DATE(),CURRENT_TIME();
-- 查询1981年入职的员工
-- select * from emp where year(hiredate) = 1981;
-- select YEAR(now()),MONTH('2020-10-01'),MONTHName(SYSDATE());
-- select DATEDIFF(now(),'2019-12-01');
-- select UNIX_TIMESTAMP();-- 获得当前系统的时间(毫秒数)
-- insert into a (name,craete_time) values ('jim2',UNIX_TIMESTAMP());
-- SELECT LAST_INSERT_ID(); -- 获得上一次的自增id值
-- SELECT id,name, FROM_UNIXTIME(craete_time,'%Y-%m-%d %H:%i:%S') from a;
-- select uuid();
5. 数据备份
-- 数据备份
-- 1. 物理备份 data
-- 2. 命令 mysqldump -uroot -proot -d 数据库名称 表名 > 路径 只带有数据库表结构
-- mysqldump -uroot -proot 数据库名称 > 路径 带有数据库表结构+数据
-- mysqldump -uroot -proot -d 数据库名称 表名1, 表名1 > 路径
-- 登录的状态下: source 文件路径
-- 异步定时任务(在一个指定时间上备份服务器的数据) 阿里云mysql服务:version
-- 3.navicat: 导入 导出
6. mysql的数据存储引擎
-- 4种引擎
-- myisam InnoDB memory archive
-- myisam(新增+删除) 不支持事务
-- InnoDB 保证事务(ACID)
-- memory 将数据存储内存
-- archive
show VARIABLES like '%storage_engine%';
7. 连接数据库
# 目前 我们不能使用计算机自动分配的ip连接mysql服务
# 原因:
mysql用户root只支持localhost/127.0.0.1 进行连接
如果后期分组开发项目 是存在问题的 因为一个项目 有一个mysql的服务。有可能出现我们要连接其他机器的mysql的服务。
#解决方式:
将localhost改为% 可以允许任意的计算机连接我本机的mysq服务。
修改完毕 重启服务。
CT id,name, FROM_UNIXTIME(craete_time,’%Y-%m-%d %H:%i:%S’) from a;
– select uuid();
## 5. 数据备份
```mysql
-- 数据备份
-- 1. 物理备份 data
-- 2. 命令 mysqldump -uroot -proot -d 数据库名称 表名 > 路径 只带有数据库表结构
-- mysqldump -uroot -proot 数据库名称 > 路径 带有数据库表结构+数据
-- mysqldump -uroot -proot -d 数据库名称 表名1, 表名1 > 路径
-- 登录的状态下: source 文件路径
-- 异步定时任务(在一个指定时间上备份服务器的数据) 阿里云mysql服务:version
-- 3.navicat: 导入 导出
6. mysql的数据存储引擎
-- 4种引擎
-- myisam InnoDB memory archive
-- myisam(新增+删除) 不支持事务
-- InnoDB 保证事务(ACID)
-- memory 将数据存储内存
-- archive
show VARIABLES like '%storage_engine%';
7. 连接数据库
# 目前 我们不能使用计算机自动分配的ip连接mysql服务
# 原因:
mysql用户root只支持localhost/127.0.0.1 进行连接
如果后期分组开发项目 是存在问题的 因为一个项目 有一个mysql的服务。有可能出现我们要连接其他机器的mysql的服务。
#解决方式:
将localhost改为% 可以允许任意的计算机连接我本机的mysq服务。
修改完毕 重启服务。